Transcript scroll locks during agent runs; view rubber-bands back to sent message
- 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
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