Skip to contentWolf-Rayet

Decision records

ADR-0081 Section C is where the tier axes decide nothing, six rows refused, and the collapse is already inside the built half

Acceptedone finding retracted by ADR-0083, which measured the claim this record reasoned about. select does not carry D5: a closed select's options are not hidden, they were never in the frame, because the frame is what declares itself into it and no <option> carries a data-wr-* attribute. The wrong sentence is left legible below and marked where it stands.2026-09-06Phase 4, reopened

#Context

ADR-0021's section C is the form block: thirteen rows, seven built and six to build. It is the largest part of the roster never audited as a group, and every audit run this phase has removed something — ADR-0057 took three rows, ADR-0060 one, ADR-0061 one, ADR-0067 one, ADR-0068 one, ADR-0073 one and ADR-0076 one. Section B's audit removed rows on evidence that was available before it ran, which is the argument for running this one before building rather than after.

§12 gives the procedure: extract the rule first, then compare what remains against a built component on eight dimensions, six of them tier axes and two in the contracts.

#The first finding is about the section rather than any row in it

Run the six tier axes over all thirty-seven built components and they partition into eight buckets. Twelve of section C's thirteen rows fall into one of them, and the bucket is already the largest in the system:

"emitter" | [1,2,3] | interactive | no vouch | no ack | no persist
  → input-field, button, checkbox, radio-button, text-area, select, number-input

Every control this section proposes lands there too: a toggle, a dropdown, a search field, a slider and a date picker are all interactive Emitters stopping at Directed, and the section's own prose says why in a sentence that has stood since the roster reopened — *"every control stops at 3."* The thirteenth row, form, lands in the Scope bucket that already holds data-table, page-header, region and popover.

So in section C the machine-checkable half of the identity test decides nothing. Six of the eight dimensions are constant across the entire section, and every separation in it is D4 or D5 — the two that live in the contracts and that §12 says no check can see from the tier. That is not a defect in the test; it is where the test's checkable half runs out, and it is worth stating because it is the opposite of every audit before it. ADR-0057, ADR-0060, ADR-0061 and ADR-0068 all turned on a layer or a ladder. Nothing here does.

#Six rows, six refusals

Each is put to §12's first step before it is compared, and each fails on a record already made.

toggle is checkbox. Identical on all eight, including D4 — a toggle's label is *"the proposition being agreed to or declined"* exactly. What Carbon separates them on is the drawing (a track and a knob against a box and a tick), which is mark and geometry and is excluded by name, and *immediacy* — that the state applies without a submit. Immediacy is a rule about when a composition commits, not an authority over attention, and extracting it leaves a checkbox. checkbox already carries the set rule this one would need: *"several of the set may be picked."*

dropdown is select. Identical on all eight. Carbon ships both because one is the native control and one is a custom listbox, which is an implementation and not a claim. select already carries the set rule — *"exactly one of the set may be chosen"* — and the disclosure chevron that says a set opens beneath. A multi-select dropdown is not the exception it looks like: its rule is *"several may be picked"*, which is checkbox's, so it is a set of checkboxes in a surface, and the surface is popover.

search is an input-field whose value filters something, and the filtering is the set's business. Identical on all eight to input-field, whose D4 is *"what this field collects"* and *"guidance, or the correction when the value is invalid"*. What a search field appears to add is the claim that the set on screen is the filtered one — and this system already put that claim where it belongs: empty-state carries a filtered variant, built under ADR-0055, whose governed parts are *"what is not here"* and *"why it is not"*. The magnifier is a mark; the clear control is a Button beside it, on ADR-0050's split.

slider is a Meter and a NumberInput, which is ADR-0076's shape — *a toggletip is a popover and a button* — arriving at a control. It is identical to number-input on all eight; what separates them is the gesture, drag against type, which is not one of the eight and is not a claim about attention. What it appears to add is showing the range, and showing a value against its range is meter's whole subject — a component that already exists, one bucket away, separated from this one by exactly the dimension that matters: meter reports and does not accept input. Reporting and acting have been put on opposite sides of a component boundary four times (ADR-0050, ADR-0062, ADR-0066, ADR-0076).

