Repository navigation
cmux NEXT multi-view: a row dropped on Home's right or bottom edge shows its workspace beside Home (Debug toggle) - #24067
Conversation
…rkspace beside Home, multi-view (red) Leo-ask sr2-01a1608f-66bb. The #23651 dogfood found Home (Chief) edge drops broken with sidebar.multiView on: the right edge over Home's pinned dock did nothing, and the bottom edge cut Home off. SidebarMultiViewHomeTests shows Home as the daemon lists it (its page tab in a pinned chat dock, alone) and drags a row to its right edge and to its bottom edge (the pane's split zone and the screen's bottom dock band): each must place the workspace beside Home, keep its tabs, and leave Home laid out in its half. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15ba7-3152-78b2-bfdf-bb6eb0d5a053&host=cosmic-gray
… bottom edge shows its workspace beside Home Leo-ask sr2-01a1608f-66bb. Home's pinned dock takes no tab drop, so a row over its right edge found no pane target and did nothing; over the bottom edge the screen's edge dock band answered first and made a new dock of Home instead of a place beside it. With sidebar.multiView on, a drag over the shown workspace now goes beside it at the nearest edge (within a quarter of its size) wherever the layout has no split edge: a pane that takes no drop, or an edge dock band (`WindowController.besideEdge`, `WorkspaceDragResolver.outcome`). Center and column drops still merge. sidebar.multiView is on by default (Debug Settings keeps the toggle to turn it off). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15ba7-3152-78b2-bfdf-bb6eb0d5a053&host=cosmic-gray
…by name onto an edge of the shown workspace The multi-view tour makes two workspaces and drags one's sidebar row onto the other's right edge through the app's own event path, so a capture shows the two side by side with both rows lit. debug.mouse takes `row` (a workspace's name or id: its sidebar row's center) and a drag's `to_edge` (10% in from that edge of the shown workspace), so the tour works on any capture window size. DEBUG only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15ba7-3152-78b2-bfdf-bb6eb0d5a053&host=cosmic-gray
…our turns it on Coordinator, for ask-c7aeeb3219: Leo asked where the feature is, not for a default change. The Home edge fixes stay; the tour sets Debug Settings sidebar.multiView on before it drags. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15ba7-3152-78b2-bfdf-bb6eb0d5a053&host=cosmic-gray
… the pointer After #23924 a drop targets the workspace under the pointer, a workspace shown beside the focused one too: `besideEdge` reads that workspace (`content(atScreen:)`), so a row dropped on the far edge of a workspace beside goes next to that one, as `placeBeside` already places it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15ba7-3152-78b2-bfdf-bb6eb0d5a053&host=cosmic-gray
|
Owned by sr-rev24067-aa23d2a-2 on huge-blue · session |
|
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)
red: cmux-next checks (god files, concurrency, crash safety, l10n); no finished base run on ad6fa43 to compare; do not merge until green; see lane-rules Tour of |
|
Found 9 test failures on Blacksmith runners: Failures
|
…ere the layout offers a new dock (red without the dock-band fix) Review: 4% in missed the 24 pt bottom dock band, so the dock-band half of the fix had no red. The case now drops 8 pt from the bottom, where the layout proposes a new bottom dock of Home. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15ba7-3152-78b2-bfdf-bb6eb0d5a053&host=cosmic-gray
|
Bead |
…n $ prompts; debug.mouse names `row` in its error The first capture showed the capture mini's user and host in a shell prompt and was refused by the privacy check. Both workspaces now set a plain `$` prompt before the drag, and the tour drops api on Home's right edge (the fixed path) with Home shown alone first. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15ba7-3152-78b2-bfdf-bb6eb0d5a053&host=cosmic-gray
Bugbot needs on-demand usage enabledBugbot 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. |
… 8 pt bottom drop meets the dock band Review: the fixture daemon advertised no capabilities, so the layout had no edge dock bands and the dock-band case took the same path as the split-zone one. The fixture takes capabilities; the Home suite passes edge-docks-v1 and requires the layout's edge dock drops before the bottom-edge drag. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15ba7-3152-78b2-bfdf-bb6eb0d5a053&host=cosmic-gray
|
Orphaned: no activity for 15 h, and no lane holds a lease on it. Adopted by the orphan sweep: merged |
|
|
|
|
|
|
|
Review (codex xhigh, correctness first): SHIP at aa23d2a Checked the exact clean head, resolver precedence, edge geometry, The Home tests exercise right-edge, pane-bottom, and dock-band-bottom paths and would fail without the fix. No builds/tests were run per the read-only constraints. Reviewer: Codex at xhigh via acpmux session At this head: This PR keeps the |
|
|
…tion `DebugMouse+Rows.swift` was guarded by `#if DEBUG` alone, but `DebugMouse.swift` compiles under `#if DEBUG || CMUX_BENCH_HOOKS` and its call sites at lines 62, 131 and 146 reach `dragTarget` and `rowPoint`. In the bench configuration (`reload.sh --config bench` and `check-release-compile.sh --bench-hooks`: Release with -DCMUX_BENCH_HOOKS -DCMUX_BLOCKING_CHECKS and no DEBUG) those symbols were compiled out, so the app did not build. Use the same conditional as the file it extends and as its sibling `DebugMouse+Page.swift`. Every symbol it reaches is available there: `InputJournal` and `InputJournalEntry` carry no `#if`, and `SidebarListView.rowFrameOnScreen` is unguarded `public` in CmuxNextSidebar (`DebugMouse+Page.swift` already calls `InputJournal.topLeftPoint` under this guard). No behaviour change in DEBUG, and nothing new ships in a release app: `check-no-bench-hooks.sh` keeps bench-hooks builds out of the release and nightly pipelines. Found by the independent Codex review of #24067 at 5ff6e19. Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a17527-de24-7863-be96-1b1a8a3a97e1&host=huge-blue
|
Review (Codex gpt-6-astra xhigh): SHIP at 6f89807 No findings. All dependencies are available with
The remaining geometry, collection and optional operations are standard AppKit/Foundation/Swift APIs. Nothing new ships in Release/nightly: neither defines DEBUG or CMUX_BENCH_HOOKS; nightly adds only CMUX_BLOCKING_CHECKS ( Byte comparison against Toggle-off pathReconfirmed unchanged. With Source assertions and Prior verdict at Reviewer: |
|
|
…lity the way base does The test fixture asked for the daemon's `edge-docks-v1` capability through `DaemonCapabilities.shared.edgeDocks`. Base has neither member: `DaemonCapabilities` is a namespace of four static wire-name forwards (sidebarDoc, sidebarLayout, workspacePin, notificationAck) with a private init, and `edgeDocks` is not one of them. So `CmuxNextAppTests` failed to compile with "type 'DaemonCapabilities' has no member 'shared'", which took down both `cmux-next swift test` and `cmux-next generated files`. Use `DaemonCapability.edgeDocks.rawValue`, the same spelling the production code uses (TabMoves.swift:175, ColumnDocking.swift:58, DockColumnHandlers.swift:59, WorkspaceContentController.swift:250). `capabilities` is `[String]`, so the value is unchanged: the wire name "edge-docks-v1". This is the one thing the clean base merge hid: git merged without conflict, and the static reviews read the production diff rather than resolving the test fixture's API against base. Found by the Swift compile at 6f89807. Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a17527-de24-7863-be96-1b1a8a3a97e1&host=huge-blue
|
|
|
Review (Codex gpt-6-astra xhigh): SHIP at e56998e Symbol resolutionAll repository-owned identifiers in the 101 added Home-test lines, changed Window-test lines, and production additions resolve against the current base.
The original
Toggle-off path
No FindingsNone. Review history on this PR, stated plainly: the receipt at Reviewer: |
|
Review (Codex gpt-6-astra xhigh, delta on an automation base merge): SHIP at 242c1fb Symbol resolutionResolved against the target commit’s git tree. The PR patch is byte-for-byte identical to the patch at Source paths below are relative to
The test fixture was independently re-resolved as well:
The merged Toggle-off pathThe human sidebar drag/drop path retains base behavior with
Both debug production files, FindingsNo merge-introduced correctness finding. The resolver, WorkspaceMerge, multi-view implementation, tunables and capability definitions are unchanged. Fullscreen revalidation is guarded by an existing presentation; daemon split changes preserve the ordinary path with Scope correction: the actual merge delta is 238 files, 12,569 insertions and 1,928 deletions, rather than the stated 23 files / 478 insertions.
Chain of custody on this PR's receipts, stated plainly:
Evidence at this head: One caveat recorded rather than glossed: a focused fleet run of the four multi-view suites at Reviewer: |
|
Shipped in:
|
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
Summary
Multi-view (#23437, #23651, #23924) lives at Debug Settings > Sidebar >
sidebar.multiView("Navigate on release (multi-view prototype)"). It is still off by default; this PR doesn't change that. With it on, hold a sidebar row and drag it onto an edge of the workspace on screen. That workspace then shows beside the current one, and every workspace on screen is lit in the sidebar.Home (Chief) edge drops didn't work in that view. The #23651 dogfood found that a row dropped on Home's right edge did nothing, and one dropped on its bottom edge cut Home off. Both now place the dragged workspace beside Home:
.cancel.WindowController.besideEdge,WorkspaceDragResolver.outcome). Center and column drops still merge, and with the toggle off nothing changes.For captures,
debug.mouse(DEBUG and bench builds only, never a shipped app) takesrow(a workspace's name or id, giving its sidebar row) and a drag'sto_edge, so the newmulti-viewtour drives the real hold-then-drag on any window size.Leo-ask: sr2-01a1608f-66bb
Leo-ask: ask-c7aeeb3219
Leo-ask: ask-f86b228564
Changelog
none
Testing
SidebarMultiViewHomeTestslists Home the way the daemon does (its page tab alone in a pinned left chat dock). It drags a row to Home's right edge and to its bottom edge, in the pane's split zone (15% in) and in the bottom dock band (4% in). Each drop must resolve to.beside(edge), show the workspace beside Home with its tabs unmoved and both rows lit, and leave Home's panes inside its half.The dock-band case drops 8 pt from Home's bottom edge with the daemon's
edge-docks-v1, where the layout offers a new bottom dock of Home. A scratch commit (scratch/mvhome-dockband-red, e005a41) is this head without the.newDockdrop inWorkspaceMerge.hit, to show that case catches it. That run is queued (steps 843f489cdac3 and c6c8f8023d8d).Red at 4cb0186 (test only, on base 35f14d9), step 86c8c8da2d272d5edd011f0d on aws-m4pro-9: all three cases fail. The hover is
.cancel, so nothing is placed, andSidebarMultiViewWindowTestspasses.Green at d7d0749 (the fix, before the test-only follow-ups), step 263722e5a80e28c7090411fc on aws-m4pro-9: all 6 suites pass (
SidebarMultiViewHomeTests,SidebarMultiViewWindowTests,SidebarMultiViewPressTests,SidebarMultiViewDropTests,DragGlassTests,WindowCloseNeighborTests). Green at head 42814b4 is queued (steps 5177550a4ada and 32366a52a320).Compile:
cmux-ci compile-check --apppassed at head 42814b4 (job be3f9a08fcc11c126853d8ac).At head aa23d2a (2026-10-23, adopted by sidebar-rows)
cmux-ci compile-check --apppassed at aa23d2a (job d9c7cf1026256d9dfa7c1316).At head 242c1fb (2026-10-26, adopted by sr-rev24067-aa23d2a-2)
DebugMouse+Rows.swiftwas#if DEBUGwhile theDebugMouse.swiftit extends is#if DEBUG || CMUX_BENCH_HOOKS, so the bench configuration (reload.sh --config bench,check-release-compile.sh --bench-hooks: Release, no DEBUG) did not compile. Fixed in6f8980778cb.SidebarMultiViewHomeTests.swift:35asked for the edge-docks capability throughDaemonCapabilities.shared.edgeDocks. Base'sDaemonCapabilitiesis a namespace of four staticwire-name forwards with a private init and has neither member, so
CmuxNextAppTestsfailed tocompile and took down
cmux-next swift testandcmux-next generated files. The base merge wasconflict-free, so git hid it. Fixed in
e56998e81f4withDaemonCapability.edgeDocks.rawValue,the spelling the production code uses; same wire value
edge-docks-v1.cmux-next app compile (build fleet)passed at 242c1fb.(receipt), a delta review
of the lander's automation base merge; the PR's own patch is byte-identical and none of its 9 files
was touched by that merge.
nightly-guards / workflow-guard-tests / release-notaryandnightly-guards / Guard statusfail the same way on base;release-compile-derived-data.test.shis red because base9482d09c430added-DCMUX_BLOCKING_CHECKSto the bench defines without updating that test's expected string, and thefour files it exercises are byte-identical to base here; the 3-file
GENERATED.mddrift incmux-next generated filesreproduces identically on unrelated PR cmux-next: place and stabilize Session Info chip #25115.Test execution: executed on a GUI mini at this head
The multi-view drag tests have now really run at
242c1fb465b, on the GUI capture minicmux7s-Mac-mini.local(step0f41e7abb4ef2a93a9ac86b5, dispatched with--target-worker). Both ofthis PR's key cases executed, the bottom dock-band case included:
SidebarMultiViewWindowTestsran its 13 tests on that host too,withTheToggleOffAnEdgeDropStillMerges()and
turningTheToggleOffShowsTheFocusedWorkspaceAlone()among them, so the toggle-off invariance iscovered by an executed test and not only by review.
A caveat worth keeping, because it made two earlier green reports meaningless: on a display-less
fleet host these suites skip and the lane's summary table still prints them as
passed. In a focusedrun at
e56998e81f4on aws-m4pro-6 (step1eabb2b7a25cdb985eb6ce99) the step log showswhile the summary printed
SidebarMultiViewHomeTests passed 10s.CMUX_TEST_REQUIRE_GUI=1did notchange it and a
--label guidispatch is refused. So the earlier "all 6 passed" line ataa23d2a8f277, on aws-m4pro-5, is not evidence that those drag tests ran. Target a GUI mini.The in-CI
cmux-next swift testjob never produced a verdict on this PR: one56998e81f4it wedged(1293 tests stuck past the 300 s detector,
swift testexited 143 on SIGTERM, 4 of its 10 named redsidentical on unrelated PR #25115), and on
242c1fb465bit is refused atSet up runnerby theglaeda disk floor (
12.0 GiB free, 40 GiB requiredoncmuxs-mac-mini-6, which is at 99% full;cmux14sat at 10.8 GiB against a 30 GiB floor across several attempts). That is a fleet diskproblem, not a failure of this PR, and it is why the suites were run directly on a GUI mini instead.
At head 6f89807 (2026-10-25, adopted by sr-rev24067-aa23d2a-2)
test_cmux_next_perf_gate_unlit.pyand the checks-job-structure test (ci(cmux-next): run the Mac Release fallback when the fast gate dies before a verdict #24822 and 4a793f4), and the Ghostty notices pins. All four pass at this head. The two reds left,nightly-guards / workflow-guard-tests / release-notaryandnightly-guards / Guard status, fail the same way on base b4bd1fe (run 40240146434, same failing steps), andrelease-compile-derived-data.test.shis red on base too: base 9482d09 added-DCMUX_BLOCKING_CHECKSto the bench defines without updating that test's expected string, and this PR does not touch any of those three files.DebugMouse+Rows.swiftwas#if DEBUGwhile theDebugMouse.swiftit extends is#if DEBUG || CMUX_BENCH_HOOKS, so the bench configuration (reload.sh --config bench,check-release-compile.sh --bench-hooks: Release, no DEBUG) did not build. 6f89807 widens that one#ifto match its siblings.Risk
risk:normal. The whole behaviour sits behind Debug Settingssidebar.multiView, off by default, so with the toggle off nothing changes for anyone. The review traced each of the three production edits and confirmed the toggle-off path is identical to base:WindowController+MultiView.swift:98returns no beside edge,WorkspaceDragResolver.swift:58makes no beside fallback, andTabDragSession+WorkspaceMerge.swift:45returns the original dock proposal. That makes this the contained kind of sidebar change that lands through the normal path (Leo, 2026-10-23), so theholdlabel is removed. With the toggle on, the known gaps are in "Observed / Not run" below: a fallback beside target draws no split preview, and a row dropped in a screen edge dock band goes beside instead of making a new dock.Observed / Not run
Observed:
prepush-gate.pyreports no new violations.GODFILES_WARN_SLACK=20 check-no-godfiles.shadds nothing from this branch. It exits 1 on base debt only (for exampleWindowController.swiftat 500 lines, unchanged here).Not run:
Known gaps (behind the Debug toggle):
Capture
Before: base
4ae5de440131, with the toggle off (its default). Two workspaces were made; one is on screen.Capture
steps-f9e3e2cca4at4ae5de440131(fleet build, capture mini, text checked for private data)After: this head,
tour:multi-view(scripts/cmux-next/media/tours/multi-view.json). It turns Debug Settingssidebar.multiViewon, shows Home alone, then holds api's sidebar row and drags it onto Home's right edge (debug.mousethrough the app's event queue). api's terminal now shows beside Home, Home keeps the focus, and api's row is lit as on screen.Capture
tour-multi-viewat42814b41b3f8(fleet build, capture mini, text checked for private data)Full quality: cap-42814b41-tour-multi-view.mp4
Agent session: cosmic-gray
🤖 Generated with Claude Code