Sub 3 of #17238, and the axis that is irreversible, public-facing, and not executable by an agent. It lands last by construction: the purge scope is defined by what #17374 and #17375 leave behind, and rewriting a still-growing repository buys a number that immediately starts degrading again.
Measured 2026-08-19, three days after #17238's census: neo 5.21 GiB GitHub-side (was 5.12), local .git4.1 GiB (was 3.8), neomjs/pages0.96 GiB, 1,790 lifetime commits to users.jsonl.
The Problem
Axes 1 and 2 stop the bleeding. They reclaim nothing. Every byte already written stays written: git history is append-only, and #17238 measured 3,417 MiB across 1,767 versions of one file — 90.5% of all blob bytes, or 95.6% counting every apps/devindex/** and apps/devrank/** path.
The cost is not theoretical and has already been paid downstream twice, undiagnosed at the time:
#16546 (closed) — the Memory Core tenant mirror cloned this repository at 4.9 GB and OOM-killed the orchestrator every ~290 s. Resolved with a blobless clone.
#16557 (open) — that blobless workaround turns first ingestion into 23,931 network round trips.
Both treat the consequence. Neither names the cause.
The Architectural Reality
git filter-repo --invert-paths over the generated paths — apps/devindex/resources/**, apps/devrank/resources/**, resources/content/.sync-metadata.json (28.3 MiB), and the generated portal artifacts (~14 MiB) — takes .git from ~4 GiB to roughly 170 MiB, per #17238's measurement.
neomjs/pages carries the identical disease and must be in scope.data-sync-pipeline.ymlgit adds the same file into that repository hourly. Treating neo alone leaves the second instance running on the same curve, five months behind.
Blast radius this axis must carry rather than discover:
Every SHA from 2026-02-12 forward changes. This substrate cites exact heads pervasively — review bodies, tickets, ADRs, Memory Core entries. filter-repo emits a commit-map; preserving that map as permanent public substrate is the workable answer, not rewriting citations.
231 forks, 3,253 stars, and every open PR invalidated. This lands at a release boundary with the open-PR queue drained, or it does not land.
A force-push does not shrink GitHub's reported size. Unreachable objects survive in the fork network until GitHub Support runs gc. Fresh clones go small immediately — that is the real win — but the public figure lags, and any communication must say so rather than promise a number that will not move on schedule.
Downstream re-clones: the Memory Core tenant mirror (#16546 / #16557) and KB ingestion.
The Fix
Sequenced, and the sequence is the substance:
confirm #17374 and #17375 are merged and that nothing is still writing generated artifacts into either repository — otherwise the purge scope is measured against a moving tree
run an Ideation Sandbox consensus round — an Epic body is not sufficient authority for an irreversible rewrite of a public repository
drain the open-PR queue and pick a release boundary
git filter-repo --invert-paths on the generated path set, both repositories
publish the commit-map as permanent substrate before the force-push, not after
force-push all refs — @tobiu executes; §critical_gates places this outside agent authority
re-clone the downstream consumers and confirm
Decision Record impact
none for the mechanism. The consensus requirement itself is the governance content: this ticket must not proceed to execution on ticket authority alone, and that constraint is inherited from #17238's own body rather than invented here.
Acceptance Criteria
AC-1: a graduated Ideation Sandbox Discussion carries family-keyed quorum for the rewrite, and this ticket records the graduation marker. Execution before that marker is the failure this AC exists to prevent.
AC-2: the purge path set is derived after#17375 merges, from a measurement of the then-current tree, and is recorded here with the measuring command and the SHA it ran against. A path set inherited from the 2026-08-16 census would be stale by construction — a census is only valid against the tree it ran on.
AC-3: the commit-map is published as permanent public substrate, reachable without a clone, before any force-push. A spec or checklist item asserts the map is retrievable, because after the push the mapping is the only bridge between every cited SHA and its successor.
AC-4: the open-PR queue is empty at execution time and a release boundary is named.
AC-5: both neomjs/neo and neomjs/pages are purged. Treating neo alone is the documented incomplete fix.
AC-6 (post-merge, operator-executed): a fresh clone of each repository is materially smaller, recorded as a measurement rather than an expectation — and the record states explicitly that GitHub's reported size will lag until Support runs gc, so a stale public figure is not read as failure.
AC-7: the downstream consumers (#16546 mirror, KB ingestion) are re-cloned and verified, and #16557 is re-assessed — its round-trip cost was a workaround for the size this ticket removes, so it may no longer need its own fix.
Out of Scope
Retroactive correction of SHA citations across existing substrate. The commit-map is the answer; rewriting thousands of citations is not.
Replacing GitHub Pages as a deployment mechanism.neomjs/pages git growth is in scope; its role is not.
The blobless-clone round-trip defect (#16557) as an independent fix. It stays independently valid — a mirror should not pay for history it never reads, whatever this repository's size becomes — but AC-7 re-assesses whether it still needs one.
Avoided Traps
Running this first because it is the visible number. It draws attention precisely because it is the largest figure, and it is the one axis whose scope depends on the other two.
Promising a size drop on a schedule. Fresh clones shrink immediately; the public diskUsage does not, and unreachable objects persist in the fork network. Announcing the second as though it were the first converts a real win into an apparent failure.
Executing on ticket authority. An Epic body — including #17238's — is not sufficient authority for an irreversible rewrite of a repository with 231 forks.
Purging neo only. Leaves neomjs/pages running the identical accrual.
Related
Parent: #17238 · blocked by #17374 and #17375 · downstream: #16546 (closed, blobless-clone workaround), #16557 (open, round-trip cost of that workaround).
Live latest-open sweep: checked the latest 20 open issues at 2026-08-19T08:36:42Z plus a 30-message A2A claim scan across all read-states; no equivalent ticket and no in-flight claim on this scope.
Context
Sub 3 of #17238, and the axis that is irreversible, public-facing, and not executable by an agent. It lands last by construction: the purge scope is defined by what #17374 and #17375 leave behind, and rewriting a still-growing repository buys a number that immediately starts degrading again.
Measured 2026-08-19, three days after #17238's census: neo 5.21 GiB GitHub-side (was 5.12), local
.git4.1 GiB (was 3.8),neomjs/pages0.96 GiB, 1,790 lifetime commits tousers.jsonl.The Problem
Axes 1 and 2 stop the bleeding. They reclaim nothing. Every byte already written stays written: git history is append-only, and #17238 measured 3,417 MiB across 1,767 versions of one file — 90.5% of all blob bytes, or 95.6% counting every
apps/devindex/**andapps/devrank/**path.The cost is not theoretical and has already been paid downstream twice, undiagnosed at the time:
Both treat the consequence. Neither names the cause.
The Architectural Reality
git filter-repo --invert-pathsover the generated paths —apps/devindex/resources/**,apps/devrank/resources/**,resources/content/.sync-metadata.json(28.3 MiB), and the generated portal artifacts (~14 MiB) — takes.gitfrom ~4 GiB to roughly 170 MiB, per #17238's measurement.neomjs/pagescarries the identical disease and must be in scope.data-sync-pipeline.ymlgit adds the same file into that repository hourly. Treating neo alone leaves the second instance running on the same curve, five months behind.Blast radius this axis must carry rather than discover:
filter-repoemits acommit-map; preserving that map as permanent public substrate is the workable answer, not rewriting citations.The Fix
Sequenced, and the sequence is the substance:
git filter-repo --invert-pathson the generated path set, both repositoriescommit-mapas permanent substrate before the force-push, not afterDecision Record impact
nonefor the mechanism. The consensus requirement itself is the governance content: this ticket must not proceed to execution on ticket authority alone, and that constraint is inherited from #17238's own body rather than invented here.Acceptance Criteria
commit-mapis published as permanent public substrate, reachable without a clone, before any force-push. A spec or checklist item asserts the map is retrievable, because after the push the mapping is the only bridge between every cited SHA and its successor.neomjs/neoandneomjs/pagesare purged. Treating neo alone is the documented incomplete fix.Out of Scope
commit-mapis the answer; rewriting thousands of citations is not.neomjs/pagesgit growth is in scope; its role is not.Avoided Traps
diskUsagedoes not, and unreachable objects persist in the fork network. Announcing the second as though it were the first converts a real win into an apparent failure.neomjs/pagesrunning the identical accrual.Related
Parent: #17238 · blocked by #17374 and #17375 · downstream: #16546 (closed, blobless-clone workaround), #16557 (open, round-trip cost of that workaround).
Retrieval Hint:
query_raw_memories("filter-repo commit-map force push fork network unreachable objects")·"neo 5 GiB users.jsonl 90 percent blob bytes"Live latest-open sweep: checked the latest 20 open issues at 2026-08-19T08:36:42Z plus a 30-message A2A claim scan across all read-states; no equivalent ticket and no in-flight claim on this scope.
Origin Session ID: a105d215-c261-4b34-82a9-546596f665ef