Skip to content

Fix prompt rail pane anchoring and narrow-width access - #26641

Merged
teamleaderleo merged 12 commits into
feat-cmux-nextfrom
rail-x-pane-origin-1028
Oct 30, 2026
Merged

teamleaderleo merged 12 commits into
feat-cmux-nextfrom
rail-x-pane-origin-1028

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 28, 2026 •

Copy link
Copy Markdown
Collaborator

Pin the prompt rail to the pane’s left edge when a right pane closes, the transcript recenters, or Session Info shifts the chat. The rail gets a token-based 8–16 px inset and compresses before it covers text. When space is exhausted, a live edge strip and keyboard focus reveal the usable rail; leaving the rail and preview hides it again. The preview remains flush with the rail’s right edge.

#25800 made the rail and its portaled preview inherit the transcript’s animated inspector shift. Remove that coupling, measure pane width through the existing resize observer, and refresh overlap placement on scoped chat-layout changes. No new observer or per-frame layout work is added.

Leo, October 28:

Likewise, there's this odd stuff going on where sometimes the left scroll rail, it doesn't return to the left when, you know, the right pane closes and whatnot.

Lawrence, relayed by Leo:

needs more left padding

Leo’s placement clarification:

Like the... well, for one, the thing should be more, you know, should be sticky along the left instead of following the agent chat section, man.

Leo’s updated narrow-width requirement:

And when it is truly too small and it would be overlapping the text, then you can just hide it until the user hovers over it. And then when it's hovered over, then they can just work normally, and then when they leave the hover area, then just, you know, it hides. But it doesn't disappear entirely. There's still that functionality.

The gallery covers wide, compressed, occluded, hovered, and focused states using the actual component. The reference is the supplied pane-edge padding crop; private reference images are not published. Existing tick style, colors, click behavior, and full minimap mode are preserved.

Validation:

  • Real Chromium: 11 tests pass, including every painted frame during pane resize and inspector shifts, actual row-edge overlap, preview alignment, and hover/click/wheel/scrub access at a 160 px pane width.
  • The new placement/resize cases fail on base 22a2728ed33eabb65eef1493a227d738a2d2f372 (7 failures).
  • Narrow/tiny rail tests, inspector tests, gallery manifest, full web check, web-lint and prepush gate pass.
  • Local static checks pass. Localization parity fails identically on base; no catalogs changed.

Risk: compressed rail hit testing and pointer travel to the preview. Chromium exercises both. The leave grace is the shared hover-intent grace (HOVER_INTENT.cardGrace, 200 ms, off the motion scale): one-shot, cancelled on re-entry or focus, skipped under Reduce Motion or on a hidden page, and cleared on unmount and on a page hide (which also closes the card). While the rail is hidden, its hover strip ends at the text edge (never under the text), so text clicks, links and selection drags stay the text's. The scoped layout listener and the visibility listener (allow-listed in check-switch-fetches: reads no data) are removed by effect cleanup. Existing resize observer cleanup is unchanged.

Takeover (2026-10-29): the original lane stalled; this lane brought the branch up to date with its base, fixed web lint (memoized rail measure), and addressed two independent review rounds. 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?" This PR is the moving-it-left part; scroll speed and wheel scrolling are on #27858 and #26520.

Browser captures of the actual app entry, using a synthetic transcript (before 22a2728, after 6828f3f). The vertical height difference comes from the separately landed rail-height change.

State Before After
Wide · 1600 px Before After
Medium · 1084 px Before After
Compressed · 800 px Before After
After right-pane close Before After
160 px, hidden 160 px, hovered with working preview
Hidden Hovered

Takes back #25800: it made the rail and its preview card follow Session Info's chat shift; the settled spec (design/session-rail.md, "Settled position and gutter") pins the rail to the pane's left edge instead, so this PR removes that shared translate.
Takes back #27192: its gallery-only inset variants (and their unit test) were exploratory placements for the pending railPlacement/useRailPlacement seam; this PR is that seam, and the gallery entry now shows the shipped wide, compressed, hidden, hovered and focused states.

Performance

No perf numbers: this PR moves and compresses the rail; it adds no per-token or per-row work, no observer and no frame loop (the placement reuses the existing resize measurement and a scoped layout event). Rail scroll and hover speed are #27858.

Agent session: agent session

The Chromium pane-close regression fails against 22a2728: the rail follows the centered column instead of the pane edge. Also cover compression, hover-strip reveal, card alignment and keyboard access.

