Skip to contentWolf-Rayet

Decision records

ADR-0025 A tag's encoding is its label; there is no category ramp

Accepted2026-09-01Phase 4, reopened by ADR-0021

#Context

Carbon's tag carries a colour that names a category — red, magenta, purple, teal, and so on for eleven of them — and that colour is the component's most recognisable property. It is also the one property this system has nowhere to put.

§2 closes the channel list at three: light, language, motion. A category hue is none of them. It is not light in this system's sense, because light here is intensity — a position on a ladder that says how much of the reader's attention a thing has been allocated — and magenta says nothing about intensity. The semantic tier has fifteen roles and every one of them resolves to a meaning about attention or about structure; there is no role for "this is the eu-west-1 colour" and adding eleven would be adding a fourth channel to hold one component, which is the reason ADR-0021 dropped ai-label by name.

So the tag arrives with the same shape of problem the pending components arrive with, from the other direction: the encoding the industry uses is one this system does not have. Unlike them, the tag has an obvious substitute sitting in plain sight, and the decision is really about admitting what it is.

There is a second force, and it is about redundancy rather than about channels. The status-indicator is built, and a tag with status variants and a leading mark is very nearly that component in a box. If the tag is going to ship, it has to be clear what it is *for* that the indicator is not, or the roster gains a duplicate and ADR-0021's coverage argument turns into a coverage claim.

#Decision

A tag's primary encoding is its label. Its variant axis says what the classification means for attention — neutral, positive, caution, critical — carried by a leading marker's shape, with hue as reinforcement where a theme has hue to spend. There is no category ramp and no category variant.

The label is required and is the datum: eu-west-1, beta, read-only, shift-b. It is set in the primary reading role rather than the caption role the indicator and the meter give their labels, and that difference is the component — those two have a mark carrying a reading and a label naming what the reading is about, and a tag has no reading at all.

The marker reuses the shape vocabulary the status indicator established and the alert already restates: ring, filled disc, triangle, octagon. It is restated in the tag's own stylesheet rather than imported, and packages/react/test/discipline.test.js now compares every component's polygon for a given shape name against every other's, so a fifth component cannot invent a private triangle and no component can quietly redraw a shared one.

What separates this component from status-indicator, stated so it is not rediscovered. An indicator reports the live state of a named thing and its label says what that state is about. A tag classifies the thing it sits on and its label *is* the classification. The indicator is unbounded and leads a row; the tag is bounded, steps one surface off its ground, and sits inside the row's content. They differ in what the label means, which is the difference that matters, and it survives every theme.

#Rejected options

Carry a category ramp. Eleven hues, one per Carbon tag type, resolving per theme like every other ramp. It is what the component is known for, it is genuinely useful in dense tables where a reader learns the colours, and the generator could produce it without a new mechanism. It lost on §2's channel list and on field-night. ADR-0006 locks that theme to one hue angle, so eleven category ramps resolve to one colour there and the encoding a product had learned to read is simply gone — not degraded, gone — in the theme this system exists to be good in. §4's rule then applies in terms: a component that cannot express its meaning without hue is marked unavailable in field-night rather than given a hue fallback, and a tag unavailable in field-night would be the first hole in the theme matrix ADR-0003 refuses.

Ship the tag with no variant axis at all — one appearance, the label doing everything. The cleanest possible answer to the channel problem, and it has real force: the classification is the label, so anything else is decoration by definition. It lost because it is not true of the classifications products actually write. seal fault and eu-west-1 are both classifications and only one of them is a problem, and a component that could not say which would push that distinction into the copy — a product would start writing ⚠ seal fault — which is a private encoding in a string, invisible to the linter, the budget engine and the level rule alike. Four attention meanings is the smallest axis that keeps that distinction inside the system.

Give the tag its own shape vocabulary rather than restating the indicator's. It would let the shapes be chosen for a chip's proportions rather than inherited from a mark designed to be read across a room. It lost because two components would then mean different things by the same word, and each would look right on its own page. The restatement is checked instead: three components now draw the triangle and four the octagon, character-for-character identical, and a change to one fails until it is a change to all — or until someone deletes the check on purpose, saying so.

Make the tag an Arbiter, on the argument that a row of tags ranks its members. It lost immediately on §3's question. A row of four tags has ranked nothing: they are four facts about one thing, and the decision about which of them matters belongs to the row, which is an Arbiter already. A tag holds one allocation and grants none.

Let the tag reach Demanded for the critical case — a quarantined chip that genuinely needs the region's maximum. It lost on the same arithmetic ADR-0021 used for the input field, arriving at a second component: a tag is plural by nature, a row routinely carries several, and a component whose ordinary state could reach the region maximum makes the one-demand rule fail on the most common thing a list does. Scene 22 measures the plural case rather than asserting it. The escalation path is unchanged and is the one the system already has: the alert carries the imperative, and the tag says what the thing is.

#Consequences

The first component in the set whose primary encoding is text. The meter encodes with length, the indicator and the alert with shape, the row, the field and the navigation item with position and weight. None of the seven relied on its own words. That is worth naming as a new claim rather than an inherited one, and the reason it is safe is narrow: a word is the one encoding no theme in this system can take away, because field-night locks hue and clamps density and does nothing whatever to language.

field-night loses the variant axis and keeps the component. With one hue angle the four variants resolve to one colour, and what still tells them apart is the marker's shape. What still tells one *tag* from another is the label, which is the datum — the same order of losses the meter records, where hue takes the threshold state and leaves the reading.

The shared shape check is now a vocabulary check. It compared two components before this unit and compares five now, in both directions: a declared shape missing from a stylesheet fails, and a clip-path no component declared fails too. That second half is new and is what stops the vocabulary growing by accident as the roster does.

The enforcement surface does not grow. No new check kind and no new matrix cell; the pairing matrix regenerates at 194 cells, unchanged.

What is harder. A product migrating from a system with category colours has no mechanical translation for them and has to decide, per tag, whether the category was carrying an attention meaning or only an identity. That is real work and it is not automatable, which is the honest cost of refusing a channel. The compensation is that the answer, once made, is legible in every theme rather than in three of them.