Skip to content

feat(desktop): make the running-session indicator clearly in-progress — the blue status dot pulse is too subtle #5519

Open

Description

@MoonOld

Problem

While a session turn is executing, the sidebar row does animate today — the shared blue (accent) StatusDot pulses with isPulsing: true. But the pulse is too weak to read as "in progress":

  • The animation is a plain opacity breathe — keyframes opacity: 1 → 0.5 → 1, ease-in-out, animation-duration: 2s, infinite (@astryxdesign/core astryx.css).
  • It runs on an 8px dot, so a 2-second 50%-opacity fade is easy to miss — especially in peripheral vision, which is where the sidebar is when the user is watching the conversation.
  • The result is that "running" and "settled" look like the same blue dot, so the user cannot tell them apart at a glance.

Worse, when motion is reduced there is no cue at all: prefers-reduced-motion sets animation-name: none on the dot, leaving the running row visually identical to a finished one.

Where this lives:

  • packages/ui/src/session-history-list.tsx — sessionRowSignals() pushes { variant: dotForStatus('active'), isPulsing: true, ... } when the session is responding, and the row draws exactly one StatusDot.
  • packages/ui/src/status-vocabulary.ts — active → 'accent' (blue).
  • packages/ui/src/session-status-presentation.ts — running → 'active'.

Desired outcome

"Running" should be unmistakable at a glance — e.g. a spinner / clearly animated working mark on the running row, distinct from the resting accent dot that is shown once the turn has settled. And because the pulse is the only cue today, there should also be a non-motion fallback (an icon or label), so a running session is still recognisable with reduced motion enabled.

Alternatives or workarounds

Today the workaround is to hover the row or open the session to check whether it is still working. Making the existing pulse stronger/brighter is possible, but a spinner (or an icon + label) is the more conventional and unambiguous affordance, and it also covers the reduced-motion case. A Spinner component already exists and is used in packages/ui/src/chat-turn.tsx (compaction / "working" cues).

Additional context

@astryxdesign/core StatusDot is a fixed 8px dot, supports isPulsing but has no spinner variant, so the stronger "working" affordance has to come from the surface rather than the dot itself.

Activity

  1. changed the title [-]bug(desktop): running session still reads as the static blue status dot — no loading indicator while the turn executes[/-] [+]feat(desktop): show a loading indicator while a session is running, instead of the static blue status dot[/+] on Sep 20, 2026
  2. changed the title [-]feat(desktop): show a loading indicator while a session is running, instead of the static blue status dot[/-] [+]feat(desktop): make the running-session indicator clearly in-progress — the blue status dot pulse is too subtle[/+] on Sep 20, 2026
  3. ggbdpq commented on Sep 20, 2026

    @ggbdpq
    Contributor

    take

  4. ggbdpq commented on Oct 18, 2026

    @ggbdpq
    Contributor

    Closing this as resolved by #5612 (b004473ed, merged 2026-09-23), which I verified against current main today.

    What that PR shipped covers everything this issue asked for, on the exact surfaces named here:

    • The sidebar row no longer draws a pulsing 8px dot while responding (isPulsing has zero hits left in session-history-list.tsx); sessionRowSignals() now emits { running: true, ... } and the row renders RunningIndicator (packages/ui/src/running-indicator.tsx) — a Spinner size="sm" from @astryxdesign/core — in place of the resting StatusDot.
    • The reduced-motion case is handled: the Spinner decelerates to 3s/turn instead of freezing (patch note: "a frozen spinner reads as broken"), the arc stays visible statically, and a visually-hidden "Responding" label backs it up — so the running row is identifiable with motion reduced, which was the second ask.
    • The same replacement landed in three places (sidebar rows, goal context layer, subagent rows), and regression tests pin the visually-hidden label in session-history-list.test — stronger than the "stronger pulse" workaround this issue proposed, and it reuses the existing component rather than inventing one.

    I had this issue claimed for an implementation; on inspection there is no delta left to build — an implementation PR would duplicate #5612 line for line. Releasing the claim and closing. #5265 and the remaining edit-and-resend slice of #5109 are still tracked separately.

    — ggbdpq, verified with GLM-5.3-Flash (ZCode)

  5. ggbdpq commented on Oct 18, 2026

    @ggbdpq
    Contributor

    untake

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions