Skip to content

Session rail: the card opens on hover, a click lands at once, and wheeling restyles no tick - #28494

Merged
teamleaderleo merged 10 commits into
feat-cmux-nextfrom
lane/ux-rail-fast
Oct 30, 2026
Merged

teamleaderleo merged 10 commits into
feat-cmux-nextfrom
lane/ux-rail-fast

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 30, 2026 •

Copy link
Copy Markdown
Collaborator

Leo, 2026-10-29:

"but how about fixing up the left side scroll rail thing (moving it to the left, giving it faster scrttoll/hover over) and being able to scroll it? and the various other noticeable ui or perf things"

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 (2a085961e28 and 269e4db52da, -x). It composes with #26635 (merged): ticks still get data-entering, and this PR only changes where the entrance stagger reads its row place from.

What was checked on feat-cmux-next

  • On the left: yes, in every placement. A right-side option exists only in the open Agent chat: right-click the prompt rail to move it to the right edge #24131.
  • Scrollable: yes, since feat(next): scroll the session rail independently #26520. An overflowing list scrolls itself, its scrollbar is hidden, it doesn't chain to the transcript, and its wheel listener is passive and keeps the wheel on the rail.
  • Scroll: the listeners are passive, and the band re-renders only when it moves. Shortfall: the list carried --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.
  • Hover and click: the tick magnifies at once (a 120 ms spring on transform, as the spec says). Shortfalls: the preview card waited 250 ms; a click glided the transcript for 200-400 ms before landing; and the card built a new Intl.DateTimeFormat on every render, which happens once for every row the pointer passes.

Changes

  • Hover: the card opens in the same commit as the hover (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.
  • Click: a click on a tick lands the prompt within the click's own task, with no glide. The full map's mark and track clicks seek at once too. Bookmark jumps and Previous/Next Turn keep their glide. From Agent chat rail: the preview card opens at once, and a click lands at once #27858.
  • Scroll: each tick keeps its own row place from when it mounted (--acpmux-minimap-place). The list's rows inherit nothing that changes with scroll. Tick ignores place and entering after mount, so a scroll renders no tick and restyles none.
  • The card uses one shared time formatter.
  • Latency harness: the preview server colours its port in the startup banner, and the plain string match never found it. Every harness run on CI failed with "server startup timed out" and then hung until the step's 30-minute limit. The banner is now matched with its colour escapes removed, and the process exits when the run ends.

No timer, observer or animation loop is added. The change does no new O(rows) work per scroll or hover.

Performance

metric before after delta harness or run link
rail hover → card committed (dwell) 250 ms 0 ms −250 ms model.ts CARD_DELAY; fake-clock tests hover-intent-cards, thread-minimap-rail (red on base, green here)
rail click → prompt landed (glide) 200–400 ms (jumpDuration) 0 ms −200 to −400 ms thread-minimap-motion (WebKit): every frame after the click already shows the landing
ticks restyled per wheel step that moves the list a row every drawn tick (rows in view + 24 overscan) 0 −100% code count: --acpmux-minimap-first on the list → per-tick --acpmux-minimap-place set at mount
latency harness start on CI timed out every run, then hung 1800 s starts and runs its cases fixed runs 41117089640 (hung), 41129655222 (runs)

The 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.

Before After
Dark before dark after dark
Light before light after light

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

Observed / Not run

  • Ran: the tests above, web-lint, and the gallery capture.
  • Not run: WebKit gallery stills, and a live tagged build.

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

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
@github-actions github-actions Bot added the risk:low Risk tier (docs/ci/risk-tiers.md) label Oct 30, 2026
teamleaderleo and others added 2 commits October 30, 2026 19:42
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
@github-actions github-actions Bot added risk:normal Risk tier (docs/ci/risk-tiers.md) and removed risk:low Risk tier (docs/ci/risk-tiers.md) labels Oct 30, 2026
@cmux-bot

cmux-bot Bot commented Oct 30, 2026 •

Copy link
Copy Markdown

cmux status (one comment, edited in place; each line is updated by the job that owns it)

Review ca1f3e2: HQ feed card · gallery before/after runs · checks

App of this head (app.zip, kept 1 day)

gh workflow run reload-build.yml -R manaflow-ai/cmux --ref feat-cmux-next -f tag=pr28494 -f ref=lane/ux-rail-fast -f platform=macos -f backend_mode=local

Gallery before/after for ca1f3e2: 16 states rendered, 20 images differ, 952 more touched states not rendered. Images are in the run's artifact, not on this public PR.

gh run download 41141492793 -R manaflow-ai/cmux -n gallery-advisory-28494-ca1f3e26dc8ba234b98414e7bbf40723fc6a1359 (then read gallery-review.json)

States
State Theme Status Diff Picked by
agent-pane.thread-minimap/card-markdown Apple System Colors Light changed 0% own PreviewCard.tsx
agent-pane.thread-minimap/card-markdown Apple System Colors changed 0% own PreviewCard.tsx
agent-pane.thread-minimap/card-failure Apple System Colors Light changed 0% own PreviewCard.tsx
agent-pane.thread-minimap/card-failure Apple System Colors changed 0% own PreviewCard.tsx
agent-pane.thread-minimap/card-metadata Apple System Colors Light changed 0% own PreviewCard.tsx
agent-pane.thread-minimap/card-metadata Apple System Colors changed 0% own PreviewCard.tsx
agent-pane.thread-minimap/card-prompt-fixed-2 Apple System Colors Light changed 0% own PreviewCard.tsx
agent-pane.thread-minimap/card-prompt-fixed-2 Apple System Colors changed 0% own PreviewCard.tsx
agent-pane.thread-minimap/card-prompt-fixed-3 Apple System Colors Light changed 0% own PreviewCard.tsx
agent-pane.thread-minimap/card-prompt-fixed-3 Apple System Colors changed 0% own PreviewCard.tsx
agent-pane.thread-minimap/card-prompt-growing Apple System Colors Light changed 0% own PreviewCard.tsx
agent-pane.thread-minimap/card-prompt-growing Apple System Colors changed 0% own PreviewCard.tsx
agent-pane.thread-minimap/rest Apple System Colors Light unchanged 0% own PreviewCard.tsx
agent-pane.thread-minimap/rest Apple System Colors unchanged 0% own PreviewCard.tsx
agent-pane.thread-minimap/scrubbing Apple System Colors Light changed 0% own PreviewCard.tsx
agent-pane.thread-minimap/scrubbing Apple System Colors changed 0% own PreviewCard.tsx
agent-pane.thread-minimap-height/eighteen-prompts Apple System Colors Light changed 1.67% own ThreadMinimap.tsx
agent-pane.thread-minimap-height/eighteen-prompts Apple System Colors changed 0.678% own ThreadMinimap.tsx
agent-pane.thread-minimap-height/seventy-prompts Apple System Colors Light unchanged 0% own ThreadMinimap.tsx
agent-pane.thread-minimap-height/seventy-prompts Apple System Colors unchanged 0% own ThreadMinimap.tsx
agent-pane.thread-minimap-height/tall-pane-caps Apple System Colors Light unchanged 0% own ThreadMinimap.tsx
agent-pane.thread-minimap-height/tall-pane-caps Apple System Colors unchanged 0% own ThreadMinimap.tsx
agent-pane.thread-minimap-lit/mid-thread Apple System Colors Light unchanged 0% own ThreadMinimap.tsx
agent-pane.thread-minimap-lit/mid-thread Apple System Colors unchanged 0% own ThreadMinimap.tsx
agent-pane.thread-minimap-lit/at-the-end Apple System Colors Light unchanged 0% own ThreadMinimap.tsx
agent-pane.thread-minimap-lit/at-the-end Apple System Colors unchanged 0% own ThreadMinimap.tsx
agent-pane.thread-minimap-lit/hovered Apple System Colors Light changed 0.869% own ThreadMinimap.tsx
agent-pane.thread-minimap-lit/hovered Apple System Colors changed 0.67% own ThreadMinimap.tsx
agent-pane.thread-minimap-mark/states Apple System Colors Light unchanged 0% own ThreadMinimap.tsx
agent-pane.thread-minimap-mark/states Apple System Colors unchanged 0% own ThreadMinimap.tsx
agent-pane.thread-minimap-mark/bookmark-hovered Apple System Colors Light changed 2.51% own ThreadMinimap.tsx
agent-pane.thread-minimap-mark/bookmark-hovered Apple System Colors changed 1.13% own ThreadMinimap.tsx

Pick other states with a Gallery: entry.id, entry.id/variant line in the PR body.

Passes: CI passes on ca1f3e26dc.

CI passes on ca1f3e26dc (run 41144188595 attempt 1).

Written by scripts/ci/classify_failures.py (ci-failure-attribution.yml); signatures are its SIGNATURES table. A machine verdict is the runner's fault, not this PR's; yours means the failing file is one this PR changes, also red on main that main's latest full suite fails the same way, seen on other PRs that it failed on another pull request's run lately.

Shipped in:

teamleaderleo and others added 2 commits October 30, 2026 20:49
…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
@teamleaderleo teamleaderleo changed the title Session rail: the preview card opens on the hover, and wheeling the rail does less per frame Session rail: the card opens on hover, a click lands at once, and wheeling restyles no tick Oct 30, 2026
@teamleaderleo
teamleaderleo marked this pull request as ready for review October 30, 2026 21:31
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6-astra high, next-review): SHIP at f176bb2

