Decision records
All 144 decisions behind this system, in the order they were made. Each one lists the options that were rejected and why.
Phase 0
5 decisions.
| No. | Decision | Status | What was decided |
|---|---|---|---|
| 0001 | Attention as a budget in three channels | Accepted | Wolf-Rayet treats attention as a budgeted resource allocated in three channels — light, language, and motion — governed by one shared five-level intensity ladder (0 Substrate, 1 Ambient, 2 Marked, 3 Directed, 4 Demanded) and enforced in CI. |
| 0002 | Layer names | Accepted | The five layers are Substrate, Emitter, Arbiter, Scope, View. |
| 0003 | Four named themes on one axis | Accepted | Four resolved, named themes on a single axis: interior-light, interior-dark, field-day, field-night. |
| 0004 | Emission load formula | Accepted | Emission load for a Scope is the mean absolute perceptual deviation from its substrate, normalized by available headroom: |
| 0009 | The content-pixels rule | Accepted | The budget governs chrome, not content. |
Phase 1
3 decisions.
| No. | Decision | Status | What was decided |
|---|---|---|---|
| 0006 | field-night palette strategy | Accepted | field-night is strict long-wavelength-only. |
| 0007 | Density: independent collection, not a theme axis | Accepted | Density is an independent collection with two enumerated modes, comfortable and compact, orthogonal to the theme axis. |
| 0011 | Emission ceiling: value and shape | Superseded by ADR-0030 | One ceiling per theme, at the values in the table above. |
Phase 2
3 decisions.
| No. | Decision | Status | What was decided |
|---|---|---|---|
| 0012 | Spatial primitives live in the Primitives collection | Accepted | The Primitives collection carries both sets: the chromatic ramps and the raw spatial scales. |
| 0013 | Stacking contexts replace elevation | Accepted | Elevation is replaced by an enumerated set of stacking contexts — base, raised, overlay — encoded structurally, not luminously. |
| 0014 | The scrim occludes by alpha | Accepted | The scrim is a single alpha mechanism in all four themes: one scrim color role resolving near-black everywhere, composited over the covered scene at a scrim alpha token's opacity. |
Phase 3
7 decisions.
| No. | Decision | Status | What was decided |
|---|---|---|---|
| 0005 | Salience share threshold at level 3 | Accepted | Directed is a relative property, not an absolute share. |
| 0010 | View demand cap and cross-scope arbitration | Accepted | A View owns a demand cap, default 1, declared as a token like the Scope emission ceilings. |
| 0015 | Scope ground derives from stacking context | Superseded by ADR-0016 | A Scope's ground is derived from its declared stacking context — the declaration ADR-0013 already requires — never stated as a free value. |
| 0016 | Floor ground and emission origin are two different grounds | Accepted | The two jobs split. |
| 0119 | A list answers for what its surface renders, not for the whole roster | Accepted | A list declares the population it answers for, and that population is derived from the surface itself: the components that surface renders. |
| 0120 | A grouped story names a group, and a scan that checked nothing has not passed | Accepted | A grouped story names a group, so no story makes an identity claim about one component, and the self-description position that read one is retired. |
| 0121 | The component tier describes components the rewrite replaced | Accepted | A component tier entry is a claim about a component this system ships. |
Phase 4
6 decisions.
| No. | Decision | Status | What was decided |
|---|---|---|---|
| 0017 | One flat custom-property namespace, one owner per name | Accepted | The --wr-* namespace is one namespace, and a name in it belongs to exactly one tier. |
| 0023 | Type families, three families resolved on the theme axis | Superseded by ADR-0035 | Three families enter the Primitives collection, mode less, alongside the ramps and the spatial scales, and two semantic roles resolve them per theme. |
| 0037 | Occlusion reorders the demand queue, and the scrim suspends a demand rather than hiding one | Accepted | The scrim dims light. |
| 0038 | An overlay is charged for what it covers, and its sheet fills the view | Accepted | A pixel covered by an occluding Scope belongs to that Scope's budget and to no other. |
| 0047 | A file must name the component it is for | Accepted | A file must name the component it is for, in the positions that exist to say so; and prose that counts the set is checked against the set. |
| 0049 | A narrative may not be checked wholesale, and one section of it must be | Accepted | A narrative's historical claims are not checkable and must not be checked. |
Phase 5
8 decisions.
| No. | Decision | Status | What was decided |
|---|---|---|---|
| 0008 | Next.js for the docs site | Accepted | The docs site (apps/docs, serving r136.dev) is a Next.js application. |
| 0018 | Length ceilings are bootstrapped from real shipped copy, not chosen freehand | Superseded by ADR-0019 | Each level's ceiling is the longest real string the real-copy scan measured shipping at that level, rounded up to the next multiple of ten. |
| 0019 | Length ceilings refreshed with real level-1 through level-3 copy | Accepted | The derivation method is unchanged from ADR-0018: each level's ceiling is the longest real string the real-copy scan measures shipping at that level, rounded up to the next multiple of ten. |
| 0114 | A Scope is data-wr-layer="scope", a demand is level 4, and the first real page measures 0.023 | Accepted | A Scope in markup is data-wr-layer="scope", and it goes where ADR-0073's test says a Scope goes. |
| 0115 | The ration engine was carrying ADR-0005's retired clause, and the rung it needs is derivable from this system's own ladder | Accepted | The dominance margin returns to ADR-0036's rule, denominated in a rung derived from this system's own neutral ladder. |
| 0116 | The intensity ladder's band boundaries come from the theme, and the dark theme had been scored against the light one's | Accepted | Both boundaries are derived, per theme, from quantities the system already derives. |
| 0117 | A block is pixels, the Scope's ground is out of the contest, and both were already accepted | Accepted | A block reports the deviation measured across its pixels, not the deviation of its ground. |
| 0118 | The docs shell declares what it carries and what it draws, and the ground is synthesized rather than found | Accepted | On this site the system is Wolf-Rayet, so chrome is what it draws and content is what it carries. |
Phase 6
8 decisions.
Phase 4, reopened
52 decisions.
| No. | Decision | Status | What was decided |
|---|---|---|---|
| 0021 | The component set reopens to Carbon's published roster | Accepted | The component set expands from seven to Carbon's full published roster. |
| 0029 | Themed coverage is the roster, and a scene with no baseline entry fails | Accepted | Themed coverage is the roster, not a phase. |
| 0032 | A baseline is recorded per platform and gated exactly; the cross-platform bound is retired, not widened | Accepted | themed-baseline.json holds one record per platform, keyed by ${process.platform}-${process.arch}, each carrying its own node, playwright, chromium and recordedBy alongside its scenes. |
| 0033 | The unthemed path comes under ADR-0032 before it comes due, and PLATFORM_TOLERANCE survives as a noise floor that gates nothing | Accepted | baseline.json holds one record per platform, keyed by ${process.platform}-${process.arch}, each carrying its own node, playwright, chromium and recordedBy alongside its scenes — the same shape themed-baseline.json has carried since ADR-0032. |
| 0034 | A step reports only what its own job measured; committed evidence must say so | Accepted | A step that reports on work which did not run in the current job must either not run, or must state that its evidence is committed rather than measured. |
| 0035 | The shipped subset is a decision, and the fall-through is its boundary | Accepted | The faces are subset, and the subset is declared in the token source. |
| 0036 | The dominance margin comes from the ladder, and PLATFORM_TOLERANCE keeps only the use that is about rasterisers | Accepted | The salience dominance margin is one rung of the theme's own lightness ladder, spread over the area the claim is made about. |
| 0039 | Two roles on one lightness is the ladder; a state told apart by hue alone is the defect | Accepted | Two roles resolving to one lightness is not, by itself, a defect, and the check this ADR adds does not report it as one: roles declared at one level are required to share a lightness, because the level is the lightness. |
| 0043 | The ladder's first rung, and the check that could not see it missing | Accepted | The ladder is repaired by rebinding roles to steps, not by moving a ramp. |
| 0044 | Quiet is what "fine" looks like, and a condition may not be whispered | Accepted | Two rules. |
| 0045 | A turned corner says you may act, and costs the budget nothing | Accepted | The spatial tier acquires a radius scale, and a turned corner means exactly one thing: this component accepts input. |
| 0046 | Chrome that outlives a route may not demand | Accepted | A Scope that persists across routes is chrome, and chrome may not hold a demand. |
| 0048 | A claim has an age, and a screen that cannot vouch may not look calm | Accepted | A component that renders a claim about an external condition declares whether it can vouch for that claim. |
| 0050 | Acknowledgement descends a demand, and is a rule rather than a component | Accepted | Acknowledgement descends a demand one rung, from Demanded to Directed, and does not touch the condition. |
| 0051 | Acknowledgement is serialized, and the tick joins the vocabulary | Accepted | data-wr-acknowledged is a serialization-surface attribute, written in both states by the three components that can carry a demand a human could acknowledge, and the engine refuses level 4 with it. |
| 0052 | The Lightning reconciliation, and three counted claims the roster got wrong about itself | Accepted | All 91 Lightning components are reconciled: 61 covered by rows the roster already has, 6 carried onto it as 5 new rows, and 24 dropped by name with a reason. |
| 0053 | A route's header may hold what the shell's may not | Accepted | page-header is a Scope that belongs to one route, and its subtree may hold the View's demand. |
| 0054 | An Arbiter grants, and this is the first one that does | Accepted | button-group is an Arbiter that grants a level to each action it holds. |
| 0055 | Good news may not be distinguished, and a blank is three sentences | Accepted | empty-state is an Emitter whose subject is an absence, and its reason is required. |
| 0056 | The battery is a list, or it is a habit | Accepted | tools/battery.js is the battery: the artifacts every component has and the checks every component must pass, in one place, read by three consumers. |
| 0057 | Carbon separates these on quantity, and this system has no quantity | Accepted | list, contained-list and structured-list are removed from the roster. |
| 0058 | tile is a Scope, and it is the one every scene has been typing by hand | Accepted | tile becomes region: a Scope, in section E, at "none — allocates", and it is built. |
| 0059 | Disclosure is a property, not a component, and for one of them it is the resting state | Accepted | ADR-0040's rule is restated on the property: a component that removes an element from the frame may not remove a Demanded one. |
| 0060 | A lower hierarchy is a lower rung, and content-switcher is tabs at one | Accepted | content-switcher is removed from the roster. |
| 0061 | breadcrumb is the pattern navigation-item was built for, and this is where the collapses stop | Accepted | breadcrumb is removed from the roster and enters *Not carried, with the reason*. |
| 0062 | An obstruction is not an alarm, and the states are the fields | Accepted | |
| 0063 | The themed set catches up, and a list that stopped is worse than one that never started | Accepted | The ten scenes join RETHEMED, and the three declared must-fail among them join the themed set's own MUST_FAIL list. |
| 0064 | One derivation per list, and the check that joins two of them | Accepted | Both lists move into data modules that their tools import, and the check imports the same modules rather than parsing anything. |
| 0065 | The two expectations meet, and the last list leaves the CLI | Accepted | THEMED_MUST_FAIL moves to packages/budget/src/themed-must-fail.js, verbatim with its comments, and cli.js imports it. |
| 0066 | A bar that counts what is not there, and the second layer the roster got wrong | Accepted | |
| 0067 | A failed upload ranks nothing, and section B's own example was wrong twice | Accepted | file-uploader is removed from the roster and enters *Not carried, with the reason*. |
| 0068 | A tree is a machine for hiding demands, and §5 is right for a different reason than it gives | Accepted | tree-view is removed from the roster and enters *Not carried, with the reason*. |
| 0069 | A countdown reports a prediction, and its level is the only one this system computes | Accepted | |
| 0070 | The oldest decision gets its first component | Accepted | code-snippet declares two slots, and the split is ADR-0009's. |
| 0071 | The test was one axis short, and presence is the row it would have cost | Accepted | presence stands and is to be built, declaring vouches: true. |
| 0072 | The retraction is the component, and both defects were found by the machinery rather than by the argument | Accepted | |
| 0073 | A Scope is a place, timeline is not one, and the test has a layer it was never run against | Accepted | |
| 0074 | Three checks were owed, one of them was already done, and the claim had been carried forward twice | Accepted | |
| 0075 | A container retracts its own claim, and a Scope's retraction has one half | Accepted | |
| 0076 | A toggletip is a popover and a button, and the hosting question answers them the same way | Accepted | |
| 0077 | The roster's last Scope comes due on §5's second depth, and the engine has no word for it | Accepted | popover is a raised Scope at §5's second depth, rendered inside its anchor's Scope and never portalled. |
| 0078 | The same rule for containing, and the second thing nesting breaks | Accepted | |
| 0079 | A frame carries properties, never identities, and two of the three symptoms were not a gap | Accepted | |
| 0080 | The roster's last Scope, and the two things its depth changed that nothing predicted | Accepted | popover is built: a raised Scope at §5's second depth, rendered inside its anchor's Scope and never portalled, one rung, one variant, one governed part, non-interactive, disclosing. |
| 0081 | Section C is where the tier axes decide nothing, six rows refused, and the collapse is already inside the built half | Accepted | The six candidate rows are refused and move to the exclusion table with their reasons. |
| 0082 | Sections D and G audited: four refused, one kept, and the roster is one row from complete | Accepted | menu, overflow-menu, avatar and combobox are refused. |
| 0083 | A closed select's options were never in the frame, and ADR-0081 was wrong about it | Accepted | ADR-0081's select finding is retracted. |
| 0084 | The affordance is the perimeter, and a corner is what a perimeter has when there is a box | Accepted | ADR-0045's rule generalises rather than gaining an exception: an interactive component says so on its perimeter, and there are three carriers. |
| 0085 | The roster's last row, and a ladder the scene took away | Accepted | link declares one rung, Marked, and it is the first single-rung Emitter in the system. |
| 0091 | Three fields are one field, and the first built component leaves the set | Accepted | text-area and select leave the set. |
| 0092 | A removal does not renumber the past, and a set is counted once | Accepted | An ordinal is build order, and a removal is recorded rather than renumbered. |
| 0093 | A meter's state is a shape, and there is no exemption | Accepted | meter draws its state as a shape. |
Phase 2, reopened
1 decision.
| No. | Decision | Status | What was decided |
|---|---|---|---|
| 0022 | Three type families, self-hosted, legibility governs the hostile themes | Superseded by ADR-0023 | Three family roles join the type scale, in generator.config.json's spatial.family — beside spatial.type, not inside it. |
Phase 4, reopened by ADR-0021
7 decisions.
| No. | Decision | Status | What was decided |
|---|---|---|---|
| 0024 | A pending state carries no motion; the block form is a Pending message | Accepted | Neither pending component declares motion beyond the ambient grant, and the block form renders §6's Pending pattern in full. |
| 0025 | A tag's encoding is its label; there is no category ramp | Accepted | A tag's primary encoding is its label. |
| 0026 | A tooltip is an Emitter; transience is a presence property, not a layer | Accepted | A tooltip is an Emitter. |
| 0027 | Emphasis is the level; a button has no emphasis variant | Accepted | Emphasis is the level. |
| 0028 | Shape carries the rule of a set, and the shape vocabulary splits in two | Accepted | Shape may carry the rule of a set as well as a meaning for attention, and the two are different vocabularies. |
| 0040 | A collapsed panel is absent rather than exempt, and a demand may not be the thing that is hidden | Accepted | A collapsed panel's children are absent from the frame, not exempted from the budget. |
| 0042 | A toast reports an event; a demand is a live condition, and arrival is not escalation | Accepted | A toast is an Emitter, and its legal levels are Marked and Directed. |
Phase 1, reopened
2 decisions.
| No. | Decision | Status | What was decided |
|---|---|---|---|
| 0030 | The ceiling derives from the theme, not from the scenes it judges | Superseded by ADR-0031 | Each theme's emission ceiling is derived from that theme's own ramps and role floors, and reads no scene. |
| 0031 | The ceiling's independence is of its inputs, not of its selection | Accepted | A ceiling's independence is a property of its inputs, not of the process that selected it. |
Phase 4, continuing ADR-0040
1 decision.
| No. | Decision | Status | What was decided |
|---|---|---|---|
| 0041 | A declaration must reach the frame, and the check that says so may not be an absence | Accepted | A state declared in markup must reach the frame, and "reaches the frame" is measured by ablation rather than argued from the cascade. |
Phase 4, reopened for one component
1 decision.
| No. | Decision | Status | What was decided |
|---|---|---|---|
| 0089 | A numeric field owes its unit and its bounds, and the scene caught the scene | Accepted | number-input declares a third governed part, range, required, whose role is *the unit it collects it in and the values it will accept*. |
Phase 7
39 decisions.
| No. | Decision | Status | What was decided |
|---|---|---|---|
| 0097 | The proof product is five screens, and each is a captured scene | Accepted | Capture is a build step. |
| 0098 | Instrument indoors, signal outside, and the palette it sets | Accepted | One system, two voices, chosen by theme family. |
| 0099 | Three type roles and five faces | Accepted | A third role, mono. |
| 0100 | The instrument treatment on components | Accepted | - Corners take the smallest step, and keep their meaning. |
| 0101 | A voice per theme family | Accepted | A voice is a family-tier value set. |
| 0102 | Archivo for display | Accepted | Display is Archivo in every theme. |
| 0103 | Caps for eyebrows only | Accepted | Uppercase is for eyebrows only. |
| 0104 | A trend is a meter over time | Accepted | trend joins the roster in section F, as the meter over time. |
| 0105 | A status colour is two roles, and the palette is authored in P3 | Accepted | - Three new roles: status-critical-bold, status-caution-bold, status-positive-bold. |
| 0106 | The affordance is a gap, not a corner | Accepted | - Everything with a ground is rounded. |
| 0107 | Nothing sustains motion | Accepted | - No component sustains motion. |
| 0108 | A stacking context casts | Accepted | - Each stacking context carries a shadow. |
| 0109 | The ladder is narrower than it was | Accepted | - spatial.type.ratio drops from 1.25 to 1.125. |
| 0110 | A shadow resolves where it is declared | Accepted | - The shadow tokens are emitted on [data-wr-theme], not on :root. |
| 0111 | The site checks its own copy | Accepted | - content-lint:scan-site reads apps/docs/app/site/text.ts and runs the rules over every string it authors. |
| 0112 | The reference is the reference | Superseded by ADR-0113 | - radius-surface and radius-control both select 6px, in both densities, and the affordance gap is retired. |
| 0113 | The reference was scaffolding, not the destination | Accepted | The reference is retired as a goal. |
| 0122 | The site's own harness answers for the site's surface | Accepted | A check in the site's harness derives both its population and the route it reads from the site's own surface. |
| 0123 | The length ceiling retires with the corpus it was bootstrapped from | Accepted | ADR-0018's length ceiling retires, and scan-real-copy.js retires with it. |
| 0124 | The shell paints in roles, and the ramps floor the pairs it uses | Accepted | The shell paints in the semantic roles, and the ramps declare a floor for every pair it paints. |
| 0125 | The cascade is read, and the grouped set consumes the tier generated for it | Accepted | ### The cascade is read |
| 0126 | The discipline test governs the twenty, and is run | Accepted | ### The table is exactly COMPONENT_LAYERS |
| 0127 | A loop is granted off the ladder, and floored rather than capped | Accepted | A loop is granted, and the grant is not a rung. |
| 0128 | A record's levels mean what its layer lets them mean | Accepted | A record's level list is read through its layer, and only an Emitter's is a capability. |
| 0129 | The sequenced three, and the ordinal that was never broken | Accepted | ### radio retires into checkbox |
| 0130 | A hue is not a classification | Accepted | A hue is not a classification, so the four decorative appearances are neither of the two things ADR-0121 asked about. |
| 0131 | Wiring a component to its tier is a record question | Accepted | A component holding a token record reads its own tier and no primitive. |
| 0132 | A page header's title is the size the system grants it | Accepted | The record is right. |
| 0133 | The grouped nine read their tiers | Accepted | Each component reads its tier for every property the record gives a role to. |
| 0134 | Overlays enter and leave on their grant | Accepted | Every overlay enters from where it belongs and leaves the way it came. |
| 0135 | The helm display adds one Scope and three meter drawings | Accepted | The helm primary display is built as a proof scene in field-day and field-night, and it adds one component to the roster. |
| 0136 | The field reads at arm's length, and its raises reach the components | Accepted | The field class has a reading minimum of 1rem. |
| 0137 | The faces load from beside the package | Accepted | The generator writes a second family stylesheet, family-local.css, that loads the faces relative to itself from ../assets/fonts/upstream/, where the package already keeps them with their licences. |
| 0138 | The flat surface yields to the tier where they share a name | Accepted | Where the flat surface and the tier are one role, the tier wins wherever a theme is set. |
| 0139 | An instrument states its datum, and its scale states its bounds | Accepted | range is removed from the instrument drawings. |
| 0140 | The helm's second pass puts each reading on one line | Accepted | A reading is one line. |
| 0141 | Selection is a shape, not a hue | Accepted | A selected Button is the page ground, the primary ink, and a heavy outline in that ink. |
| 0142 | The Figma library is generated from the repo | Accepted | tools/figma-sync builds the library. |
| 0143 | The Figma library is three files | Accepted | One plugin, one command per file. |
Unphased
1 decision.
| No. | Decision | Status | What was decided |
|---|---|---|---|
| READ | README | Unknown |