date-picker is an InputField, a Button and a Popover — or, read the other way, a select whose options are computed. Identical to input-field on all eight. Its calendar is a set in which exactly one may be chosen, which is radio-button's set rule, laid out as a grid — and layout lives in scene stylesheets (ADR-0073), so the grid is a stylesheet rather than a component. Its surface is where the difference was supposed to live, and ADR-0077 put that surface in popover.

form is a Region holding controls with a Button beside it. Extract its rules and there are four, and all four are already somewhere: shared density is every Scope's, by §5's density coherence; the submit is a Button, on ADR-0050's split; an invalid field's correction is input-field's own hint role; and *a validation pass must not produce one demand per field* is section C's own ceiling rule, already enforced on every control by the ladder stopping at 3. What remains is a bounded place holding things, declaring one density, holding no allocation — which is region, identical on all eight. Its one candidate D4, *how many are still required*, is region's count over the same set, and pagination was kept on the opposite property: its subject is a set the reader cannot see. A form's fields are on the screen.

#The second finding: the collapse the test exists to prevent is already inside the built half

The same run that put the six candidates in one bucket put four built components there with identical governed copy. input-field, text-area, select and number-input all declare, character for character:

label: "what this field collects"
hint:  "guidance, or the correction when the value is invalid"

None of the four declares a disclosure. So on the eight dimensions §12 names, four built components are one component — and that is the outcome the test exists to refuse. Put to each of them separately, they do not fail the same way.

~~select is separated on D5 and does not declare it.~~ RETRACTED BY ADR-0083. The sentence that stood here read: *"It renders a native <select> with an <option> per member, and a closed one paints only the selected option — so the rest are in the frame and not rendered, which is ADR-0059's test word for word."* It asserts a rendering behaviour that was never measured, and the artifacts say otherwise: the frame is [data-wr-layer],[data-wr-level],[data-wr-slot] and fixture 37 holds twenty <option> elements carrying none of them, so no option is in dom.nodes and Salience — hidden cannot see one. A closed select's options are not hidden — they were never there. select delegates its disclosure to the user agent and therefore does not carry the dimension. So this bucket is four components with no separation available rather than three, which makes the finding below worse rather than better.

number-input is separable on D4 and does not declare it. A numeric field owes what no other field owes: its unit and its permitted range. 71 is not a reading and 71 degrees, 40 to 90 is, and neither the unit nor the bounds can be verified by looking at the control — which is exactly the property that made region's count required (ADR-0058) and kept pagination (ADR-0066). Its contract takes the generic field pair instead, so the separation exists in the world and not in the tier.

text-area is not separable, and it fails on ADR-0057's ground. What separates it from input-field is how many lines of text it accepts, and ADR-0057 removed three roster rows for exactly that: *"this system's tier has no quantity in it ... two components separated only by how much would be told apart by their names."* Its own contract says so without meaning to — *"the same lifecycle, the same ladder, the same ceiling, applied to a multi-line control instead of a single-line one"* — and gives its reason for existing as *"Carbon publishes it as a component distinct from TextInput"*, which is provenance and is what §12's first step is for.

And there is no rescue available of the kind ADR-0073 found. That record faced this shape for Scopes: shell-left-panel and shell-right-panel are identical on all eight and are two components, because a Scope is a place and two fixed places are two Scopes. Position is a fact about a screen and not a quantity. These are Emitters, there is no position to appeal to, and the thing left over is a quantity — the one thing this system has already decided cannot separate two components.

#Decision

The six candidate rows are refused and move to the exclusion table with their reasons. Section C goes from thirteen rows to seven, all built. The roster goes from 48 to 42 and the identity holds: 16 dropped + 27 distinct slugs carried = 43.

The three findings in the built half are named and not acted on, and the scope of each is stated so the next pass is not an investigation:

  • ~~select declares D5.~~ WITHDRAWN by ADR-0083. There is nothing to declare: the component delegates its disclosure to the user agent, and a dimension follows the declaration rather than the visual behaviour.
  • number-input sharpens D4. A third governed part carrying the unit and the bounds, which is a copy obligation and therefore a tone record, a story, a real string the content linter scans, and a scene. Larger than it looks, and it is a change to what the component *says* rather than to what it draws.
  • text-area fails the identity test and its removal is its own record. It is built: a contract, a component, a stylesheet, a token block, thirty-two APCA checks, a scene, two baselines and a violations fixture. Removing a built component has never been done here, and a pass that removed one inside an audit would put the audit's conclusion and the removal's consequences in one commit where neither could be read against the other — which is ADR-0077's argument, applied to a component instead of an engine.

