Skip to content

cmux NEXT multi-view: a row dropped on Home's right or bottom edge shows its workspace beside Home (Debug toggle) - #24067

Merged
teamleaderleo merged 16 commits into
feat-cmux-nextfrom
multiview-default-on
Oct 26, 2026
Merged

teamleaderleo merged 16 commits into
feat-cmux-nextfrom
multiview-default-on

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 22, 2026 •

Copy link
Copy Markdown
Collaborator

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:

  • Right edge. Home's pinned dock takes no tab drop, so the layout gave no pane target and the drag fell through to .cancel.
  • Bottom edge. The screen's bottom edge dock band answered first, so the drag made a new dock of Home instead of placing the workspace beside it.
  • The fix. With the toggle on, a drag over a workspace on screen goes beside it at the nearest edge (within a quarter of its size) wherever the layout has no split edge there: a pane that takes no drop, or an edge dock band (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) takes row (a workspace's name or id, giving its sidebar row) and a drag's to_edge, so the new multi-view tour 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

SidebarMultiViewHomeTests lists 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 .newDock drop in WorkspaceMerge.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, and SidebarMultiViewWindowTests passes.

cmux-ci run --class light --script scripts/ci/package-test-lane.sh --ref <sha> --key mvhome-before-4cb0 --target-worker aws-m4pro-9 --arg=suite --arg=Packages/macOS/CmuxNext --arg=SidebarMultiViewHomeTests,SidebarMultiViewWindowTests --env CMUX_CI_XCODE_APP=/Applications/Xcode_26.6.app

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 --app passed at head 42814b4 (job be3f9a08fcc11c126853d8ac).

At head aa23d2a (2026-10-23, adopted by sidebar-rows)

  • Base brought in once: feat-cmux-next 6ceb03a, no conflicts; the PR's own diff is unchanged.
  • Compile: cmux-ci compile-check --app passed at aa23d2a (job d9c7cf1026256d9dfa7c1316).
  • Suites at aa23d2a: step 8bee30570a0101adba33ea92 on aws-m4pro-5 reported all 6 as passed, but that green was vacuous and this line previously claimed it as evidence. See "Test execution" below.

At head 242c1fb (2026-10-26, adopted by sr-rev24067-aa23d2a-2)

  • Two defects found and fixed at this head, both by review and CI rather than by the carried receipt:
    • DebugMouse+Rows.swift was #if DEBUG while the DebugMouse.swift it 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 in 6f8980778cb.
    • SidebarMultiViewHomeTests.swift:35 asked for the edge-docks capability through
      DaemonCapabilities.shared.edgeDocks. Base's DaemonCapabilities is a namespace of four static
      wire-name forwards with a private init and has neither member, so CmuxNextAppTests failed to
      compile and took down cmux-next swift test and cmux-next generated files. The base merge was
      conflict-free, so git hid it. Fixed in e56998e81f4 with DaemonCapability.edgeDocks.rawValue,
      the spelling the production code uses; same wire value edge-docks-v1.
  • Compile: cmux-next app compile (build fleet) passed at 242c1fb.
  • Review: Codex gpt-6-astra xhigh, SHIP 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.
  • Base reds only, each checked: nightly-guards / workflow-guard-tests / release-notary and
    nightly-guards / Guard status fail the same way on base;
    release-compile-derived-data.test.sh is red because base 9482d09c430 added
    -DCMUX_BLOCKING_CHECKS to the bench defines without updating that test's expected string, and the
    four files it exercises are byte-identical to base here; the 3-file GENERATED.md drift in
    cmux-next generated files reproduces 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 mini
cmux7s-Mac-mini.local (step 0f41e7abb4ef2a93a9ac86b5, dispatched with --target-worker). Both of
this PR's key cases executed, the bottom dock-band case included:

◇ Suite SidebarMultiViewHomeTests started.
✔ Test aRowDroppedOnHomesRightEdgeShowsItsWorkspaceBesideHome() passed after 0.749 seconds.
✔ Test aRowDroppedOnHomesBottomEdgeStacksItUnderHome(points:) with 2 test cases passed after 1.110 seconds.
✔ Suite SidebarMultiViewHomeTests passed after 1.860 seconds.

SidebarMultiViewWindowTests ran its 13 tests on that host too, withTheToggleOffAnEdgeDropStillMerges()
and turningTheToggleOffShowsTheFocusedWorkspaceAlone() among them, so the toggle-off invariance is
covered 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 focused
run at e56998e81f4 on aws-m4pro-6 (step 1eabb2b7a25cdb985eb6ce99) the step log shows

➜ Suite SidebarMultiViewHomeTests skipped: "the drag tests need a display"
➜ Test aRowDroppedOnHomesRightEdgeShowsItsWorkspaceBesideHome() skipped: "the drag tests need a display"

while the summary printed SidebarMultiViewHomeTests passed 10s. CMUX_TEST_REQUIRE_GUI=1 did not
change it and a --label gui dispatch is refused. So the earlier "all 6 passed" line at
aa23d2a8f277, on aws-m4pro-5, is not evidence that those drag tests ran. Target a GUI mini.

The in-CI cmux-next swift test job never produced a verdict on this PR: on e56998e81f4 it wedged
(1293 tests stuck past the 300 s detector, swift test exited 143 on SIGTERM, 4 of its 10 named reds
identical on unrelated PR #25115), and on 242c1fb465b it is refused at Set up runner by the
glaeda disk floor (12.0 GiB free, 40 GiB required on cmuxs-mac-mini-6, which is at 99% full;
cmux14 sat at 10.8 GiB against a 30 GiB floor across several attempts). That is a fleet disk
problem, 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)

  • Base brought in once: feat-cmux-next b4bd1fe, no conflicts; the PR's own diff is unchanged (the nine files below, same per-file patch IDs as at aa23d2a).
  • Reds at aa23d2a were all base debt that base has since fixed or still carries: the SwiftUI allowlist and canary coverage (fixed by cmux NEXT checks: No new SwiftUI and canary coverage pass again (re-point moved entries, lint keeps moved files, Sleepy shims) #25021), test_cmux_next_perf_gate_unlit.py and 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-notary and nightly-guards / Guard status, fail the same way on base b4bd1fe (run 40240146434, same failing steps), and release-compile-derived-data.test.sh is red on base too: base 9482d09 added -DCMUX_BLOCKING_CHECKS to the bench defines without updating that test's expected string, and this PR does not touch any of those three files.
  • Fix found by review at this head: DebugMouse+Rows.swift was #if DEBUG while the DebugMouse.swift it 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 #if to match its siblings.
  • Review: Codex gpt-6-astra xhigh, SHIP at 6f89807 (receipt). FIX FIRST at 5ff6e19 for the bench compile above, re-reviewed after the fix.

Risk

risk:normal. The whole behaviour sits behind Debug Settings sidebar.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:98 returns no beside edge, WorkspaceDragResolver.swift:58 makes no beside fallback, and TabDragSession+WorkspaceMerge.swift:45 returns the original dock proposal. That makes this the contained kind of sidebar change that lands through the normal path (Leo, 2026-10-23), so the hold label 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:

  • The fleet runs above.
  • prepush-gate.py reports no new violations.
  • GODFILES_WARN_SLACK=20 check-no-godfiles.sh adds nothing from this branch. It exits 1 on base debt only (for example WindowController.swift at 500 lines, unchanged here).
  • An independent review subagent read the full head three times. Its findings (the dock-band case missed the band, then the fixture had no edge docks) were fixed test-first.

Not run:

  • The suites on display-less hosts, where they are skipped.
  • A Home edge drop in the app by hand. The capture drives the right edge through the app's event queue; the bottom edge is covered by the tests only.

Known gaps (behind the Debug toggle):

  • A fallback beside target (Home's edge, a dock band) moves the drag's ghost to the half it will take, but draws no split preview in the layout.
  • With multi-view on, a workspace row dropped in a screen's edge dock band goes beside instead of making a new dock.

Capture

Before: base 4ae5de440131, with the toggle off (its default). Two workspaces were made; one is on screen.

Capture steps-f9e3e2cca4 at 4ae5de440131 (fleet build, capture mini, text checked for private data)

Light Dark
light dark

After: this head, tour:multi-view (scripts/cmux-next/media/tours/multi-view.json). It turns Debug Settings sidebar.multiView on, shows Home alone, then holds api's sidebar row and drags it onto Home's right edge (debug.mouse through 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-view at 42814b41b3f8 (fleet build, capture mini, text checked for private data)

Light Dark
light dark

video
Full quality: cap-42814b41-tour-multi-view.mp4

Agent session: cosmic-gray

🤖 Generated with Claude Code

teamleaderleo and others added 6 commits October 21, 2026 16:57
…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
@teamleaderleo teamleaderleo added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 22, 2026
@teamleaderleo

teamleaderleo commented Oct 22, 2026 •

Copy link
Copy Markdown
Collaborator Author

Owned by sr-rev24067-aa23d2a-2 on huge-blue · session

@github-actions

github-actions Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

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

Review 242c1fb: 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=pr24067 -f ref=multiview-default-on -f platform=macos -f backend_mode=local

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 242c1fb465 (run): no media. The tour job failed before the tour ran (build or setup); the run log has the output. Both apps run cmux-tui from 6c0a319 (tree b574b2aef425): the merge base's own tree 259d24932425 was not published yet.

@blacksmith-sh

blacksmith-sh Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

Found 9 test failures on Blacksmith runners:

Failures

Test View Logs
/tmp/tmp12gxeuch/summary-fail.json (live):/summary-fail.json (live): View Logs
/tmp/tmpoa6rat6q/summary-missing.json (live):/summary-missing.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
bench OTHER_SWIFT_FLAGS is 'OTHER_SWIFT_FLAGS=$(inherited) -DCMUX_BENCH_HOOKS -DCMUX_BL
OCKING_CHECKS'/
bench OTHER_SWIFT_FLAGS is 'OTHER_SWIFT_FLAGS=$(inherited) -DCMUX_BENCH_HOOKS -DCMUX_BL
OCKING_CHECKS'
View Logs
bench OTHER_SWIFT_FLAGS is 'OTHER_SWIFT_FLAGS=$(inherited) -DCMUX_BENCH_HOOKS -DCMUX_BL
OCKING_CHECKS'/
bench OTHER_SWIFT_FLAGS is 'OTHER_SWIFT_FLAGS=$(inherited) -DCMUX_BENCH_HOOKS -DCMUX_BL
OCKING_CHECKS'
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.

…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
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

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

…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
@cursor

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

… 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
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Orphaned: no activity for 15 h, and no lane holds a lease on it. Adopted by the orphan sweep: merged feat-cmux-next in at 1d5c343. A later pass queues it for the merge hub if it is reviewed, small and red only on base reds.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next crash-class rules / cmux-next crash-class rules is red on 12 of 12 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 teamleaderleo added the hold cmux-next batch queue: keep this PR out of the batch (docs/ci/cmux-next-batch.md) label Oct 23, 2026
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

rust workspaces / plan (changed Cargo workspaces) is red on 20 of 20 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

rust workspaces / plan (changed Cargo workspaces) is red on 18 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

Copy link
Copy Markdown
Collaborator Author

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

Checked the exact clean head, resolver precedence, edge geometry, .newDock cleanup, toggle-off behavior, drag exclusions, DEBUG-only mouse coordinate conversion, and affected tests. No correctness or compile regressions found.

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 sr-rev24067-aa23d2a, read-only, given the PR diff and body. Head aa23d2a brings in base 6ceb03a with no conflicts; the PR's own diff is unchanged.

At this head: cmux-ci compile-check --app passed (job d9c7cf1026256d9dfa7c1316). All 6 suites passed (SidebarMultiViewHomeTests, SidebarMultiViewWindowTests, SidebarMultiViewPressTests, SidebarMultiViewDropTests, DragGlassTests, WindowCloseNeighborTests), step 8bee30570a0101adba33ea92 on aws-m4pro-5.

This PR keeps the hold label: it stays open for dogfooding under the sidebar hold.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next guards / nightly-guards / workflow-guard-tests / release-notary is red on 17 of 21 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.

…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
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (Codex gpt-6-astra xhigh): SHIP at 6f89807

No findings. DebugMouse+Rows.swift:1 now uses #if DEBUG || CMUX_BENCH_HOOKS, exactly matching DebugMouse.swift:1 and DebugMouse+Page.swift:1.

All dependencies are available with CMUX_BENCH_HOOKS defined and DEBUG absent:

Symbol Source and conditional availability
InputJournal, topLeftPoint InputJournal.swift:13, InputJournal+AppKit.swift:66; neither file contains an #if.
InputJournalEntry InputJournalEntry.swift:12; no #if.
SidebarWorkspaceID, underlying ID and initializer BridgeAliases.swift:29, SidebarIDs.swift:5; no #if in either file.
JSONValue, stringValue, doubleValue CmuxNextSettings/JSONValue.swift:5,20,30; no #if.
controller.services, state, sidebar, content WindowController.swift:20,21,28,36; all unguarded. Its separate `DEBUG
sidebar.container.sidebarView.rowFrameOnScreen SidebarBridge.swift:18, SidebarContainerView.swift:23, SidebarListView+HoverCard.swift:113; no #if in these files.
services.windows.registry.members(of:) AppServices.swift:143, WindowManager.swift:28, WindowRegistryStore.swift:28; all unguarded. AppServices has an unrelated bench/debug block; WindowManager has an unrelated DEBUG-only block; WindowRegistryStore has none.
services.workspace(id:), workspace name AppServices.swift:641, MachineRegistry.swift:138, WorkspaceModel.swift:12; unconditional. The latter two files contain no #if.
controller.content?.contentView WorkspaceContentController.swift:23; unguarded, outside its unrelated DEBUG-only blocks. WorkspaceContentView.swift:11 has no #if.

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 (nightly-swift-defines.sh:8). BenchHooksMarker.swift:10 emits the marker only under CMUX_BENCH_HOOKS. check-no-bench-hooks.sh:18 rejects that marker; release and nightly invoke it at .github/workflows/release.yml:430 and .github/workflows/nightly.yml:2425.

Byte comparison against 5ff6e19f664 confirms the commit changes only the first #if line.

Toggle-off path

Reconfirmed unchanged. With sidebar.multiView=false, WindowController+MultiView.swift:98 returns no beside edge, WorkspaceDragResolver.swift:58 produces no beside fallback, and TabDragSession+WorkspaceMerge.swift:45 preserves the original dock proposal. The repair touches none of these paths.

Source assertions and git diff --check passed. Native compilation and runtime tests were not run.


Prior verdict at 5ff6e19f664 was FIX FIRST on this one finding (the bench-configuration compile);
6f8980778cb fixes it and this is the re-review of that head. The delta review at 5ff6e19f664
also confirmed the base merge is semantically empty: all nine per-file patch IDs match
6ceb03a41537..aa23d2a8f277, and the base refactor (ba5e6df99f9, 53 files moved out of
CmuxNextApp) moved no API the resolver, merge or window code uses.

Reviewer: codex exec --sandbox read-only gpt-6-astra at xhigh (a different model from the lane).

@teamleaderleo teamleaderleo removed the hold cmux-next batch queue: keep this PR out of the batch (docs/ci/cmux-next-batch.md) label Oct 25, 2026
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next fast gates / post cmux-next/fast-gates is red on 17 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.

…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
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

high-signal review link / link is red on 22 of 28 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 gpt-6-astra xhigh): SHIP at e56998e

Symbol resolution

All repository-owned identifiers in the 101 added Home-test lines, changed Window-test lines, and production additions resolve against the current base.

Added use Definition
DaemonCapability.edgeDocks.rawValue Packages/macOS/CmuxNext/Sources/CmuxNextDaemon/Connection/DaemonEndpoint.swift:35,202; rawValue is synthesized by the String enum.
Previous invalid DaemonCapabilities.shared.edgeDocks DaemonCapabilities.swift:14-25 has only four static forwards and a private initializer at line 16; no shared or edgeDocks.
capabilities: [String] Fixture parameter SidebarMultiViewWindowTests.swift:20,26; DaemonIdentity.capabilities is defined at Requests/Session/Identify.swift:3,9,48-54.
DaemonTree, PaneSnapshot DaemonTree.swift:16,35; PaneSnapshot.swift:3,17-26.
TabDropEdge, TabDropKind.newDock TabDragPayload.swift:14-15,20-29.
WorkspaceDropTarget.beside WorkspaceDragResolver.swift:7,20 on the current base.
WorkspaceDragResolver.outcome, pane and besideEdge parameter WorkspaceDragResolver.swift:50-75; caller at TabDragSession+Workspaces.swift:73-76.
SidebarTunables.multiView SidebarTunables.swift:190-193; default is explicitly false.
WindowController.besideEdge, besideEdgeBand, besideHighlight WindowController+MultiView.swift:88-111.
WorkspaceViewSet.half WorkspaceViewSet.swift:80-87.
f.dragRow, f.geometry, f.visible, f.windowFrame, f.frame, withMultiView SidebarMultiViewWindowTests.swift:85-107,159-181,195-203.
dragSession.drag?.workspaceOutcome TabDragSession+State.swift:45-72.
dragSession.finish(commit:), finishLanding() TabDragSession+Ghost.swift:70,139-143.
f.state.id WindowState.swift:19-22.
InputJournal.topLeftPoint InputJournal+AppKit.swift:64-71.
rowFrameOnScreen, SidebarWorkspaceID SidebarListView+HoverCard.swift:111-117; BridgeAliases.swift:28-30.
Home fixture snapshots and IDs WorkspaceSnapshot.swift:3,47-63; ScreenSnapshot.swift:45,69-85; ColumnSnapshot.swift:10,21; TabSnapshot.swift:3,55-77; DockSnapshot.swift:5-25; ConversationTabRef.swift:8,32; LayoutNode.swift:11-18; handle aliases in Handles.swift:43-57.
HomeDock.page, .conversation, personal fixtures HomeDock.swift:28-30; TabValues.swift:3-15; PersonalState.swift:8,22-31; PersonalWorkspace.swift:23,34-43; SpaceSwitchBench.screen at Tests/CmuxNextAppTests/SpaceSwitchBench.swift:88-95.
f.services.dragSession, workspace(id:), content panes/workspace AppServices.swift:144,641-643; WorkspaceContentController.swift:15-32; WorkspaceModel.swift:5-12.
acceptsEdgeDockDrops LayoutModel.swift:38-40.
JSONValue.doubleValue and stringValue JSONValue.swift:5,20-32.
LayoutTabDropTarget.dropExited TabDropTargets.swift:115,203-206.

The original 6ceb03a41537...aa23d2a8f27 diff and current origin/feat-cmux-next...e56998e81f4 diff both contain the same nine files and 210 insertions/16 deletions. Changed production/tour hunks are identical except the repaired #if DEBUG → #if DEBUG || CMUX_BENCH_HOOKS; the Home test differs only by the repaired capability spelling. The Window test is otherwise identical. No merge drift was found.

git diff --check and tour JSON parsing passed. The local verifier could not run its Swift syntax check because this host has no swiftc and no usable temporary directory.

Toggle-off path

  • SidebarTunables.swift:190-193: default: false.
  • TabDragSession+WorkspaceMerge.swift:45-48: if SidebarTunables.multiView.value, case .newDock = proposal.kind { ... }; with the toggle off, the new-dock proposal is returned exactly as before.
  • TabDragSession+Workspaces.swift:74-76: placesBeside: SidebarTunables.multiView.value; off passes false, and besideEdge is nil.
  • WorkspaceDragResolver.swift:58-59: let beside = placesBeside ? ... : nil; the existing sidebarHit ?? layoutHit.map { pane(..., placesBeside: false) } ?? .window path remains unchanged.
  • WindowController+MultiView.swift:22: guard SidebarTunables.multiView.value else { return leaveMultiView() }.
  • WindowController+MultiView.swift:98-99: guard SidebarTunables.multiView.value, ... else { return nil }; the new edge detector exits before inspecting content when off.

No .beside target, highlight, placement, or multi-view arrangement is produced with the default-off setting. The debug mouse additions are gated by #if DEBUG || CMUX_BENCH_HOOKS at DebugMouse+Rows.swift:1.

Findings

None.


Review history on this PR, stated plainly: the receipt at 6f8980778cb said SHIP and was wrong.
The Swift compile on that head failed with type 'DaemonCapabilities' has no member 'shared' in this
branch's own SidebarMultiViewHomeTests.swift:35, taking down cmux-next swift test and
cmux-next generated files. The base merge was conflict-free, so git hid it and the static review
had checked the production diff without resolving the test fixture's API against base.
e56998e81f4 fixes it with DaemonCapability.edgeDocks.rawValue, the spelling the production code
uses, and this review resolves every added identifier in the test files as well as the production
files. Not merging until a Swift compile passes on this exact head.

Reviewer: codex exec --sandbox read-only gpt-6-astra at xhigh (a different model from the lane).

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (Codex gpt-6-astra xhigh, delta on an automation base merge): SHIP at 242c1fb

Symbol resolution

Resolved against the target commit’s git tree. The PR patch is byte-for-byte identical to the patch at e56998e81f4: 9 files, 210 insertions, 16 deletions. None of those nine files was touched by the merge.

Source paths below are relative to Packages/macOS/CmuxNext/Sources/.

Referenced symbols Definitions at reviewed head
DaemonCapability.edgeDocks.rawValue CmuxNextDaemon/Connection/DaemonEndpoint.swift:35 declares the enum with String raw values; :202 defines edgeDocks = "edge-docks-v1". The test therefore constructs [String].
DaemonIdentity capability decoding CmuxNextDaemon/Requests/Session/Identify.swift:9 declares capabilities: [String]; :110 decodes [String].
SidebarTunables.multiView.value CmuxNextSidebar/Logic/SidebarTunables.swift:190; default remains false at :193. value resolves to CmuxNextDesignTokens/Tunables/Tunable.swift:26.
TabDropEdge, .newSplit, .newDock, proposal kind CmuxNextDesignTokens/TabDragPayload.swift:14, :24, :27; CmuxNextDesignTokens/TabDropTargetProviding.swift:5. Re-export remains CmuxNextDesign/DesignTokensExport.swift:4.
WorkspaceDropTarget.beside, resolver signature CmuxNextApp/Drag/WorkspaceDragResolver.swift:20, :50. The added besideEdge parameter remains optional and defaults to nil at :52.
WorkspaceMerge.hit, layout hit testing and cleanup CmuxNextApp/Drag/TabDragSession+WorkspaceMerge.swift:40; CmuxNextApp/Drag/TabDropTargets.swift:142 (workspaceHitTest) and :203 (dropExited).
Window content and edge lookup CmuxNextApp/Windows/WindowController+MultiView.swift:97 (besideEdge), :111 (besideEdgeBand), :141 (content(atScreen:)).
Window controller member chain CmuxNextApp/Windows/WindowController.swift:20 (state), :21 (sidebar), :28 (content), :36 (services); window state identifiers at Windows/WindowState.swift:22 and :25.
Workspace content, panes and identity CmuxNextApp/WorkspaceContentController.swift:16 (workspace), :19 (layoutModel), :21 (layoutView), :23 (contentView), :32 (panes); PaneController.swift:25 (view); CmuxNextDaemon/Store/WorkspaceModel.swift:7 (id) and :12 (name).
Debug row lookup CmuxNextApp/AppServices.swift:143 (windows), :644 (workspace(id:)); Windows/WindowManager.swift:28 (registry); Windows/WindowRegistryStore.swift:28 (members(of:)); SidebarBridge.swift:18 (container); CmuxNextSidebar/Views/SidebarContainerView.swift:23 (sidebarView); Views/SidebarListView+HoverCard.swift:113 (rowFrameOnScreen).
Sidebar ID conversion CmuxNextBridge/BridgeAliases.swift:29 aliases SidebarWorkspaceID; its initializer is CmuxNextSidebar/Model/SidebarIDs.swift:7.
Debug parameter and coordinate helpers CmuxNextSettings/JSONValue.swift:5, :20 (stringValue), :30 (doubleValue); CmuxNextApp/InputVerification/InputJournal+AppKit.swift:66 (topLeftPoint); DebugMouse+Rows.swift:12 (rowPoint) and :22 (dragTarget).

The test fixture was independently re-resolved as well:

  • Tests/CmuxNextAppTests/SidebarMultiViewWindowTests.swift:26 declares tree: DaemonTree? = nil and capabilities: [String] = []. Both Home-test calls match. Handshake and snapshot application resolve to CmuxNextDaemon/Store/DaemonStore.swift:364 and :267.
  • Snapshot constructors remain compatible: CmuxNextDaemon/Tree/TabSnapshot.swift:55, ConversationTabRef.swift:32, DockSnapshot.swift:25, ScreenSnapshot.swift:21 (ColumnSnapshot) and :69 (ScreenSnapshot), PaneSnapshot.swift:17, and DaemonTree.swift:35.
  • .conversation is Tree/TabValues.swift:14; .left, .docked, .agentChat are Tree/DockSnapshot.swift:7, :11, :13; .leaf is Tree/LayoutNode.swift:12. Numeric IDs retain integer-literal support at Wire/Handles.swift:10 and :15. HomeDock.page remains CmuxNextHomeEngine/HomeDock.swift:30.
  • Mutated snapshot members resolve to Tree/DaemonTree.swift:23 (workspaces), WorkspaceSnapshot.swift:16 (screens) and :30 (kind), and TabSnapshot.swift:42 (conversation).
  • Fixture helpers remain defined in SidebarMultiViewWindowTests.swift: tree:57, close:77, frame:85, onScreen:93, shown:97, visible:99, windowFrame:107, edgePoint:143, dragRow:159, geometry:181, tabs:190, and withMultiView:195.
  • Drag state and completion resolve to CmuxNextApp/Drag/TabDragSession.swift:26, TabDragSession+State.swift:71, and TabDragSession+Ghost.swift:70 / :139. Edge-dock acceptance remains CmuxNextLayout/Model/LayoutModel.swift:40, populated by WorkspaceContentController.swift:250 / :266.

The merged WorkspaceSpawn.swift:128 now calls shown.confirm(giveUp), matching the changed closure type at AgentTabs+OptimisticWorkspace.swift:20. None of this PR’s added lines calls that API. New fullscreen tests reuse Fixture with omitted defaulted arguments at PageFullscreenWholeScreenTests.swift:51, :75, :93, and :112; those calls remain compatible.

Toggle-off path

The human sidebar drag/drop path retains base behavior with sidebar.multiView OFF:

Production file Guard or controlling expression
Drag/TabDragSession+WorkspaceMerge.swift:45 if SidebarTunables.multiView.value, case .newDock = proposal.kind — false leaves the original proposal returned at :49.
Drag/TabDragSession+Workspaces.swift:74 placesBeside: SidebarTunables.multiView.value — passes false; the new edge lookup at :76 returns nil through the following guard.
Windows/WindowController+MultiView.swift:98 guard SidebarTunables.multiView.value, ... else { return nil } — prevents the new edge lookup. Arrangement also exits through guard SidebarTunables.multiView.value else { return leaveMultiView() } at :22.
Drag/WorkspaceDragResolver.swift:58 let beside = placesBeside ? besideEdge.map(WorkspaceDropTarget.beside) : nil — disables the fallback. At :73, guard placesBeside, case let .newSplit(_, edge) = kind else { return .merge(kind) } preserves merging.

Both debug production files, InputVerification/DebugMouse.swift:1 and DebugMouse+Rows.swift:1, use #if DEBUG || CMUX_BENCH_HOOKS. Their addressing helpers are available independently of the toggle; generated input still reaches the guarded drag resolver.

Findings

No 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 around: None. The capability-set addition retains edge docks.

Scope correction: the actual merge delta is 238 files, 12,569 insertions and 1,928 deletions, rather than the stated 23 files / 478 insertions.

git diff --check passed. This verdict covers source-level delta review and independent test-symbol inspection; no Swift compilation, test execution or GUI capture was performed.


Chain of custody on this PR's receipts, stated plainly:

  • aa23d2a8f277 — SHIP (previous owner).
  • 5ff6e19f664 — FIX FIRST: DebugMouse+Rows.swift was #if DEBUG while the DebugMouse.swift
    it extends is #if DEBUG || CMUX_BENCH_HOOKS, so the bench configuration did not compile. Fixed
    in 6f8980778cb.
  • 6f8980778cb — SHIP, and that SHIP was wrong. The Swift compile on that head failed:
    type 'DaemonCapabilities' has no member 'shared' in this branch's own
    SidebarMultiViewHomeTests.swift:35. A conflict-free base merge had invalidated the test
    fixture's API and the review had resolved only the production diff. Fixed in e56998e81f4
    with DaemonCapability.edgeDocks.rawValue (the spelling production uses; same wire value
    edge-docks-v1).
  • e56998e81f4 — SHIP, after a full per-symbol resolution pass over the test files too.
  • 242c1fb465b — this 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 the merge.

Evidence at this head: cmux-next app compile (build fleet) passed. Remaining reds are base, each
checked: nightly-guards / workflow-guard-tests / release-notary and nightly-guards / Guard status
fail the same way on base; release-compile-derived-data.test.sh is red because base 9482d09c430
added -DCMUX_BLOCKING_CHECKS to the bench defines without updating that test's expected string,
and the four files it exercises are byte-identical to base here; the 3-file GENERATED.md drift in
cmux-next generated files reproduces identically on unrelated PR #25115.

One caveat recorded rather than glossed: a focused fleet run of the four multi-view suites at
e56998e81f4 reported "All 4 suites passed", but on display-less aws-m4pro-5/-6 every drag test
was skipped ("the drag tests need a display"), so that green is vacuous — only 5 tests in 1
suite actually ran, and CMUX_TEST_REQUIRE_GUI=1 did not change it. The GUI route is the
cmux-next swift test CI job; its earlier run on e56998e81f4 wedged (1293 tests stuck past the
300 s detector, swift test exited 143 on SIGTERM) with 4 of its 10 named reds identical on
unrelated PR #25115, and on this head it was cancelled. It has been re-dispatched on this exact SHA.

Reviewer: codex exec --sandbox read-only gpt-6-astra at xhigh (a different model from the lane).

@teamleaderleo
teamleaderleo merged commit 9fa257a into feat-cmux-next Oct 26, 2026
161 of 176 checks passed
@teamleaderleo
teamleaderleo deleted the multiview-default-on branch October 26, 2026 02:44
@github-actions

github-actions Bot commented Oct 26, 2026 •

Copy link
Copy Markdown
Contributor

This branch had an error being deployed

1 failed (outdated) and 2 inactive (1 outdated) deployments
ci-routing-agent — 242c1fb4 Deployed Oct 26, 2026 by teamleaderleo via namespace autofix #2848
sentry-dsyms — 933ceb5b Deployed Oct 25, 2026 by teamleaderleo via upload cmux-tui dSYMs to Sentry #52938
artifacts — 933ceb5b Deployed Oct 25, 2026 by teamleaderleo via publish to R2 #52938
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