Agent-Session: https://cmux.com/deeplink/agent?id=aid-c2793b771c663431e8c4
Detach the rail and preview from the inspector chat translation. Reuse pane resize measurements and an inspector layout event to compress against the actual text gutter. Read spacing tokens for the edge inset. An always-mounted edge strip and keyboard focus reveal the rail over text; a one-shot 120ms leave grace is cancelled on reentry and unmount. No observer or frame loop added. Chromium: 11 pass, including frame alignment and narrow click/scrub/wheel/card access. Web lint/type/protocol checks pass; unit checks pass. Localization verification is unchanged base debt.

Agent-Session: https://cmux.com/deeplink/agent?id=aid-c2793b771c663431e8c4
@cursor

cursor Bot commented Oct 28, 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

Bead cx-kkefzh created for this PR by the cmux coordinator.

…-origin-1028

# Conflicts:
#	webviews/src/agent-session/acpmux/threadMinimap/ThreadMinimap.tsx
@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 28, 2026
@github-actions

github-actions Bot commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

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

Review d83de16: 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=pr26641 -f ref=rail-x-pane-origin-1028 -f platform=macos -f backend_mode=local

Unclear: web / react-apps-check failed: no known signature; failed step: Check webview test shards. This PR merged before its CI finished: fix forward on main.

CI failed on 879e10807d (run 41011226214 attempt 1): 1 code, 1 unknown.

Job Verdict Why
web / react-apps-base-check (2) code a web test failed
web / react-apps-check unknown no known signature; failed step: Check webview test shards

Failures:

  • seen on other PRs MarkdownMath.test.tsx keeps shell command dollar signs as plain text without dropping content: failed (job)
  • seen on other PRs queuedMessages.test.ts each agent message is a received-card row, in the queue's order, with its promptId: failed (job)
  • seen on other PRs agent-pane-no-capsules.test.ts agent pane page > rounds its controls as small-radius rects, not capsules: failed (job)
  • seen on other PRs agent-pane-pending-steer.test.tsx Send now on a waiting steer asks queue_edit send_now for its promptId, and goes once it is read: failed (job)
  • seen on other PRs agent-pane-turn-tokens-muted-browser.test.tsx the count reads quieter than the line's words > the line over the turn (WorkingFor.tsx): failed (job)
  • seen on other PRs agent-pane-turn-tokens-muted.test.tsx the count takes the theme's tertiary text token, in tabular numerals, never a literal color: failed (job)
  • seen on other PRs bare-ref-repo.test.tsx an agent's message: its own address names the repository of its bare #N: failed (job)
  • seen on other PRs chat-open-long.test.ts a 700-turn chat opened cold on a busy daemon shows its rows with the attach, never an empty page: failed (job)
Matched log lines
web / react-apps-base-check (2): (fail) keeps shell command dollar signs as plain text without dropping content [5.66ms]

Not re-run automatically: web / react-apps-base-check (2), web / react-apps-check are not machine failures.

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.

red: cmux-next checks (god files, concurrency, crash safety, l10n); NEW: red check: Package dependency lists sorted (+1 more) is not red on the base f5e762b; do not merge until green; see lane-rules
red: web / Web status; base red: the same failure on the base f5e762b; does not block
red: web / react-apps-base-check (2); no finished base run on f5e762b to compare; do not merge until green; see lane-rules
red: web / react-apps-check; base red: the same failure on the base f5e762b; does not block

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

gh run download 41005121449 -R manaflow-ai/cmux -n gallery-advisory-26641-89876bb93da65998ecfcac7b791bda44f19e3ca6 (then read gallery-review.json)

