Skip to content
SQA Cockpit

ADR-0043 — ADR-number and standards-rule collision adjudication

ADRsUpdated 6 min readEdit on GitHub ↗

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:

SlotClaimant AClaimant B
ADR-0030PRD-13 §13.1.1 — "Import-direction rules: lib ← components ← systems"PRD-16 §16.1.1 — "Component-type registry: closed enum in code"
ADR-0033PRD-09 §09.1.2 — "LLM outputs evaluated against external rubric, not fixed strings"PRD-16 §16.1.2 — "Secret reference coordinate format"
ADR-0041PRD-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 or code-standards.md rule number, the PRD whose authoring sub-item lands first (commit on master) 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):

  1. 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.

  1. PRD scoping date. The earlier createdAt in the PRD's

frontmatter wins.

  1. 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.

SlotWinnerLoser → new slot
ADR-0030PRD-13 §13.1.1 (master-synthesis order; PRD-13 lands first per Wave A)PRD-16 §16.1.1 → ADR-0044
ADR-0033PRD-09 §09.1.2 (PRD scoping date 2026-05-09 vs PRD-16 2026-05-11)PRD-16 §16.1.2 → ADR-0045
ADR-0041PRD-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 47PRD-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 forReserved by
0030Import-direction rules (lib ← components ← systems)PRD-13 §13.1.1
0033LLM outputs evaluated against external rubricPRD-09 §09.1.2
0035System binding: roles, not system namesPRD-16 §16.1.3
0036Environment as a first-class scope, not a tagPRD-16 §16.1.4
0038Route body-undelivered to unresolvedPRD-24 — referenced as Accepted, file backfill pending
0041N-claim type shape (parallel NegativeClaim<I,E> vs reuse Claim<O,E>)PRD-22 §22.1.1
0042L4 transport beyond fetch() (Bright Data / Playwright)PRD-24 anchors §24
0044Component-type registry: closed enum in codePRD-16 §16.1.1 (renumbered from 0030 by this ADR)
0045Secret reference coordinate formatPRD-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.md becomes 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
    1. 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:

  1. 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.

  1. 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.

  1. **The reservation table at docs/adr/README.md is 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 #

"load-bearing standard" framing for code-standards.md rules.

/ 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.

Was this page helpful?