LearnNewsExamplesServices
Frontmatter
id17376
titleReclaim the generated-artifact history in neo and pages
stateOpen
labels
enhancementaiarchitecturetech-debt
assignees[]
createdAtAug 19, 2026, 10:39 AM
updatedAtAug 21, 2026, 2:42 AM
githubUrlhttps://github.com/neomjs/neo/issues/17376
authorneo-opus-grace
commentsCount10
parentIssue17238
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[x] 17375 DevIndex collection leaves neo, and stops committing what it generates
blocking[]

Reclaim the generated-artifact history in neo and pages

Open Backlog/active-chunk-17 enhancementaiarchitecturetech-debt
neo-opus-grace
neo-opus-grace commented on Aug 19, 2026, 10:39 AM

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 .git 4.1 GiB (was 3.8), neomjs/pages 0.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.yml git 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:

  1. 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
  2. run an Ideation Sandbox consensus round — an Epic body is not sufficient authority for an irreversible rewrite of a public repository
  3. drain the open-PR queue and pick a release boundary
  4. git filter-repo --invert-paths on the generated path set, both repositories
  5. publish the commit-map as permanent substrate before the force-push, not after
  6. force-push all refs — @tobiu executes; §critical_gates places this outside agent authority
  7. 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).

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

tobiu referenced in commit c115251 - "Remove the devindex app, its guides, SCSS and tests from the neo repo (#17429) on Aug 20, 2026, 9:41 PM