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 window that makes the stall row spell out how long it has been quiet.
It used to leave the palette entirely. stallColor returned the accent only while no token had
arrived at all; on the FIRST token of every reply the inline formula produced rgb(0,255,255) —
pure cyan — and then ramped toward a hard-coded red. Neither endpoint was a palette colour, and
cyan means nothing in four of the five variants (in the fifth it is the accent, so it collided).
The ramp now runs over real tokens through a shared rampColor(t, stops) helper in
src/tui/theme.ts, available to any other ramp that needs one. Reduced motion still collapses it
to a single step rather than a continuous drift — a colour that changes every frame IS motion, and
npm run selftest:tui-stall-ramp asserts that branch survives alongside the endpoints.
Known Limitations and Deferred Work. In a variant whose tones are terminal-defined ANSI NAMES
rather than hex (the ansi variant), interpolation is undefined, so the ramp SNAPS to the nearest
stop instead. Degrading to a step there is correct; emitting an invented rgb() would not be.
The fuzzy picker highlights what it matched (kenqx)
Typing in any fuzzy picker now paints the characters that matched, the way fzf, helix and telescope do. The scorer already knew them — it tracks the position of every hit to compute its...
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.