Appearance
ADR-0085: Restating a span the replacement asked to keep is its own coded refusal
Status: Accepted — amends ADR-0084, which stands Date: 2026-09-20
Decisions
D-178 A span named as kept and also stated as text is refused under a code of its own
A supersession names the spans it carries forward from the row it replaces and states the rest as text (D-169). Naming a span as kept and supplying text for the same span is refused, and the refusal carries its own code rather than joining any of the six ADR-0084 enumerates.
This makes seven supersede refusals and eleven across the two commands, where ADR-0084's Consequences counted six and ten. That count is the thing this ADR corrects; nothing else in ADR-0084 moves.
Context
ADR-0084 was accepted on 2026-09-20 and D-176 enumerated the supersede refusals as six: a row that is not there, one already superseded, a different position, a different document, a span the replaced row was not carrying, and a replacement that changes nothing.
Writing the request model found a seventh state that is none of those. The keep list and the text keys are two different ways to state the same span, so a request can say both — keep the passage, and here is the passage. Every reading of that request is wrong:
- Taking the text silently discards an explicit instruction to keep, and produces a new Source Span the Curator did not ask for, carrying the unjudged pairs that come with one.
- Taking the keep list silently discards stated text, which for a passage that genuinely changed means the correction did not happen and the Curator is told it did.
- Refusing it without a code leaves a curator surface to word a 400 it cannot tell from a blank field, which is the situation ADR-0062 exists to end.
It is not a blank required field. D-153 settles that boundary: an input "nullable in itself and required by the value beside it" is a rule of the domain and names itself, and the no-code case is an input that is simply missing. This is the same shape as CAVEAT_ON_NOT_APPLICABLE, which is coded for exactly this reason — a value that is legal alone and refused beside another.
Decision
KEPT_SPAN_RESTATED is a 400 on the selection command, joining the table ADR-0084's D-176 puts the supersede refusals in and deriving everything from it the way every other code does (D-136).
Rejected options
- Folding it into
SPAN_NOT_ON_SUPERSEDED_SELECTION— rejected. That code says the replaced row does not carry the span named; this one says it does and the request stated it twice. They are different mistakes and a Curator does something different about each, which is the test D-136 sets for whether a code earns its place. One wording covering both would have to be vague enough to describe neither. - Leaving ADR-0084's count stale and implementing eleven anyway — rejected. A ruling whose Consequences miscount the thing it rules is the drift this repository keeps catching in its own artifacts, and the 2026-09-20 grill that produced ADR-0075 found four of them in one sitting. Recording the correction costs one short ADR.
- Editing ADR-0084's Consequences — rejected, and not available: an Accepted ADR is never edited, and D-83 draws the one exception at Coverage Note cells, which are bookkeeping about a decision rather than the decision.
- Expressing the impossibility in the schema instead, as a union of two request shapes — rejected. TypeBox can express it, and the cost is that the selection body stops being one object a curator surface can build and becomes a discriminated pair whose two halves differ in four keys. A refusal a person reads is worth more here than a state a schema forbids, and the whole command is loopback-only with one caller.
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 merge this code into another to get the count back to ten, and do not downgrade it to a bare 400 on the grounds that it looks like a malformed request. It is a rule about two keys that disagree, and rules name themselves here.
Consequences
What becomes true. Every way a supersession can be self-contradictory has a code, so the curator surface words all of them and none arrives as an unexplained 400.
What this costs. Eleven codes cross to the frontend rather than ten: seven on the selection command and four on retraction, each needing Thai wording and at least one golden fixture case.
What is closed off. Silently preferring either the keep list or the stated text.
Coverage
No upstream finding lands here. This came from implementing ADR-0084 and finding a state its enumeration did not reach — the same way ADR-0021 and ADR-0038 recorded numbering gaps found while working rather than while deciding (D-104).
| Upstream | Landed in | Evidence | Note |
|---|