cyberine
UsageRun recipes

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.