Repository navigation
Session rail: the preview card opens in one commit, and the rail's hover, wheel and click are measured at 3,000 prompts - #28540
Conversation
Three cases on the 3,000-prompt resident chat the rail drag uses: the hover lighting a tick, the hover opening its preview card, and a wheel over the rail scrolling its own list with the pointer resting on it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
The compact rail's card waited 250 ms (Codex's delayOpen) before it opened. design/session-rail.md keeps the card's instant-open hover behavior, and Leo asked for faster hover (2026-10-29: "faster scrttoll/hover over"). The card now opens in the hover's own commit (RAIL_CARD_DELAY = 0), then follows the pointer from row to row as before. The opt-in full-height map keeps its 250 ms (CARD_DELAY). Red on base, green here: bun test test/hover-intent-cards.test.tsx test/thread-minimap-rail.test.tsx (2 fail on base, 20 pass here). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
… costs no formatter The list carried --acpmux-minimap-first (its first row in view), which every tick's entrance stagger read. A wheel that moved the list a row changed it, and with it the computed style of every drawn tick, on every scrolled frame. Each tick now keeps its own place in the view as it mounted (--acpmux-minimap-place), which is what its once-per-mount entrance needs; the rows inherit nothing that moves with the scroll. Tick ignores that prop after mount, so a scroll renders no tick either. The preview card built an Intl.DateTimeFormat on every render, and a hover that follows the pointer (or the wheel under it) renders it once per row. One formatter now serves every card. No timer, observer or animation loop is added. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
…once Leo, 2026-10-29: "giving it faster scrttoll/hover over". The rail's preview card no longer waits 250 ms: it opens on the pointer's commit and follows it row to row. A click on a tick (or on a mark or the track of the full map) lands the prompt in the frame of the click instead of gliding for 200-400 ms; bookmark jumps and Previous/Next Turn steps keep their glide. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 2a08596)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 269e4db) Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
…the run ends
The preview server colors its port in the banner ("127.0.0.1:" ESC[1m port
ESC[22m), so the plain match never saw it: every run failed with "server
startup timed out", and the process then stayed up on the server's
surviving child's pipes until the CI step's 30-minute limit. Match the
output so far with SGR escapes dropped (as #27858 does), and exit with the
run's code.
Co-authored-by: Leo Li <cheerleaderleo@outlook.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
… sits beside the text Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
…l-fast # Conflicts: # webviews/src/agent-session/acpmux/threadMinimap/ThreadMinimap.tsx # webviews/src/agent-session/acpmux/threadMinimap/threadMinimap.css
They time out on the flows fixture's rail (the selector waits for a tick the fixture does not leave hoverable), so they would only add red cases to the scoreboard. The server banner fix stays: with it the harness starts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
36e4a73 to
3100940
Compare
|
Found 6 test failures on Blacksmith runners: Failures
|
3100940 to
b88dc96
Compare
Keeps #24131's rail side (left or right edge, the mirrored rail and card) with this branch's changes: the card opens with the hover (CARD_DELAY 0), a click lands at once (ScrollMap's seek takes no smooth flag), each tick keeps its own mounted place beside #26635's data-entering, and the harness banner fix. Adds a WebKit test that Next Turn still glides. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
At 3,000 prompts (and at 300: it does not grow with the chat) a hover took three React commits and six forced layouts to show its card: the card measured the rail's origin into state, its owner measured the card's height into state, and the reply's line budget went through state too, each a commit of its own. The card now places itself in its layout effect: it reads the rail's origin and its own height and writes its transform before paint, and writes the reply's line budget straight onto the reply. Its owner hands it the row's center and the view's height instead of a top it had to measure for. The ResizeObserver it already had keeps the place right when the content grows; it stops with the card's content or the card going (cleanup disconnects it). No new timer or observer. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
…rompts A hover arms the probe on pointerover (its default inputs are presses, keys and wheels, so a hover never started the clock and every run timed out at 5 s). A case that cannot start names what the rail showed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
…m measures the rail beside the text Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
b88dc96 to
444a364
Compare
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. |
|
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)
Stale: these images are of Gallery before/after for
States
Pick other states with a Shipped in:
|
|
Review (codex gpt-6-astra high, router-review): BLOCK at e09e164 BLOCK Visual verdict: PASS — all four after screenshots were inspected; card placement looks correct on both edges and themes, and hashes match the before images.
|
…, reused or resized, on both edges (red) A prompt's card then a reply's in the same card component (the full map's assistant marks), and a reply's card whose content grows without a render, in Chromium and WebKit, on the left and the right rail edge. Red at this commit: the reply-only path returned before placing the card or observing its size (#28540 review). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
A reply's card (no prompt) returned from the budget effect after clearing a prompt card's clamp, without placing the card or observing its size. A card reused from a prompt's to a reply's was then placed from its old height by the every-commit effect, which runs first, and a later resize never moved it. One fit path now serves every kind: it sets or clears the reply's line budget, then places the card from its height after that change. The layout effect runs it at open and on every content or kind change, and the ResizeObserver runs it on every resize; the observer is disconnected in the cleanup when the content or kind changes or the card goes. Still one commit to open; no new timer or observer. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
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. |
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
Leo (rulebook): "when it comes to the left scroll rail thing, i already said we want it ultra fast ultra responsive". Leo, 2026-10-29: "giving it faster scrttoll/hover over ... and being able to scroll it".
Stacked on #28494 (head ca1f3e2) until it lands. Until then the diff against base includes #28494's commits. Rebased onto #28494's merge with #24131 (the right-edge rail): the card places itself on either edge (left: card.left == rail.right; right: card.right == rail.left, in the layer by its own width or pinned to the right edge without one).
Takes back #26134: the card now measures and places itself in one commit (fit() plus a ResizeObserver in PreviewCard) instead of a setCardHeight round-trip; #26134's wrapped-prompt behavior is kept and minimap-card-layout.test.ts still passes.
Root cause: why the rail harness cases timed out at 3,000 prompts
The cause was the harness, not the rail. Three harness faults hit both arms:
pointerover.With the harness fixed, the rail does no work that grows with the number of prompts. The 3,000 ticks are already virtualized to about 86 drawn. A Chromium trace at 300 and at 3,000 prompts gave the same per-step cost: wheel style time 233 vs 239 ms per 10 steps, and hover 19–36 ms to commit. The remaining cost is per pane DOM, not per prompt:
:has()rules cause this (the composer field menu, the PR dock's:has(> .acpmux-pr-dock) > :not(...), and twolabel:has(...)rules). With every:has()rule turned off, the same wheel step restyles 14–22 elements. A wheel step over the rail inserts nodes in two places: ticks entering the drawn window, and the open card's reply when the hovered row changes. Those rules are being handled in a separate PR, since they also affect transcript streaming.Change
chat.rail.hover.tick,chat.rail.hover.card,chat.rail.wheelandchat.rail.click.Performance
Same harness and same command for every arm:
bun scripts/latency/run.ts --engine chromium --runs N --page "chat rail pointer", on the 3,000-prompt resident flows page, Chromium. Within a run, the arms differ only inwebviews/src: base is094dd560(feat-cmux-next before #28494), "#28494" is f176bb2, "this PR" is the card change on top of it. The card change was measured before the rebase onto #24131; the rebase adds only the right-edge branch of its placement.chat.rail.hover.card, runs=10, run 41136916156chat.rail.hover.tick, runs=6, run 41139037067chat.rail.wheel, base run 41138308077, this PR run 41139037067chat.rail.click, runs 41138308077 / 41139037067Harness note: when the cases share one page, a case that runs after another sometimes finds no rail ("rail not ready ... rail:false"), so some arms lack a case in a given run. The table uses only complete cases and links each to its run. The wheel and click costs are the pane
:has()restyle described above, which is being fixed separately.Stills
The card's placement code changed, so here are gallery stills with the hover card open on both edges. They were captured via cmux-ci in one job (run 41144770735), Chromium. Before is #28494's head
ca1f3e26; after is this PR's head444a364e. Left edge:agent-pane.thread-minimap/card-markdown. Right edge (#24131):agent-pane.thread-minimap-narrow/right-hovered. All eight before/after pairs are byte-identical (same PNG hash): the card lands on the same pixels on both edges, with card.left == rail.right on the left and card.right == rail.left on the right.Viewed after image: yes
Testing
*minimap*,hover-intent-cards,minimap-*,thread-scroll-map*,HarnessStatusCard.dom): 134 pass, 0 fail.thread-minimap-feel,thread-minimap-motion,thread-minimap-side(right edge),thread-minimap-left-rail-stays,minimap-card-layout,thread-minimap-card-glass,thread-minimap-tick-states), Chromium and WebKit: 54 pass, 0 fail (run 41142877669).scripts/web-lint.sh: passes.Changelog
Changed: The chat rail's preview card opens with less work per hover.
Agent session: agent session
🤖 Generated with Claude Code