Skip to content

[cx-ncc.112.66, cx-ncc.112.74] cmux NEXT agent chat: the rail's lit band glides at rest, shows at 75%, and stays lit on hover - #24526

Merged
teamleaderleo merged 2 commits into
feat-cmux-nextfrom
tp/minimap-band-glide
Oct 23, 2026
Merged

teamleaderleo merged 2 commits into
feat-cmux-nextfrom
tp/minimap-band-glide

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 23, 2026 •

Copy link
Copy Markdown
Collaborator

Leo-ask: ask-50f889c053
Leo-ask: ask-8dbc4a81e1

Takes back #22228: it lit the prompts on screen at 60% and dimmed them back to rest while the pointer was on the rail, so the band barely showed where the reader was. This PR lights them at 75% and keeps them lit on hover. #22228's rail, geometry, fisheye, card, click and scrub are unchanged.

This PR carries over the parts of #24065 that #24058 (5082646) does not cover. #24058 already restored the compact rail as the default and made its band reach the bottom ticks (railScrollTop). It also keeps the band followed with the pointer on the rail (followPointer). This PR builds on that code. The full-height map (#22784) stays selectable from cmux.experiments, as #24058 left it. #24065 is closed in favour of #24058 plus this PR.

What Leo said

On the nightly, the agent chat's left-edge prompt rail (#22228, the Codex rail) "felt short". He explained: "it wouldn't show the highlighted bottom text where I was scrolling at the bottom, and it just didn't go to the bottom. It didn't show the bottom bits being highlighted." About the full-height map: "Why did you turn it into a whole mini map? ... I didn't want the mini map." From #24065's notes on the band's motion (Leo, 2026-10-21): "the wave didn't look good enough".

Change against #24058

#24058 (base) This PR
Lit band brightness 60% over rest at 40% 75%, through --acpmux-minimap-lit
Band with the pointer on the rail dimmed back to rest stays lit beside the fisheye
Band moving at rest rows flick from rest to lit brighten and dim over 120 ms (--cmux-motion-micro)
Hover, scrub, data-reduce, prefers-reduced-motion switch at once still switch at once
Keyboard focus, the pointer leaving the rail switch at once still switch at once: the active tick never glides, and a commit that changes the active row, hover or scrub marks the rail data-snap
Full-height map (full arm) as #24058 left it unchanged: the glide is scoped with :not(.acpmux-scrollmap)
Default arm, railScrollTop, followPointer, the bottom fix #24058 unchanged
  • threadMinimap.css: a @media (prefers-reduced-motion: no-preference) block gives the rail at rest a color transition on ticks and transform, opacity on bars. The lit bar reads opacity: var(--acpmux-minimap-lit, 0.75). The two [data-hovering] … [data-tone="current"] rules that dimmed the band are gone.
  • lit.experiment.ts (new, registered): thread-minimap-lit with arms lit-60, lit-70, lit-75 (default) and lit-85. ThreadMinimap reads the arm once per pane and sets --acpmux-minimap-lit on the rail. Dogfood: {"thread-minimap-lit":"lit-60"} in cmux.experiments.

Timers and cleanup: this PR adds no timer, observer or animation loop. Each glide is a CSS transition that ends by itself after 120 ms. A hovered, scrubbed or Reduce Motion rail runs none. No new per-token work: the arm is read once per pane in a useState initializer.

Versions (gallery)

New entry agent-pane.thread-minimap-lit: 18 or 70 synthetic prompts (Prompt N: check the next step of the plan), with states mid-thread, at-the-end and hovered, and the four thread-minimap-lit arms side by side in the compare view.

Stills: the rail strip of each gallery frame at 2x, taken with Playwright's headless Chromium from the gallery host's builds. "Before" is base ea5f81f and "after" is this head, 61de4e9. Each frame waits for data-gallery-ready, then 600 ms for the transitions to finish. The computed bar opacities read in the same frames are: rest 0.4 everywhere; lit 0.6 before and 0.75 after; with the pointer on the rail, lit 0.4 before (dimmed) and 0.75 after; the hovered tick 1.

Before / after (dark, light):

Pointer on prompt 9 of 18, band on prompts 15 to 18. Before: the band drops back to rest. After: it stays lit.
before after long chat

At rest mid-thread:
before after rest

