Skip to content

[finding] The merge queue is blocked repo-wide: check-adr-anchors is red on mainobject.zod.ts cites ADR-0006 D4, which no ADR-0006 file declares #12913

Description

@os-zhuang

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 7bba90b06feat(spec)!: ObjectSchema closes on the PARSE path, not only in create() (#4001) (#4522). Long-standing.
  • The assertion that catches it was introduced by 8c0b5cf06tooling(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.

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions