ADR-0063 The themed set catches up, and a list that stopped is worse than one that never started
#Context
ADR-0029 is titled *themed coverage is the roster*. make-themed-fixtures.js composes every scene on the budget CLI's roster against each of the four themes, and its RETHEMED list — the component scenes, rethemed by swapping one theme's whole CSS block for another's — ended at scene 47.
Ten scenes have been added since. Every one of them was named as owed at the time and none was closed:
| named in | said |
|---|---|
| ADR-0058 | *"Six scenes have no themed sibling — 48 through 53, and now 54."* |
| ADR-0059 | *"Seven scenes now have no themed sibling."* |
| ADR-0062 | *"Eight scenes now have no themed sibling."* |
three STATUS.md snapshots | the same, in the Scene roster row |
A list that stops is worse than a list that was never written. Forty-four scenes themed and the last ten not is a roster claim that quietly stopped being true, and it is the shape ADR-0056 generalises — the battery went unstated for thirty-five passes and agreed with reality by habit. This one had the additional property that every pass made it larger.
#Decision
The ten scenes join RETHEMED, and the three declared must-fail among them join the themed set's own MUST_FAIL list. The themed set moves 140 → 170 fixtures and 30 → 39 declared must-fail.
Nothing else changes. No fixture was edited, no scene stylesheet moved, no component touched. The retheming mechanism is a whole-file CSS swap that has been in place since scene 09, and the ten scenes satisfy its five exact-once preconditions unchanged.
#Why all three must-fail scenes theme safely
The themed set restricts one scene — 06-overlay-violation, to interior-light — because it must fail on emission, and a scrim's cost is maximal in that theme; generated in the dark themes it would legally pass, putting a scene declared must-fail into a theme where it is not. That is the test every candidate has to survive.
All three of these fail on salience, which reads declared levels and the rendered flag and no colour at all:
- 48 fails on
salience — vouched— the rung a withdrawn claim declares (ADR-0048). - 50 fails on
salience — acknowledged— the rung an acknowledged demand descends to (ADR-0051). - 56 fails on
salience — hidden— a demand inside a panel its component removed (ADR-0040, restated by ADR-0059).
A verdict that reads no pixel cannot move with the palette, which is the reason 10, 12, 16, 19, 32, 35 and 41 are rethemed in all four. Measured rather than assumed: all nine siblings failed, each on exactly the check its unthemed original fails on, and the run exits 0 because every one of the 170 matches its declared expectation.
#What the new siblings are actually for
Two of them earn their place beyond arithmetic.
Scenes 54–57 carry region, the first component to draw ADR-0013's raised perimeter more than once on a screen. Scene 44's own note says what to watch in a raised sibling — *"that the context keeps grounding on the theme substrate rather than acquiring a luminance of its own — the elevation ADR-0013 refused, arriving by the back door"* — and until these there was never a scene with two of them side by side to watch it in. There are now twelve.
Scene 57 carries the only component whose two variants were caught sharing a lightness in all four themes (ADR-0062). Its repair is a non-hue one — a dashed ring — and a themed sibling is where that repair is exercised rather than argued: the component now renders in three themes it was not designed in, with a state encoding that does not depend on any of them.
#Rejected options
Close it by adding only the scenes from this session. Four of the ten (48–51) predate it, and leaving them would have been the same decision that produced the gap: close what is convenient and name the rest. The list either covers the roster or it is a list of what somebody remembered.
Generate themed siblings automatically from the CLI roster and delete RETHEMED. The obvious structural fix, and it is wrong for the reason the file already documents: two scenes on the roster must not be rethemed. 06-overlay-violation fails on emission and would pass in three themes; 21-proof-supervisor-queue is the one scene this repository did not compose, and its own header refuses a recomposition — *"a fixture that re-composed its screen from the same components would be measuring this file's idea of the screen."* An automatic list would have to carry an exclusion list, which is the list that just went stale wearing a different name. What is owed is not automation; it is a check.
Write the check that would have caught this, in this pass. Tempting, and deferred deliberately. The check is *every scene on the CLI roster is either in the themed set or excluded by name with a reason* — ADR-0056's shape exactly, and the same shape roster:check grew for the exclusion table in ADR-0057. It belongs with the two named exclusions written as data rather than as prose, and doing it here would have mixed a mechanical catch-up with a new enforcement surface. It is named below as owed, which is the third time this session a record has ended by naming a check rather than writing one — and each of the first two was written in the pass that followed.
#Consequences
The themed set is 170 fixtures across 4 themes, 39 of them declared must-fail, and the whole set matches its declared verdicts.
The themed baseline is darwin-arm64 170 scenes / 474 Scope values against linux-x64 140 / 378. That is the largest platform gap this session has opened — thirty scenes and ninety-six values — and it closes the way every other has, from one CI run.
No component, no token, no unthemed scene and no unthemed baseline moved. Two data lists and thirty generated files.
A check is owed and is not written here, as above: every scene on the CLI roster themed or excluded by name. Until it exists, this list can stop again and nothing will say so.
One small thing, found while counting. The comment first written into MUST_FAIL used apostrophes, and a naive quote scan reading that file counted a contraction as a list entry — which made this record's own figure briefly wrong before it was checked against receipts/themed.json. The comment is rewritten without them and says why. The lesson is the pass's smallest and is exactly ADR-0049's: read the artifact that owns the number, not a second copy of it.
#Measured
RETHEMEDbefore: 47 scenes. After: 57. Themed fixtures 140 → 170 *(darwin-arm64, this pass)*.- Declared must-fail themed fixtures 30 → 39, from 13 distinct scenes, counted from
receipts/themed.jsonrather than by parsing the list. - All nine new must-fail siblings failed on exactly the check their unthemed original fails on:
salience — vouched,salience — acknowledged,salience — hidden— three declaration-reading checks, none of which reads a pixel. node src/cli.js themed— exit 0, every one of 170 matching its declared expectation.- Themed baseline:
darwin-arm64170 scenes, 474 Scope values;linux-x64140 / 378, short by exactly the thirty new scenes. pnpm battery— the verdict this pass is measured by.