States
State Theme Status Diff Picked by
agent-pane.chat-inspector/full Apple System Colors Light unchanged 0% own ChatInspector.tsx
agent-pane.chat-inspector/full Apple System Colors unchanged 0% own ChatInspector.tsx
agent-pane.chat-inspector/workflow-running Apple System Colors Light changed 0.0049% own ChatInspector.tsx
agent-pane.chat-inspector/workflow-running Apple System Colors changed 0.0036% own ChatInspector.tsx
agent-pane.chat-inspector/workflow-finished Apple System Colors Light unchanged 0% own ChatInspector.tsx
agent-pane.chat-inspector/workflow-finished Apple System Colors unchanged 0% own ChatInspector.tsx
agent-pane.chat-inspector/workflow-agent-row-compact Apple System Colors changed 0.0045% own ChatInspector.tsx
agent-pane.chat-inspector/workflow-agent-row-compact Apple System Colors Light changed 0.0043% own ChatInspector.tsx
agent-pane.chat-inspector/workflow-agent-row-detail Apple System Colors Light changed 0.0045% own ChatInspector.tsx
agent-pane.chat-inspector/workflow-agent-row-detail Apple System Colors changed 0.0042% own ChatInspector.tsx
agent-pane.chat-inspector/workflow-agent-row-grid Apple System Colors Light changed 0.0047% own ChatInspector.tsx
agent-pane.chat-inspector/workflow-agent-row-grid Apple System Colors changed 0.0041% own ChatInspector.tsx
agent-pane.chat-inspector/workflow-agent-row-narrow Apple System Colors Light changed 0.0055% own ChatInspector.tsx
agent-pane.chat-inspector/workflow-agent-row-narrow Apple System Colors changed 0.004% own ChatInspector.tsx
agent-pane.chat-inspector/layout-glance Apple System Colors Light unchanged 0% own ChatInspector.tsx
agent-pane.chat-inspector/layout-glance Apple System Colors unchanged 0% own ChatInspector.tsx
agent-pane.chat-inspector-surfaces/transcript Apple System Colors Light unchanged 0% own ChatInspector.tsx
agent-pane.chat-inspector-surfaces/transcript Apple System Colors unchanged 0% own ChatInspector.tsx
agent-pane.chat-inspector-surfaces/diff-in-place Apple System Colors Light unchanged 0% own ChatInspector.tsx
agent-pane.chat-inspector-surfaces/diff-in-place Apple System Colors unchanged 0% own ChatInspector.tsx
agent-pane.chat-inspector-surfaces/document-beside Apple System Colors Light unchanged 0% own ChatInspector.tsx
agent-pane.chat-inspector-surfaces/document-beside Apple System Colors unchanged 0% own ChatInspector.tsx
agent-pane.chat-inspector-surfaces/diff-closed Apple System Colors changed 0% own ChatInspector.tsx
agent-pane.chat-inspector-surfaces/diff-closed Apple System Colors Light unchanged 0% own ChatInspector.tsx
agent-pane.chat-width/standard Apple System Colors Light unchanged 0% own App.tsx
agent-pane.chat-width/standard Apple System Colors unchanged 0% own App.tsx
agent-pane.chat-width/wide Apple System Colors Light unchanged 0% own App.tsx
agent-pane.chat-width/wide Apple System Colors unchanged 0% own App.tsx
agent-pane.chat-width/wide-blocks Apple System Colors Light unchanged 0% own App.tsx
agent-pane.chat-width/wide-blocks Apple System Colors unchanged 0% own App.tsx
agent-pane.composer-edge/short-edge Apple System Colors Light unchanged 0% own App.tsx
agent-pane.composer-edge/short-edge Apple System Colors unchanged 0% own App.tsx

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

@blacksmith-sh

blacksmith-sh Bot commented Oct 28, 2026 •

Copy link
Copy Markdown

Found 9 test failures on Blacksmith runners:

Failures

Test View Logs
--from must install a complete prebuilt tree/
--from must install a complete prebuilt tree
View Logs
/tmp/tmprohwr7_s/summary-missing.json (live):/summary-missing.json (live): View Logs
/tmp/tmpzwjde8ip/summary-fail.json (live):/summary-fail.json (live): View Logs
[new_workspaces] debug.new_workspace timed 0 of 50 new workspace rows/
[new_workspaces] debug.new_workspace timed 0 of 50 new workspace rows
View Logs
[new_workspaces] the window draws no frames/[new_workspaces] the window draws no frames 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
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
test_the_repository_highlights_validate (main.DigestTests.test_the_repository_highl
ights_validate)/
test_the_repository_highlights_validate (main.DigestTests.test_the_repository_highl
ights_validate)
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

Orphaned: no activity for 15 h, and no lane holds a lease on it. The orphan sweep could not merge feat-cmux-next in: conflicts in webviews/src/agent-session/acpmux/threadMinimap/ThreadMinimap.tsx. Listed for a lane to resolve.

@teamleaderleo

teamleaderleo commented Oct 29, 2026 •

Copy link
Copy Markdown
Collaborator Author

Owned by an agent session · session

Resolve against #27192's exploratory inset gallery: the pane-edge placement here
replaces those plays, so the gallery keeps this PR's resting/hovered/focused
variants and the exploratory inset test goes with them. Keep the flushSync band
render (9439a80) and Session Info's useUnderInspector.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-636fd2e0ce24b82d1b3d
@teamleaderleo

teamleaderleo commented Oct 30, 2026 •

Copy link
Copy Markdown
Collaborator Author

Owned by an agent session · session

…p overlap

Review at 7ff8959 found three blockers:
- useRailPlacement measured in a layout effect that ran before the ancestor
  scroller's ref attached, so a same-width remount never subscribed to the
  shell's layout event. A passive effect now measures again and subscribes.
