| D-M6-10-0 |
2026-10-15 |
The ticket was built on an integration base and ported onto main with only its own commit; the chart roles color.viz.*, their contrast pairing and the preview viz of plan ruling D-W-13 are on main already, so the base's port of them is left out. The rows stand in a section per ticket like the other ported tickets. |
The tickets are built in parallel on integration bases; main takes each ticket as one pull request (D-W-100). |
| D-M6-10-1 |
2026-10-15 |
Simulation model: the matrices of Machado, Oliveira and Fernandes 2009 (IEEE TVCG 15(6), doi:10.1109/TVCG.2009.113) for severity 1.0, for protanopia, deuteranopia and tritanopia, in tokenkit/cvd.py with the citation. They are applied in linear sRGB: decode, multiply, clip to [0, 1], encode. Tests pin every column against the published numbers, white and greys unchanged, and two samples worked by hand from the table. |
One model for all three deficiencies, in linear RGB, as browser developer tools use it; the gate needs a reproducible transformation, not a perceptual study (brief, design note 1). |
| D-M6-10-2 |
2026-10-15 |
Distance: OKLab Euclidean distance of the two simulated colours (delta_e_ok), computed on the unrounded simulated values. cvd_min_delta_e_ok is 0.05 in design/design-rules.json, with source and reason there: 2.5 times the just noticeable difference 0.02 of deltaE OK (CSS Color 4), because chart marks are small and the noticeable difference grows as marks shrink (Szafir 2018). A row passes when the distance rounded to three places reaches the minimum, as contrast rows round to two. Measured minimum before and after the adjustment (series; traffic light): light protanopia 0.056 to 0.071; 0.069 to 0.123, deuteranopia 0.012 to 0.094; 0.008 to 0.083, tritanopia 0.076 to 0.076; 0.095 to 0.079; dark protanopia 0.054 to 0.086; 0.071 to 0.075, deuteranopia 0.012 to 0.067; 0.007 to 0.059, tritanopia 0.116 to 0.116; 0.011 to 0.099. |
The measure the palette guards already use; the factor is a stated design choice, not a measured value (brief, design note 2). |
| D-M6-10-3 |
2026-10-15 |
Changed values (alias steps of the same scale, so hue and series order stay): light color.viz.series.3 spruce.600 (#1b8a83) to spruce.700 (#136f69), color.viz.series.6 moss.600 (#1b9046) to moss.900 (#063e1a), color.warning.fg amber.700 (#8c4f10) to amber.800 (#6b3b09), color.danger.fg rowan.700 (#b21622) to rowan.900 (#63080e); dark color.viz.series.3 spruce.400 (#49c0b7) to spruce.300 (#7cd5cd), color.viz.series.7 rowan.400 (#fb827a) to rowan.500 (#f15653), color.danger.fg rowan.300 (#fcaaa3) to rowan.400 (#fb827a). Two series per theme is the fewest that passes (exhaustive search over the steps of each series' own scale); no palette step changes, so no other pairing moves. The traffic light failed under deuteranopia in both themes and under tritanopia in dark; the state roles changed because every contrast pairing of banners, badges and live box stays green in both themes and with every accent (make tokens). All previews are regenerated, because the state roles appear in the components, layout, mobile and palette sheets too. |
Brief, design note 4: fewest series, lightness before hue, guards and contrast green; the state roles only with the banner and badge pairings green. |
| D-M6-10-4 |
2026-10-15 |
Pairs (cvd_pairs): a sequence entry with the eight series and wrap: true gives 1 with 2 up to 7 with 8 and 8 with 1; a pairs entry gives success.fg with warning.fg, warning.fg with danger.fg and success.fg with danger.fg; all under the three deficiencies, per theme (light, dark). The accents of M4-03 swap none of these roles, so there are no per-accent CVD rows; a test fails if an accent role joins the checked roles. Rows go to contrast.md (section "Color vision deficiency") and to the member cvd of tokens.resolved.json. |
Brief, design notes 3 and 5. |