ADR-0129 The sequenced three, and the ordinal that was never broken
Executes the three rows ADR-0121's table left sequenced. Corrects ADR-0128.
#Context
ADR-0128 decided ADR-0121's last eleven rows and sequenced three of them, two because they move measured budgets and one because a check refused it.
The check that refused was self-description:check, on the radio retirement. 19 of 25 components state which number they are, radio sits mid-list, and removing it moved every ordinal after it. ADR-0128 wrote that up as a fourth instance of a check reading the wrong column, and said the question was whether the ordinal is a position in the array or a position in build order.
That was wrong, and the mechanism it asked for has existed since ADR-0092. tools/check-self-description.js builds the ordinal from a build order with removed components counted back in, out of a register in the config beside the components, and its own comment says why: *an ordinal in a description is when the component was built... without this every component built after them would have been told to renumber itself, rewriting a fact about the past to match a set that changed later.* Six components are already in that register, four of them retired by ADR-0121 itself.
The retirement failed because it was written as an object keyed by name and the register is an array of {component, position, layer, record}. A malformed register entry, read as a broken derivation.
#Decision
#radio retires into checkbox
The decision was never in doubt and ADR-0121's row carries it: the two records declare the same selector, .wr-choice, and the same 36 fixture elements answer to both. A radio is a choice whose box is round and whose selection is exclusive. The shape is the encoding, which is §4's field-first principle, and the exclusivity is a property of the group rather than of the control.
It joins the register at build position 14, between checkbox and modal, so every ordinal after it stays what it was. $interactiveNote moves to nine accepting input and twenty-three not, which is the one place ADR-0092 allows that count to be stated.
Scene 28 stays. It draws the round box, a glyph ADR-0028's shape argument turns on and one scene 27 does not cover, and its generator now inlines the surviving record's tier.
#An Arbiter declares its slot and not a level
accordion wrote data-wr-level="1" on its own root and tabs wrote data-wr-level="2" on its, while both records said layer: arbiter. §3 gives the allocation to the Emitter, data-wr-level is that declaration, and QueueItem has carried the reason in a comment since it was written: core's DECLARED_LAYERS holds three layers and Arbiter is not among them, so there is nothing for a level to declare and the budget attributes an Arbiter's pixels to the Scope's ground.
Both now take declareArbiter(), which emits the slot and no level. The slot stays because an Arbiter's chrome is governed like everything else the system draws (ADR-0009).
declareArbiter is a separate export rather than a parameter on declare, because the reason these two went wrong is that declare is the convenient helper and it was reached for.
#The rule is a check
no Arbiter writes a level on its own root, in discipline.test.js, over every record whose layer is arbiter. It reads six today and it was confirmed to fire: putting the accordion's declare(1) back turns it red and names the component and the file.
This is the check ADR-0128 said the closing row owed, and writing it is the difference between this record and a note.
#Consequences
No measured value moved, anywhere. 69 comparisons identical to six decimals with zero first records, themed MATCH at exact bound, 3331 scene-state pairs passing. That is the surprise worth stating: the two Arbiter roots painted nothing attributable, so their declarations were noise in the model rather than weight in it. Scene 41 still fails on salience — hidden and scene 56 still fails, each for its own reason.
It also explains why nothing caught them. A wrong declaration that moves no number is invisible to an engine that reads numbers, which is the same shape as ADR-0125's unread grants and ADR-0126's unrun test: three defects this week that every green check was structurally unable to see.
ADR-0121's table is executed as well as complete. Seventeen rows, every entry decided, and nothing left in the state that record refused.
ADR-0128's fourth-instance claim is withdrawn. There were three, not four. The correction is left in that record rather than edited out of it, because a record that quietly stops having been wrong is worth less than one that says where it was.
#Rejected
Renumber the 19 ordinals. What ADR-0128 assumed the retirement would cost. It would have rewritten nineteen true statements about the past to clear a check that was already built to prevent exactly that, and it would have taken the register ADR-0092 added out of use without removing it.
Let declare take an optional level so one helper serves both. The failure mode is reaching for the default, and an optional argument keeps the default reachable. Two names cost one line and make the wrong one require a deliberate choice.
Drop the slot along with the level on an Arbiter. It would exempt an Arbiter's chrome from the budget, which is ADR-0009's opposite. An Arbiter holds no allocation; its ink still lands on a Scope's ground and is still counted there.
Check the fixtures rather than the source. The markup is where the defect lands, so it is the tempting place to look. The source is where it is introduced, and a source check names the component and the file a reader has to open. The fixtures are a build output of the thing being checked.