Repository navigation
cmux NEXT: the workspace row copies its link before its ID, and a test that the link opens it - #27564
Conversation
|
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 7665b87 to compare; do not merge until green; see lane-rules |
Default changesThis pull request changes 5 defaults at
Needs a review. It passes with an independent review receipt on this commit: a comment or review whose first line is Regenerate the snapshot with |
da07833 to
87677c2
Compare
This comment has been minimized.
This comment has been minimized.
dd7e0db to
7cbe86a
Compare
103d0c4 to
1cb5283
Compare
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. |
c3e146e to
ac3de4d
Compare
e71756b to
00cda77
Compare
5de18c1 to
c82c6ae
Compare
|
Review (Codex gpt-6-astra, high, independent): SHIP at 74ebf24
|
74ebf24 to
335b262
Compare
335b262 to
1e6967b
Compare
1e6967b to
15dc9bb
Compare
|
Review (Codex gpt-6-astra, high, independent): SHIP at 15dc9bb
|
… the link opens it Leo 2026-10-29: "the workspaces, you know, in this case, you don't, like, there's no link to workspace, which is, I mean, that seems pretty important, doesn't it?" #27709 put Copy Workspace ID and Copy Workspace Link in the workspace row's More > Copy. This puts the link first, as on the tab and pane menus, and WorkspaceLinkTests copies a workspace's link through the action and opens it through link.open, which shows that workspace; a gone workspace's link refuses. debug.object_menu (DEBUG only) and tour:object-menu-workspace, -tab and -pane open the workspace, tab and pane right-click menus and their folders for captures. Agent-Session: https://cmux.com/deeplink/agent?id=aid-fb75b7af9902231028aa Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
15dc9bb to
65135ef
Compare
|
Review (Codex gpt-6-astra, high, independent): SHIP at 65135ef
|
|
Shipped in:
|
…8106) The cmux-next checks job's menu-metrics item fails on base: DebugObjectMenu.swift:52 `NSPoint(x: 80, ...)` "places a row part at its own x". DebugObjectMenu (#27564) reads as a menu surface by its type name, but that point is where the DEBUG `debug.object_menu` command pops the pane's own menu up when the pane's tab bar is hidden: a click location, not a row of a menu it draws. No MenuMetrics value is 80, so taking one would move the capture's menu. List the file in NOT_MENUS with why, as the lint does for MacScreenButtons.swift. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…s are instances AppServices owns (#28267) The arch-ratchet tip rise (audit-rh): fourteen globals and two assumeIsolated sites that landed with no reviewed exception now live on instances the composition root constructs and passes. - AppServices.DebugFixtures (DEBUG only): the capture fixtures of one app. It holds debug.cloud_machine_fixture's cloudWorkspace (was DebugCloudMachineFixture.holders, #26274), debug.add_device's listing (DebugAddDevice.listing, #27229), debug.join_consent's status and person line (DebugJoinConsent.status and .line, #27223), debug.object_menu's menu (DebugObjectMenu.popped, #27564), and debug.joined_machines' service (was AppServices.debugJoinedMachines). - DebugWindowRecord is an instance (AppServices.windowRecord): running, launchRecorders, launchSeen and launchWatch (#23680) are its properties. The app delegate starts --record-launch right after it makes the services, before the first window, as before. A launch recording's window-close observer is a MainActorObservation, not a raw queue: .main observer with MainActor.assumeIsolated. - RoomDefaultsUpdates is an instance (AppServices.roomDefaults): its per-space serial tails (#23461). - JoinConsentModel.fixtureActive: the app sets it in DEBUG from its fixtures; it is false in Release, as the removed static was. The Mac Screen gate reads it before and after its read. - The grant gate is invalidated by SettingsController.onEveryLoad, which runs on the main actor in the load itself, before the load changes snapshot or loadCount. This replaces an observation that re-armed itself through Thread.isMainThread plus assumeIsolated or a Task (#27223). Those two properties change only in that main-actor load, so the Task branch never ran. - PageID.fixtureRoots (#26109) is gone. A test gives its fixture root to the page host it builds (PageWebView and AgentPaneView testRoot: true; DEBUG only, Release ignores it). Behavior does not change. Tests that set the statics now set their own instances. arch_counts delta: stateful_singletons -4, global_mutable_statics -7, assume_isolated_outside_adapters -2, assume_isolated_total -2, app_lines -11; no row rises. Owner: Performance Lead. Not compiled or tested on this VM (fleet compile-check after push).
Leo, 2026-10-29:
This PR is the first part: the workspace link. The "much better way than all these menus" part (one Copy ▸ submenu on the workspace, tab and pane menus) is the follow-up PR.
While this was in review, #27709 landed Copy Workspace ID and Copy Workspace Link in the workspace row's More › Copy, ID first. This PR now carries what that one doesn't:
What
ActionSurfaceCatalog+Menus.swiftswap.ContextMenuEssentialsTests.theWorkspaceRowMenuCopiesItsLinkThenItsIDchecks the order.link.open→DeepLinkNavigator→windows.reveal(workspaceID:)already handled<scheme>://workspace/ws_…, but nothing tested it.WorkspaceLinkTests(app tests, same-tree daemon):<scheme>://workspace/<ws_ id>.link.openthe way a clicked link does (origin.user; a CLI run never moves this client's view), then waits until the window that lists the workspace shows it.linkTargetGone.services.link(workspace:)rather than the clipboard: the fleet's headless test workers have no usable pasteboard (an earlier version failed there).debug.object_menu(DEBUG only) opens the workspace, tab or pane right-click menu, then folders in it, for before/after shots.tour:object-menu-workspace,-taband-panerun it.debug.mouse). Its folders open by type-select, after a Down arrow that takes the keys back from the menu's name field, so the workspace isn't renamed.NSMenu.popUpfrom a main run-loop perform (a small@MainActorNSObject, noassumeIsolated), so the menu's tracking doesn't hold the main queue and the next call can run. Their folders open with arrow keys over the menu's enabled rows.Overlaps:
DeepLinkNavigator/DurableWorkspaceLink. This PR doesn't touch those files; it tests the open-workspace path.plans/cmux-next/exports are left to the PR autofix, as its workflow says ("no person regenerates them").Captures
The workspace row's right-click › More, from
tour:object-menu-workspaceon a fleet mini (whole-host display shot, cropped to the app window). The before is the current base plus the capture tooling alone (96aa11a), the after is this PR at 1e6967b (the menu rows are the same at the head).Menus still open on the click; nothing here adds an animation.
Tests
On the fleet at this head (
package-test-lane.sh): ContextMenuEssentialsTests, WorkspaceLinkTests, ActionSurfaceParityTests, LinkExportTests, ContextMenuIconTests.Timers and observers
None.
debug.object_menu(DEBUG only) schedules one run-loop perform (perform(_:with:afterDelay:inModes:)) per tab or pane menu it opens; it fires once, and the menu it opens closes with Escape (dismiss).Risk
Low. Two existing rows swap places. The rest is a test and DEBUG-only capture tooling.
🤖 Generated with Claude Code
Agent session: agent session