Repository navigation
cmux mcp: agents open in their own workspace, Chief in the task's workspace; workspace evals - #29178
lawrencecchen wants to merge 33 commits into
Conversation
…e, connected, supported" (honest answers that gave the screen text instead failed on the apostrophe form)
…pace and the last index are looked up) or just a workspace (its focused pane); the sheet names tab_move, workspace_create and terminal_input_keys (r13d: agents spent a docs step and two reads per move)
…efix or <session>: went to the daemon unresolved), a workspace alone moves to its active screen and pane (no focused pane in a background workspace), the index is past the end (the daemon clamps; a retry keeps its fingerprint), lookups run in the tab's session (review of 760ad56)
…ne_create (the daemon answered 'no current screen'); the sheet says workspace_create opens with a terminal pane a moved tab can go into (r14a: GPT 6 Astra made an empty workspace and spent 3 steps after it)
…, below, in a pane, next to logs, sticky column, other workspace, focus when asked); the stand-in app runs the app's open actions and records them; an 'opened' check grades kind, path, side and docked; case files are written on the daemon's host too. cmux mcp code mode: the sheet names app_file_open, app_browser_open_diff_viewer, app_tab_new_browser with target, and a sticky column (open-v1: no model found the file viewer)
… Tailscale SSH forwards the app socket as root 0600, so a relay of this user (ending with the MCP server) listens at the app path; every remote run before this saw no cmux app
…ed (right, left, below, above, here, a sticky column, a pane, a workspace) in one call: it splits or finds the column, docks a sticky one, and runs the app's open action into it (open-r16b: 2 to 4 steps an open, and no model found the sticky path)
…ind with no app); no redundant clone
…efuses any other non-word where (a model's where: {workspace} opened on the right); the sheet says how to make an existing column sticky. tool-evals: the stand-in app honors focus: true (open-r16d: both models asked to focus and the stand-in ignored it)
…chat's folder, sticky skips the agent chat's column, a refused open closes its split; stand-in app refuses as the app does Review of round 16 found three failures the stand-in app hid: tab new-browser takes a tab target, file open and the diff viewer refuse a relative path, and sticky could reuse the agent chat's docked column. The stand-in now refuses the same two inputs the app refuses.
…o (by session name); a stop through a closed forward left 1,000+ daemons running on rbx
…y logs column"); open names its pane in the answer, and its description says how to open two side by side to compare open-r16f: Sonnet read "make my logs column sticky" as a file search (2 of 2 samples, no cmux call); Opus split, moved and closed tabs by hand for "open a.txt and b.txt to compare" (2 of 2 failed).
…s one above the other (review of 373848c)
Correctness review (subagent) of 373848c, and resolutionBlocking: none. The reviewer checked the string continuations and escapes, that no test pins the old wording, that Non-blocking
|
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. |
…ext-tool-evals-r17
…he merge took the base side of conflicting lines)
|
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); NEW: |
|
Found 7 test failures on Blacksmith runners: Failures
|
Chief cases start the MCP server with CMUX_CALLER_HOME_CHAT=1 and add three cases where the request names a workspace's work (api tests, docs README, infra dashboard). The cli surface no longer attaches the MCP server, and a cli run that wrote cli.jsonl is not retried as untouched. Clearer prompts.
…lacks, as the app does `cmux file open --pane X` sends args.pane. The app answers 'file.open has no argument pane'; the stand-in opened the file in the focused pane and graded it as a leak into another workspace.
- A caller the app does not place in a pane (unknown to it, or a workspace with no pane) keeps the app's own placement for an untargeted viewer. - A pathless diff viewer opened beside the chat diffs the chat's folder; an empty or non-string path is not redirected. - Chief's rule rides on the open and cmux_exec descriptions, and Chief's instructions stay within 2048 characters.
- Redirect an untargeted viewer only for a caller the app places in a pane; otherwise open's current would be the daemon's active pane. - An in_progress open error carries the open's own key as idempotency_key, so a retry reconciles instead of opening a second split and viewer. - A pathless diff names the chat's folder. - Chief's rule moves from the instructions (2370 characters with it, past the 2048 that Claude Code may keep) to the open and cmux_exec descriptions.
…rkspace's) and the argument to pass Sonnet 5.5 as Chief made the api tests terminal in its own workspace with the abstract rule (tool-evals chief-task-api, 0/2).
The in_progress error of open keeps the app stage's idempotency_key, as #30752's open_splits_and_opens_in_one_call asserts; the retry key question goes to its author. Clippy: drop the unneeded super:: qualification.
|
Correctness review (subagent) of the merge resolution 0294309 and the new commits up to a4199ca, with the resolution at aec62b6:
Low findings: a non-bool Merge resolution 0294309: the reviewer found it correct. Verification on rbx (Linux, cmux-rust-builder-1):
|
…ces it there Sonnet 5.5 as Chief opened "the infra dashboard" beside itself (tool-evals chief-task-infra 0/2 on r18e); chief-task-api went from 0/2 to 2/2 with the example of ec6f6b4.
… the action (red)
… open refuses keeps the action Second review: cmux_exec's description is about 6 KB, so a client that cuts it would drop a rule at its end. A file open with an idempotency_key of 129 to 200 characters worked as an action and open would refuse it.
|
Second correctness review (subagent) of a4199ca..a82b64b, with the resolution at af0e5f6:
Checks the reviewer passed: both rbx: red at 14b2987 ( |
|
Review (independent-subagent): BLOCK at af0e5f6 The SHIP at 0e545f9 covered only the r17 instruction text and Blocking: a second owner of beside-caller placement (db021ca, c1ee0b7;
Not blocking
CI on this head: no red is the PR's own
|
|
Lead: I removed ready-to-land after the independent BLOCK at af0e5f6 (comment 6609251823). The MCP interception adds a second owner of 'beside the caller' placement next to ControlRouter.placeBesideCaller, which Lawrence's standing rule rejects, and it bypasses the app's browser rule for agent chats and Chief. The principled fix is in placeBesideCaller itself: add file open and accept terminal callers, so the CLI and MCP share one path. Then drop the MCP-side interception. The evals must run against the real app (a tagged build), not the stand-in. Whoever owns this PR: please take it from there. |
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
Summary
Agents open their splits, files, diffs and pages in their own workspace, and Chief opens a task's things in that task's workspace (Lawrence 2026-11-02: "when there are a ton of workspaces, agents ... should open it in the same workspace ... careful with chief as well"). Also the r17 instruction changes (panes and columns are cmux objects;
opennames its pane). It contains #29080 until that lands.app_file_open, diff viewer ortab_new_browsercall with no target went to the app's focused pane, which with many workspaces is often another workspace. It now goes throughopen's placement beside the caller, when the app places the caller in a pane (db021ca, c1ee0b7). A pathless diff names the chat's folder.CMUX_CALLER_HOME_CHAT=1), theopenandcmux_execdescriptions say that a request with a workspace's name in it, or about its project, agent, server or files, opens in that workspace in the background, and Chief names the workspace. Only a request with no workspace opens beside Chief. The rule is not in the instructions, which would pass 2048 characters with it (30a49d8, ec6f6b4, a82b64b, af0e5f6; the rule starts each description).tests/tool-evals/cases/workspace.ndjson: 17 cases in a session of 6 workspaces where the person looks at another one (terminals, splits, files, diffs, sites, browser tabs, an asked-for other workspace, and Chief docked left). New checksstayed_in_workspaceandnew_panes. The stand-in app now opens an untargeted action in the focused pane and refuses unknown arguments, as the app does (it had hidden the leak).Results (Claude CLI, MCP code mode, 2 samples per case, median per task)
Changelog
Observed / Not run
cargo test --locked -p cmux-tui --lib -- <filter>): e7bda04an_untargeted_viewer_from_a_chat_opens_beside_itfailed; effd0f1 the Chief test failed; 8ced5fdchief_tools_open_in_the_workspace_of_the_task,an_untargeted_viewer_from_a_chat_opens_beside_itandan_untargeted_diff_names_the_chat_folderfailed.chief_tools_open_in_the_workspace_of_the_taskandan_untargeted_diff_names_the_chat_folderfailed.cli::mcp cli::beside193 passed;--test cli caller_selector4 passed; clippy-D warnings0;cmux_surface classicandbrowser_enginepassed.cmux file openwith no target (Swift,ControlRouter.placeBesideCaller) is not changed here.