accessibility

Contrast is asserted by the build, not by intention. The audit found a defect that had been shipping for months.

the build asserts it

design/build-tokens.py --audit prints every foreground / background pair the system actually puts together, with its WCAG ratio and the threshold that applies, and exits non-zero if any fall short. The list is curated, not generated — an all-against-all would be hundreds of rows nobody reads, flagging combinations that never occur.

It audits derived steps too, not only the raw tokens: the editor's dim ramp and Spotify's subtext step are computed inside the theme renderers and are as load-bearing as anything in the token source.

what it found immediately

Secondary ink had failed AA on all three light surfaces since the palette was inverted — 3.62 / 3.94 / 3.34 against a 4.5 requirement — and it is the ink for every subtitle in the shell. The inversion pass measured the wallpaper shader carefully and the chrome by eye. That is the gap this closes.

The fix kept hue and saturation and dropped lightness 0.531 → 0.446, giving 4.88 / 5.31 / 4.51, with the luminance gap to primary ink preserved so the two-tier hierarchy still reads.

every pair, live

Rendered by the same function that gates the build, so this table cannot advertise a ratio the build does not enforce.

pairfg / bgratiomingrade
primary ink on base surface7.904.5AAA
primary ink on raised chrome8.604.5AAA
primary ink on hover surface7.304.5AAA
secondary ink on base surface4.884.5AA
secondary ink on raised chrome5.314.5AA
secondary ink on hover surface4.514.5AA
hairline against base surface1.321.3ok
accent ink on accent4.544.5AA
accent ink on accent-dim5.744.5AA
accent against base surface4.013.0ok
terminal text12.054.5AAA
terminal cursor on background8.133.0AAA
terminal ansi[1]4.774.5AA
terminal ansi[2]6.164.5AA
terminal ansi[3]7.404.5AAA
terminal ansi[4]5.894.5AA
terminal ansi[5]5.364.5AA
terminal ansi[6]7.024.5AAA
terminal ansi[7]9.704.5AAA
terminal ansi[9]6.234.5AA
terminal ansi[10]8.204.5AAA
terminal ansi[11]9.854.5AAA
terminal ansi[12]8.134.5AAA
terminal ansi[13]7.184.5AAA
terminal ansi[14]9.434.5AAA
terminal ansi[15]13.734.5AAA
editor comment4.934.5AA
editor line number3.993.0ok
editor placeholder on input4.834.5AA
editor inactive tab on deep5.794.5AA
editor button ink on accent8.134.5AAA
spotify text on main12.054.5AAA
spotify subtext on card4.834.5AA
spotify subtext on main5.784.5AA
spotify field subtext on main7.224.5AAA
gtk ink on bg-012.054.5AAA
gtk dim ink on bg-07.564.5AAA
gtk ink on bg-110.454.5AAA
gtk dim ink on bg-16.554.5AA
gtk ink on bg-213.284.5AAA
gtk dim ink on bg-28.334.5AAA
gtk accent as link text5.114.5AA
gtk ink on accent fill6.994.5AA
gtk border against window1.621.3ok

colour that cannot break contrast

Spotify's field can take its hue from the album art. Recolouring naively would undo all of the above the first time a yellow cover played: holding HSL lightness constant lets relative luminance swing 1.70× across the hue circle, because HSL lightness is not perceptual brightness.

So the tint rotates hue and saturation, then solves for the lightness that reproduces the original WCAG luminance. Measured across every hue at four saturations, the error is 0.000%. Contrast holds by construction rather than by luck.