Skip to content

[finding] 67 of 125 ADR numbers declare no machine-readable decision letters — 37 live ADR-NNNN Dk citations into 6 of them can never be verified #12786

Description

@claude

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

  1. 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.
  2. Respell the citations to name what the record does say (a section title, a link), so no letter is claimed. Touches code, not ADRs.
  3. 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

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions