Context
Operator-agreed (2026-06-12, on the #12964 exploration trail): the legacy all-leaves apps/portal/resources/data/tickets.json (1.69 MB, 10k+ entries) is deprecated-in-fact — verified at 4e44dde29:
- The portal moved off it entirely:
apps/portal/store/Tickets.mjs:24-26 loads the chunked tickets/index.json (lazy folders, per-chunk leaf files); zero runtime consumers remain in the portal.
- The SEO/GEO generators never used it:
buildScripts/docs/seo/generate.mjs fast-globs the content tree directly (issues/pulls/discussions + their archives).
- Repo-wide, its only toucher is its own producer:
buildScripts/docs/index/tickets.mjs dual-emits legacy + chunked surfaces.
- The single true reader anywhere is the private middleware repo's SSG (
build.mjs ticketPaths mapping — builds the flat-URL→chunk-path bucket map from the monolith).
Release classification: post-release — pairs with the #12964 middleware work; no v13 surface depends on the deletion.
The Fix (strict ordering — flip the reader before killing the writer)
- Middleware first (tracked in
#12964, private repo): switch the ticketPaths mapping source from the monolith to the chunked surface (tickets/manifest.json + index.json + per-chunk metadata: chunk nodes carry contentDir/filePrefix, leaves omit repeated paths — the id→subPath mapping is reconstructible from node metadata). Verify a full ticketPaths.json equivalence diff old-vs-new before cutover.
- Then neo-side: remove the legacy emit from
buildScripts/docs/index/tickets.mjs (keep the chunked emit); git rm apps/portal/resources/data/tickets.json; confirm the hourly data-sync staging globs simply have nothing to stage for it.
Acceptance Criteria
Out of Scope
- The ticket-route SSR hang (separate
#12964 falsifier) and the middleware's other Phase-0/1/2 items.
Related
#12964 (carries the middleware-side flip + the deprecation V-B-A trail) · buildScripts/docs/index/tickets.mjs (dual-emitter) · apps/portal/store/Tickets.mjs (the migration that orphaned the monolith)
Live latest-open sweep: checked latest 15 open issues at 2026-06-12T09:32Z; no equivalent. A2A in-flight sweep: the active claims are the CI-red fixture family (#12973/#12974/#12977/#12980, gpt) — no overlap.
Origin Session ID: c29b5ccc-d711-4cde-8401-32d1e4bbc4f1
Retrieval Hint: "retire tickets.json monolith dual-emit chunked manifest ticketPaths middleware last reader"
Evolution note (2026-06-12, scope extension — operator-pointed): the deletion extends to the pulls.json monolith twin (518KB legacy flat tree, zero readers — the Pulls store loads the chunked pulls/index.json; its only ecosystem reference was its own writer). Verified non-twins stay: discussions.json IS the chunked root index (differently placed, live-consumed), and the remaining small data JSONs (blog/medium/releases/labels/seo/examples) are live-consumed surfaces, not monoliths.
Context
Operator-agreed (2026-06-12, on the
#12964exploration trail): the legacy all-leavesapps/portal/resources/data/tickets.json(1.69 MB, 10k+ entries) is deprecated-in-fact — verified at4e44dde29:apps/portal/store/Tickets.mjs:24-26loads the chunkedtickets/index.json(lazy folders, per-chunk leaf files); zero runtime consumers remain in the portal.buildScripts/docs/seo/generate.mjsfast-globs the content tree directly (issues/pulls/discussions + their archives).buildScripts/docs/index/tickets.mjsdual-emits legacy + chunked surfaces.build.mjsticketPaths mapping — builds the flat-URL→chunk-path bucket map from the monolith).Release classification:post-release — pairs with the#12964middleware work; no v13 surface depends on the deletion.The Fix (strict ordering — flip the reader before killing the writer)
#12964, private repo): switch the ticketPaths mapping source from the monolith to the chunked surface (tickets/manifest.json+index.json+ per-chunk metadata: chunk nodes carrycontentDir/filePrefix, leaves omit repeated paths — the id→subPath mapping is reconstructible from node metadata). Verify a full ticketPaths.json equivalence diff old-vs-new before cutover.buildScripts/docs/index/tickets.mjs(keep the chunked emit);git rm apps/portal/resources/data/tickets.json; confirm the hourly data-sync staging globs simply have nothing to stage for it.Acceptance Criteria
#12964).tickets.mjsno longer writes the monolith; the chunked emit unchanged.tickets.jsonremoved from the tree; one full data-sync cycle runs green without recreating it./news/tickets/<id>SSG render verified post-deletion.Out of Scope
#12964falsifier) and the middleware's other Phase-0/1/2 items.Related
#12964(carries the middleware-side flip + the deprecation V-B-A trail) ·buildScripts/docs/index/tickets.mjs(dual-emitter) ·apps/portal/store/Tickets.mjs(the migration that orphaned the monolith)Live latest-open sweep: checked latest 15 open issues at 2026-06-12T09:32Z; no equivalent. A2A in-flight sweep: the active claims are the CI-red fixture family (
#12973/#12974/#12977/#12980, gpt) — no overlap.Origin Session ID: c29b5ccc-d711-4cde-8401-32d1e4bbc4f1
Retrieval Hint: "retire tickets.json monolith dual-emit chunked manifest ticketPaths middleware last reader"
Evolution note (2026-06-12, scope extension — operator-pointed): the deletion extends to the
pulls.jsonmonolith twin (518KB legacy flat tree, zero readers — the Pulls store loads the chunkedpulls/index.json; its only ecosystem reference was its own writer). Verified non-twins stay:discussions.jsonIS the chunked root index (differently placed, live-consumed), and the remaining small data JSONs (blog/medium/releases/labels/seo/examples) are live-consumed surfaces, not monoliths.