- A click on an occluded rail's tick kept focus there, which held the rail and
  its card over the text after the pointer left. The leave grace now blurs
  focus a click gave (not :focus-visible) and closes the card.
- The full-height map lost its gutter cutoff and lay over text with live click
  and drag handlers. It now shows only where its box overlaps the text by at
  most 8 px, measured from the compact rail's placement.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-636fd2e0ce24b82d1b3d
teamleaderleo and others added 2 commits October 30, 2026 02:43
…dencies

Clears the two react-hooks/exhaustive-deps warnings that failed web lint.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The occluded rail hid after a hard-coded 120 ms. It now waits HOVER_INTENT.cardGrace, hides at
once under Reduce Motion or while the page is hidden, and a hidden page clears a pending timer
(design/session-rail.md, Settled position and gutter).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
check:switch-fetches refuses page visibility listeners in the agent page. The leave grace already
reads document.hidden when it is scheduled, and the one-shot timer only hides the rail.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ars its grace

Review findings at d83de16: the occluded rail hover strip spanned the hidden rail width
over the transcript text, taking its clicks, links and selection drags; it now ends at the text
edge and keeps at least the pane-edge inset. A page that hides mid-grace clears the leave timer
and settles the rail hidden (allow-listed in check-switch-fetches: reads no data). The narrow
tests follow the shared HOVER_INTENT.cardGrace and assert the strip stops at the text.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the strip keeps the rail

Review findings at 89876bb: a page hide during the leave grace cleared the timer but left
the card intended, so a later strip hover brought back a stale card; and a tick blur while the
pointer rested on the strip hid the rail with no new pointer enter to reveal it. The visibility
handler now dismisses the card too, and the grace keeps the rail while the pointer is on the strip.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (independent Codex gpt-6-astra, high, fast; correctness first): SHIP at 879e108

Earlier rounds at d83de16 and 89876bb returned BLOCK; their four findings (leave grace running after a page hide, the occluded strip covering the text edge, a stale card after a page hide, a blur hiding the rail under a resting pointer) are fixed in d83de16..879e108 and confirmed resolved at this head. Nit noted: the removed inset-variants unit test; browser tests cover the shipped narrow states.

@cmux-bot cmux-bot Bot 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 146a973 into feat-cmux-next Oct 30, 2026
201 of 218 checks passed
@teamleaderleo
teamleaderleo deleted the rail-x-pane-origin-1028 branch October 30, 2026 06:16
@github-actions

Copy link
Copy Markdown
Contributor

Shipped in:

@github-actions

github-actions Bot commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

teamleaderleo added a commit that referenced this pull request Oct 30, 2026
Resolved on top of the rewritten latency harness (#26554): the rail hover case uses its
inputEvent (pointerover) in place of the hover flag, and its server-ready match keeps the
ANSI-stripped, cross-chunk banner match. ThreadMinimap header comment keeps #26641 left-edge
wording with the same-frame card.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
teamleaderleo added a commit that referenced this pull request Oct 30, 2026
…ool output cap) (#28256)

* test(webviews): follow the pane-edge prompt rail in two stale tests

#26641 pinned the prompt rail to the pane's left edge and made its leave grace skip under
Reduce Motion. Two tests still assumed the old placement and timing:

- thread-minimap-narrow: the file runs with Reduce Motion on, so the strip's revealed rail
  hides at once instead of after HOVER_INTENT.cardGrace. The grace case now turns motion on,
  and a new case covers the immediate hide under Reduce Motion.
- transcript-follow: the touch tap at the pane's left edge (x + 12) now lands on a rail tick,
  which jumps to that prompt and unmounts the streaming row. The tap now lands on a reply's
  text, checked to be off the rail.

Agent-Session: https://cmux.com/deeplink/agent?id=aid-fb75b7af9902231028aa
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(webviews): scale the tool output viewport cap with transcript text size

#26696 capped every [data-output-viewport] at a fixed calc(8 * 18px + 16px). At larger chat
text sizes that box holds fewer than eight lines, and transcript-content-font fails ("eight
scaled lines remain in the preview", 160 < 288 at 28px). The cap is now eight 18/14-scaled
lines plus padding, which is still 160px at the 14px default. Not 8lh: the Markdown viewport
sets no line-height of its own, so its lh would be the inherited normal line-height and the
Markdown preview would shrink below its base height (Codex review of #28135).

Agent-Session: https://cmux.com/deeplink/agent?id=aid-fb75b7af9902231028aa
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

This branch was previously deployed

1 inactive deployment
ci-routing-agent — 879e1080 Deployed Oct 30, 2026 by teamleaderleo via cmux-tui tree preflight #80694
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