The streaming label pulses, and its copy escalates (kk92a)
While a chat response is in flight the waiting label pulses between the muted tone and a slightly
brighter one on a 2-second sine, after a 3-second warm-up. The warm-up is the load-bearing part: a
pulse that starts immediately makes a SHORT response flicker once and stop, which reads as a
rendering glitch rather than as liveness. TERM_REDUCED_MOTION=1 holds it on a single frame.
The copy now escalates on elapsed time — "waiting for response", then "still waiting" at 10s,
"still working" at 20s, "this is taking a while" at 30s, "still going — Ctrl+C to stop" at 45s —
instead of toggling dimColor every 300ms. A verb that changes on a timer carries no information;
a threshold states something true about this response.
One caution for anyone editing the palette: the shimmer's bright end is its own constant and is NOT
MUTED_STRONG. That token is the separate STATIC inactiveShimmer value; conflating the animation
pair with it is the easy mistake, and npm run selftest:tui-shimmer-label asserts they differ.
Known Limitations and Deferred Work — the spinner question, resolved. The reference product has no rotating glyph in its main loop at all, which is an argument for removing Cyberine's braille spinner and letting the shimmer carry liveness alone. It is NOT removed here, deliberately: the spinner's cadence was just fixed and pinned by its own selftest, and deleting it in the very next commit is exactly what that work warned against. More importantly, "replace or complement" is a visual judgement that has to be made by looking at both on a real terminal, which no headless check can stand in for. The two therefore ship together for now, and the removal decision is filed separately rather than made blind. The 48-verb rotation also survives on FLEET ROWS, where the per-run seed is what keeps two concurrent rows distinguishable — only the single in-flight chat label moved to elapsed-time copy.
Decision (kqt6z, 2026-09-25): both stay. Observed on a real PTY (tmux, 120x40, cyberine chat,
one planner turn on deepseek): before the first token the input row reads ❯ ⠇ waiting for response, the braille glyph stepping every sample and the row's colour moving between
rgb(255,159,45) and rgb(255,172,32) across frames 0.5 s apart; once tokens stream, the label is
gone and the spinner is the ONLY liveness cue left on the input row (❯ ⠸), with a second spinner in
the assistant message's gutter (◆ ⠏). Removing the spinner would leave the streaming phase with no
motion on the input row at all, so it is not a replacement candidate for the shimmer, which only
exists before the first token. The spinner's cadence selftest therefore stays. What the pass did
show is that two glyphs animate at different phases during streaming, one in the gutter and one on
the input row; whether the input-row one should hide while the gutter one runs is a separate polish
question, not this one.
The wide hub: a 140-column breakpoint that splits list and preview (kxxph)
At 140 terminal columns and above, the cyberine agents hub stops being one column. The runs list becomes the left pane, the run preview becomes a full-height right pane, and a vertical rule sits...
Meters render at sub-cell resolution (k9y4k)
Progress and context meters use the eighth-block ramp for the cell at the fill boundary, so a 16-cell bar shows 129 distinguishable levels instead of 17 — at the same width, because all eight...