Skip to contentWolf-Rayet

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.DecisionStatusWhat was decided
0001Attention as a budget in three channelsAcceptedWolf-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.
0002Layer namesAcceptedThe five layers are Substrate, Emitter, Arbiter, Scope, View.
0003Four named themes on one axisAcceptedFour resolved, named themes on a single axis: interior-light, interior-dark, field-day, field-night.
0004Emission load formulaAcceptedEmission load for a Scope is the mean absolute perceptual deviation from its substrate, normalized by available headroom:
0009The content-pixels ruleAcceptedThe budget governs chrome, not content.

Phase 1

3 decisions.

No.DecisionStatusWhat was decided
0006field-night palette strategyAcceptedfield-night is strict long-wavelength-only.
0007Density: independent collection, not a theme axisAcceptedDensity is an independent collection with two enumerated modes, comfortable and compact, orthogonal to the theme axis.
0011Emission ceiling: value and shapeSuperseded by ADR-0030One ceiling per theme, at the values in the table above.

Phase 2

3 decisions.

No.DecisionStatusWhat was decided
0012Spatial primitives live in the Primitives collectionAcceptedThe Primitives collection carries both sets: the chromatic ramps and the raw spatial scales.
0013Stacking contexts replace elevationAcceptedElevation is replaced by an enumerated set of stacking contexts — base, raised, overlay — encoded structurally, not luminously.
0014The scrim occludes by alphaAcceptedThe 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.DecisionStatusWhat was decided
0005Salience share threshold at level 3AcceptedDirected is a relative property, not an absolute share.
0010View demand cap and cross-scope arbitrationAcceptedA View owns a demand cap, default 1, declared as a token like the Scope emission ceilings.
0015Scope ground derives from stacking contextSuperseded by ADR-0016A Scope's ground is derived from its declared stacking context — the declaration ADR-0013 already requires — never stated as a free value.
0016Floor ground and emission origin are two different groundsAcceptedThe two jobs split.
0119A list answers for what its surface renders, not for the whole rosterAcceptedA list declares the population it answers for, and that population is derived from the surface itself: the components that surface renders.
0120A grouped story names a group, and a scan that checked nothing has not passedAcceptedA 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.
0121The component tier describes components the rewrite replacedAcceptedA component tier entry is a claim about a component this system ships.

Phase 4

6 decisions.

No.DecisionStatusWhat was decided
0017One flat custom-property namespace, one owner per nameAcceptedThe --wr-* namespace is one namespace, and a name in it belongs to exactly one tier.
0023Type families, three families resolved on the theme axisSuperseded by ADR-0035Three families enter the Primitives collection, mode less, alongside the ramps and the spatial scales, and two semantic roles resolve them per theme.
0037Occlusion reorders the demand queue, and the scrim suspends a demand rather than hiding oneAcceptedThe scrim dims light.
0038An overlay is charged for what it covers, and its sheet fills the viewAcceptedA pixel covered by an occluding Scope belongs to that Scope's budget and to no other.
0047A file must name the component it is forAcceptedA 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.
0049A narrative may not be checked wholesale, and one section of it must beAcceptedA narrative's historical claims are not checkable and must not be checked.

Phase 5

8 decisions.

No.DecisionStatusWhat was decided
0008Next.js for the docs siteAcceptedThe docs site (apps/docs, serving r136.dev) is a Next.js application.
0018Length ceilings are bootstrapped from real shipped copy, not chosen freehandSuperseded by ADR-0019Each 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.
0019Length ceilings refreshed with real level-1 through level-3 copyAcceptedThe 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.
0114A Scope is data-wr-layer="scope", a demand is level 4, and the first real page measures 0.023AcceptedA Scope in markup is data-wr-layer="scope", and it goes where ADR-0073's test says a Scope goes.
0115The ration engine was carrying ADR-0005's retired clause, and the rung it needs is derivable from this system's own ladderAcceptedThe dominance margin returns to ADR-0036's rule, denominated in a rung derived from this system's own neutral ladder.
0116The intensity ladder's band boundaries come from the theme, and the dark theme had been scored against the light one'sAcceptedBoth boundaries are derived, per theme, from quantities the system already derives.
0117A block is pixels, the Scope's ground is out of the contest, and both were already acceptedAcceptedA block reports the deviation measured across its pixels, not the deviation of its ground.
0118The docs shell declares what it carries and what it draws, and the ground is synthesized rather than foundAcceptedOn this site the system is Wolf-Rayet, so chrome is what it draws and content is what it carries.

Phase 6

8 decisions.

No.DecisionStatusWhat was decided
0020The live demo reaches the real engine server-side onlyAcceptedClient-native pixel capture is rejected as a permanent path.
0086The only check that looks at the page, and what it found when it was finally readAccepted.specimenMount becomes a scroll container.
0087Emphasis nests, and so does everything else the inline renderer was flatteningAcceptedEmphasis and link labels recurse.
0088A backtick on the page is a render site, and the check found four in the record that fixed the last oneAccepteddocs:check-site gains a sixteenth check: no visible text node may contain a backtick.
0090The check that looks at the page can look at the served oneAcceptedDOCS_CHECK_ORIGIN selects the origin the page checks read.
0094Focus is drawn by the system, and the fixtures are build outputAcceptedOne ring, drawn by the system, on every component that accepts input.
0095The site is a product, and its centrepiece is built from the systemAcceptedThe shell.
0096An icon set, a grid, and no em dash in a headlineAccepted### The icon set

Phase 4, reopened

52 decisions.

No.DecisionStatusWhat was decided
0021The component set reopens to Carbon's published rosterAcceptedThe component set expands from seven to Carbon's full published roster.
0029Themed coverage is the roster, and a scene with no baseline entry failsAcceptedThemed coverage is the roster, not a phase.
0032A baseline is recorded per platform and gated exactly; the cross-platform bound is retired, not widenedAcceptedthemed-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.
0033The unthemed path comes under ADR-0032 before it comes due, and PLATFORM_TOLERANCE survives as a noise floor that gates nothingAcceptedbaseline.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.
0034A step reports only what its own job measured; committed evidence must say soAcceptedA 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.
0035The shipped subset is a decision, and the fall-through is its boundaryAcceptedThe faces are subset, and the subset is declared in the token source.
0036The dominance margin comes from the ladder, and PLATFORM_TOLERANCE keeps only the use that is about rasterisersAcceptedThe salience dominance margin is one rung of the theme's own lightness ladder, spread over the area the claim is made about.
0039Two roles on one lightness is the ladder; a state told apart by hue alone is the defectAcceptedTwo 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.
0043The ladder's first rung, and the check that could not see it missingAcceptedThe ladder is repaired by rebinding roles to steps, not by moving a ramp.
0044Quiet is what "fine" looks like, and a condition may not be whisperedAcceptedTwo rules.
0045A turned corner says you may act, and costs the budget nothingAcceptedThe spatial tier acquires a radius scale, and a turned corner means exactly one thing: this component accepts input.
0046Chrome that outlives a route may not demandAcceptedA Scope that persists across routes is chrome, and chrome may not hold a demand.
0048A claim has an age, and a screen that cannot vouch may not look calmAcceptedA component that renders a claim about an external condition declares whether it can vouch for that claim.
0050Acknowledgement descends a demand, and is a rule rather than a componentAcceptedAcknowledgement descends a demand one rung, from Demanded to Directed, and does not touch the condition.
0051Acknowledgement is serialized, and the tick joins the vocabularyAccepteddata-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.
0052The Lightning reconciliation, and three counted claims the roster got wrong about itselfAcceptedAll 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.
0053A route's header may hold what the shell's may notAcceptedpage-header is a Scope that belongs to one route, and its subtree may hold the View's demand.
0054An Arbiter grants, and this is the first one that doesAcceptedbutton-group is an Arbiter that grants a level to each action it holds.
0055Good news may not be distinguished, and a blank is three sentencesAcceptedempty-state is an Emitter whose subject is an absence, and its reason is required.
0056The battery is a list, or it is a habitAcceptedtools/battery.js is the battery: the artifacts every component has and the checks every component must pass, in one place, read by three consumers.
0057Carbon separates these on quantity, and this system has no quantityAcceptedlist, contained-list and structured-list are removed from the roster.
0058tile is a Scope, and it is the one every scene has been typing by handAcceptedtile becomes region: a Scope, in section E, at "none — allocates", and it is built.
0059Disclosure is a property, not a component, and for one of them it is the resting stateAcceptedADR-0040's rule is restated on the property: a component that removes an element from the frame may not remove a Demanded one.
0060A lower hierarchy is a lower rung, and content-switcher is tabs at oneAcceptedcontent-switcher is removed from the roster.
0061breadcrumb is the pattern navigation-item was built for, and this is where the collapses stopAcceptedbreadcrumb is removed from the roster and enters *Not carried, with the reason*.
0062An obstruction is not an alarm, and the states are the fieldsAccepted
0063The themed set catches up, and a list that stopped is worse than one that never startedAcceptedThe ten scenes join RETHEMED, and the three declared must-fail among them join the themed set's own MUST_FAIL list.
0064One derivation per list, and the check that joins two of themAcceptedBoth lists move into data modules that their tools import, and the check imports the same modules rather than parsing anything.
0065The two expectations meet, and the last list leaves the CLIAcceptedTHEMED_MUST_FAIL moves to packages/budget/src/themed-must-fail.js, verbatim with its comments, and cli.js imports it.
0066A bar that counts what is not there, and the second layer the roster got wrongAccepted
0067A failed upload ranks nothing, and section B's own example was wrong twiceAcceptedfile-uploader is removed from the roster and enters *Not carried, with the reason*.
0068A tree is a machine for hiding demands, and §5 is right for a different reason than it givesAcceptedtree-view is removed from the roster and enters *Not carried, with the reason*.
0069A countdown reports a prediction, and its level is the only one this system computesAccepted
0070The oldest decision gets its first componentAcceptedcode-snippet declares two slots, and the split is ADR-0009's.
0071The test was one axis short, and presence is the row it would have costAcceptedpresence stands and is to be built, declaring vouches: true.
0072The retraction is the component, and both defects were found by the machinery rather than by the argumentAccepted
0073A Scope is a place, timeline is not one, and the test has a layer it was never run againstAccepted
0074Three checks were owed, one of them was already done, and the claim had been carried forward twiceAccepted
0075A container retracts its own claim, and a Scope's retraction has one halfAccepted
0076A toggletip is a popover and a button, and the hosting question answers them the same wayAccepted
0077The roster's last Scope comes due on §5's second depth, and the engine has no word for itAcceptedpopover is a raised Scope at §5's second depth, rendered inside its anchor's Scope and never portalled.
0078The same rule for containing, and the second thing nesting breaksAccepted
0079A frame carries properties, never identities, and two of the three symptoms were not a gapAccepted
0080The roster's last Scope, and the two things its depth changed that nothing predictedAcceptedpopover 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.
0081Section C is where the tier axes decide nothing, six rows refused, and the collapse is already inside the built halfAcceptedThe six candidate rows are refused and move to the exclusion table with their reasons.
0082Sections D and G audited: four refused, one kept, and the roster is one row from completeAcceptedmenu, overflow-menu, avatar and combobox are refused.
0083A closed select's options were never in the frame, and ADR-0081 was wrong about itAcceptedADR-0081's select finding is retracted.
0084The affordance is the perimeter, and a corner is what a perimeter has when there is a boxAcceptedADR-0045's rule generalises rather than gaining an exception: an interactive component says so on its perimeter, and there are three carriers.
0085The roster's last row, and a ladder the scene took awayAcceptedlink declares one rung, Marked, and it is the first single-rung Emitter in the system.
0091Three fields are one field, and the first built component leaves the setAcceptedtext-area and select leave the set.
0092A removal does not renumber the past, and a set is counted onceAcceptedAn ordinal is build order, and a removal is recorded rather than renumbered.
0093A meter's state is a shape, and there is no exemptionAcceptedmeter draws its state as a shape.