Nothing is removed from the built set in this pass. The audit's output is a roster, three named units and a correction.

#Rejected options

Keep the six and decide when each is built. The status quo, and it is what section B did until ADR-0073 and ADR-0076 audited it and removed two of five. A row that would fail on the day it is built costs more the longer it stands, because everything around it is written as though it were coming.

Keep form because every design system has one. The strongest of the six, and it is refused on its own extraction rather than on a comparison: after the four rules it asserts are lifted into the records that already hold them, what is left is a Region. A system that kept it would be keeping a name.

Keep slider and date-picker because a monitoring product needs them. It does, and it gets them by composition — which is the answer the layer model has given eight times already (list, contained-list, structured-list, content-switcher, breadcrumb, file-uploader, toggletip, tree-view). A setpoint typed into a NumberInput beside a Meter is also the safer instrument, but that is a second reason and the first one stands alone.

Add a ninth dimension so the built four separate. The obvious response to the second finding and the wrong one. The candidates are all quantities — line count, numeric domain, option count — and a tier with a quantity in it is what ADR-0057 removed three rows to avoid. ADR-0073 added no dimension either when it found the same shape among Scopes; it named a ground that lives outside the tier and left the axis count alone.

Act on text-area in this pass. Rejected above, and worth stating as a rejection rather than an omission: the finding is complete and the response is not the audit's to make in the same commit.

#Consequences

Roster 42, built 37, five rows remain. Section C is complete at seven rows and every one of them is built. The remaining five are link, menu, overflow-menu, avatar and combobox.

The same argument reaches two rows outside this section, and they are named rather than audited. menu is a Scope in section D that hosts content anchored to a control, which is popover as ADR-0077 defined it and ADR-0080 built it; combobox in section G is an input-field, a popover and a set rule. Both are section-D and section-G questions and this record does not settle them.

A stale sentence is corrected. Section C said date-picker and dropdown *"each open a surface; that surface is an overlay Scope and is popover's entry below"*. ADR-0077 refused overlay for a popover from the measurement — a popover draws no scrim and measure.js compares the prediction against the pixels — and both rows are now refused, so the sentence goes rather than being repaired.

The identity test has now been run against every section of the roster. It has removed nine rows across seven records and kept every row it was run against that had an argument. This is the first time it has been run against a section where its checkable half was constant throughout.

No token, no component, no scene, no baseline. A roster, a record and three named units.

#Measured

  • The six tier axes over 37 built components: 8 distinct vectors; the largest bucket is emitter | [1,2,3] | interactive | false | false | false with 7 members — input-field, button, checkbox, radio-button, text-area, select, number-input *(disk, this pass)*.
  • Governed copy across that bucket: input-field, text-area, select and number-input all declare {"label":"what this field collects","hint":"guidance, or the correction when the value is invalid"} — identical objects; none declares a disclosure *(read from the built contracts, this pass)*.
  • ~~Select.tsx renders <option> elements inside a native <select>, so a closed select holds its unselected members in the frame and not rendered — D5 in fact, undeclared.~~ This line was reasoned, not measured, and ADR-0083 measured it: the frame is [data-wr-layer],[data-wr-level],[data-wr-slot], and fixture 37 holds **20 <option> elements, 0 with any data-wr-* attribute** *(disk, ADR-0083's pass)*.
  • text-area-contract.ts, its own header: *"the same lifecycle, the same ladder, the same ceiling, applied to a multi-line control instead of a single-line one"*, and *"Carbon publishes it as a component distinct from TextInput"* *(disk, this pass)*.
  • pnpm roster:check — ROSTER OK, 42 rows, 37 built, joined both ways; 16 dropped + 27 distinct slugs carried = 43 *(this pass)*.
  • pnpm battery — the verdict this pass is measured by.