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.
The stall indicator stays inside the palette (kfapa)
While a reply is streaming, the input frame drifts from the brand accent through the warning tone to the error tone as the stream stays silent, reaching its end state after 8 seconds — the same...
The chat REPL is a bottom-anchored column (kntve)
The conversation grows UPWARD off the input, the way every good REPL does. Before this the transcript was a fixed-height box with no justifyContent, so on a 50-row terminal two messages sat at the...