Skip to content

Animate the working indicator and narrow the side gutter - #410

Merged
TheGreatAxios merged 2 commits into
mainfrom
cl-5695-live-working-indicator
Aug 8, 2026
Merged

Animate the working indicator and narrow the side gutter#410
TheGreatAxios merged 2 commits into
mainfrom
cl-5695-live-working-indicator

Conversation

@TheGreatAxios

Copy link
Copy Markdown
Collaborator

Working indicator (CL-5695)

The density ramp machinery (rampFor, resolveRampPhase) was already fully built and computed correctly on every paint, but its output only ever landed in shell.turnPhase — a field nothing painted. The actual on-screen bottom-left status slot is a separate mechanism, lockup.ts, which rendered the phase word through a brief neutral crossfade and never carried color or motion tied to the turn's real state. That gap is why a genuine stall looked identical to normal progress.

This wires the lockup slot to the same ramp phase the density ramp already computes, adding a third phase — stalled — driven by the stall watchdog's existing shouldNoticeStall check (no new state, no second source of truth):

  • moving: bronze, crossfades on every real text/tool event
  • waiting on you (blocked gate): frozen orange, holds still
  • stalled: orange, blinks the word out for a same-width row of ! every ~450ms

Blocked and stalled share a color on purpose — both mean "not making progress on its own" — but are never confused: blocked freezes, stalled blinks and changes glyph shape, so the difference survives a monochrome terminal too.

Side gutter

The gutter held at 2 columns per side from 60 columns wide upward, with no further scaling — read as excess air on a wide pane. Narrowed to 1 column, still enough to keep content off the frame edge.

Verification

Full suite passes except one pre-existing, unrelated failure (lsp-availability.test.ts, caused by a missing dev binary in this environment, not touched by this diff). Manually verified in tmux with a scratch driver against a real stall watchdog (no faked clock): captured ANSI output confirmed bronze while moving, frozen orange while blocked, and an orange blink between the phase word and !!!!!!!!!!!!!!! once the run went genuinely silent.

@linear-code

linear-code Bot commented Aug 8, 2026

Copy link
Copy Markdown

CL-5695

The bottom-left slot printed the phase as a flat word, so a live run and a
hung one rendered identically and the only way to tell them apart was to
wait and see whether anything ever changed. Lead the word with a single
density cell that cycles while the turn moves, holds one static glyph while
the turn is blocked on an operator gate, and blinks a bang once the run has
gone silent. Every distinction is a glyph or a motion before it is a color,
so the states separate on a monochrome terminal and without reading the word.

The stall blink is a bounded burst that settles to a static bang: an alarm
that strobes for the whole stall window becomes wallpaper, and settling lets
the render loop drop back to its slow cadence. Measuring the burst from the
notice threshold rather than stamping it means a resumed session with stale
activity shows the settled glyph immediately instead of alarming about
silence its operator was not present for.

The watchdog now reports the stall as three levels rather than a boolean, so
the indicator can keep reading as stalled through the abort threshold while
the status flash still steps aside for the abort's own message.
The gutter held at two columns per side from 60 columns wide all the way
up, never scaling down or up with the terminal, which read as excess air
on a wide pane. Drop it to one column, still enough to keep content off
the frame edge at every width the gutter is affordable.
@TheGreatAxios
TheGreatAxios force-pushed the cl-5695-live-working-indicator branch from c9d092e to 6c7cd70 Compare August 8, 2026 20:53
@TheGreatAxios
TheGreatAxios merged commit 722dee5 into main Aug 8, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant