Design system
Every component in dark, in light, and with the hue removed. This page is the acceptance surface for the port and the regression check for every phase after it. Nothing here names a colour; every surface and status resolves a token — and the greyscale column is what proves it, because colour is never the only carrier.
W1 · component galleryColour & surfaces
Chrome stays achromatic so the only saturated pixels on screen carry a verdict. If something is coloured, it means something.
dark
surfaces
semantic — each owns exactly one meaning
light
surfaces
semantic — each owns exactly one meaning
dark · greyscale
surfaces
semantic — each owns exactly one meaning
Type & density
Three families with distinct jobs: Bricolage Grotesque for hierarchy, Instrument Sans for interface prose, and Azeret Mono for evidence, identifiers and provenance.
dark
light
dark · greyscale
Verdicts & outcomes
Four outcomes, three sizes, one shape language. A setup failure and an indeterminate result are rendered with the same care as a pass — the credibility of the gate rests on people believing the difference.
dark
card
row · inline
greyscale proof — colour is never the only carrier, so hue removal must lose nothing
light
card
row · inline
greyscale proof — colour is never the only carrier, so hue removal must lose nothing
dark · greyscale
card
row · inline
greyscale proof — colour is never the only carrier, so hue removal must lose nothing
Run strip
A whole run in one proportional row, with its denominator. Segments keep declaration order so two runs stay comparable at a glance.
dark
light
dark · greyscale
Setup failure
Grouped by the flow that broke, never by test. This component exists so that one broken factory can never read as eleven regressions.
dark
Setup flow process.uniqueName could not provision
— 11 cases never startedSchema drift detected on the process name field — the captured flow no longer produces this state.
light
Setup flow process.uniqueName could not provision
— 11 cases never startedSchema drift detected on the process name field — the captured flow no longer produces this state.
dark · greyscale
Setup flow process.uniqueName could not provision
— 11 cases never startedSchema drift detected on the process name field — the captured flow no longer produces this state.
Controls
The whole product has four button weights, and the filled one is almost always Approve. Scarcity is the point: when a page has one solid button, nobody has to hunt for the consequential action. Everything below is live — every control writes to the URL and nothing holds its own state, so this section is also the proof that a filtered screen can be pasted into a ticket.
dark
four weights — filled is rationed, danger is never filled
segmented — mutually exclusive, all options visible
filter chips — multi, order-independent, click to toggle
select · menu — enumerations, never free text
Attach nothing
radio · stepper · tooltip
query — the grammar is the placeholder
button role="switch", never a checkbox with a background image. 38×21, a 15px knob, 17px of travel at 120ms — a discrete state change, not a disclosure. Accent says “you set this”, never “this is good news”.tabs & pagination — the run detail shell
FailuresThe two failing cases, newest first.
light
four weights — filled is rationed, danger is never filled
segmented — mutually exclusive, all options visible
filter chips — multi, order-independent, click to toggle
select · menu — enumerations, never free text
Attach nothing
radio · stepper · tooltip
query — the grammar is the placeholder
button role="switch", never a checkbox with a background image. 38×21, a 15px knob, 17px of travel at 120ms — a discrete state change, not a disclosure. Accent says “you set this”, never “this is good news”.tabs & pagination — the run detail shell
FailuresThe two failing cases, newest first.
dark · greyscale
four weights — filled is rationed, danger is never filled
segmented — mutually exclusive, all options visible
filter chips — multi, order-independent, click to toggle
select · menu — enumerations, never free text
Attach nothing
radio · stepper · tooltip
query — the grammar is the placeholder
button role="switch", never a checkbox with a background image. 38×21, a 15px knob, 17px of travel at 120ms — a discrete state change, not a disclosure. Accent says “you set this”, never “this is good news”.tabs & pagination — the run detail shell
FailuresThe two failing cases, newest first.
Disclosure
One primitive, 220ms, opacity and transform. The content is in the DOM whether the row is open or closed — a reader who searches a report for the assertion that failed must not be told it is not on the page.
dark
Expected the approval banner to name the delegate. The page rendered the manager's own name instead, so the delegation never took effect.
STATE·builder.validationBLD-VLD-01validation-rule.spec.tsA browser-driven explorer cannot reach a rule the server enforces without a client path to it. Recorded as a structural gap rather than as backlog, and reviewed on a date rather than closed by a run.
Collapsed is clipped, never removed: hidden, display:none and visibility:hidden all take the text out of the browser's find. The trigger is a real button carrying aria-expanded, so the state is announced rather than drawn.
light
Expected the approval banner to name the delegate. The page rendered the manager's own name instead, so the delegation never took effect.
STATE·builder.validationBLD-VLD-01validation-rule.spec.tsA browser-driven explorer cannot reach a rule the server enforces without a client path to it. Recorded as a structural gap rather than as backlog, and reviewed on a date rather than closed by a run.
Collapsed is clipped, never removed: hidden, display:none and visibility:hidden all take the text out of the browser's find. The trigger is a real button carrying aria-expanded, so the state is announced rather than drawn.
dark · greyscale
Expected the approval banner to name the delegate. The page rendered the manager's own name instead, so the delegation never took effect.
STATE·builder.validationBLD-VLD-01validation-rule.spec.tsA browser-driven explorer cannot reach a rule the server enforces without a client path to it. Recorded as a structural gap rather than as backlog, and reviewed on a date rather than closed by a run.
Collapsed is clipped, never removed: hidden, display:none and visibility:hidden all take the text out of the browser's find. The trigger is a real button carrying aria-expanded, so the state is announced rather than drawn.
Tags & metadata
Four families, four shapes, so a reader can tell what kind of fact a tag carries without reading it.
dark
layer — square, mono, outlined. Filled when e2e
role — pill, tinted neutral. A role is not a status
provenance — unbroken in both directions, or it is a defect