Skip to content

cmux-next: the Priority view jumps to the chat's own workspace instead of taking over this one - #23926

Merged
teamleaderleo merged 8 commits into
feat-cmux-nextfrom
cmux/priority-jump-workspace
Oct 22, 2026
Merged

teamleaderleo merged 8 commits into
feat-cmux-nextfrom
cmux/priority-jump-workspace

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 22, 2026 •

Copy link
Copy Markdown
Collaborator

The sidebar's Priority view sent every pick through DeepLink(.session(id)), which opens the chat
in the active window's focused pane. AgentActivityLane.workspaceID — the workspace acpmux
bound that session to (_meta.acpmux.workspaceId) — was assigned in AgentActivityLane.of(summary:)
and read nowhere in the app. So picking a lane that belongs to another workspace took over the
workspace the person was looking at, and nothing recorded the jump, so Back did not bring them back.

A pick now goes where the chat lives:

  1. the tab already showing it, revealed wherever it is;
  2. else the workspace the session is bound to: that workspace is shown first
    (windows.reveal(workspaceID:), the palette's own switcher path), then the chat opens in a pane
    there — waiting for that workspace's first pane to mount, and giving up if the window closes or
    moves on;
  3. else the focused pane, exactly as before (no binding, or a workspace this app no longer has).

locationTrail.noteJump() now runs for every pick, so the next settled location is its own trail
step even within one workspace and Back leaves the chat again — the softlock.

The choice itself is a value, AgentChatJump (with a nested PaneWait), so it is covered without
the app's services.

Leo-ask: ask-6d920c42d9

I FUCKING HATE THIS NEEDS YOUR INPUT BUTTON FRIST OFF IT'D FUCKIGN SOFTLOCK ME BC IT DOESNT JUMP
TO ANOTHER WORKSPACE IT OVERRIDES THSI WORKSPACE PLUS THE UI/UX IS JUST BAD ALL AROUND IDK

This PR is the first two complaints, which have one cause. The third ("the UI/UX is just bad all
around") is not specific enough to guess a redesign from; it is back with Leo for specifics rather
than reinterpreted here.

Proof

Red before green, each failing test committed before its fix:

Commit
529a0cca593f AgentChatJumpTests with today's behaviour extracted verbatim — aChatBoundToAnotherWorkspaceOpensInThatWorkspace fails
1461ef7f8d6b the binding is used — that test passes
f5ea284acc64 aWorkspaceWithNoPaneYetWaitsForOne fails (the jump gave up with "no pane")
d33da039de6c, a41661eba13c, 05fed352d857 the pane wait, and its end when the window closes or moves on

The red commits extract the shipped behaviour rather than stubbing it, so each failure is the real
bug.

The focused command could not be executed on the fleet. scripts/ci/package-test-lane.sh suite Packages/macOS/CmuxNext AgentChatJumpTests calls ensure_web_bundles unconditionally for that
package, and the web bundles do not build on base: gen-strings.mjs fails on 48 missing
translations for base's own settings.sidebar.style keys. Both runs (at 529a0cca593f and at the
head) stopped there with error: the cmux-next web bundles did not build, on aws-m4pro-8, before
reaching a single test. That blocks every lane's CmuxNext Swift suite right now, not just this one;
it is written up with evidence in a comment below and wants its own PR.

What did execute on this head: cmux-next app compile (build fleet) passes, and cmux-next fast tier passes — that lane runs swift build --build-tests, so the new test file and the new
source both compile. package-conventions-lint passes here while it is red at base tip.

Changelog

Fixed: Picking a chat in the sidebar's Priority view switches to that chat's own workspace instead
of taking over the one on screen, and Back returns to where you were.

Observed / Not run

Observed, on this head: cmux-next app compile (build fleet) green; cmux-next fast tier green;
scripts/cmux-next/prepush-gate.py — no new violations;
./scripts/lint-ios-package-conventions.sh — the one ERROR it prints
(CmuxNextPages/AppsPageNativeOps.swift:3) reproduces identically in a clean worktree at base tip
123a1ec9d794d, and that file is byte-identical to base here.

Not run: no Swift compile or test locally — this is a Linux host and agents do not build the Mac app
on a person's Mac. The AgentChatJumpTests suite has not been executed anywhere, for the base
reason above; the review of these three files rests on reading and hand-tracing plus the two green
compile lanes. All five CI reds on this head are base findings, each reproduced at base tip or red
on base tip's own run (see the comment below).

No capture: this changes which workspace a jump lands in, not how anything is drawn — there is no
visual difference to capture, and the AgentChatJumpTests cases state the behaviour.

🤖 Generated with Claude Code

Agent session: big-red

teamleaderleo and others added 2 commits October 21, 2026 17:29
…(failing)

The sidebar's Priority view sends every pick through
`DeepLink(.session(id))`, which opens the chat in the active window's focused
pane. `AgentActivityLane.workspaceID` — the workspace acpmux bound the session
to — is read nowhere in the app, so picking a lane that belongs elsewhere
replaces what the person is looking at.

This makes the choice a value, `AgentChatJump`, with today's behaviour, and
adds the test for the case it gets wrong. `aChatBoundToAnotherWorkspaceOpensInThatWorkspace`
fails here; the next commit makes it pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15cad-cadc-7a92-8dc0-fb5d2028dd67&host=big-red
A pick now goes where the chat lives: the tab already showing it, else the
workspace acpmux bound the session to (`AgentActivityLane.workspaceID`, read
nowhere until now), else the focused pane as before. Showing that workspace
first means the jump no longer drops the chat into the pane the person is
looking at, and `locationTrail.noteJump()` makes the next settled location its
own step, so Back leaves the chat again.

Leo 2026-10-21: it "would softlock me bc it doesnt jump to another workspace it
overrides this workspace".

`AgentChatJumpTests.aChatBoundToAnotherWorkspaceOpensInThatWorkspace` passes here.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15cad-cadc-7a92-8dc0-fb5d2028dd67&host=big-red
@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 deeplink-message on cosmic-gray · 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 cc5e0e1: 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=pr23926 -f ref=cmux/priority-jump-workspace -f platform=macos -f backend_mode=local

red: cmux-next checks (god files, concurrency, crash safety, l10n); no finished base run on 04b4a4c to compare; do not merge until green; see lane-rules
red: cmux-next page strings generate; base red: the same failure on the base 04b4a4c; does not block

Tour of cc5e0e11a7 (run)

The path-selected recorder failed for core-after, core-before; see the run artifact and failed manifests.

Path-selected interactions

Interaction Changed paths
core Packages/macOS/CmuxNext/Sources/CmuxNextApp/AgentActivity/AgentActivityPageService.swift
Packages/macOS/CmuxNext/Sources/CmuxNextApp/AgentActivity/AgentChatJump.swift
Packages/macOS/CmuxNext/Tests/CmuxNextAppTests/AgentChatJumpTests.swift

Core UI (before): FAILED — 16 ok, 3 failed, 1 unavailable

tour

Video (mp4)

# Step Result Command
1 Launch ok
2 New workspace ok cmux workspace new --name Tour
3 Type in the terminal ok cmux workspace name:Tour screen current pane current tab current terminal current write --text "echo hello from the cmux-next tour\r"
4 A command reports progress: tab loading spinner ok cmux workspace name:Tour screen current pane current tab current terminal current write --text "clear; printf '\\033]9;4;3\\007'; sleep 900\r"
5 Split right failed: exited 1 cmux action run splitRight
6 Split down failed: exited 1 cmux action run splitDown
7 New terminal tab failed: exited 1 cmux action run newSurface
8 Browser tab ok cmux tab new-browser --url https://example.com
9 Hide the sidebar ok cmux action run toggleSidebar
10 Show the sidebar ok cmux action run toggleSidebar
11 Notification ok cmux notify --title Tour --body "Hello from CI"
12 Notifications panel ok cmux action run showNotifications
13 Agent chat ok cmux agent new-chat
14 Agent workspace ok cmux workspace new --name Agent
15 Agent starts ok cmux workspace name:Agent screen current pane current tab current terminal current write --text "clear; printf '\\033]7501;state=working\\033\\\\'; sleep 8; printf '\\033]7501;state=done\\033\\\\'; sleep 900\r"
16 An agent works: row working spinner ok cmux workspace new --name Notes
17 The agent finishes: done mark in the spinner's place ok
18 Session tree: keycaps on the first rows ok cmux settings set sidebar.sessionTree true
19 Session tree back off for later tours ok cmux settings set sidebar.sessionTree false
20 Profile menu unavailable: exited 1 (the menu shot needs a screen capture route) cmux action run sidebar.profileMenu

Failed steps:

5. Split right
Split right

6. Split down
Split down

7. New terminal tab
New terminal tab

Screenshots (12)

1. Launch
Launch

2. New workspace
New workspace

3. Type in the terminal
Type in the terminal

4. A command reports progress: tab loading spinner
A command reports progress: tab loading spinner

8. Browser tab
Browser tab

9. Hide the sidebar
Hide the sidebar

11. Notification
Notification

12. Notifications panel
Notifications panel

13. Agent chat
Agent chat

16. An agent works: row working spinner
An agent works: row working spinner

17. The agent finishes: done mark in the spinner's place
The agent finishes: done mark in the spinner's place

18. Session tree: keycaps on the first rows
Session tree: keycaps on the first rows

### Core UI \(after\): FAILED — 16 ok, 3 failed, 1 unavailable

tour

Video (mp4)

# Step Result Command
1 Launch ok
2 New workspace ok cmux workspace new --name Tour
3 Type in the terminal ok cmux workspace name:Tour screen current pane current tab current terminal current write --text "echo hello from the cmux-next tour\r"
4 A command reports progress: tab loading spinner ok cmux workspace name:Tour screen current pane current tab current terminal current write --text "clear; printf '\\033]9;4;3\\007'; sleep 900\r"
5 Split right failed: exited 1 cmux action run splitRight
6 Split down failed: exited 1 cmux action run splitDown
7 New terminal tab failed: exited 1 cmux action run newSurface
8 Browser tab ok cmux tab new-browser --url https://example.com
9 Hide the sidebar ok cmux action run toggleSidebar
10 Show the sidebar ok cmux action run toggleSidebar
11 Notification ok cmux notify --title Tour --body "Hello from CI"
12 Notifications panel ok cmux action run showNotifications
13 Agent chat ok cmux agent new-chat
14 Agent workspace ok cmux workspace new --name Agent
15 Agent starts ok cmux workspace name:Agent screen current pane current tab current terminal current write --text "clear; printf '\\033]7501;state=working\\033\\\\'; sleep 8; printf '\\033]7501;state=done\\033\\\\'; sleep 900\r"
16 An agent works: row working spinner ok cmux workspace new --name Notes
17 The agent finishes: done mark in the spinner's place ok
18 Session tree: keycaps on the first rows ok cmux settings set sidebar.sessionTree true
19 Session tree back off for later tours ok cmux settings set sidebar.sessionTree false
20 Profile menu unavailable: exited 1 (the menu shot needs a screen capture route) cmux action run sidebar.profileMenu

Failed steps:

5. Split right
Split right

6. Split down
Split down

7. New terminal tab
New terminal tab

Screenshots (12)

1. Launch
Launch

2. New workspace
New workspace

3. Type in the terminal
Type in the terminal

4. A command reports progress: tab loading spinner
A command reports progress: tab loading spinner

8. Browser tab
Browser tab

9. Hide the sidebar
Hide the sidebar

11. Notification
Notification

12. Notifications panel
Notifications panel

13. Agent chat
Agent chat

16. An agent works: row working spinner
An agent works: row working spinner

17. The agent finishes: done mark in the spinner's place
The agent finishes: done mark in the spinner's place

18. Session tree: keycaps on the first rows
Session tree: keycaps on the first rows

Tours are data in scripts/cmux-next/media/tours: add a step or a tour file to show your feature.

@blacksmith-sh

blacksmith-sh Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

Found 11 test failures on Blacksmith runners:

Failures

Test View Logs
/tmp/tmpmn18ywpa/summary-fail.json (live):/summary-fail.json (live): View Logs
/tmp/tmprl0f1hbd/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
convention violations found (ERROR lines above)./
convention violations found (ERROR lines above).
View Logs
test_base_passes (main.NoticesPairTests.test_base_passes)/
test_base_passes (main.NoticesPairTests.test_base_passes)
View Logs
test_every_submodule_free_checkout_on_an_owned_runner_resets_submodules (main.Reuse
dWorkspaceSubmodules.test_every_submodule_free_checkout_on_an_owned_runner_resets_submo
dules)/
test_every_submodule_free_checkout_on_an_owned_runner_resets_submodules (main.Reuse
dWorkspaceSubmodules.test_every_submodule_free_checkout_on_an_owned_runner_resets_submo
dules)
View Logs
test_every_submodule_free_checkout_on_an_owned_runner_resets_submodules (main.Reuse
dWorkspaceSubmodules.test_every_submodule_free_checkout_on_an_owned_runner_resets_submo
dules) (job='web-bundles')/
test_every_submodule_free_checkout_on_an_owned_runner_resets_submodules (main.Reuse
dWorkspaceSubmodules.test_every_submodule_free_checkout_on_an_owned_runner_resets_submo
dules) (job='web-bundles')
View Logs

...and 1 more test failures. View all on Blacksmith

Fix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

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

teamleaderleo and others added 2 commits October 21, 2026 20:47
… pane (failing)

The window can show the chat's workspace before that workspace's panes mount;
the jump then refused with "no pane" and the chat never opened (Codex review
of #23926). AgentChatJump.PaneWait makes the next step a value; this stub keeps
today's behaviour, so aWorkspaceWithNoPaneYetWaitsForOne and
theWaitEndsWhenTheWindowLeavesTheWorkspace fail here.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16162-34d8-7600-bebd-e4685dbb2aa6&host=cosmic-gray
…e's first pane mounts

When the window showed the chat's workspace before that workspace's panes
mounted, the jump refused with "no pane" and the chat never opened (Codex
review of #23926). It now waits on PaneMounts (the Cmd-I pattern) and opens the
chat in the first pane. The wait stops when a pane mounts, when the window
closes or shows another workspace, or when the next pick cancels it; a
workspace that mounts after a newer pick opens nothing.

AgentChatJumpTests.aWorkspaceWithNoPaneYetWaitsForOne and
theWaitEndsWhenTheWindowLeavesTheWorkspace pass here.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16162-34d8-7600-bebd-e4685dbb2aa6&host=cosmic-gray
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next crash-class rules / cmux-next crash-class rules is red on 13 of 13 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.

… closes or shows another workspace

The wait read only PaneMounts, which neither closing the window nor switching
to an already-mounted workspace changes, so it could outlive both and open the
old chat later (Codex re-review of #23926). It now also reads the window's
registry entry and its selected workspace, both observable.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16162-34d8-7600-bebd-e4685dbb2aa6&host=cosmic-gray
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

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

A closed window stays in the registry with isOpen false, so the wait read it
as still open and could open the abandoned chat when the window came back
(Codex review of #23926 at a41661e).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16162-34d8-7600-bebd-e4685dbb2aa6&host=cosmic-gray
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6.1-sol): SHIP at 05fed35

Independent Codex review at xhigh (acpmux on cmux16), read-only. Three rounds: it blocked on a lost open when no pane had mounted yet (fixed in d33da03), a wait that outlived a window close or a switch to an already-mounted workspace (fixed in a41661e), and a closed window still counting as open (fixed in 05fed35). Final: "No blocking findings. AgentActivityPageService.swift:92 now checks isOpen, so closing a retained window produces .stop and ends the wait." No build or tests by the reviewer. Fleet cmux-ci compile-check --app at 05fed35 passed (job 695edae627d535e2831bc4a7).

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next guards / cmux-next page strings generate is red on 10 of 10 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

cmux-next / cmux-next web bundles (source-keyed cache) is red on 6 of 10 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

cmux-next / cmux-next checks (god files, concurrency, crash safety, l10n) › Checks job structure is red on 13 of 13 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

cmux-next / cmux-next checks (god files, concurrency, crash safety, l10n) › No fleet host names in gallery fixtures is red on 12 of 13 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

cmux-next / cmux-next checks (god files, concurrency, crash safety, l10n) › No new SwiftUI (macOS UI is AppKit) is red on 11 of 11 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

Head cc5e0e11a71e5: all five reds are the base's, from three causes

This PR's diff against 123a1ec9d794d is three files, all under
Packages/macOS/CmuxNext/.../AgentActivity/ plus its test. None of the files named below is in it.

1. 48 missing locale strings for base's settings.sidebar.style — two reds

cmux-next page strings generate and cmux-next web bundles (source-keyed cache) both fail on the
same thing: settings.sidebar.style, settings.sidebar.style.help, settings.choice.sidebarRail
and settings.choice.sidebarStandard are missing in 12 locales (bs, da, it, km, nb, …), 48 strings.

Those keys live in base's CmuxNextSettings/SidebarSectionsSetting.swift,
CmuxNextSettings/Localizable.xcstrings and schemas/settings/settings-schema.json. This PR
changes no .xcstrings, settings or schema file and adds no user-facing string (it reuses
MiscHandlerStrings.noPane).

Reproduced at the base tip, not just asserted: in a clean worktree at 123a1ec9d794d,
CMUX_STRINGS_BEST_EFFORT="" node webviews/scripts/pages/gen-strings.mjs — the exact command the
guard job runs — prints the identical 48 missing strings. cmux-next web bundles is the same
generator, called as bun scripts/pages/gen-strings.mjs --best-effort, and it is red on base tip's
own run too.

2. AppsPageNativeOps and the namespace lint — cmux-next checks

ERROR namespace-type Packages/macOS/CmuxNext/Sources/CmuxNextPages/AppsPageNativeOps.swift:3
  struct AppsPageNativeOps (all-static public surface, not instantiable)

That file is byte-identical to base here. ./scripts/lint-ios-package-conventions.sh prints the
same single ERROR in a clean worktree at 123a1ec9d794d. #24330 converted the two caseless enums
the lint rejected into structs; the lint also rejects an all-static struct, so this one surfaced.

3. Ghostty license notices — nightly-guards / Guard status

workflow-guard-tests / release-notary fails NoticesPairTests.test_base_passes plus three
CheckBundleNoticesTest errors, over cmux-tui/build-support/notices/ghostty/pinned-licenses/MANIFEST.json
(a changed manifest digest, pkg/simdutf/vendor/simdutf.cpp unreviewed, z2d 0.11→0.12) and a
missing THIRD_PARTY_LICENSES.md in the tests' temp checkout. Guard status is the aggregator and
reports workflow-guard-tests: failure, so it follows that root check. This PR touches no notices,
submodule or workflow file.

nightly-guards / Guard status and cmux-next web bundles are red on base tip 123a1ec9d794d's own
check runs
, together with cmux app scheme compile (Debug), ios-tests and
package-conventions-lint — two of which are not even red on this PR.

Green on this head

cmux-next app compile (build fleet) and cmux-next fast tier (which runs
swift build --build-tests, so the new test file compiles) both pass, and package-conventions-lint
passes here while it is red at base tip.

These base findings are linked, not fixed here: each wants its own PR.

🤖 Generated with Claude Code

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (Explore): SHIP at cc5e0e1

An independent subagent reviewed this exact head, reading the real definitions rather than
trusting the diff. No blocking findings. Highlights of what it verified:

  • The ID spaces match, which is the whole fix. Mux::new_workspace_key emits a lowercase
    8-4-4-4-12 hex UUID (workspace_identity.rs:32, {:02x}) and WorkspaceModel.id is that raw
    key; CMUX_WORKSPACE_ID is the uppercased form, and acpmux lowercases both
    _meta.acpmux.workspaceId and the env value (session_env.rs:158,167). So lane.workspaceID
    and WorkspaceModel.id are the same space and workspace(id:) is an exact dictionary hit. A
    pre-registry daemon gives id = "handle:<n>" with key == nil, which simply misses and keeps
    the old focused-pane behaviour.
  • The pane waiter does fire for an already-open window. WindowController.show(_:on:) calls
    contentDidAppear(self) unconditionally at its end (:277), not only for a window's first
    content, and reveal(workspaceID:) only calls select(…), so the path really does go through
    afterNextContent. The wait captures neither self nor the WindowController, so it cannot
    retain a closed window, and it has no re-arm loop.
  • View-change permission survives the wait. ActionRunScope.current is a @TaskLocal,
    afterNextContent binds it synchronously through carrying, and Task {} inherits task-locals.
  • Isolation is right. uiSwiftSettings sets .defaultIsolation(MainActor.self), so
    AgentChatJump is MainActor-inferred and decide's non-@Sendable closure legally inherits it.
    MachineReconnectRoute is the same declaration shape, tested the same way.

Gates it ran on Linux: check-concurrency.sh, check-motion.sh, check-no-godfiles.sh and
lint-ios-package-conventions.sh all clean.

Follow-ups it raised, none blocking, for their own PR

  1. AgentActivityPageService.swift:55,70 uses WindowActivation.Intent.raise without
    import CmuxNextDesign. Legal today (implicit-member lookup, MemberImportVisibility off) but
    it is the only file in CmuxNextApp that does so.
  2. :97 — the .open body re-looks-up the window's focusedPane without re-asserting the window
    still shows workspaceID. The emit→body gap is a main-actor suspension, so a switch landing in
    between would open the chat in the wrong workspace's pane.
  3. :49 — noteJump() runs before a wait that can exceed LocationTrailService.jumpWindow (2 s),
    so a slow-mounting workspace loses its dedicated Back step, and it stays armed for 2 s when the
    jump is refused. Calling it immediately before each actual open would be exact.
  4. :74 — if content never appears, that path neither opens nor refuses, where the old path always
    ended in a tab or noPane. Also, contentDidAppear drops all of a window's waiters and runs
    only the matching one, so two rapid picks of different workspaces can drop the second.
  5. :67-70 — showJumpWindow runs before it is known the window will show the workspace. Not
    reachable from the one caller (the sidebar gesture, where ActionRunScope.current is nil) and it
    matches DeepLinkNavigator.reveal(workspace:)'s existing shape.
  6. Untested, because both need AppServices: that jump(to:) actually calls noteJump(), and that
    the generation guard suppresses a stale mount.

Two notes on the gates themselves

crash_ratchet.py reports CmuxNextApp dynamic_dispatch 3 -> 4, but that class is
NSSelectorFromString / Selector("…") / KVC-by-key and the added lines contain none of those; the
same run also reports deltas in MessagesLabHome and two cmux-tui-core files this PR does not
touch, so the baseline is stale on base.

scripts/cmux-next/prepush-gate.py crashes before running any check when given a ref with a slash:
it writes <rev>.reserved.json with rev="origin/feat-cmux-next", and the / makes a missing
directory. Unrelated to this PR, worth its own fix.

🤖 Generated with Claude Code

@teamleaderleo
teamleaderleo merged commit 6d503de into feat-cmux-next Oct 22, 2026
@teamleaderleo
teamleaderleo deleted the cmux/priority-jump-workspace branch October 22, 2026 13:29
@github-actions

Copy link
Copy Markdown
Contributor

The feat-cmux-next push run https://github.com/manaflow-ai/cmux/actions/runs/39787368484 at 3b9c520 failed: cmux-next fast tier.
Those jobs last passed at 73201a4. This pull request is one of 2 merged since: #23926, #24114.
If the failure is in your change, fix forward on feat-cmux-next. Pull requests run only the tiers their paths reach (docs/ci/cmux-next-tiers.md); label a batch PR full-ci to run them all before merging.

@github-actions

Copy link
Copy Markdown
Contributor

The feat-cmux-next push run https://github.com/manaflow-ai/cmux/actions/runs/39788190928 at 0105692 failed: cmux-next fast tier.
Those jobs last passed at c04ccb2. This pull request is one of 2 merged since: #23926, #24114.
If the failure is in your change, fix forward on feat-cmux-next. Pull requests run only the tiers their paths reach (docs/ci/cmux-next-tiers.md); label a batch PR full-ci to run them all before merging.

@github-actions

Copy link
Copy Markdown
Contributor

The feat-cmux-next push run https://github.com/manaflow-ai/cmux/actions/runs/39788910738 at e70f2c3 failed: cmux-next fast tier.
Those jobs last passed at c04ccb2. This pull request is one of 4 merged since: #23926, #24114, #24347, #24006.
If the failure is in your change, fix forward on feat-cmux-next. Pull requests run only the tiers their paths reach (docs/ci/cmux-next-tiers.md); label a batch PR full-ci to run them all before merging.

@github-actions

github-actions Bot commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

Shipped in:

This branch was previously deployed

1 inactive deployment
ci-routing-agent — cc5e0e11 Deployed Oct 22, 2026 by teamleaderleo
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