Decision records
Every decision this system was built on, 144 of them, in the order they were made. Each one carries the options that were rejected and the reason, which is the part worth reading.
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 |