Agent view: the row hover and copy button flicker while a resting pointer sits over a streaming transcript #94

Closed
opened 2026-09-27 17:49:13 -04:00 by cmoriarty · 1 comment
Owner

What happens

With the mouse resting over the coding-agent pane while an agent streams, the rows' hover background flickers with every new line, and the copy button on command output blinks on and off.

Why

The transcript follows the tail: each streamed line scrolls the list up under a pointer that has not moved. Whatever row is now under the pointer takes :hover (the row's hover:bg-raise/40, and the copy button's group-hover reveal), then loses it a moment later as it scrolls past. Measured in the fixture's streaming run with the mouse parked: scrollTop climbed 243 → 783 over four seconds while the hovered row switched row 1 → none → row 2 → none, with the same DOM nodes throughout (nothing re-mounts).

Fix

Hover effects apply only to a pointer that has moved. While the list scrolls — following the stream, or the wheel — the rows take no hover; the next real mouse movement brings it back. It applies to the transcript and the subagents panel alike.

Done when

  • With the mouse parked over a streaming transcript, no row's background and no copy button changes as lines arrive.
  • Moving the mouse over a row still shows its hover and its copy button, and they still work.
## What happens With the mouse resting over the coding-agent pane while an agent streams, the rows' hover background flickers with every new line, and the copy button on command output blinks on and off. ## Why The transcript follows the tail: each streamed line scrolls the list up under a pointer that has not moved. Whatever row is now under the pointer takes `:hover` (the row's `hover:bg-raise/40`, and the copy button's `group-hover` reveal), then loses it a moment later as it scrolls past. Measured in the fixture's streaming run with the mouse parked: `scrollTop` climbed 243 → 783 over four seconds while the hovered row switched row 1 → none → row 2 → none, with the same DOM nodes throughout (nothing re-mounts). ## Fix Hover effects apply only to a pointer that has moved. While the list scrolls — following the stream, or the wheel — the rows take no hover; the next real mouse movement brings it back. It applies to the transcript and the subagents panel alike. ## Done when - With the mouse parked over a streaming transcript, no row's background and no copy button changes as lines arrive. - Moving the mouse over a row still shows its hover and its copy button, and they still work.
Author
Owner

Fixed as the OpenSpec change resting-pointer-no-hover, archived in #96. Live on production at 9298175.

  • When the transcript scrolls and the mouse hasn't moved in the last 150ms — following a stream, or the wheel — the list stops drawing hover effects: no row background, no copy button, no chevrons. The next real mouse movement brings them back, and a moving mouse keeps them throughout. It covers the step's transcript and the subagents panel, which share the component.
  • Only the drawing pauses: the rows keep their pointer events, so a click still lands. (The first version took pointer events away; the full lane caught that a click without a move, and Playwright's own clicks, then hit the list instead of the row.)
  • Checked on production on soundcheck#32's openspec.apply[4]: the parked pointer's row is lit; scrolling the list beneath it pauses and nothing is lit; a move brings the row's hover back.
  • New e2e/resting-pointer.spec.ts parks the mouse over the fixture's streaming run and checks no row lights up while lines arrive. Spec: agent-transcript.

PRs: #95 (the fix), #96 (archive).

Fixed as the OpenSpec change `resting-pointer-no-hover`, archived in #96. Live on production at `9298175`. - When the transcript scrolls and the mouse hasn't moved in the last 150ms — following a stream, or the wheel — the list stops drawing hover effects: no row background, no copy button, no chevrons. The next real mouse movement brings them back, and a moving mouse keeps them throughout. It covers the step's transcript and the subagents panel, which share the component. - Only the drawing pauses: the rows keep their pointer events, so a click still lands. (The first version took pointer events away; the full lane caught that a click without a move, and Playwright's own clicks, then hit the list instead of the row.) - Checked on production on soundcheck#32's `openspec.apply[4]`: the parked pointer's row is lit; scrolling the list beneath it pauses and nothing is lit; a move brings the row's hover back. - New `e2e/resting-pointer.spec.ts` parks the mouse over the fixture's streaming run and checks no row lights up while lines arrive. Spec: `agent-transcript`. PRs: #95 (the fix), #96 (archive).
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
cmoriarty/braid#94
No description provided.