dashboard: session scrubber — sticky bottom track with per-event ticks, hover preview, kbd nav, replay #968

Closed
opened 2026-05-08 12:16:09 +00:00 by claude-desktop · 2 comments
Collaborator

User story

As an operator post-mortem'ing an agent run, I want a sticky timeline scrubber at the bottom of the run view with one tick per event (color-coded by tool kind), where dragging or pressing , . jumps the chat scroll + workspace state to that event, so I can replay a 200-step run without infinite scrolling.

Context

Devin's draggable progress bar at the bottom of the workspace + linked chat scroll is the strongest reference; LangSmith / Langfuse / Helicone are explicitly criticized for not having one (dev.to critique). Adding it here is the single biggest copy-able UX win over the OSS observability tools.

Acceptance criteria

  • <SessionScrubber> position: sticky bottom-0 inside the run view. Track is full-width, ~24 px tall.
  • Tick per event, colored by ToolKind (taxonomy issue #954). Errors and approvals are larger / accent-tinted ticks. Compactions render as a different glyph (vertical bar w/ glyph).
  • Hover a tick: popover with the event's <ToolCard> summary (compact mode).
  • Click a tick or drag the playhead: chat scrolls to the matching event; subagent swimlane focuses; pinned PlanPanel updates if the plan-state-at-that-time differs.
  • Keyboard: , previous event, . next event, [ / ] previous-error / next-error.
  • When prefers-reduced-motion, scroll is instant (no smooth-scroll).
  • Performance budget: 1000 events should render the track in <50 ms; achieved by canvas-render of ticks (not 1000 DOM nodes) with hover-area mapping.

Out of scope

  • Time-warping the SSE state on the live run (i.e. "rewinding while still streaming"). Scrubbing only applies to settled runs; live runs render the playhead at the latest event with no rewind.
  • Sharing a scrubber position via URL (separate enhancement).

Dependencies

  • Depends on the subagent tree + swimlane ticket (timeline data is keyed by lanes for the popover focus).
  • Depends on #951 (delta events feed the tick density).

References

## User story As an operator post-mortem'ing an agent run, I want a sticky timeline scrubber at the bottom of the run view with one tick per event (color-coded by tool kind), where dragging or pressing `,` `.` jumps the chat scroll + workspace state to that event, so I can replay a 200-step run without infinite scrolling. ## Context Devin's draggable progress bar at the bottom of the workspace + linked chat scroll is the strongest reference; LangSmith / Langfuse / Helicone are explicitly criticized for not having one ([dev.to critique](https://dev.to/custodiaadmin/the-missing-layer-in-langsmith-langfuse-and-helicone-visual-replay-21gk)). Adding it here is the single biggest copy-able UX win over the OSS observability tools. ## Acceptance criteria - [ ] `<SessionScrubber>` `position: sticky bottom-0` inside the run view. Track is full-width, ~24 px tall. - [ ] Tick per event, colored by `ToolKind` (taxonomy issue #954). Errors and approvals are larger / accent-tinted ticks. Compactions render as a different glyph (vertical bar w/ glyph). - [ ] Hover a tick: popover with the event's `<ToolCard>` summary (compact mode). - [ ] Click a tick or drag the playhead: chat scrolls to the matching event; subagent swimlane focuses; pinned PlanPanel updates if the plan-state-at-that-time differs. - [ ] Keyboard: `,` previous event, `.` next event, `[` / `]` previous-error / next-error. - [ ] When `prefers-reduced-motion`, scroll is instant (no smooth-scroll). - [ ] Performance budget: 1000 events should render the track in <50 ms; achieved by canvas-render of ticks (not 1000 DOM nodes) with hover-area mapping. ## Out of scope - Time-warping the SSE state on the live run (i.e. "rewinding while still streaming"). Scrubbing only applies to settled runs; live runs render the playhead at the latest event with no rewind. - Sharing a scrubber position via URL (separate enhancement). ## Dependencies - Depends on the subagent tree + swimlane ticket (timeline data is keyed by lanes for the popover focus). - Depends on #951 (delta events feed the tick density). ## References - Devin scrubber: https://ppaolo.substack.com/p/in-depth-product-analysis-devin-cognition-labs - "The missing layer in LangSmith / Langfuse / Helicone": https://dev.to/custodiaadmin/the-missing-layer-in-langsmith-langfuse-and-helicone-visual-replay-21gk
Collaborator

🤖 Auto-assigned to code-lead (heuristic: area:dashboard + body 2352 bytes (> 2 KB) — code-lead (heavy)). Reply /unassign to reroute.

🤖 Auto-assigned to **code-lead** (heuristic: area:dashboard + body 2352 bytes (> 2 KB) — code-lead (heavy)). Reply `/unassign` to reroute.
Collaborator

🛑 implement skill misrouted — this issue has PR #1001 awaiting review changes; operator should re-dispatch address-review

🛑 implement skill misrouted — this issue has PR #1001 awaiting review changes; operator should re-dispatch address-review
Sign in to join this conversation.
No milestone
No project
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Reference
charles/claude-hooks#968
No description provided.