Skip to content

ADR-0044: A Coverage row records what drove a decision, not that the author read the research

Status: Accepted Date: 2026-09-10

Decisions

D-104 An ADR whose decision was not driven by a research finding ships an empty Coverage table, and that is correct rather than incomplete

A Coverage row exists to record what drove a decision. It is not evidence that the author consulted the research, and it must never be added to make a table look complete. Where no finding drove the ruling — because adversarial review did, or internal consistency, or a working practice — the table is empty and says so.

Corrections applied

Five rows, under D-83's permission to edit Coverage cells in an Accepted ADR.

WhereActionWhy
ADR-0043, R-19 → D-103removedD-103 names which control bounds exposure. R-19 concerns unquantified benefits. No relation.
ADR-0031, R-32 → D-67removedR-32 is about SDS data being hard to understand; D-67 is retrieval confidence. ADR-0012 already landed R-32 in D-16 and D-17, and the row's own Note admitted it.
ADR-0032, R-03 → D-73removedR-03 is superseded by R-22 and R-23, and the claim failed on its own terms: eviction is a browser-storage property (D-42), not a property of deployment venues.
ADR-0033, R-03 → D-77removedSame, twice over: superseded upstream, and D-77 grounds the specified state in D-66 and Seam 5 rather than in any venue list.
ADR-0033, R-19 → D-77sharpened, not removedThe link is real once stated accurately. R-19's surviving half is that the claims carry no thresholds and "cannot be read off the source" — so a number the spec needs comes from the owner. That is exactly D-77's ruling about the cap.

Every finding remains covered elsewhere after the removals: R-19 by ADR-0001 and ADR-0017, R-32 by ADR-0012 and ADR-0037, R-03 by ADR-0005.

Context

Six instances of one act, five of them found by review rather than by any gate:

  1. ADR-0032 citing R-03 for D-73
  2. ADR-0033 citing R-03 for D-77
  3. ADR-0033 citing R-19 for D-77
  4. ADR-0031 citing R-32 for D-67
  5. ADR-0031 citing a study objective R-24 had deleted — ADR-0039's subject
  6. ADR-0043 citing R-19 for D-103, written while resolving the ticket immediately before this one

The sixth is the useful one. It was written by an author who had read the finding describing this exact defect, in a session whose previous act was fixing an instance of it. That rules out carelessness about a particular id and rules out ignorance of the pattern. What remains is the pull of the empty cell: a Coverage table with no rows looks like unfinished work, so the author reaches for the nearest plausible finding.

No gate reaches this. coverage_check.py checks presence. IDSTATUS (ADR-0035) checks currency. Neither reads the Evidence cell, and ADR-0039 already recorded that no check can tell whether a sentence cites a finding that says what the sentence claims. This is caught by adversarial review or not at all.

So the intervention has to be at the moment of writing, which is why this ADR is accompanied by one sentence in docs/agents/templates/adr.md — the file an author actually has open while filling in the table. The ADR is where the rule is binding and where the count survives; the template is where it is read.

ADR-0036 and ADR-0038 already ship empty Coverage tables. The convention existed and was never stated, so each author had to decide alone whether an empty table looked like a mistake.

Rejected options

  • Fix the five rows and write no rule — rejected on the count. Two instances is a habit; six, including one written an hour after fixing another, is a structural pull that individual care has demonstrably failed to resist.
  • A template note without an ADR — rejected. ADR-0038 declined to rule id-allocation as a working practice, correctly, because that habit had two instances and no consequence for what a reader believes. This corrupts the traceability artifact the harness rests on, and a count kept in a template comment decays.
  • An ADR without the template note — rejected. It would be read by people auditing rather than by people writing, and the writing is where the row gets invented.
  • Keep the stretched rows but mark the Evidence as an analogy — rejected. A row saying "cited by analogy" still counts as coverage to anyone skimming, and the gate cannot tell the difference. It preserves exactly the appearance the row was added to create.
  • Build a gate — not available. The check would be whether a cited finding supports the claim made about it, which is a reading task, not a parsing one.

This ruling may not be re-decided

If a change contradicts this ADR: stop and raise it. Do not implement over it.

Specifically: do not add a Coverage row because a table looks empty; do not reach for a finding that is about the same area as a decision and call it upstream — proximity is not causation; and do not read D-104 as licence to skip Coverage where a finding genuinely did drive the ruling, which is the common case and the reason the table exists.

Consequences

What becomes easy. An empty Coverage table is now a normal outcome with a name, so the next author writing an internally-motivated ADR has nothing to resist.

What becomes hard. Nothing mechanical. This rule is enforced by reading, and it will be broken again — the honest expectation is that the next adversarial pass finds a seventh instance and that the count in this ADR is what makes it recognisable as the same defect rather than a fresh one.

What the count is for. Six instances across four days, by one author, with the pattern documented between the fifth and the sixth. Anyone tempted to explain this as inattention should read the sixth's timing first.

Coverage

No upstream finding lands here. This ruling came from adversarial review of the repository's own Coverage tables, which is precisely the case D-104 describes — the table is empty because nothing drove it but the review, and leaving it empty is the rule demonstrating itself.

UpstreamLanded inEvidenceNote