Found while implementing #9592 (the ADR-NNNN Dk decision-letter check in scripts/check-adr-anchors.mjs, PR #12785). Filed as a finding, not fixed there: the remedy is an edit to docs/adr/**, which is governed surface routed to the maintainer's own merge per #6741, and the gate deliberately reports rather than forces it.
Measured on origin/main @ 1246b4cf2
docs/adr/ holds 131 files under 125 distinct ADR numbers. Grouping every number by whether any of its records declares a machine-readable decision letter, by the four grammars the corpus actually uses (### Dk heading, **Dk —** bold lead, | Dk | decision-table cell, and a Dk heading's own top-level list declaring Dk.1 / Dka):
numbers with a decision-letter index : 58
numbers with NO decision letters : 67
The 67 number their decisions topically (### Schema, ### Hostname routing — ADR-0006, ADR-0014, ADR-0024, ADR-0081) or ordinally (### 1. A turn is a commit, ### 2. Commits are atomic — ADR-0067 and ~20 others), never as Dk.
Why it matters now
The new check has to report a third verdict for them — "cannot verify" — because there is no index to resolve against. On the anchored surface alone that is 37 citations across 12 letter/file sites and 6 ADR numbers:
ADR-0006 D4 1 site packages/spec/src/data/object.zod.ts
ADR-0014 D2 1 site packages/objectql/src/engine.ts
ADR-0024 D4 2 sites packages/plugins/plugin-auth/src/{auth-manager,auth-plugin}.ts
ADR-0024 D5.2 2 sites packages/platform-objects/src/identity/sys-member.object.ts, packages/plugins/plugin-auth/src/invitation-role-cap.ts
ADR-0067 D2 4 sites packages/metadata-protocol/src/protocol.ts, packages/objectql/src/engine.ts, packages/spec/src/contracts/objectql-engine.ts, scripts/adr-anchors/packages__spec__src__contracts__objectql-engine.ts.json
ADR-0081 D1 2 sites packages/platform-objects/src/identity/sys-member.object.ts, packages/plugins/plugin-auth/src/auth-plugin.ts
Each of those citations is a promise a reader cannot collect: ADR-0067 D2 is meaningful (that ADR's own amendment calls its second decision "the D2 join"), but the record never writes D2, so following the citation means counting headings and hoping.
The gap is not the citation's fault and not the gate's: it is that the corpus has two decision-numbering conventions and the citation convention only fits one.
Options, for triage
- Give the cited records decision letters. Narrowest possible edit: only the 6 records above are actually cited by letter today. Governed-surface PR, maintainer-merged. Converts 37 unverifiable citations into checked ones and shrinks the note toward empty.
- Respell the citations to name what the record does say (a section title, a link), so no letter is claimed. Touches code, not ADRs.
- Leave it. The note is honest and counted; it just never shrinks.
An ordinal-to-letter inference in the gate (D2 = the 2nd ### N. heading) was considered while building #9592 and rejected: the record never writes D2, so the mapping would be the gate's invention rather than the document's statement, and a gate that manufactures the index it checks against cannot fail honestly.
Re-check
node scripts/check-adr-anchors.mjs # the note prints under the OK line
Refs: #9592 (the check) · PR #12785 (where the note ships) · #6741 (governed-surface routing for docs/adr/**)
Generated by Claude Code
Found while implementing #9592 (the
ADR-NNNN Dkdecision-letter check inscripts/check-adr-anchors.mjs, PR #12785). Filed as a finding, not fixed there: the remedy is an edit todocs/adr/**, which is governed surface routed to the maintainer's own merge per #6741, and the gate deliberately reports rather than forces it.Measured on
origin/main@1246b4cf2docs/adr/holds 131 files under 125 distinct ADR numbers. Grouping every number by whether any of its records declares a machine-readable decision letter, by the four grammars the corpus actually uses (### Dkheading,**Dk —**bold lead,| Dk |decision-table cell, and aDkheading's own top-level list declaringDk.1/Dka):The 67 number their decisions topically (
### Schema,### Hostname routing— ADR-0006, ADR-0014, ADR-0024, ADR-0081) or ordinally (### 1. A turn is a commit,### 2. Commits are atomic— ADR-0067 and ~20 others), never asDk.Why it matters now
The new check has to report a third verdict for them — "cannot verify" — because there is no index to resolve against. On the anchored surface alone that is 37 citations across 12 letter/file sites and 6 ADR numbers:
Each of those citations is a promise a reader cannot collect:
ADR-0067 D2is meaningful (that ADR's own amendment calls its second decision "the D2 join"), but the record never writesD2, so following the citation means counting headings and hoping.The gap is not the citation's fault and not the gate's: it is that the corpus has two decision-numbering conventions and the citation convention only fits one.
Options, for triage
An ordinal-to-letter inference in the gate (
D2= the 2nd### N.heading) was considered while building #9592 and rejected: the record never writesD2, so the mapping would be the gate's invention rather than the document's statement, and a gate that manufactures the index it checks against cannot fail honestly.Re-check
Refs: #9592 (the check) · PR #12785 (where the note ships) · #6741 (governed-surface routing for docs/adr/**)
Generated by Claude Code