Skip to content

ADR-0069: The gaps read carries a judged count, so an empty list cannot claim a judgement that never happened

Status: Accepted — amends ADR-0068, which stands Date: 2026-09-20

Decisions

D-145 The Reconciliation gaps read carries how many pairs the document has, and the every-pair-judged wording is used only where there were pairs to judge

A document with no pairs says that instead. The count is a number on the existing read, not a new kind of answer.

What this amendment touches

  • ADR-0068 — D-144 stands. The two facts it requires the read to carry — whether the document holds any Restriction, and whether any span has been selected from it — are unchanged, as is its rule that the page composes no claim the payload does not carry. What changes is that those two facts turn out not to be sufficient for one of the three causes they were meant to separate: both can be true while no pair exists. D-145 adds the third fact that makes the judged case decidable. ADR-0068's own rule is what condemns the gap — this is that rule applied to itself, not a retreat from it. ADR-0068 is Accepted and is not edited.

Context

EVERY_PAIR_JUDGED is vacuously true for a document whose only shown span is the Restriction's own span. A Restriction is never paired with itself, so no pair exists; holdsRestrictions is true, holdsSelectedSpans is true, gaps is empty — and the page states that every pair has been judged on a document where nothing was judged.

This is the same defect D-144 removed, surviving inside the fix. ADR-0068 replaced a sentence that asserted a judgement the payload could not evidence; this is a narrower sentence doing the same thing, on a narrower document. The two booleans separate the three causes correctly everywhere except the one place where both are true and neither is enough.

It matters because of what the sentence claims. A Reconciliation names the curator who made it (D-49); "every pair has been judged" is a statement about human judgement, and on this document no human made one. The gate agrees with the page rather than catching it: corpus_check.py passes such a document, because there is genuinely nothing unreconciled in it.

The case is reachable in ordinary curation. A curator who selects the Restriction's own passage — the Section 7 storage passage in the nitrile case is exactly such a span — and has selected nothing else yet, is in it.

Decision

The gaps read carries the number of (Restriction, selected span) pairs the document has. The every-pair-judged wording is available only when that number is greater than zero; a document with no pairs is stated as having none.

Rejected options

  • A fifth coverage member rather than a count — rejected because the case is not a new kind of answer, it is the same answer with a number behind it. A fifth member would make the union carry a distinction a reader of the four could not have predicted, and every consumer would have to learn it to stay exhaustive.
  • Leaving it, and wording the page around it — rejected because it weakens the sentence on every document in order to stay true on a rare one, and it leaves the client hedging a claim the server could simply have qualified. The hedge is also the shape ADR-0068 refused: a page choosing its words to cover a payload that did not determine the answer.
  • Ruling the case a curation mistake rather than a state — rejected because it is reachable, corpus_check.py passes such a document, and a ruling that a reachable state is an error still leaves the page asserting something false on the day it is reached. Declaring a state invalid does not stop a curator arriving in it.

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 say every pair was judged on a document with no pairs, do not add a fifth member to the union instead of reading the count, and do not move the zero-pair test onto the client — the count is what the server sends precisely so the page does not compute it.

Consequences

What becomes true. The every-pair-judged sentence is true wherever it appears, including on the document that used to be its worst case. ADR-0068's rule now holds of ADR-0068's own fix.

What this costs. A third fact on the read, and a payload shape both repositories agree on again — the seam fixture is regenerated a second time in one day. The count is a number the page must not display; it exists to gate a sentence, not to be shown.

What is closed off. The fifth coverage member, and any client-side test for the empty-document case.

Coverage

UpstreamLanded inEvidenceNote
D-144D-145the two facts D-144 requires are both true in the vacuous case, which is what this ADR adds the third fact to settleADR-0068, amended here and standing
D-49D-145the wording asserts a named curator's judgement, which is the claim that must not be made where no pair was judgedADR-0022
D-44D-145the pair is the unit the reconciliation rule is enforced over, so counting pairs is counting what D-44 asks aboutADR-0022; a Restriction is never paired with itself, which is why the count can be zero
D-124D-145the server decides the value and the client derives nothing from it; the count is sent rather than computed on the pageADR-0053