block / block/berd

Transcript scroll locks during agent runs; view rubber-bands back to sent message

Open
#111 2 comments 1 reaction 0 assignees View on GitHub
bug
Dominant language
TypeScript
Stars
909
Forks
116
Avg merge
1d 1h
Merged PRs (30d)
156

Description

### Before filing

- [x] I searched [open and closed issues](https://github.com/block/berd/issues?q=is%3Aissue) for duplicates.
- [x] I reproduced this on the [latest release](https://github.com/block/berd/releases).
- [x] This is one bug, not several bundled together.

### Closest existing issue

none found; nearest are merged PRs #72 and #46 (transcript anchoring)

### What's broken

While an agent turn is running, the transcript cannot be scrolled: manual scrolling rubber-bands back to the sent message until the entire run (including silent tool activity) finishes.

### Steps to reproduce

1. Launch Berd 0.6.2 on macOS
2. Open a chat on the Claude Code (claude-acp) harness, model Claude Fable 5 [1m]; chat had prior history (observed across multiple chats, ~100+ messages in the main one)
3. Send a message that triggers a long agent turn with tool calls
4. While the run indicator is active, scroll down with trackpad or wheel
5. The view snaps back to the top of the sent message on each new content chunk; scrolling past it is impossible until the whole turn completes
Note: this persists after the reply text looks finished, as long as the session is still running. Verified via `berdctl session get` showing chat_state "streaming" / is_running true while the reply appeared complete and scrolling was still locked.

### What you expected to happen

Manual scroll input cancels auto-follow immediately; auto-follow resumes only if I return to the bottom.

### What actually happened

Scroll position is re-anchored to my sent message on every content resize for the entire agent run, including while tools run silently after the reply text appears finished. In agentic chats a single turn can run for minutes, leaving the transcript unscrollable the whole time.

### How often does it happen?

Every time — reliably reproducible

### Berd version

0.6.2

### Operating system

macOS (Apple Silicon)

### Model and provider

Claude Fable 5 [1m] via claude-acp (Claude Code harness)

### Relevant log output

```text
[2026-08-19][04:07:09][berd_lib::services::diagnostic_log][ERROR] [diagnostic] category=renderer event=window_error app_version=0.6.2 platform=macos columnNumber=0 errorName=Error filename=tauri://localhost/ lineNumber=0 message="ResizeObserver loop completed with undelivered notifications." stack="" windowKind=main
[2026-08-19][04:07:27][... identical ...]
[2026-08-19][04:07:29][... identical ...]
These repeat at exactly the moments the rubber-banding occurs, consistent with scroll anchoring re-firing on every content resize instead of yielding to user scroll.
```

### Screenshots, recordings, or other context

Possibly related: PR #72 and PR #46 both touched auto-follow / row anchoring in VirtualMessageTimeline.tsx; this looks like the inverse case, where the anchor set at send time keeps overriding user scroll while the session is running. Im unable to upload a video of the issue. It keeps saying upload failed. That said, it is easy to reproduce.

Contributor guide

Open the contributing guide

Research direction

Start by reproducing the issue in Berd 0.6.2 with a long Claude Code agent turn, then read VirtualMessageTimeline.tsx alongside PRs #72 and #46. Check the behavior during streaming and silent tool activity, including the ResizeObserver errors. Done means manual scrolling immediately stops auto-follow, and auto-follow resumes only after returning to the bottom.

Written by the indexing model from the issue text.

Assessment

Tech stack
tauri, typescript
Domain
desktop, frontend
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
70/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.