Repository navigation
Agent chat: the gutter beside every part of the floating stack scrolls the transcript - #23243
Conversation
…scrolls the transcript A browser test (Chromium and WebKit) with one chat that shows every part of the bottom stack at once: the question, the pull request dock, an error card, the agents pill, the queue and the composer's card, then the dictation notice. Beside each part's card the pointer reaches the transcript and the wheel scrolls it; over the card it does not. Red on this head: the question, pull request dock, error card and agents pill bands take the pointer across the pane's width. 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)
Probably yours: CI failed on
Failures:
Matched log linesNot re-run automatically: Written by red: web / Web status; NEW: green on the base 95c0d1f; do not merge until green; see lane-rules
Agents: Gallery before/after for
States
Pick other states with a |
…s only drawn parts 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
|
Bead |
…crolls the transcript The floating bottom stack passed the pointer through only around the composer's card: its other parts (the question card, the pull request dock, error cards, the agents pill) are bands the pane's width wide with their card inset, and the band took the pointer, so the wheel in the gutter beside them scrolled nothing. Now every part's band passes the pointer through and what it holds takes it, the rule the composer had, so a new part gets it too. Text-only parts and notice lines keep the whole band. 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
|
codex-review: SHIP at 3b3c868
|
…n their empty room scrolls the transcript Review of #23243: with the bands passing the pointer through, every empty spot in a band (right of the agents pill, right of a pull request's chip, its padding) reached the transcript rows hidden under the stack, so hover, click and drag acted on unseen rows. The test now asks that those spots reach the band while the wheel there still scrolls the transcript, and that a part scrolling in a short pane scrolls alone with its scrollbar under the pointer. 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
…l on to the transcript Review of #23243: the transcript's rows under the floating stack are only masked, so a band that passed the pointer through let a hover, click or drag in its empty room reach rows no one sees. The bands take the pointer again (the composer still passes it through around its card), and wheelPassThrough.ts forwards a wheel over a band itself to the transcript, as it does over Jump to latest, unless the band scrolls itself; the pull request dock's and question card's scrollbars take the pointer again. 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
|
|
…croll alone; the question card only keeps the transcript still 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
…hold still before the next measure 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
… a timer The fixed-waits ratchet (#23365): wheelAt counts animation frames until the transcript and the stack's scrollers hold still for 12 frames, or 30 frames pass with nothing moved. 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
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
…ents pill (#23526) #23104 replaced the agents pill with the tray of running work (on by default) after #23243 landed this file, so the file's setup waited for a pill that never shows and hit the runner's 120 s limit on every run. The file now waits for the tray, expects it in the stack's order, and checks it as the dictation notice: the stack's gutter beside it passes through and scrolls the transcript, the tray takes the pointer and the wheel over it scrolls nothing. The pill's own list test goes with the pill. 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>
|
Shipped in:
|
Summary
In the agent chat, when the bottom stack floats over the transcript, the wheel in the gutter beside the composer's card already scrolls the transcript (Leo 2026-10-20: "if it's not in the composer it should just scroll"). Beside the stack's other parts it did not. The question card, the pull request dock, error cards and the agents pill are bands as wide as the pane, with their card inset. The wheel in a band's gutters or empty room hit the band and scrolled nothing.
The fix keeps the bands catching the pointer. The transcript rows under the stack are only masked (
.acpmux-scroll[data-docked]), so a band that passed the pointer through would let a hover, click or drag in its empty room reach rows no one can see: link hover cards, hidden links, tool rows, text selection. Instead,wheelPassThrough.tsforwards a wheel whose target is a band itself (a direct child of the floating.acpmux-dock, not the composer and not the dictation notice) to the transcript, the way it already forwards the wheel over Jump to latest. It does this only when the band can't scroll itself (scrollHeight <= clientHeight), so a pull request dock or question card that overflows in a short pane keeps its own wheel, and a wheel there never scrolls both. Because the bands take the pointer, those two parts' scrollbars can be dragged again. The composer is unchanged: it passes the pointer through around its card and queue.Changelog
Testing
CMUX_BROWSER_TESTS=1 bun test test/agent-pane-dock-gutters.test.ts(CIweb / react-apps-check, Chromium and WebKit). One chat shows every part of the stack at once:For each part, the pointer 8 px left of the card reaches the band (for the composer's queue and card, the transcript) and the wheel there scrolls the transcript both ways. The same holds in the empty room right of a PR chip and right of the agents pill, where
elementFromPointmust not be inside.acpmux-scroll. The wheel over a card moves nothing. The agents list dialog takes the pointer. In a 440 px pane, the wheel over the overflowing PR dock scrolls only the dock, and for each overflowing part the point 3 px in from the band's right edge (its scrollbar) reaches the band.PASS). Review found the hidden-row problem above.transcript, notband(line 250).transcript(line 309).transcript(line 342).PASS test/agent-pane-dock-gutters.test.ts(react-apps-check shard 3, both engines).Observed / Not run
Observed: the CI logs above. On 02fff40 the two main cases passed in both engines. The short-pane case failed only on the question card's own scroll: the wheel over its rows moves neither the card nor the transcript. Wheels over a band's contents are handled the same way as on base, so this isn't caused by this PR. The test now asks only the PR dock to scroll alone, and asks the question card only that the transcript stays still and its scrollbar takes the pointer.
On 560891d, the remaining react-apps-check reds are secret-card and timeouts in composer-draft-wrap and composer-row-layout. Earlier heads also had reds in files this PR doesn't touch:
+ is its glyphand Add tooltip casesNot run: nothing ran locally; browser tests run only on CI. The recap card (behind a Debug toggle) and the folder-choice, worktree and btw notices (shown only before a chat starts or with side sessions on) aren't in the fixture. They are bands of the same shape and get the same handling. Dragging a scrollbar is checked only through
elementFromPoint, not with a real drag.Agent session: cosmic-gray
🤖 Generated with Claude Code