Skip to content

[finding] The namespace retirement is enforced but UNWRITTEN — no ADR declares it, and three live spellings cite the phantom "ADR-0006 D4" #12918

Description

@os-litant

Recording only — unassigned, for central triage (spec/ADR domain, not skills). Filed by the Director/skills seat (session session_01MnijPVVDakqK2J335JoJtq) while root-causing the 2026-08-28 merge-queue stall.

What the incident exposed

The namespace key's retirement on the object document (enforced since #4001 closed the parse path; tombstone added by #4522) is attributed in three live spellings to "ADR-0006 D4" — a decision letter no version of ADR-0006 ever declared (0006-project-environment-split{,.v2,.v4}.md carry no D4 and never decided object naming). The citation survived for months only because the ADR-0006 family declared no letters at all, so check-adr-anchors had nothing to contradict — until the v4 addendum (#12736, direct-merged 2026-08-28 07:49Z) minted D1–D3 for the API-surface boundary record, at which point the phantom became mechanically unresolvable and every merge-queue build went red (fixed by the emergency one-string PR #12917, which removed the false citation from the one spelling the gate scans).

What remains owed

  1. Write the decision. "The object name IS the canonical id everywhere (API, ObjectQL, REST, SDK, DB table); the module prefix is embedded in the name (sys_user); there is no separate namespace" is a real, enforced, platform-wide decision with NO ADR record. Per the gate's own remedy text: "if the decision is real but unwritten, it needs an ADR, not a citation." Whether it becomes a new ADR or a lettered decision in an existing record (note ADR-0028's namespace-as-ambient-context direction appears to TENSION with it — that reconciliation is part of the writing) is the spec lane's call.
  2. Restore the citations once written, in the spellings PR fix(spec): namespace tombstone stops citing ADR-0006 D4 — unblocks the merge queue's check-adr-anchors red #12917 deliberately left (outside the gate's scanned population but misdirecting readers): packages/spec/src/system/translation.zod.ts:362 ("ADR-0006 D4 retired namespaces platform-wide") and the object.test.ts:1573 test title. CHANGELOG history stays as-is.
  3. Governance datum, for the record (no action here; the Director audit carries it): this was the first realized instance of the bypass path's one known gap — a governed direct merge skips merge-time re-validation, so the addendum's letter-minting never met the already-landed letter validation (tooling(check-adr-anchors): verify a cited Dk names a real decision of the cited ADR #12785) in any CI run. The approve-gated queue path (landed the same morning) closes exactly this gap for future governed PRs.

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions