Repository navigation
cmux-next: a link opened to the right appears in its split, never in the source pane first - #23032
austinywang wants to merge 5 commits into
Conversation
…er in the source pane (red) User report 2026-10-20: a pull request link clicked in an agent chat opened as another tab of the chat's pane, then slid into a right split. Fails: the browser tab is made in the source pane and moved with move-tab-to-split. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e daemon commit
new-frontend-browser-tab takes split {direction, pane_id?, split_id?}
(frontend-browser-tab-split-v1), sharing conversation-tab-split-v1's pane.split
path: the tab is created in the new pane, one pane-added delta, the source pane
never lists it. The app shows the split with a stand-in tab in the click's
frame and sends one create; an older daemon, files and new columns keep the
make-then-move path. A web link dropped on a right or bottom edge splits
directly too.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ock rules (review) Review: the direct split skipped AppServices.splitRoom, so a narrow strip column split below its minimum and a chat dock split. A pane that does not split in place keeps the move, which opens a new column or refuses. The test awaits the create instead of polling. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
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)
Not verified: macOS jobs did not run: compile and app tests were skipped on CI passes on Written by red: cmux-next checks (god files, concurrency, crash safety, l10n); NEW: |
|
Bead |
|
Found 6 test failures on Blacksmith runners: Failures
|
|
|
|
Review (correctness-first subagent) and resolution, head 08c04fc The first pass, on 92ce549, returned FIX.
Swift, fleet (
Rust: |
…d_browser_tab; api-compat surface lists split CI: E0592 duplicate keyed_frontend_browser_tab in frontend_browser_keys.rs (the new private helper reused open_url's name), and api-compat-check found spec/api-compat.surface.json stale for new-frontend-browser-tab's split. Also drops the unnecessary crate::mux:: qualifications rustc warned about. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…en-split-direct # Conflicts: # cmux-tui/spec/commands.md
|
Head e2e936a, base Changes since the review pass, checked by the primary agent:
CI on this head:
Verdict: no red of its own; reviewed. Labeling |
|
Review (Codex gpt-6-astra xhigh): BLOCK at e2e936a. @austinywang
|
|
Removed ready-to-land: the newest review on this PR is a BLOCK (Review (Codex gpt-6-astra xhigh): BLOCK at e2e936a, 2026-10-26), and the PR is DIRTY (conflicts with feat-cmux-next). A BLOCK beats an older SHIP, so the label made this PR count as ready in the merge-wait numbers for 10 days without being mergeable. @austinywang: to land it, address the BLOCK findings, merge feat-cmux-next, and get a new independent review receipt at the new head. |
…it in the click's frame
LinkOpener's split right and split below no longer make the tab in the
source pane and move it once the store lists it (two daemon round
trips, and the opening played on the source pane first). A web link's
split shows now with a stand-in tab (PaneBrowserTabSplit) and one
new-frontend-browser-tab {pane, split} makes the tab in the daemon's
new pane (frontend-browser-tab-split-v1). A folder's terminal opens as
Cmd-D's optimistic split. An older daemon keeps make-and-move.
PaneBrowserTabSplit and the tests come from austinywang's #23032.
Co-authored-by: Austin Wang <38676809+austinywang@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-ed9226b71907d8aaa0b6
…it in the click's frame
LinkOpener's split right and split below no longer make the tab in the
source pane and move it once the store lists it (two daemon round
trips, and the opening played on the source pane first). A web link's
split shows now with a stand-in tab (PaneBrowserTabSplit) and one
new-frontend-browser-tab {pane, split} makes the tab in the daemon's
new pane (frontend-browser-tab-split-v1). A folder's terminal opens as
Cmd-D's optimistic split. An older daemon keeps make-and-move.
PaneBrowserTabSplit and the tests come from austinywang's #23032.
Co-authored-by: Austin Wang <38676809+austinywang@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-ed9226b71907d8aaa0b6
…ock rules As in austinywang's #23032 (08c04fc): a chat dock, a pane with no room or a strip column too narrow keeps the move, which refuses or opens a new column as every split does. Co-authored-by: Austin Wang <38676809+austinywang@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ed9226b71907d8aaa0b6
|
Awareness note from an agent lane that does not own this PR; it is not a review or a request to take the PR over. For awareness: this PR no longer applies on today's feat-cmux-next, so its work is carried, with your authorship, on two new PRs.
Nothing was pushed to this branch. It stays yours to close. |
…it in the click's frame
LinkOpener's split right and split below no longer make the tab in the
source pane and move it once the store lists it (two daemon round
trips, and the opening played on the source pane first). A web link's
split shows now with a stand-in tab (PaneBrowserTabSplit) and one
new-frontend-browser-tab {pane, split} makes the tab in the daemon's
new pane (frontend-browser-tab-split-v1). A folder's terminal opens as
Cmd-D's optimistic split. An older daemon keeps make-and-move.
PaneBrowserTabSplit and the tests come from austinywang's #23032.
Co-authored-by: Austin Wang <38676809+austinywang@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-ed9226b71907d8aaa0b6
…ock rules As in austinywang's #23032 (08c04fc): a chat dock, a pane with no room or a strip column too narrow keeps the move, which refuses or opens a new column as every split does. Co-authored-by: Austin Wang <38676809+austinywang@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ed9226b71907d8aaa0b6
…it in the click's frame
LinkOpener's split right and split below no longer make the tab in the
source pane and move it once the store lists it (two daemon round
trips, and the opening played on the source pane first). A web link's
split shows now with a stand-in tab (PaneBrowserTabSplit) and one
new-frontend-browser-tab {pane, split} makes the tab in the daemon's
new pane (frontend-browser-tab-split-v1). A folder's terminal opens as
Cmd-D's optimistic split. An older daemon keeps make-and-move.
PaneBrowserTabSplit and the tests come from austinywang's #23032.
Co-authored-by: Austin Wang <38676809+austinywang@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-ed9226b71907d8aaa0b6
…ock rules As in austinywang's #23032 (08c04fc): a chat dock, a pane with no room or a strip column too narrow keeps the move, which refuses or opens a new column as every split does. Co-authored-by: Austin Wang <38676809+austinywang@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ed9226b71907d8aaa0b6
…'s frame, never in the source pane first (#32900) * fix(cmux-next): a link or folder opened to the right shows in its split in the click's frame LinkOpener's split right and split below no longer make the tab in the source pane and move it once the store lists it (two daemon round trips, and the opening played on the source pane first). A web link's split shows now with a stand-in tab (PaneBrowserTabSplit) and one new-frontend-browser-tab {pane, split} makes the tab in the daemon's new pane (frontend-browser-tab-split-v1). A folder's terminal opens as Cmd-D's optimistic split. An older daemon keeps make-and-move. PaneBrowserTabSplit and the tests come from austinywang's #23032. Co-authored-by: Austin Wang <38676809+austinywang@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ed9226b71907d8aaa0b6 * bench(next): instant-new-surfaces names link_right Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ed9226b71907d8aaa0b6 * fix(cmux-next): a link's split open goes before the in-pane stand-in (review) A local foreground link took openStandIn first: the tab showed in the source pane and its split request never finished, so the source's open turns queued forever. The split branch now runs first; the test checks that the next open beside the pane still runs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ed9226b71907d8aaa0b6 * fix(cmux-next): a link's direct split keeps the split-room and chat-dock rules As in austinywang's #23032 (08c04fc): a chat dock, a pane with no room or a strip column too narrow keeps the move, which refuses or opens a new column as every split does. Co-authored-by: Austin Wang <38676809+austinywang@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ed9226b71907d8aaa0b6 * fix(cmux-next): a link's direct split ends its turn once the daemon's pane is listed; incognito keeps the move (review) router-review (gpt-6.1-sol) BLOCK at 6027476: the reply can come before the pane's events, so the next queued link aimed at the provisional pane; and an incognito pane could mount about:blank before the reply registered its URL. BrowserTabSplitCommand now waits (30 s bound) for the store to list the made tab, as LinkOpener's move does; incognito panes keep make-and-move. The bench's quick arm skips commands with no key (link_right). Regression tests: LinkOpenSplitDirectTests.theTurnWaitsForTheDaemonsPaneNotJustTheReply, anIncognitoPaneKeepsTheMove. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ed9226b71907d8aaa0b6 --------- Co-authored-by: Austin Wang <38676809+austinywang@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: cmux-bot[bot] <348531757+cmux-bot[bot]@users.noreply.github.com>
A web link opened to the right (a terminal's Cmd-click with Open Links and Files: Split right, or a chat link with
links.pagesFollowPlacementon, or a link dropped on a pane's right or bottom edge) first showed as another tab of the source pane, then slid into a new right split. Reported 2026-10-20 on nightly828d367273f, where a pull request link clicked in an agent chat did exactly that.Cause.
LinkOpenermade the browser tab hidden in the source pane (new-frontend-browser-tab), waited for the store to list it, then moved it withmove-tab-to-split. The tab was in the source pane's strip for that whole round trip.Fix. The tab is now created directly in its new split.
new-frontend-browser-tabtakessplit: {direction, pane_id?, split_id?}(frontend-browser-tab-split-v1). It reuses thepane.splitpath ofconversation-tab-split-v1(now a sharedTabSplit/split_tab_pane_with_fields_as): one commit, onepane-addeddelta, and the source pane never lists the tab.splitneedspane,afterwithsplitis a bad request, and a keyed request fingerprints the split. Keys stored withoutsplitkeep their old fingerprint byte for byte. A right split beside Home's lone pinned dock is a 0.5-wide column, as the conversation split is.spec/commands.md,spec/sdk-schema.jsonand the regenerated bindings carry the field.PaneBrowserTabSplitshows the provisional split with a stand-in browser tab in the click's frame, along with its even sizing. It then sends one create with the provisional pane's client-minted ids, and the daemon's pane replaces the stand-in bypane_id. A refusal takes the split and its sizing away. Closing the new pane before the reply closes the tab when it arrives..newColumn, left or top drops, popups the engine already made, and any panesplitRoomwould not split in place (a chat dock, no room, or a strip column too narrow, which opens a new column instead).Not changed: what a chat link does by default. Since #22822 it opens as a tab in the chat's own pane. Related open PR: #22949 (the lone-chat dock hand-off animation of an agent-opened tab), a different path (
AgentBesidePlacement).Test
LinkOpenSplitDirectTestschecks that a Cmd-click to the right makes one create withsplitand no move, that the split shows at once, and that the source pane lists only its own tab; it also covers the fallbacks.FrontendBrowserTabSplitRequestTestscovers the wire encoding, and a scripted daemon checks that an older daemon is never sentsplit.server/frontend_browser_split_tests.rscovers the capability being advertised, onepane-addeddelta, the title kept, left and up, malformed requests refused, keyed replay and conflict, and the lone pinned dock.Review
A correctness-first review subagent first returned FIX:
splitRoom, so it split narrow strip columns. Fixed in 08c04fc.ProvisionalSplitkeeps the split until the daemon's layout places the pane. Left as is.Changelog
Observed / Not run
check-sdk-schema.py,check-spec-inventory.py,bindings/codegen/generate.py --check, andprepush-gate.pywith no new violations.--filter frontend_browserand--filter conversation_tab_split.🤖 Generated with Claude Code
Need help on this PR? Tag
@codesmith-botwith what you need.Summary by cubic
Fixes a link opened to the right (a terminal's Cmd-click, a chat link with
links.pagesFollowPlacementon, or a link dropped on a pane's edge) showing as another tab of the source pane first, then sliding into its split. The tab is now created directly in the new split, so the source pane never lists it.new-frontend-browser-tabtakes asplitfield (frontend-browser-tab-split-v1), reusing the conversation tab split'spane.splitpath: one commit, onepane-addeddelta, and the source pane never lists the tab.splitRoomwill not split in place (a chat dock, no room, or a strip column too narrow) falls back to opening a new column..newColumn, left or top drops, and engine-made popups keep the old make-then-move path.Written for commit e2e936a. Summary will update on new commits.