ADR-0043 — ADR-number and standards-rule collision adjudication
ADR-0043 — ADR-number and standards-rule collision adjudication #
- Status: Accepted
- Date: 2026-05-16
- Deciders: Natan
- Source: 2026-05-16 documentation drift sync (see
CHANGELOG.md ↗ [Unreleased] §"documentation drift sync"). The drift audit surfaced four reservation collisions across in-flight PRDs that — until this ADR — were tracked only as side-by-side rows in docs/adr/README.md §"Reserved / planned" and docs/prds/00-tracker.md.
Context #
Four ADR numbers and one code-standards.md rule number were reserved by two different PRDs each. None of the reserved slots had files yet, so the conflicts were latent — but two of the PRDs (PRD-13 and PRD-16) are scheduled for the next development wave, and the first one to author its ADR would have silently forced the second to renumber post-hoc, breaking back-references.
Collisions surfaced by the drift sync:
| Slot | Claimant A | Claimant B |
|---|---|---|
| ADR-0030 | PRD-13 §13.1.1 — "Import-direction rules: lib ← components ← systems" | PRD-16 §16.1.1 — "Component-type registry: closed enum in code" |
| ADR-0033 | PRD-09 §09.1.2 — "LLM outputs evaluated against external rubric, not fixed strings" | PRD-16 §16.1.2 — "Secret reference coordinate format" |
| ADR-0041 | PRD-23 §23.2.1 — "sqa_runs vs sqa_sweep_summary table split" | PRD-22 §22.1.1 — "N-claim type shape: parallel NegativeClaim<I,E> vs reuse Claim<O,E>" |
Rule 47 (code-standards.md) | PRD-13 §13.1.2 — "Concurrency code lives in named modules" (warn) | PRD-16 §16.2.1 — "Probes accept config, never read env directly" (fail) |
This ADR adjudicates the four collisions and pins a procedural rule so future PRDs can detect and resolve reservation conflicts at scoping time rather than at authoring time.
Decision #
Procedural rule #
First-merged keeps the number. When two PRDs reserve the same ADR orcode-standards.mdrule number, the PRD whose authoring sub-item lands first (commit onmaster) keeps the slot. The later PRD renumbers to the next free slot at the bottom of the respective sequence, updates its body and tracker row in the same commit, and adds a "Reserved / planned" entry pointing at the new slot.
Tie-breakers (in order):
- Master synthesis ship order. Where
docs/research/2026-05-09-master-synthesis.md pins a sequence (e.g. PRD-13 before PRD-10 at lines 371–395), the earlier-shipped PRD wins by default.
- PRD scoping date. The earlier
createdAtin the PRD's
frontmatter wins.
- Smaller surface. The PRD whose ADR has fewer sub-items
referencing it wins (less downstream renumbering).
This is recorded as Rule 44 in docs/concepts/code-standards.md ↗ so PRD reviewers see the constraint at scoping time. (Rule 44 is not the same kind of rule as 1–43 / 46 — it constrains PRD authoring, not code. The rule still belongs in code-standards.md because it is part of the "how we write things down" discipline covered by ADR-0018.)
Concrete adjudication for the four open collisions #
Decisions follow the procedural rule above. Tie-breakers cited in parentheses.
| Slot | Winner | Loser → new slot |
|---|---|---|
| ADR-0030 | PRD-13 §13.1.1 (master-synthesis order; PRD-13 lands first per Wave A) | PRD-16 §16.1.1 → ADR-0044 |
| ADR-0033 | PRD-09 §09.1.2 (PRD scoping date 2026-05-09 vs PRD-16 2026-05-11) | PRD-16 §16.1.2 → ADR-0045 |
| ADR-0041 | PRD-22 §22.1.1 (PRD-23 §23.2.1 already shipped without authoring an ADR — the table-split decision is documented inline at src/runners/sweep/sink.ts and PRD-23 §23.2 Open Question 1 — so PRD-23's reservation is released) | n/a — PRD-23 releases; PRD-22 keeps ADR-0041 |
| Rule 47 | PRD-13 §13.1.2 (master-synthesis order; smaller surface — one check vs three) | PRD-16 §16.2.1 → Rule 48, §16.2.2 → Rule 49, §16.2.3 → Rule 50 |
After this adjudication, the post-state reservation table is:
| # | Reserved for | Reserved by |
|---|---|---|
| 0030 | Import-direction rules (lib ← components ← systems) | PRD-13 §13.1.1 |
| 0033 | LLM outputs evaluated against external rubric | PRD-09 §09.1.2 |
| 0035 | System binding: roles, not system names | PRD-16 §16.1.3 |
| 0036 | Environment as a first-class scope, not a tag | PRD-16 §16.1.4 |
| 0038 | Route body-undelivered to unresolved | PRD-24 — referenced as Accepted, file backfill pending |
| 0041 | N-claim type shape (parallel NegativeClaim<I,E> vs reuse Claim<O,E>) | PRD-22 §22.1.1 |
| 0042 | L4 transport beyond fetch() (Bright Data / Playwright) | PRD-24 anchors §24 |
| 0044 | Component-type registry: closed enum in code | PRD-16 §16.1.1 (renumbered from 0030 by this ADR) |
| 0045 | Secret reference coordinate format | PRD-16 §16.1.2 (renumbered from 0033 by this ADR) |
What this ADR is, what it is not #
Is: a one-time adjudication of four specific live collisions and a procedural rule to prevent future ones.
Is not: a renaming of an already-merged ADR. Every winner above holds an unmerged reservation; the renumbering is cheap because no ADR file or downstream code reference exists yet.
Consequences #
Positive.
- PRD-09, PRD-13, PRD-16 can author their ADRs in parallel without
number conflicts.
- Future PRD scoping has a rule to follow at reservation time.
docs/adr/README.mdbecomes the canonical reservation registry
(was already, but now with adjudication codified).
Negative.
- PRD-16's PRD body and tracker rows need editing in the same
commit as this ADR. Touches 4 ADR-number references and 3 rule- number references in PRD-16. Mechanical, low risk.
- PRD-23 needs a small edit removing its ADR-0041 reservation
(it never authored it; that reservation was speculative per PRD-23 §23.2 Open Question 1).
- Renumbering rule favors landing-order over scoping-order in step
- This is a deliberate choice — landing order is the
observable fact; scoping order is intent. A PRD that has been scoped for months but hasn't shipped should not block one actively shipping.
Falsifiability #
This ADR is falsified — and supersedable — if any of the following becomes true:
- Procedural rule produces a worse outcome twice. If, in two
distinct future collisions, "first-merged keeps the slot" forces a much larger PRD to renumber more downstream references than its smaller competitor, the rule's heuristic is wrong. The tie-breakers in §"Procedural rule" exist to mitigate this, but if they aren't enough, the rule should flip to "fewer downstream refs wins" with landing-order as the tie-breaker.
- A merged ADR's number ever needs to change. This would mean
the "first-merged keeps" rule isn't load-bearing — at which point the convention should add a numbering-rewrite tool and accept that ADR numbers are not stable.
- **The reservation table at
docs/adr/README.mdis wrong twice
in a row** (someone authored an ADR with a number that was reserved). Means the table is not getting read at scoping time. Either tooling (CI check on PR adding an ADR file) or convention change.
See also #
- ADR-0018 — the
"load-bearing standard" framing for code-standards.md rules.
- ADR-0028 — the deferred-work
/ tracker discipline that surfaced the collisions during the doc-sync sweep.
docs/adr/README.md§"Reserved / planned" — the updated registry
after this adjudication.
docs/research/2026-05-09-master-synthesis.md§"Ship order"
(lines 371–395) — the source for tie-breaker 1.