Seventy prompts at the bottom of the chat (#24058's fix, now lit at 75%):
before after seventy prompts bottom

Versions: lit at 60% (#22228's, the before), 70%, 75% and 85%; dark, then light:

At rest mid-thread:
lit arms mid thread

At the end of a 70-prompt chat:
lit arms at the end

Pointer on prompt 3, band on prompts 4 to 7:
lit arms hovered

Pick: 75% (the default). At 60% the band is a soft step over rest, most of all in light mode. At 85% in light mode the band is nearly as dark as the hovered tick, so the row under the pointer stops standing out. 75% reads as lit in both schemes and stays clearly under the hovered tick. The other arms stay selectable from cmux.experiments.

Gallery: agent-pane.thread-minimap-lit, agent-pane.thread-minimap/rest, agent-pane.thread-minimap/long-chat, agent-pane.thread-minimap/seventy-prompts-bottom

Tests

webviews/test/thread-minimap-default-wave.test.tsx adds:

  • the lit band ships at 75%, and lit-60 and lit-85 reach the rail's --acpmux-minimap-lit (rendered through VirtualTranscript);
  • the lit bar reads var(--acpmux-minimap-lit, 0.75), and no rule dims the rail's band under [data-hovering];
  • at rest the bar transitions transform and opacity, and the tick transitions color, over --cmux-motion-micro, both inside the no-preference query, and never on an active tick or a data-snap rail;
  • focusing a tick, and leaving it, marks the rail data-snap, and the next band move from the scroll clears it (rendered through VirtualTranscript).

thread-minimap-motion (browser lane) reads the bar's transition at rest: exactly transform, opacity, each 0.12 s with no delay.

Review: Codex (gpt-6.1-sol, xhigh) blocked 61de4e9 on focus and pointer-leave fading, and on the motion test's loose pattern; b6762ca fixes all three.

Observed / Not run

  • Observed on huge-blue (scripts/ci/run-webviews-tests.sh, bun 1.4.2): 14 of 15 files pass: thread-minimap default-wave, bottom, rail, current, feel, stream, tiny, room and card-glass, plus gallery agent-pane-entries, manifest, play-names and touched-rank. The 15th, gallery-coverage, fails its two cover checks with the same lists on base, none of them this PR's. vp lint and vp fmt --check are clean on the touched files. typecheck reports 3 errors, all in thread-minimap-stream.test.tsx, which this PR does not touch (base).
  • Not run locally: thread-minimap-motion's browser lane (CI only).

Changelog

  • Improved: the agent chat's prompt rail lights the prompts on screen more clearly, keeps them lit while you point at the rail, and glides the lit band as you scroll.

Webview only; no Swift change.

Agent session: cosmic-gray

🤖 Generated with Claude Code

@teamleaderleo teamleaderleo added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 23, 2026
@cursor

cursor Bot commented Oct 23, 2026

Copy link
Copy Markdown

Bugbot needs on-demand usage enabled

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

@github-actions

github-actions Bot commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

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

Review a7e8cfe: 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=pr24526 -f ref=tp/minimap-band-glide -f platform=macos -f backend_mode=local

Gallery before/after for a7e8cfe: 6 states rendered, 12 images differ (picked by the Gallery: line in the PR body). Images are in the run's artifact, not on this public PR.

gh run download 39950310363 -R manaflow-ai/cmux -n gallery-advisory-24526-a7e8cfef7fda0ce8859a6c8c080245ca5a56e9f2 (then read gallery-review.json)

States
State Theme Status Diff Picked by
agent-pane.thread-minimap-lit/mid-thread Apple System Colors Light new 0% pr-body
agent-pane.thread-minimap-lit/mid-thread Apple System Colors new 0% pr-body
agent-pane.thread-minimap-lit/at-the-end Apple System Colors Light new 0% pr-body
agent-pane.thread-minimap-lit/at-the-end Apple System Colors new 0% pr-body
agent-pane.thread-minimap-lit/hovered Apple System Colors Light new 0% pr-body
agent-pane.thread-minimap-lit/hovered Apple System Colors new 0% pr-body
agent-pane.thread-minimap/rest Apple System Colors Light changed 0.0064% pr-body
agent-pane.thread-minimap/rest Apple System Colors changed 0.0064% pr-body
agent-pane.thread-minimap/long-chat Apple System Colors Light changed 0.0085% pr-body
agent-pane.thread-minimap/long-chat Apple System Colors changed 0.0085% pr-body
agent-pane.thread-minimap/seventy-prompts-bottom Apple System Colors Light changed 0.0064% pr-body
agent-pane.thread-minimap/seventy-prompts-bottom Apple System Colors changed 0.0064% pr-body

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

red: cmux-next checks (god files, concurrency, crash safety, l10n); no finished base run on d5928a9 to compare; do not merge until green; see lane-rules

Tour of a7e8cfef7f (run): no media. The tour did not run: only webview code changed (7 path(s)), which the gallery advisory run checks in Linux Chromium on the pull request (its artifact holds any captures); add the media-tour-mac label, then re-add media-tour, to tour it on a Mac.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Owned by transcript-parity on cosmic-gray · session

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

rust workspaces / plan (changed Cargo workspaces) is red on 19 of 19 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

@blacksmith-sh

blacksmith-sh Bot commented Oct 23, 2026 •

Copy link
Copy Markdown

Found 8 test failures on Blacksmith runners:

Failures

Test View Logs
/tmp/tmp2f1bqe1e/summary-fail.json (live):/summary-fail.json (live): View Logs
/tmp/tmpw83iukb7/summary-missing.json (live):/summary-missing.json (live): View Logs
[tabs] debug.tab_switch timed 0 of 40 switches/
[tabs] debug.tab_switch timed 0 of 40 switches
View Logs
[tabs] debug.tab_switch timed 0 of 40 switches/
[tabs] debug.tab_switch timed 0 of 40 switches
View Logs
[tabs] the window draws no frames/[tabs] the window draws no frames View Logs
[tabs] the window draws no frames/[tabs] the window draws no frames View Logs
test_base_passes (main.NoticesPairTests.test_base_passes)/
test_base_passes (main.NoticesPairTests.test_base_passes)
View Logs
test_targets_outside_the_app_go_to_the_mac_canary (main.SwiftCanaryFleetCoverage.te
st_targets_outside_the_app_go_to_the_mac_canary)/
test_targets_outside_the_app_go_to_the_mac_canary (main.SwiftCanaryFleetCoverage.te
st_targets_outside_the_app_go_to_the_mac_canary)
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

rust workspaces / rust workspaces is red on 17 of 18 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

teamleaderleo added a commit that referenced this pull request Oct 23, 2026
…r and leaving snap

Codex review of #24526 (BLOCK at 61de4e9):
- A key focusing a tick made it active while the rail stayed at rest, so the
  focused row faded in. Active ticks never take the glide now.
- The pointer leaving the rail dropped data-hovering in the same commit that
  changed the hovered row's tone, so leaving faded too. A commit that changes the
  active row, the hover or the scrub marks the rail data-snap and its rows switch
  at once; the rail's next render that changes none of these drops the mark.
- thread-minimap-motion asserted durations with a pattern a single 0.12s also
  matched. It now reads transitionProperty: exactly "transform, opacity", each
  0.12s with no delay.

thread-minimap-default-wave: the glide's selectors exclude data-snap and the
active tick, and a VirtualTranscript render marks data-snap on focus and blur and
clears it on the next band move.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16030-bf28-7072-b1f6-b83bbd0beacc&host=cosmic-gray
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next guards / nightly-guards / workflow-guard-tests / release-notary is red on 13 of 17 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex xhigh, correctness first): SHIP at b6762ca

Reviewer: Codex gpt-6.1-sol, model_reasoning_effort=xhigh, --sandbox read-only on cmux16, from a diff-only prompt (the PR's whole diff, the delta since the last review, and ThreadMinimap.tsx and threadMinimap.css at this head).

Verdict: "No correctness findings. The snap pose is commit-safe, hover/focus/leave/scrub changes are marked in the same render, scroll updates clear it, and the full map remains excluded from the new rules."

The first round, at 61de4e9, blocked on three findings, all fixed in b6762ca:

  • keyboard focus faded the active row in;
  • leaving the rail faded the hovered row out;
  • the motion test's duration pattern accepted a single 0.12s.

CI at this head: the only reds are base reds (rust workspaces, release-notary, Guard status, cmux-next checks); web and react-apps checks and fast gates are green.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next fast gates / fast gates is red on 15 of 17 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

teamleaderleo and others added 2 commits October 23, 2026 12:01
…%, and stays lit on hover

Carries over the parts of #24065 that #24058 does not cover, built on #24058's
rail (railScrollTop, followPointer). The full-height map stays as #24058 left it.

- At rest a row coming on screen brightens, and one leaving dims, over the motion
  scale's micro step (120 ms), so the band glides down the rail. Hover, scrub,
  data-reduce and prefers-reduced-motion switch at once; the full map keeps its look.
- Lit ticks draw at --acpmux-minimap-lit, 75% by default (was 60%), over rest at 40%.
  lit.experiment.ts keeps 60/70/75/85% for the gallery's compare view and dogfood.
- The prompts on screen stay lit while the pointer is on the rail (#22228 dimmed
  them back to rest there).

Tests: thread-minimap-default-wave (default arm, each arm reaches the rail, the
CSS); thread-minimap-motion reads the bar's transitions as a list.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16030-bf28-7072-b1f6-b83bbd0beacc&host=cosmic-gray
…r and leaving snap

Codex review of #24526 (BLOCK at 61de4e9):
- A key focusing a tick made it active while the rail stayed at rest, so the
  focused row faded in. Active ticks never take the glide now.
- The pointer leaving the rail dropped data-hovering in the same commit that
  changed the hovered row's tone, so leaving faded too. A commit that changes the
  active row, the hover or the scrub marks the rail data-snap and its rows switch
  at once; the rail's next render that changes none of these drops the mark.
- thread-minimap-motion asserted durations with a pattern a single 0.12s also
  matched. It now reads transitionProperty: exactly "transform, opacity", each
  0.12s with no delay.

thread-minimap-default-wave: the glide's selectors exclude data-snap and the
active tick, and a VirtualTranscript render marks data-snap on focus and blur and
clears it on the next band move.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16030-bf28-7072-b1f6-b83bbd0beacc&host=cosmic-gray
@cursor

cursor Bot commented Oct 23, 2026

Copy link
Copy Markdown

Bugbot needs on-demand usage enabled

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

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next / cmux-next checks (god files, concurrency, crash safety, l10n) › Checks job structure is red on 13 of 14 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex xhigh, correctness first): SHIP at a7e8cfe

This is a delta review over b6762ca, the head of the full SHIP review above. Since then the branch was rebased onto b671d11, in two steps:

Reviewer: Codex gpt-6.1-sol, model_reasoning_effort=xhigh, --sandbox read-only on cmux16, from a diff-only prompt. Verdict on a7e8cfe: "The new head's tree is identical to reviewed commit 3a47dc1 (49dada63...), with no content diff. History is linear: both commits have exactly one parent; no merge commit remains. Every changed file is under webviews/; no sidebar or other base files are touched. registry.ts retains both threadMinimapLit and turnErrorCard."

CI at this head:

  • web lint, webview tests and tsc are green.
  • The only reds are base reds: Guard status, release-notary and cmux-next checks.
  • The fast gates prepush gate charges base sidebar files to this PR as a missing Sidebar-Look: trailer ("ChromeDecorations.swift and 161 more"). Neither of this PR's commits touches a file outside webviews/.

@teamleaderleo
teamleaderleo merged commit 0409e0b into feat-cmux-next Oct 23, 2026
131 of 136 checks passed
@teamleaderleo
teamleaderleo deleted the tp/minimap-band-glide branch October 23, 2026 12:20
@github-actions

Copy link
Copy Markdown
Contributor

Shipped in:

teamleaderleo added a commit that referenced this pull request Oct 23, 2026
…ut (#24539)

The pull_request checkout holds the merge ref at depth 2: the merge and its two parents. The PR head's own
parents are cut, so a cut head reads as a root commit that adds the whole tree. On #24526 at 3a47dc1 the head
was a commit bringing the base in; `rev-list --no-merges` listed it (a cut merge shows no parents) and the
Sidebar-Look check saw it add 162 sidebar files.

prepare now deepens the pull_request checkout with the same rule the dispatch path already used (shared as
deep_enough/deepen): until the base meets the head at its true merge base with no cut between them. A full
clone is left alone, as before.

Tests: a depth-2 merge-ref checkout whose head brings the base in. After prepare, rev-list base..merge
--no-merges is only the PR's own commit, and that commit's diff is only its own file. This fails on the old
script with the cut merge listed instead. A full-clone pull_request fetches nothing.


Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a1603a-6462-72f0-a4b0-6937eb58e4c3&host=cosmic-gray

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
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