Phase 2, reopened

1 decision.

No.DecisionStatusWhat was decided
0022Three type families, self-hosted, legibility governs the hostile themesSuperseded by ADR-0023Three 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.DecisionStatusWhat was decided
0024A pending state carries no motion; the block form is a Pending messageAcceptedNeither pending component declares motion beyond the ambient grant, and the block form renders §6's Pending pattern in full.
0025A tag's encoding is its label; there is no category rampAcceptedA tag's primary encoding is its label.
0026A tooltip is an Emitter; transience is a presence property, not a layerAcceptedA tooltip is an Emitter.
0027Emphasis is the level; a button has no emphasis variantAcceptedEmphasis is the level.
0028Shape carries the rule of a set, and the shape vocabulary splits in twoAcceptedShape may carry the rule of a set as well as a meaning for attention, and the two are different vocabularies.
0040A collapsed panel is absent rather than exempt, and a demand may not be the thing that is hiddenAcceptedA collapsed panel's children are absent from the frame, not exempted from the budget.
0042A toast reports an event; a demand is a live condition, and arrival is not escalationAcceptedA toast is an Emitter, and its legal levels are Marked and Directed.

Phase 1, reopened

2 decisions.

No.DecisionStatusWhat was decided
0030The ceiling derives from the theme, not from the scenes it judgesSuperseded by ADR-0031Each theme's emission ceiling is derived from that theme's own ramps and role floors, and reads no scene.
0031The ceiling's independence is of its inputs, not of its selectionAcceptedA ceiling's independence is a property of its inputs, not of the process that selected it.

Phase 4, continuing ADR-0040

1 decision.

No.DecisionStatusWhat was decided
0041A declaration must reach the frame, and the check that says so may not be an absenceAcceptedA 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.DecisionStatusWhat was decided
0089A numeric field owes its unit and its bounds, and the scene caught the sceneAcceptednumber-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.DecisionStatusWhat was decided
0097The proof product is five screens, and each is a captured sceneAcceptedCapture is a build step.
0098Instrument indoors, signal outside, and the palette it setsAcceptedOne system, two voices, chosen by theme family.
0099Three type roles and five facesAcceptedA third role, mono.
0100The instrument treatment on componentsAccepted- Corners take the smallest step, and keep their meaning.
0101A voice per theme familyAcceptedA voice is a family-tier value set.
0102Archivo for displayAcceptedDisplay is Archivo in every theme.
0103Caps for eyebrows onlyAcceptedUppercase is for eyebrows only.
0104A trend is a meter over timeAcceptedtrend joins the roster in section F, as the meter over time.
0105A status colour is two roles, and the palette is authored in P3Accepted- Three new roles: status-critical-bold, status-caution-bold, status-positive-bold.
0106The affordance is a gap, not a cornerAccepted- Everything with a ground is rounded.
0107Nothing sustains motionAccepted- No component sustains motion.
0108A stacking context castsAccepted- Each stacking context carries a shadow.
0109The ladder is narrower than it wasAccepted- spatial.type.ratio drops from 1.25 to 1.125.
0110A shadow resolves where it is declaredAccepted- The shadow tokens are emitted on [data-wr-theme], not on :root.
0111The site checks its own copyAccepted- content-lint:scan-site reads apps/docs/app/site/text.ts and runs the rules over every string it authors.
0112The reference is the referenceSuperseded by ADR-0113- radius-surface and radius-control both select 6px, in both densities, and the affordance gap is retired.
0113The reference was scaffolding, not the destinationAcceptedThe reference is retired as a goal.
0122The site's own harness answers for the site's surfaceAcceptedA check in the site's harness derives both its population and the route it reads from the site's own surface.
0123The length ceiling retires with the corpus it was bootstrapped fromAcceptedADR-0018's length ceiling retires, and scan-real-copy.js retires with it.
0124The shell paints in roles, and the ramps floor the pairs it usesAcceptedThe shell paints in the semantic roles, and the ramps declare a floor for every pair it paints.
0125The cascade is read, and the grouped set consumes the tier generated for itAccepted### The cascade is read
0126The discipline test governs the twenty, and is runAccepted### The table is exactly COMPONENT_LAYERS
0127A loop is granted off the ladder, and floored rather than cappedAcceptedA loop is granted, and the grant is not a rung.
0128A record's levels mean what its layer lets them meanAcceptedA record's level list is read through its layer, and only an Emitter's is a capability.
0129The sequenced three, and the ordinal that was never brokenAccepted### radio retires into checkbox
0130A hue is not a classificationAcceptedA hue is not a classification, so the four decorative appearances are neither of the two things ADR-0121 asked about.
0131Wiring a component to its tier is a record questionAcceptedA component holding a token record reads its own tier and no primitive.
0132A page header's title is the size the system grants itAcceptedThe record is right.
0133The grouped nine read their tiersAcceptedEach component reads its tier for every property the record gives a role to.
0134Overlays enter and leave on their grantAcceptedEvery overlay enters from where it belongs and leaves the way it came.
0135The helm display adds one Scope and three meter drawingsAcceptedThe helm primary display is built as a proof scene in field-day and field-night, and it adds one component to the roster.
0136The field reads at arm's length, and its raises reach the componentsAcceptedThe field class has a reading minimum of 1rem.
0137The faces load from beside the packageAcceptedThe 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.
0138The flat surface yields to the tier where they share a nameAcceptedWhere the flat surface and the tier are one role, the tier wins wherever a theme is set.
0139An instrument states its datum, and its scale states its boundsAcceptedrange is removed from the instrument drawings.
0140The helm's second pass puts each reading on one lineAcceptedA reading is one line.
0141Selection is a shape, not a hueAcceptedA selected Button is the page ground, the primary ink, and a heavy outline in that ink.
0142The Figma library is generated from the repoAcceptedtools/figma-sync builds the library.
0143The Figma library is three filesAcceptedOne plugin, one command per file.

Unphased

1 decision.

No.DecisionStatusWhat was decided
READREADMEUnknown