cyberine
UsageRun recipes

One state grammar across every pane (kctsa)

Run and worker state colours come from stateColor() everywhere, so every surface teaches the same language: a blue spinner means working, a blue check means done.

The workflow monitor used to teach the opposite — running painted warning-yellow, done painted the brand accent — and that accent collided with accent-as-SELECTION inside the same component, so a completed phase and a selected row were the same colour. Because those tokens bypassed the palette's state map, the cyan, claude-dark and light variants were being served dark-theme semantics in that one pane. The accent is now reserved there strictly for the selected row.

npm run selftest:tui-state-grammar guards it mechanically rather than by comment, because this drifted silently for as long as it existed: it asserts the monitor resolves every state through stateColor(), that done is not the accent, and that no hard-coded colour is assigned to a color prop or field anywhere under src/tui/. The brand art (src/tui/brand/) and the palette itself are exempt — mascot canvases are one-off art with their own palettes, not state colours.