Agent chat: the transcript runs under the composer, its scrollbar to the pane's bottom
Summary
The agent chat's scrollbar stopped at the top of the composer: the transcript's scroller ended where the bottom stack began, so its track ended a composer's height above the pane's bottom (Leo, 2026-10-19). Now the transcript runs the pane's full height and scrolls under a floating composer, as the Claude and Codex apps do, so the track reaches the pane's bottom corner.
- The bottom stack (questions, notices, the PR dock, the agents pill, the queue and the composer) sits in a new
.acpmux-dock. While the stage shows the transcript (.acpmux-main[data-dock=float]) it lies over the transcript's foot, capped so the transcript keeps--acpmux-transcript-minunder the header; its parts keep their own flow and shrink/scroll rules as before. A new chat's hero, a handoff review, the diff and the inspector keep it in the flow (display: contents). VirtualTranscripttakes the stack (dock) and keeps how far it reaches over the view as room under the last row, measured by a ResizeObserver before the frame paints. Scrolled to the end, the last row sits above the composer; a composer that grows a line or a queue that appears moves a followed view at once (treated like a resize, no glide). Find, a counted reveal, keyboard focus (scroll-padding-bottom) and Jump to latest keep to the view above the stack; the minimap gets the visible height.- Rows that pass under the stack are masked out so they never show through the composer's tinted card or its gutters; a second mask layer keeps the scroller's right 16px lane (where rows never reach) so the scrollbar stays drawn there. Reduce Transparency keeps a hard cut there and plain edges elsewhere.
bottomStack.csswas only imported by the dev entry (dev.tsx); the shipped stylesheet (scripts/cmux-next/build-agent-pane-web.sh) never had it. It does now, so the app gets the stack's layout (and the existing stage min-height and scroll-inside rules) too.
Testing
webviews/test/agent-pane-scrollbar-full-height.test.ts (new, CMUX_BROWSER_TESTS lane), run on Huge Blue (Linux, Chromium):
base a899423f1b | head | |
|---|---|---|
| scrollbar track bottom to pane bottom | 111px (211px with a five-line prompt) | 0px |
| test result | 2 fail | 2 pass |
It also checks that at the end the last row is whole above the composer's card, that the scrollbar's thumb is drawn at the track's foot (pixel check under the composer), and that typing a five-line prompt keeps the last row above the card and the view at its end on every painted frame.
Updated for the new layout (the transcript now ends at the pane's bottom, so "above the stack" is measured from the stack's top): agent-pane-bottom-stack, agent-pane-chat-column, agent-pane-pr-dock, agent-pane-queue-steer, agent-pane-recap-card.
Observed / Not run
- Ran on Huge Blue, head: the new test,
agent-pane-soft-edges,agent-pane-chat-column,agent-pane-bottom-stack,agent-pane-pr-dock,agent-pane-queue-steer,agent-pane-recap-cardpass;vp lint/vp fmt --checkon touched files, the type check andgallery-coverage.test.tspass. - Ran 76 browser files (agent-pane-, composer-, chat-find, minimap) per file at head and base: no head-only failure besides the five geometry tests updated above;
agent-pane-attach-typingandagent-pane-diff-findfailed once under load and pass on rerun. Several composer-*/chat-width/locale files fail on base too. - Gallery:
agent-pane.composer-floats(scrolled-to-end,composer-grown) rendered with the matrix runner on Huge Blue: its geometry play passes at head and fails at base ("The transcript ends 111.0px above the pane's bottom"). bun run checkstops atcheck:browser-lanesonagent-pane-older-rows-fade.test.tsandvp checkat formatting insrc/pages/settings/icons.tsx, both on base, untouched here.- Not run: the native app (no tagged build), so WebKit's overlay scrollbar in WKWebView is unverified live; WebKit was only exercised through the gallery runner.
Changelog
Fixed: The agent chat's scrollbar runs to the bottom of the pane, and the conversation scrolls under the composer
Proof
Gallery state agent-pane.composer-floats/scrolled-to-end (Chromium, dark), at the latest message:
Before (base): the transcript ends above the composer, so the turn's footer rests a composer's height above it and the scrollbar stops there.

After: the transcript runs under the composer to the pane's bottom; the footer rests just above the card.

No cmux-design-references entry covers this; the reference is the Claude and Codex desktop apps' floating composer.
Checklist
- Behavior changes have added or updated tests, or Testing says why not
- UI, settings, menu, schema, help-text or user-facing docs change: no new user-facing strings (gallery fixtures only)
š¤ Generated with Claude Code