Repository navigation
Agent chat: a composer that grows never moves the transcript - #23186
Conversation
…hey were Leo 2026-10-20: a newline in the composer (Shift-Return, or a wrap) makes the transcript's scrollbar jump. Read up the chat, five lines typed into the composer must not move the transcript's offset on any painted frame. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fdc7-79b0-b869-8ac78b0edd90&host=cosmic-gray
|
Owned by composer-scroll on cosmic-gray · session |
|
cmux status (one comment, edited in place; each line is updated by the job that owns it) Review App of this head (app.zip, kept 1 day)
Unclear: CI failed on
Failures:
Matched log linesNot re-run automatically: Written by red: web / Web status; NEW: green on the base 0d59bfd; do not merge until green; see lane-rules
Agents: Tour of |
|
Bead |
…r a followed end Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fdc7-79b0-b869-8ac78b0edd90&host=cosmic-gray
…s growth Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fdc7-79b0-b869-8ac78b0edd90&host=cosmic-gray
|
Found 5 test failures on Blacksmith runners: Failures
|
… row holds still Review of #23186: both per-frame cases now check the card grew by the typed lines and shrank back, so a missed keystroke cannot pass them flat. The reader case starts well up from the end and also samples the top of the row in the middle of the view, not only the offset. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fdc7-79b0-b869-8ac78b0edd90&host=cosmic-gray
…poser-grow-scroll # Conflicts: # webviews/test/agent-pane-scrollbar-full-height.test.ts
The reader guard from #23186 read its frames a fixed 300 ms after clearing the draft; on a slow runner the last shrink painted later and the card was still a line taller (CI on 5566a2a). Both grow-and-shrink guards now wait for the card to reach its first frame's height. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fdc7-79b0-b869-8ac78b0edd90&host=cosmic-gray
|
Shipped in:
|
…23257) * test(next): back at the end after the composer grew, the last row is never under the card Review of #23097: scrolled up, the room under the last row stays as it was, so the scroller ends short of a composer that grew meanwhile. Scrolling back to the end must never show the last row under the card, and Jump to latest must glide there instead of snapping. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fdc7-79b0-b869-8ac78b0edd90&host=cosmic-gray * test(next): the composer guards sample until the card has shrunk back The reader guard from #23186 read its frames a fixed 300 ms after clearing the draft; on a slow runner the last shrink painted later and the card was still a line taller (CI on 5566a2a). Both grow-and-shrink guards now wait for the card to reach its first frame's height. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fdc7-79b0-b869-8ac78b0edd90&host=cosmic-gray * fix(next): Jump to latest glides to the end after the composer grew Scrolled up, the room under the last row stays as it was (#23097), so the scroller ended short of a composer that grew meanwhile, and Jump to latest snapped to the end: following again gave the room back, and a followed view's room moves its offset at once. Jump to latest now takes the room first, out of view, and glides to the end above the card. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fdc7-79b0-b869-8ac78b0edd90&host=cosmic-gray * fix(next): Jump to latest aims at the committed layout's end Review of #23257: scrollHeight is 0 under jsdom, so the jump aimed at the top in transcript-jump-latest.test.tsx. The layout the taken room just committed gives the same end in the browser. The composer guards wait for the card's height from before typing, not their first sample. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fdc7-79b0-b869-8ac78b0edd90&host=cosmic-gray * test(next): the composer guards take their first frame before the first key On a slow runner the sampler's first frame landed after the first Shift-Return, so the card's first height was a line taller than at rest (CI on 7f70721). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fdc7-79b0-b869-8ac78b0edd90&host=cosmic-gray * fix(next): Jump to latest's glide is not snapped to the end on its way The jump follows again at once, so its first small step read as layout work and settled at the end, and a layout pass while following did the same: the glide snapped (CI on 7f70721, one moving frame). While the glide is in flight its steps are the view following, a layout pass aims it at the new end, and the reader's input or the landing ends it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fdc7-79b0-b869-8ac78b0edd90&host=cosmic-gray * fix(next): a Jump to latest glide reports the latest place and yields to Find Review of #23257: the glide's steps returned before the kept place was reported, so a chat reopened after Jump to latest opened where the reader had been. Its steps now commit before paint and report the latest place, a Find match or a row reveal ends the glide, and the keyboard jump test wheels back up as a reader does before its second jump. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fdc7-79b0-b869-8ac78b0edd90&host=cosmic-gray * webviews: the Jump to latest tests wait for the view to come to rest, not a fixed time Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fdc7-79b0-b869-8ac78b0edd90&host=cosmic-gray --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Summary
Leo, 2026-10-20: typing a newline in the composer (Shift-Return, or a wrap) makes the transcript's scrollbar jump. Growing the composer must never move the transcript's scroll position, and a view following the latest row stays at the end.
agent-pane-scrollbar-full-height.test.ts, sampled after every painted frame while typing five lines with Shift-Return, deleting three, then clearing the draft:scrollTopdiffers by more than half a pixel).Changelog
none
Testing
Command:
cd webviews && CMUX_BROWSER_TESTS=1 bun test test/agent-pane-scrollbar-full-height.test.ts(real Chromium).Observed / Not run
PASS test/agent-pane-scrollbar-full-height.test.ts. The guards pass on the current code, so the same-frame lockstep needs no fix for these cases. This PR adds guards only.web / react-apps-checkreds on this head are in files this PR does not touch:+ is its glyph, named Add with no tooltip(also red on base run 39386215666) and timeouts in composer-location-strip, composer-draft-wrap and composer-type-scale.Agent session: cosmic-gray
🤖 Generated with Claude Code