No blocking findings.

@cmux-bot cmux-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cmux-bot approves f176bb2: an independent review passed this exact head (next-review receipt by teamleaderleo). A push needs a new review; a later BLOCK at this head dismisses this approval.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

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 threadMinimap/ScrollMap.tsx and ThreadMinimap.tsx. The owner lane has been told to merge base in, resolve the conflict and land.

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
@blacksmith-sh

blacksmith-sh Bot commented Oct 30, 2026

Copy link
Copy Markdown

Found 1 test failure on Blacksmith runners:

Failure

Test View Logs
test_every_listed_hook_is_one_glaeda_released_with_the_check (main.SigningHooksInSt
epWithGlaedaTests.test_every_listed_hook_is_one_glaeda_released_with_the_check)/
test_every_listed_hook_is_one_glaeda_released_with_the_check (main.SigningHooksInSt
epWithGlaedaTests.test_every_listed_hook_is_one_glaeda_released_with_the_check)
View Logs

Fix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

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.

  1. Non-blocking: gallery copy still says the card opens after 250 ms at threadMinimap.gallery.ts:53 and line 274, while CARD_DELAY is now 0.

@teamleaderleo teamleaderleo removed the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 30, 2026
@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 30, 2026
@teamleaderleo
teamleaderleo merged commit fb0888b into feat-cmux-next Oct 30, 2026
171 of 176 checks passed
@teamleaderleo
teamleaderleo deleted the lane/ux-rail-fast branch October 30, 2026 23:49
teamleaderleo added a commit that referenced this pull request Oct 31, 2026
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
teamleaderleo added a commit that referenced this pull request Oct 31, 2026
* 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>

This branch was previously deployed

1 inactive deployment
ci-routing-agent — ca1f3e26 Deployed Oct 30, 2026 by teamleaderleo via cmux-tui tree preflight #85582
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

risk:normal Risk tier (docs/ci/risk-tiers.md)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant