Context
ADR 0004 §2.3 retired the asymmetric issue-archive/ + pr-archive/ primitives in favor of the universal archive/{type}/v<X>/chunk-N/ shape. The clean-slate migration (Epic #11372) removed those directories from disk, and #11363 removed the gh-workflow config fallbacks (archiveDir, defaultArchiveVersion). However, 4 source files still carry hardcoded issue-archive/pr-archive path strings/comments that survived both. Operator-flagged during the ADR-0004 Phase-2 consumer audit 2026-05-29.
The Problem
Dead references to retired primitives are substrate-decay debt: future sessions reading them may infer the old shape is still live — the exact substrate-bypass failure mode ADR 0004 §1.2/§5.1 anti-anchors against. Per ADR §1.3 (regeneratable cache) + §2.6 (clean-cut, no deprecation window), retired-primitive refs should be deleted, not preserved.
The 4 sites (verified on disk 2026-05-29):
ai/services/github-workflow/SyncService.mjs:22 — 'resources/content/issue-archive/' path constant.
buildScripts/release/publish.mjs:246-247 — comment naming legacy issue-archive//pr-archive/ paths.
buildScripts/util/check-chore-sync.mjs:65-67 — path list including issue-archive/, pr-archive/.
ai/services/knowledge-base/source/TicketSource.mjs — JSDoc/comment referencing issue-archive (the runtime read at :67 is already correct archive/issues).
The Architectural Reality
Each ref must be V-B-A'd as non-load-bearing before removal (orphan-helper cross-test-audit discipline). Likely all dead because the issue-archive//pr-archive/ dirs no longer exist post clean-slate migration, but SyncService.mjs:22 and check-chore-sync.mjs:65 are path constants/lists that could still be consumed by a sweep loop — confirm the loop is a no-op against absent dirs before deletion, or whether removing the entry changes sweep behavior.
The Fix
- Verify each of the 4 refs is non-load-bearing (grep call-sites; confirm absent-dir behavior is a no-op).
- Remove the dead refs (clean-cut, no
@deprecated shim per ADR §5.6).
- Confirm no consumer (KB sync, release publish, chore-sync check) regresses.
Decision Record impact
aligned-with ADR 0004 §2.3 (retired primitives), §2.6 (clean-cut), §5.1/§5.6 (anti-bypass). Note: the import-scanner check-retired-primitives.mjs RETIRED_PRIMITIVES array (§2.6.1) targets imports, not path-string refs — do not force-fit these into it.
Acceptance Criteria
Out of Scope
- The release-index fix (sibling ticket).
- Doc/skill stale-reference cleanup (ADR §9 item 9 — separate surface; partially done in #11368).
- Any change to the live
archive/{type}/v*/chunk-N/ read paths (already correct).
Avoided Traps
- Deprecation theater (ADR §5.6): no
@deprecated shim — delete outright.
- Blind deletion: each ref V-B-A'd non-load-bearing first (not assumed dead because the dir is gone).
Related
- Parent epic: #11372 (ADR 0004)
- Config-fallback removal (distinct surface): #11363
- Authority: ADR 0004 §2.3, §2.6, §2.6.1, §5.1, §5.6
Retrieval Hint: query_raw_memories("issue-archive pr-archive retired primitive cleanup ADR 0004"); grep anchor: grep -rn "issue-archive|pr-archive" ai/ buildScripts/.
Context
ADR 0004 §2.3 retired the asymmetric
issue-archive/+pr-archive/primitives in favor of the universalarchive/{type}/v<X>/chunk-N/shape. The clean-slate migration (Epic #11372) removed those directories from disk, and #11363 removed the gh-workflow config fallbacks (archiveDir,defaultArchiveVersion). However, 4 source files still carry hardcodedissue-archive/pr-archivepath strings/comments that survived both. Operator-flagged during the ADR-0004 Phase-2 consumer audit 2026-05-29.The Problem
Dead references to retired primitives are substrate-decay debt: future sessions reading them may infer the old shape is still live — the exact substrate-bypass failure mode ADR 0004 §1.2/§5.1 anti-anchors against. Per ADR §1.3 (regeneratable cache) + §2.6 (clean-cut, no deprecation window), retired-primitive refs should be deleted, not preserved.
The 4 sites (verified on disk 2026-05-29):
ai/services/github-workflow/SyncService.mjs:22—'resources/content/issue-archive/'path constant.buildScripts/release/publish.mjs:246-247— comment naming legacyissue-archive//pr-archive/paths.buildScripts/util/check-chore-sync.mjs:65-67— path list includingissue-archive/,pr-archive/.ai/services/knowledge-base/source/TicketSource.mjs— JSDoc/comment referencingissue-archive(the runtime read at :67 is already correctarchive/issues).The Architectural Reality
Each ref must be V-B-A'd as non-load-bearing before removal (orphan-helper cross-test-audit discipline). Likely all dead because the
issue-archive//pr-archive/dirs no longer exist post clean-slate migration, butSyncService.mjs:22andcheck-chore-sync.mjs:65are path constants/lists that could still be consumed by a sweep loop — confirm the loop is a no-op against absent dirs before deletion, or whether removing the entry changes sweep behavior.The Fix
@deprecatedshim per ADR §5.6).Decision Record impact
aligned-with ADR 0004§2.3 (retired primitives), §2.6 (clean-cut), §5.1/§5.6 (anti-bypass). Note: the import-scannercheck-retired-primitives.mjsRETIRED_PRIMITIVES array (§2.6.1) targets imports, not path-string refs — do not force-fit these into it.Acceptance Criteria
issue-archive/pr-archiverefs removed from all 4 files.grep -rn "issue-archive|pr-archive" ai/ buildScripts/returns no live code refs (test/doc historical refs excluded).publish.mjs/check-chore-sync.mjs.Out of Scope
archive/{type}/v*/chunk-N/read paths (already correct).Avoided Traps
@deprecatedshim — delete outright.Related
Retrieval Hint:
query_raw_memories("issue-archive pr-archive retired primitive cleanup ADR 0004"); grep anchor:grep -rn "issue-archive|pr-archive" ai/ buildScripts/.