Repository navigation
Session rail: the card opens on hover, a click lands at once, and wheeling restyles no tick - #28494
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
|
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)
Gallery before/after for
States
Pick other states with a Passes: CI passes on CI passes on Written by Shipped in:
|
…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
f3f1419 to
5af6a6d
Compare
… 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
|
Review (codex gpt-6-astra high, next-review): SHIP at f176bb2 No blocking findings. |
|
Not merged at f176bb2: it was ready (Codex SHIP at the head, react-apps-check shards green on rerun run 41132059150, perf section passes), but it now conflicts with #24131 (526d782) in |
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
|
Found 1 test failure on Blacksmith runners: Failure
|
|
Review (codex, router-review): SHIP at ca1f3e2 SHIP Visual verdict: SHIP — after dark/light screenshots show aligned, readable rail cards with no clipping or overlap.
|
Keeps #28494's SGR-tolerant banner match covered after folding it into waitForServerReady. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-159afad10a5ab45ea16c
* fix(latency): report browser engine launch coverage Record selected engines and structured launch failures so partial latency sweeps cannot look complete. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-8653e9b405a501fdfdc3 * fix(latency): preserve schema and fail incomplete engine runs Agent-Session: https://cmux.com/deeplink/agent?id=aid-de6a18975ad3ec68b1b1 * test(latency): cover chunked server readiness Agent-Session: https://cmux.com/deeplink/agent?id=aid-01581fe5da773d909472 * test(latency): server readiness strips colour escapes around the port Keeps #28494's SGR-tolerant banner match covered after folding it into waitForServerReady. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-159afad10a5ab45ea16c * style(latency): oxfmt the engine-selection import and test web lint on the merge failed oxfmt --check for these two files. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-159afad10a5ab45ea16c --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
Leo, 2026-10-29:
Relayed later: "on the left, faster scroll and hover, scrollable". From the rulebook: "when it comes to the left scroll rail thing, i already said we want it ultra fast ultra responsive". Spec: leo-workspace
design/session-rail.md. It settles the card's "instant-open hover behavior" and the left pin, and this PR changes neither.This PR supersedes #27858's card-dwell change and carries its click change too. #27858 is "Agent chat rail: the preview card opens at once, and a click lands at once". Its two product commits are cherry-picked here with their authorship kept (
2a085961e28and269e4db52da,-x). It composes with #26635 (merged): ticks still getdata-entering, and this PR only changes where the entrance stagger reads its row place from.What was checked on feat-cmux-next
--acpmux-minimap-first, its first row in view, and every tick's entrance stagger read it. A wheel that moved the list by a row changed that variable, so every drawn tick's style was recomputed on every scrolled frame.Intl.DateTimeFormaton every render, which happens once for every row the pointer passes.Changes
CARD_DELAY = 0) and still follows the pointer from row to row. From Agent chat rail: the preview card opens at once, and a click lands at once #27858.--acpmux-minimap-place). The list's rows inherit nothing that changes with scroll.Tickignoresplaceandenteringafter mount, so a scroll renders no tick and restyles none.No timer, observer or animation loop is added. The change does no new O(rows) work per scroll or hover.
Performance
model.tsCARD_DELAY; fake-clock testshover-intent-cards,thread-minimap-rail(red on base, green here)thread-minimap-motion(WebKit): every frame after the click already shows the landing--acpmux-minimap-firston the list → per-tick--acpmux-minimap-placeset at mountThe latency harness does not have a working rail hover or wheel case yet. The three cases I drafted timed out on the flows fixture's rail in both arms, so they are left out. The rows above come from code constants, fake-clock tests and a count, not from the latency harness.
Stills
Gallery
agent-pane.thread-minimap/card-markdown, Chromium, the hover card open. This is a capture via cmux-ci at the merge-base product source and at the head, in one job (run 41126799888). The rail and card look identical; what changes is when the card appears.Viewed after image: yes
Visual verdict: SHIP (ux-owner; checked again by claude-sr2-coord on the after stills). Dark and light: equal short rail ticks at the pane's left edge, the hovered tick grown, and the preview card flush right of the rail, readable, with nothing clipped or overlapping. Same look as before; only the timing changes.
Testing
bun test test/hover-intent-cards.test.tsx test/thread-minimap-rail.test.tsx. Base: 2 fail (the card is still closed when the hover commits). Head: pass.test/*minimap*.test.tsx,hover-intent-cards,minimap-card-*,thread-scroll-map*): 107 pass, 0 fail.thread-minimap-feelChromium,thread-minimap-motionWebKit,thread-minimap-tick-states,thread-rail-scroll-entrancefrom perf(agent-chat): stop replaying rail tick entrances (rail-speed) #26635): 16 pass, 0 fail (run 41130984757).scripts/web-lint.sh: passes.Observed / Not run
Changelog
Changed: The chat rail's preview card opens as soon as you hover a tick, a click on a tick lands at once, and scrolling the rail does less work per frame.
Agent session: agent session
🤖 Generated with Claude Code