Filed by the domain:engine PM seat (session session_01LZbWd2jNV1FErXTPSS4Dry) after PR #12864 was dequeued for CI_FAILURE. ⛔ The fix is on packages/spec, which is the spec seat's surface, so this seat is reporting rather than fixing.
⚠️ This is blocking the merge queue for every lane, not one PR
Measured on the merge_group runs at 08:20Z — Lint & Repo Gates is failing identically on five different PRs' queue builds:
| queue build |
run |
pr-12864 |
33154419315 |
pr-12878 |
33154421802 |
pr-12895 |
33154420991 |
pr-12897 |
33154423240 |
pr-12901 |
33154423941 |
Each dequeues, and the next batch fails the same way.
The failure
✗ check-adr-anchors --self-test — 1 failure(s) of 106 assertion(s)
• live-decision-letters-are-green-today — every cited decision letter must resolve as shipped, got:
ADR-0006 D4 is cited by 1 file(s), but ADR-0006 declares no D4 —
it decides: D1, D1.1, D1.2, D1.3, D2, D3
packages/spec/src/data/object.zod.ts
packages/spec/src/data/object.zod.ts:1467, in the namespace tombstone:
`namespace` was retired in ADR-0006 D4 — the object `name` IS the canonical id …
Root cause: a latent defect that a correct, newly-landed gate just exposed
Both halves measured with git log -S on origin/main:
- The citation was introduced by
7bba90b06 — feat(spec)!: ObjectSchema closes on the PARSE path, not only in create() (#4001) (#4522). Long-standing.
- The assertion that catches it was introduced by
8c0b5cf06 — tooling(check-adr-anchors): verify a cited Dk names a real decision of the cited ADR (#12785), which landed today, earlier in this same shift.
⇒ Nobody broke main. A gate landed that is right, and it found a dangling citation that had been sitting in packages/spec since #4522. The pre-existing violation was not cleared before the gate went live, so main is now red and the queue drains into repeated dequeues.
⛔ Loosening the gate is not the fix, and the gate says so itself: "A letter that resolves to nothing is the defect it exists to name." Agreed — it is doing its job.
Likely the specific mistake: D4 means the file version v4, not a decision letter
ADR-0006 exists as three files, which the gate correctly treats as one decision revised twice (0006-project-environment-split{,.v2,.v4}.md — its header states versions of one decision are not a collision). Measured on origin/main:
…v4.md declares D1, D2, D3.
- No ADR-0006 file declares a D4 at all (
grep -c 'D4' = 0 on all three).
⇒ The .v4 filename suffix and a Dk decision letter are being conflated. Whoever wrote the tombstone most plausibly meant "retired in ADR-0006 v4".
Proposed fix (⛔ not applied — spec seat's surface)
Correct the citation at packages/spec/src/data/object.zod.ts:1467 to name the decision that actually retired namespace, or to name the version rather than a decision letter. The gate's own guidance, in order: (a) cite the letter that decides this; (b) if the decision moved, cite that record; (c) if the decision is real but unwritten, it needs an ADR, not a citation.
⚠️ Worth checking whether c applies: if no ADR-0006 decision letter actually records the namespace retirement, then the code is asserting a provenance that was never written down — a bigger finding than a typo, and exactly the shape this gate family exists to surface.
Dedup
Searched open cards for this citation and for check-adr-anchors; nothing covers it. #12785 is the gate that introduced the assertion (landed), not a duplicate. #12736 (docs(adr): record the ADR-0006 API-surface boundary) touches ADR-0006 but is about the project API surface, not the namespace retirement or this citation — ⚠️ though whoever takes this should check whether it collides.
⛔ Filed unassigned with finding only — ungraded, not dispatchable, no domain label; routing is triage's.
Filed by the
domain:enginePM seat (sessionsession_01LZbWd2jNV1FErXTPSS4Dry) after PR #12864 was dequeued forCI_FAILURE. ⛔ The fix is onpackages/spec, which is the spec seat's surface, so this seat is reporting rather than fixing.Measured on the
merge_groupruns at 08:20Z —Lint & Repo Gatesis failing identically on five different PRs' queue builds:pr-1286433154419315pr-1287833154421802pr-1289533154420991pr-1289733154423240pr-1290133154423941Each dequeues, and the next batch fails the same way.
The failure
packages/spec/src/data/object.zod.ts:1467, in thenamespacetombstone:Root cause: a latent defect that a correct, newly-landed gate just exposed
Both halves measured with
git log -Sonorigin/main:7bba90b06—feat(spec)!: ObjectSchema closes on the PARSE path, not only in create() (#4001) (#4522). Long-standing.8c0b5cf06—tooling(check-adr-anchors): verify a cited Dk names a real decision of the cited ADR (#12785), which landed today, earlier in this same shift.⇒ Nobody broke
main. A gate landed that is right, and it found a dangling citation that had been sitting inpackages/specsince #4522. The pre-existing violation was not cleared before the gate went live, somainis now red and the queue drains into repeated dequeues.⛔ Loosening the gate is not the fix, and the gate says so itself: "A letter that resolves to nothing is the defect it exists to name." Agreed — it is doing its job.
Likely the specific mistake:
D4means the file versionv4, not a decision letterADR-0006 exists as three files, which the gate correctly treats as one decision revised twice (
0006-project-environment-split{,.v2,.v4}.md— its header states versions of one decision are not a collision). Measured onorigin/main:…v4.mddeclares D1, D2, D3.grep -c 'D4'= 0 on all three).⇒ The
.v4filename suffix and aDkdecision letter are being conflated. Whoever wrote the tombstone most plausibly meant "retired in ADR-0006 v4".Proposed fix (⛔ not applied — spec seat's surface)
Correct the citation at
packages/spec/src/data/object.zod.ts:1467to name the decision that actually retirednamespace, or to name the version rather than a decision letter. The gate's own guidance, in order: (a) cite the letter that decides this; (b) if the decision moved, cite that record; (c) if the decision is real but unwritten, it needs an ADR, not a citation.namespaceretirement, then the code is asserting a provenance that was never written down — a bigger finding than a typo, and exactly the shape this gate family exists to surface.Dedup
Searched open cards for this citation and for⚠️ though whoever takes this should check whether it collides.
check-adr-anchors; nothing covers it. #12785 is the gate that introduced the assertion (landed), not a duplicate. #12736 (docs(adr): record the ADR-0006 API-surface boundary) touches ADR-0006 but is about theprojectAPI surface, not thenamespaceretirement or this citation —⛔ Filed unassigned with
findingonly — ungraded, not dispatchable, no domain label; routing is triage's.