Repository navigation
fix(cmux-next): Cmd-T keeps the pane's content until the agent page paints; new terminal tabs titled with their folder - #17527
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… first frame
After Cmd-D the tab read "Terminal" for one frame, then the shell's
title ("~"). An untitled terminal now shows its abbreviated cwd, which
the shell's first title usually is.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… a recording Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Cmd-T showed an empty pane for ~230 ms (warm) before the agent page's first frame. These cover the page's first-frame report and the pane keeping the outgoing content until it (or a 500 ms limit). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Cmd-T emptied the pane (~230 ms warm, ~700 ms cold) before the agent page drew: the page is transparent until its first frame. The page now reports that frame (pane.painted, two animation frames after mount), and a pane switching to an agent page that has not painted keeps the outgoing content, with the new page above it at alpha 0, until it does or 500 ms pass. Both swap in one transaction. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ker-check times frames at 60 Hz Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
screencapture over SSH has no Screen Recording grant on the capture minis; one Cua Driver MCP session records while the steps run. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… a newline Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…le recording Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…shake
v3 capture: after Cmd-T the kept content gave way to the new page's
pre-handshake frame ("Connecting", no hero), and the hero blinked in
83 ms later. The page now reports pane.painted on the first frame after
the handshake, so the pane keeps the outgoing content until the page
shows what it is.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configuration
You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
…content; tests use a real terminal tab Review of #17527: an outgoing page that hid itself when withdrawn has nothing to keep, and a browser whose header band the strip leaves would jump while kept. The untitled-terminal test now decodes a pty tab, and the hold's deadline test leaves a second of slack. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Pre-merge review (subagent, correctness first): ship with nits, nothing blocking. Every hold ends: a page that paints, the 500 ms deadline, another switch, a detach, a moved tab or teardown. Late waiters and deadlines are tied to their own hold and a released pane. Parked spares and LaunchReveal are unaffected. Fixed in 53144ff:
Left as is:
cmux-b2 (unregistered) |
…ext-flicker-sweep # Conflicts: # Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/pane.js
|
Not verified: macOS jobs did not run: compile and app tests were skipped on CI passes on Written by |
…ext-flicker-sweep # Conflicts: # Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/pane.js
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ext-flicker-sweep
|
Batch queue: green. Stack Own check still red: Next: land it yourself with gh-merge-green on this receipt. |
…n their own file Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… at row size (#17558) * test(cmux-next): sidebar items, headers and tab rows draw registry icons at row size (red) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(cmux-next): sidebar items, headers and tab rows draw registry icons at row size Home, App Store and the other top items, section and group chevrons, the group pin and listed tabs drew stock SF Symbols a size or two below the text beside them. They now draw from the cmux icon registry: one semantic name per built-in, first-party app and reference kind, at the row size workspace rows use, pixel-aligned. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ext-flicker-sweep
…rface Scale The uiScale key was in the Settings catalog but not in the page's generated strings, so the strings freshness and locale tests failed on feat-cmux-next. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* test(cmux-next): batch dispatch runs every dispatch-gated job (red) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * ci(cmux-next): run every tier when dispatched on a next-batch branch Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(ci): cmux-next batch queue selection, stacking and bisect (red) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * ci(cmux-next): implicit batch queue for feat-cmux-next Debounced PR events dispatch one batch: stack eligible PRs on feat-cmux-next, rebuild conflicted generated files, run every cmux-next tier and a fleet production build on the stack, then land each PR with gh-merge-green or bisect a red stack to its culprit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(ci): address batch workflows by id, not file name feat-cmux-next is not the default branch, so the Actions API cannot find a workflow file that exists only there by its name. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(ci): batch keeps one base and never blames a PR for a fleet failure Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(ci): batch skips workflow changes and stays off until enabled GitHub refuses the job token's push or merge of a .github/workflows change, so those PRs land by hand. Debounce dispatches only when CMUX_NEXT_BATCH_ENABLED is 1. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(ci): create batch branches at the base before pushing the stack Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(ci): batch pushes and merges with an App token; terse bot comments Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(ci): batch queue App token, off switch and workflow PRs Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(ci): batch queue serve loop, remote regeneration and local fleet build (red) python3 -m unittest tests.test_next_batch: 14 failures, all in the new ServeDebounce, RemoteRegeneration, LocalController and regen workflow tests. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * feat(ci): serve the batch queue under a gh login; regenerate on runners next_batch.py serve polls open PRs, debounces like the debounce job and runs one batch at a time with the operator's gh login, so it runs without the batch App. Its pushes and merges start CI, so nothing is re-dispatched after landing; the fleet build uses the host's cmux-ci. Generators run the stack's code, so they no longer run on the controller: regen-linux (web, SDK) and regen (Swift) check out the stack with a read-only token and return a patch that the controller applies and pushes. python3 -m unittest tests.test_next_batch: 41 pass (14 failed on 552c900). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(ci): Swift regeneration runs the workflow ref's generator (red) next-batch/20261006: the regen job ran the stack's own copy of regenerate-swift-exports.sh, which the stack does not have yet (exit 127). python3 -m unittest tests.test_next_batch: 1 failure. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(ci): run the Swift export generator from the workflow's ref The stack checkout keeps the stack's code; only the generator script comes from the trusted ref. python3 -m unittest tests.test_next_batch: OK. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(ci): retry a mini job that was refused before writing a result (red) next-batch/20261006: the Swift regen job was refused at runner setup (a fleet build was waiting for the host) and the batch gave up. python3 -m unittest tests.test_next_batch: 3 errors. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(ci): dispatch a mini job once more when it wrote no result python3 -m unittest tests.test_next_batch: OK. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(ci): a production fleet build passes no backend mode (red) cmux-ci build --production --backend-mode local: "production builds cannot use offline backend mode". python3 -m unittest tests.test_next_batch: 1 failure. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(ci): submit the production fleet build without a backend mode python3 -m unittest tests.test_next_batch: OK. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(ci): the queue formats a PR's webviews before landing it (red) next-batch/20261006: #17527 and #17537 were validated green but web / react-apps-check failed on formatting and blocked landing. python3 -m unittest tests.test_next_batch: 5 failing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(ci): format a PR's webviews on a runner before landing it A PR changing webviews/ whose only red is web formatting stays eligible. Before landing it, regen-linux runs bun run check:fix (formatter and lint autofix) on its head and the queue pushes the patch to the PR's branch; gh-merge-green waits for the rerun. python3 -m unittest tests.test_next_batch: 50 OK. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(ci): serve posts a receipt for owners instead of merging (red) Landing from the queue host is not allowed yet; owners land on the receipt. A receipt names the heavy jobs that ran, since cmux-next.yml skips them on next-batch/* until this PR is on feat-cmux-next. python3 -m unittest tests.test_next_batch: 4 failing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(ci): serve posts a receipt and owners land, unless --land python3 -m unittest tests.test_next_batch: 54 OK. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(ci): page the open-PR query and retry a gateway timeout (red) next_batch.py select: gh api graphql failed: gh: HTTP 504 (100 PRs with files and checks in one query). python3 -m unittest tests.test_next_batch: 2 failing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(ci): page the open-PR query 30 at a time and retry a 5xx once python3 -m unittest tests.test_next_batch: OK; next_batch.py select: OK. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(ci): a local run posts receipts unless --land (red) python3 -m unittest tests.test_next_batch: 1 failing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(ci): a local run posts receipts unless --land python3 -m unittest tests.test_next_batch: OK. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(ci): an owner push during formatting waits for the next batch (red) Batch local-20261006-153816: #17534's owner pushed while its formatting ran; the report showed a raw git push error. python3 -m unittest tests.test_next_batch: 1 error. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(ci): an owner push during formatting leaves the PR for the next batch python3 -m unittest tests.test_next_batch: OK. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(ci): a PR with a green receipt at its head is not validated again Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(ci): the queue never pushes to a branch it does not own (red) An opted-in PR by another author got the formatting push too. python3 -m unittest tests.test_next_batch: 1 failure. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(ci): push formatting only to batch authors' branches python3 -m unittest tests.test_next_batch: OK. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(ci): serve reports a batch author's PR closed by someone else (red) Detect and alert only: number, actor and time to the coordinator; one alert for 3 or more within 10 minutes. python3 -m unittest tests.test_next_batch: 4 errors. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * feat(ci): serve reports a batch author's PR closed by someone else The minute poll runs on its own thread, so it keeps going while a batch runs; a PR leaving the open set costs one lookup. Detect and alert only. python3 -m unittest tests.test_next_batch: 63 OK. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(ci): retry a truncated GraphQL reply once (red) serve log 20:34 and 20:37 UTC: gh api graphql failed: unexpected end of JSON input. python3 -m unittest tests.test_next_batch: 1 failure. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(ci): retry a truncated GraphQL reply once python3 -m unittest tests.test_next_batch: OK. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Problem
Two pieces of known chrome changed after they first appeared (#17485, rows 4 and 5):
PaneContentView.showremoved the outgoing view as soon as the new one was installed.Before, Cmd-T from a terminal pane (fleet build of 4328967, the right pane only, 30 fps capture):
Fix
pane.paintedonce per document, on the second animation frame after its first post-handshake render. That is the first frame that shows what the page is, with the new chat's hero.PaneContentViewkeeps the outgoing view on screen. The new page sits above it at alpha 0 and keeps rendering.The hold reports after the handshake, not after mount, because of an intermediate capture (tag v3). Reporting after mount swapped in the pre-handshake frame: "Connecting" with no hero. The hero then appeared 83 ms later.
After, Cmd-T from a terminal pane (fleet build of the head, tag next-flicker-v4). The terminal stays until the agent page replaces it in one frame:
Tooling
scripts/cmux-next/flicker-check.pytakes a recording of one scripted interaction and finds two patterns. It exits 1 when it finds any.scripts/cmux-next/flicker-capture.pyrecords scripted scenarios on a capture Mac and runs the check on each. A scenario is real pointer moves, clicks and hotkeys, recorded by Cua Driver's ScreenCaptureKit recorder.screencaptureover SSH has no Screen Recording grant on the capture minis.Verification
PanePaintHoldTests(CmuxNextAppTests): the outgoing view stays until paint, painted content swaps at once, another switch ends the hold, and the 500 ms limit.AgentPanePaintTests(CmuxNextAgentPaneTests):pane.paintedparses and is a registered op, waiters run once, and painting doesn't count as a user touch.UntitledTerminalTabTitleTests(CmuxNextBridgeTests).bun test src/agent-session/acpmux: 982 pass.tsc --noEmitis clean, andbuild-agent-pane-web.sh --checksays the bundle is current.--backend-mode local): 1ff7c80e (baseline) and a32f99ed (head before the handshake change).flicker-capture-v3; v3 80da76e0, v4 56f8124f).Found, not fixed here
EXC_BREAKPOINTinAgentPaneNextTurnPacerdeinit duringAgentPaneView.installTransport. It hit v2 and v4, including with fix(cmux-next): keep next-turn pacer alive during tab replacement #17515 merged.Changelog
Fixed: Cmd-T no longer shows an empty pane before the agent chat page appears, and a new terminal tab is titled with its folder from the first frame.
cmux-b2 (unregistered)
🤖 Generated with Claude Code
Need help on this PR? Tag
@codesmith-botwith what you need. Autofix is disabled.