| D-M4-03-0 |
2026-10-14 |
The ticket was built on an integration base and ported onto main with only its own commits; the English docs and spec of main win, and text this ticket adds is English. The tool's ruff configuration selects no D rules; the new code carries docstrings anyway, no lint rule is added. |
The tickets are built in parallel on integration bases; main takes each ticket as one pull request. |
| D-M4-03-1 |
2026-10-14 |
The rules member accent_variants of design/design-rules.json names the default (spruce), the seven accents of 01 section 12 and the eight swapped roles. tokenkit/accents.py validates it (default in the accents, every accent a palette scale, every role an opaque colour in both themes) and raises a RuleError naming the member. A role is swapped in a theme only where it aliases palette.spruce.<step> directly; otherwise it is kept and shown as "not swapped". |
One place for the list the server, the apps and the gate share; a role that does not follow the brand scale (dark color.focus.ring on gorse) must not change with the accent. |
| D-M4-03-2 |
2026-10-14 |
Step search: a variant starts on the same step of the chosen scale (nearest step by number if missing, a tie goes darker in light and lighter in dark) and, while one of its pairings fails, moves one step towards more contrast (darker when the role is the darker colour of the failing pair, else lighter) until all pass; a scale end, a flat scale or a revisited step fails the build with accent <a>, theme <t>: no step of <scale> meets <pairing>. moved_from records the start step and contrast.md shows it. With today's palette no variant moves. |
A fixed step on a lighter scale cannot always meet AA, while 01 section 12 promises that every listed accent works; the moved steps stay visible. |
| D-M4-03-3 |
2026-10-14 |
DsAccent is a separate ThemeExtension with one constant per theme and accent (lightSpruce ... darkMoss) and DsAccent.of(key, brightness), an unknown key giving the default; it is not a fourth resolver modifier. DsColors keeps its fields. In CSS the light/dark default theme block of an accent also covers an element without data-theme, and a prefers-color-scheme block covers the other theme, as for the base roles; data-accent sits on the same element as data-theme. |
The tool allows a token to depend on one modifier only, and an accent role always combines with the theme; existing code keeps compiling. |
| D-M4-03-4 |
2026-10-14 |
Guard scope: the palette guard "Brand and accent" keeps checking the base roles only; accent variants of an instance are not checked against it. The Discord guard covers every scale. Recorded below the ban list of the design README. |
01 section 12 allows heather, rowan and amber deliberately as the instance owner's choice from the checked palette, while the product brand stays spruce; contrast applies to the variants in full. |
| D-M4-03-5 |
2026-10-14 |
An accent without a passing step is reported as a failed gate (exit 1, nothing written, the other gate messages still listed); an invalid accent_variants member stays an error of the rules file (exit 2), as for other rule errors. |
The brief's test asks for exit 1 when a variant falls below AA; an invalid rules file is a different failure. |