Skip to content

fix(cmux-tui): a terminal tab aimed at a pinned dock that takes no tabs opens in a new column right of it (FC-1 follow-up) - #30886

Open
lawrencecchen wants to merge 23 commits into
feat-cmux-nextfrom
fix/fc1-daemon-terminal-reroute
Open

lawrencecchen wants to merge 23 commits into
feat-cmux-nextfrom
fix/fc1-daemon-terminal-reroute

Conversation

@lawrencecchen

@lawrencecchen lawrencecchen commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

Summary

cmux-tui now opens a terminal tab aimed at a pinned dock that takes no tabs in a new column right of the dock. Before, it refused the tab with dock-column-pinned. The rule lives in one daemon commit point, so every terminal creator gets it: the app's own creators, the CLI, MCP and scripts.

FC-1 (fuzz catalog). Home's dock is pinned in its dock move, and it takes other tabs only after a later column.update {allow_tabs: true}. A person can also close it to tabs. While allow_tabs is off, cmux-tui refused every terminal tab in it. #30676 fixes this for TabLifecycle.newTerminal (New Terminal Tab from a script, the CLI or MCP). The independent review of #30676 found that many other creators still failed in the dock: config commands (ConfigCommandRunner), the account and provider login openers, Duplicate Tab (TabHandlers:80), the page openers, Tab Group's New Tab, agent handlers and Agent Teams (raw connection.newTab).

Fix (per cmux-shared-behavior: one shared point, not a guard per caller). Every terminal tab commits through Mux::commit_resource_topology_operation (cmux-tui/crates/cmux-tui-core/src/mux/resource_topology/topology_operation.rs): the JSON-lines new-tab, tab.create_terminal, and the frontend's creation. There, a tab.create_terminal whose pane is in a pinned column that takes no tabs becomes one pane.split to the right with a viewport width, which makes a new column beside the dock:

  • Beside a lone dock, it uses LONE_DOCK_NEIGHBOR_WIDTH, the same width as a link Home opens there (the daemon's browser rule for a lone dock).
  • Beside a dock with other columns, it uses DEFAULT_VIEWPORT_PANE_WIDTH.
  • The split keeps the focus where it was unless the caller asked, as a tab made in another pane does. The tab's strip slot is dropped. Its caller-chosen terminal id, cwd, env and size go to the split, and a prelaunched host is adopted by its terminal id as before.

New helpers in pinned_columns.rs: pane_in_pinned_column_taking_no_tabs (now also used by ensure_pane_takes_tabs) and terminal_column_beside_closed_dock.

Behavior change: two wire tests asserted the old refusal for terminal tabs (pinned_column_takes_no_new_tab_until_allow_tabs_is_on, a_browser_tab_made_in_a_lone_pinned_dock_opens_in_a_new_column_beside_it). They now assert that no tab enters the dock. Browser and conversation tabs are unchanged: in a dock with a column beside it they are still refused, and from a lone dock the daemon already reroutes them.

Related: #30503 (landed), #30676, #30826.

Owner note: this touches the cmux-tui daemon area of PL-daemon (session cmux-b6; plans/cmux-next/OWNERS.md). Only the creation route changes; no request-speed path changes.

Changelog

  • Fixed: A terminal opened in Home's dock by a config command, a login, Duplicate Tab, a tab group, an agent, the CLI or MCP before Home's dock takes tabs now opens beside it instead of failing.

Testing

Regression tests (red at 34883fd, tests only):

  • Rust server::pinned_columns_tests::a_terminal_tab_aimed_at_a_pinned_dock_that_takes_no_tabs_opens_in_a_new_column_right_of_it. It sends new-tab into a lone dock (expects a new column right of the dock at the lone-dock width), then tab.create_terminal into the dock with a column beside it (expects a third column, right of the dock). The dock keeps only its pinned tab.
  • App HomeClosedDockTerminalCreatorsTests. It calls PaneController.newTerminalTab (the config-command and login-opener path) on Home's closed dock, and expects no failure and a real terminal in a column right of the dock.

Fleet:

  • Rust red (Linux) a9ab569f3f9645ea63fc64ab at 34883fd: failed, 17 passed and 1 failed: {"cmd":"new-tab","pane":3} failed: {"error":"dock-column-pinned: the pinned column takes no other tab (allow_tabs is off)" ...}.
  • Rust green (Linux) f392de60c38e74863e3bdb0b at dbf93b8: 18 of 18 pinned_columns_tests passed.
  • App display red f1b1e52d1caabe2a437aeaa7 and green 904e86672320b448bfc02432 (HomeClosedDockTerminalCreatorsTests, plus HomeDockOpensTests in the green): running when this was written; results are added here.
  • Compile: 39521237e012b6e7588bce20 passed at dbf93b8 (CmuxNext, app, cmux-tui). 5d2ecda26ebf80ae9bee68d4 passed at the head 4e49f38 (CmuxNext, app, cmux-tui).
  • Clippy (Linux):

Base clippy reds (not this PR's)

Observed / Not run

  • Observed: the fleet steps above and prepush-gate.py with no new violations.
  • Not run: the full cmux-tui test suite (only pinned_columns_tests), a first-5s bench, a dogfood build. I read, but did not run, the frontend new-tab creation path through cmd_frontend.rs; it commits through the same function.

No capture: the visible result is a terminal in a new column right of Home, as for a person's new terminal from Home.

perf claim: none

…pen in a new column right of it (FC-1 follow-up)

cmux-tui refused every terminal tab in a pinned column with allow_tabs
off (dock-column-pinned), so every creator that does not go through
TabLifecycle.newTerminal failed in Home's dock before its allow_tabs:
config commands, login openers, Duplicate Tab, Tab Group's New Tab, agent
handlers, Agent Teams, the CLI and MCP. Rust: new-tab and
tab.create_terminal into the dock, alone and beside a column. App:
PaneController.newTerminalTab on Home's closed dock. Red on the base.
…bs opens in a new column right of it (FC-1 follow-up)

cmux-tui refused every terminal tab in a pinned column with allow_tabs off
(dock-column-pinned). Home's dock is pinned before it takes tabs, so the
first terminal a script, the CLI, MCP, a config command, a login opener,
Duplicate Tab, Tab Group's New Tab, an agent handler or Agent Teams made
there failed. Every terminal tab commits through
commit_resource_topology_operation (JSON-lines new-tab, tab.create_terminal,
the frontend creation); there a tab.create_terminal whose pane is in such
a column becomes one pane.split right of the dock with a viewport width
(the lone-dock neighbor width beside a lone dock, as a link Home opens,
else the default column width) and keeps the focus where it was unless
the caller asked. No client needs its own guard. The two wire tests that
asserted the old refusal for terminal tabs now assert that none enters
the dock.

Regression tests: pinned_columns_tests
a_terminal_tab_aimed_at_a_pinned_dock_that_takes_no_tabs_opens_in_a_new_column_right_of_it
and HomeClosedDockTerminalCreatorsTests (red at the commit before).
@lawrencecchen lawrencecchen added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Nov 1, 2026

@cubic-dev-ai cubic-dev-ai Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2 issues found across 5 files

You’re at about 92% of the monthly reviewed-line limit. You may want to disable incremental reviews to conserve quota. Reviews will continue until that limit is exceeded. If you need help avoiding interruptions, please contact contact@cubic.dev.

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="cmux-tui/crates/cmux-tui-core/src/mux/resource_topology/topology_operation.rs">

<violation number="1" location="cmux-tui/crates/cmux-tui-core/src/mux/resource_topology/topology_operation.rs:553">
P1: Workspace- or screen-scoped terminal creation still fails when its active pane is the closed pinned dock. Resolve the effective active pane for selectors without an explicit `pane` before deciding whether to convert this operation to `pane.split`, so those API forms receive the same FC-1 behavior.</violation>
</file>

<file name="Packages/macOS/CmuxNext/Tests/CmuxNextAppTests/HomeClosedDockTerminalCreatorsTests.swift">

<violation number="1" location="Packages/macOS/CmuxNext/Tests/CmuxNextAppTests/HomeClosedDockTerminalCreatorsTests.swift:42">
P2: This assertion does not prove that the terminal landed in a new column to the dock’s right. A same-column split would pass all current checks; assert the column count and that the dock and terminal occupy distinct, ordered columns.</violation>
</file>

Reply with feedback, questions, or to request a fix.

View guided diff | Turn on auto-fix | Re-trigger cubic

/// The new column's width when `selectors` name a pane in a pinned column that takes no
/// tabs ([`terminal_column_beside_closed_dock`]), else `None`.
fn terminal_column_beside_closed_dock(&self, selectors: &ResourceSelectors) -> Option<f32> {
selectors.pane.as_ref()?;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1: Workspace- or screen-scoped terminal creation still fails when its active pane is the closed pinned dock. Resolve the effective active pane for selectors without an explicit pane before deciding whether to convert this operation to pane.split, so those API forms receive the same FC-1 behavior.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At cmux-tui/crates/cmux-tui-core/src/mux/resource_topology/topology_operation.rs, line 553:

<comment>Workspace- or screen-scoped terminal creation still fails when its active pane is the closed pinned dock. Resolve the effective active pane for selectors without an explicit `pane` before deciding whether to convert this operation to `pane.split`, so those API forms receive the same FC-1 behavior.</comment>

<file context>
@@ -530,6 +547,17 @@ impl Mux {
+    /// The new column's width when `selectors` name a pane in a pinned column that takes no
+    /// tabs ([`terminal_column_beside_closed_dock`]), else `None`.
+    fn terminal_column_beside_closed_dock(&self, selectors: &ResourceSelectors) -> Option<f32> {
+        selectors.pane.as_ref()?;
+        let pane = self.resolve_resource_path(ResourceTarget::Pane, selectors).ok()?.pane?;
+        self.with_state(|state| {
</file context>

#expect(failures.isEmpty, "the terminal made in Home's closed dock failed: \(failures)")
try await PasswordManagerRouteTests.until({
let panes = HomeSplitKeysTests.panes(home)
return panes.count == 2 && panes.first === dock && dock.tabs.count == 1

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: This assertion does not prove that the terminal landed in a new column to the dock’s right. A same-column split would pass all current checks; assert the column count and that the dock and terminal occupy distinct, ordered columns.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At Packages/macOS/CmuxNext/Tests/CmuxNextAppTests/HomeClosedDockTerminalCreatorsTests.swift, line 42:

<comment>This assertion does not prove that the terminal landed in a new column to the dock’s right. A same-column split would pass all current checks; assert the column count and that the dock and terminal occupy distinct, ordered columns.</comment>

<file context>
@@ -0,0 +1,49 @@
+            #expect(failures.isEmpty, "the terminal made in Home's closed dock failed: \(failures)")
+            try await PasswordManagerRouteTests.until({
+                let panes = HomeSplitKeysTests.panes(home)
+                return panes.count == 2 && panes.first === dock && dock.tabs.count == 1
+                    && panes.last?.tabs.contains { $0.kind == .pty && !ProvisionalTab.isProvisional(surface: $0.surface) } == true
+            }, report: {
</file context>

@blacksmith-sh

This comment has been minimized.

@github-actions

github-actions Bot commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

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

Review 895a703: 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=pr30886 -f ref=fix/fc1-daemon-terminal-reroute -f platform=macos -f backend_mode=local

web and size checks: green

@lawrencecchen

Copy link
Copy Markdown
Contributor Author

Review (subagent, correctness first): FIX at 4e49f38

I read the code only. I did not build or run anything on the review machine.

Defects

  1. Not the single commit point: the receipted creation path skips the reroute. cmux-tui/crates/cmux-tui-core/src/mux/resource_topology/topology_operation.rs:346-393 (receipted_surface_creation) calls resource_correlated_creation_operation directly. It never goes through commit_resource_topology_operation, where the rewrite is (:434). These callers use that path:

    • cmd_frontend.rs:494: create-surface-with-receipt, operation new-tab. This is "the frontend's creation" that the PR body says commits through the same function.
    • cmux-tui's own TUI frontend, for every new tab, local and remote (cmux-tui/crates/cmux-tui/src/session/mod.rs:1253-1299).
    • The generated SDKs' create_surface_with_receipt.

    A new tab from these callers, aimed at a pinned dock that takes no tabs, is still refused with dock-column-pinned. pane.run / run-command (PaneRun -> effect_add_terminal_tab, effect_execution.rs:415) is refused the same way. The macOS app's creators use JSON-lines new-tab and tab.create_terminal, so the FC-1 app cases this PR names are fixed. But the "one rule for every terminal creator" claim, and the cmux-shared-behavior requirement, do not hold.

  2. name is silently dropped. tab.create_terminal accepts name (spec resource-operations-v2.json, tab.create_terminal.fields.name). terminal_tab_as_column (topology_operation.rs:600) keeps it in the fields, but the PaneSplit effect never reads it:

    • effect_execution.rs:386-410 builds PaneAddOptions with no name.
    • effect_spawn_pane_surface passes None as the reservation name (pane_browser.rs:191).
    • Nothing calls set_name.

    So tab.create_terminal {pane: <Home's dock>, name: "build"} returns success, and the terminal has no name. The terminal-reservation fingerprint also leaves out the name.

  3. A retry with the same key gets creation_conflict when the dock's state changed. The fingerprint stores the caller's tab.create_terminal, but the creation receipt is written under the rewritten operation name (pane.split). require_creation_identity (workspace_registry/effect_store.rs:1175-1191) compares both the operation name and the fingerprint. So a tab.create_terminal retry with the same idempotency key fails with a creation conflict, not a replay, if allow_tabs flipped between the two attempts, in either direction. That is exactly the FC-1 window: Home's dock turns allow_tabs on soon after launch. Compare the cx-ebm.59.5 pane rewrite just above (:414-418): it keeps the operation, so its comment ("a retry with the same key replays after the focus moved") holds. This rewrite breaks that. A smaller related problem: the decision is made outside the creation fence and the state lock (terminal_column_beside_closed_dock at :552), so it can race a concurrent column.update.

Suggested fix (removes all three)

Decide the reroute where the creation's intent is built, not at the commit entry:

  • In resource_topology_effect_intent, for TabCreateTerminal (and PaneRun) whose resolved pane is in a pinned column that takes no tabs, record the decision in the stored intent, for example "beside_closed_dock": {"viewport_width": w}. Also add the pane and split reservations that PaneSplit gets today.
  • In execute_resource_topology_effect, when the intent has that marker, run effect_add_pane(direction right, viewport_width, focus false) and apply name. Otherwise call effect_add_terminal_tab as before.

Then:

  • The operation name and the fingerprint stay tab.create_terminal, so retries and replays match the stored receipt.
  • The decision is made under the registry and state locks, and restart recovery replays the same decision.
  • receipted_surface_creation, the TUI, the SDKs and pane.run all get the rule with no per-caller code.

Checked and correct

  • Column placement: PaneSplit right with viewport_width calls insert_layout_column_beside(.., before=false), which inserts at index + 1: right of the dock, not at the end and not inside the dock column. With viewport_width set, the PaneSplit skips ensure_pane_column_not_agent_chat. The pinned-column check is not tripped, because no tab enters the dock.
  • Widths: LONE_DOCK_NEIGHBOR_WIDTH (1.0) beside a lone dock and DEFAULT_VIEWPORT_PANE_WIDTH otherwise. Both are inside the PaneSplit width validation.
  • Fields and identity:
    • terminal_id, env, cwd, cols/rows, reopen_tab_id and the client tab id carry over.
    • creation_identity_kind(PaneSplit) is Terminal, so the caller's terminal id is reserved and adopted.
    • tab_insert_index is correctly dropped.
  • Results and events:
    • ordinary_created_surface finds tab_id in the PaneSplit created path.
    • effect_add_pane emits its own pane-added and layout-changed. The later legacy TabCreateTerminal emission only adds a harmless TreeChanged.
    • The router's mutation_result shape is unchanged.
  • Focus default false:
    • This matches tab.create_terminal's programmatic semantics, because a tab made in another pane does not move the focus.
    • The app's user path focuses the new terminal itself through expectFocus(on: created.surface) (PaneController+Intents.swift).
    • For the optimistic stand-in, the reply's ProvisionalTab.created swaps it by surface. The pane-added event is not claimed by ProvisionalTab.matched (it handles tab-added only), so the stand-in in the dock can show beside the real terminal until the reply arrives. This is cosmetic.
  • Rules: no new unwrap or panic in non-test code. No socket method and no relay policy changes.
  • Bypasses that are not this PR's (no FIX for them): workspace-targeted terminal creation (tab.create_terminal/pane.create with only a workspace selector when the dock is focused and alone, and JSON-lines create-terminal) goes to create_terminal_in_workspace_impl (terminal_create.rs:311-322). That function pushes the tab into the workspace's active pane with no pinned check at all, so a terminal can enter a closed dock there. The same is true at the base. Layout undo, open_url and the app-workspace creation use other operations.
  • Nit: in pinned_columns_tests.rs:392-397, the old doc comment of the browser test ("A terminal tab is refused as before.") now sits on columns_and_column_of. It is stale, and the browser test lost its doc.

Evidence

  • Rust red a9ab569f3f9645ea63fc64ab (34883fd): the new test failed with dock-column-pinned on new-tab. Read in the log.
  • Rust green f392de60c38e74863e3bdb0b (dbf93b8): 18/18 pinned_columns_tests passed. Read in the log.
  • Clippy 1a7101f2d30d705aa3e3d705: the only findings are acpmux/src/prompt_provenance.rs:584 and cmux-tui/src/link/start_chat_cli.rs:282. Neither file is in this PR.
  • App display red f1b1e52d1caabe2a437aeaa7 and green 904e86672320b448bfc02432: still running when I reviewed. Not read.

perf claim: none

…replay a retry, and cover pane.run and the receipted creation (review of #30886)

The review found that the commit-point reroute misses the receipted
create-surface-with-receipt path (the TUI, the SDKs) and pane.run, drops
a tab.create_terminal name, and turns a keyed retry into a
creation_conflict (the receipt stored pane.split, the fingerprint
tab.create_terminal). The wire test now covers all four. Red at this
commit (the old fix).
…intent, under the locks (review of #30886)

The reroute moves from commit_resource_topology_operation (which the
receipted creation path and pane.run bypass, and which changed the stored
operation) into resource_topology_effect_intent: for a tab.create_terminal
or pane.run whose resolved pane is in a pinned column that takes no tabs,
the intent records beside_closed_dock {viewport_width} with pane and split
reservations, under the state lock. effect_add_terminal_tab then opens the
terminal with effect_add_pane (right, that width, focus false) and keeps
its name and exit policy (PaneAddOptions gains both). The operation and its
fingerprint stay the caller's, so a keyed retry replays; every creator
gets it: JSON-lines new-tab, tab.create_terminal,
create-surface-with-receipt and pane.run. The browser test's doc comment
is back above its test.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 5 files (changes from recent commits).

You’re at about 93% of the monthly reviewed-line limit. You may want to disable incremental reviews to conserve quota. Reviews will continue until that limit is exceeded. If you need help avoiding interruptions, please contact contact@cubic.dev.

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="cmux-tui/crates/cmux-tui-core/src/server/pinned_columns_tests.rs">

<violation number="1" location="cmux-tui/crates/cmux-tui-core/src/server/pinned_columns_tests.rs:467">
P2: The new `pane.run` and receipted-creation checks do not verify the required placement. Capture each returned surface/pane and assert its column is `Some(1)`; otherwise a regression that creates both terminals in another column can still satisfy the final `columns.len() == 5` assertion.</violation>
</file>

Reply with feedback, questions, or to request a fix.

View guided diff | Turn on auto-fix | Re-trigger cubic

"receipt": "fc1-receipted-new-tab", "pane": panes[0],
}));
assert_eq!(wire.tabs(panes[0]), vec![home], "the dock keeps only its pinned tab: {receipted}");
let (columns, _) = columns_and_column_of(&wire, beside);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: The new pane.run and receipted-creation checks do not verify the required placement. Capture each returned surface/pane and assert its column is Some(1); otherwise a regression that creates both terminals in another column can still satisfy the final columns.len() == 5 assertion.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At cmux-tui/crates/cmux-tui-core/src/server/pinned_columns_tests.rs, line 467:

<comment>The new `pane.run` and receipted-creation checks do not verify the required placement. Capture each returned surface/pane and assert its column is `Some(1)`; otherwise a regression that creates both terminals in another column can still satisfy the final `columns.len() == 5` assertion.</comment>

<file context>
@@ -432,27 +427,60 @@ fn a_terminal_tab_aimed_at_a_pinned_dock_that_takes_no_tabs_opens_in_a_new_colum
+        "receipt": "fc1-receipted-new-tab", "pane": panes[0],
+    }));
+    assert_eq!(wire.tabs(panes[0]), vec![home], "the dock keeps only its pinned tab: {receipted}");
+    let (columns, _) = columns_and_column_of(&wire, beside);
+    assert_eq!(columns.len(), 5, "each made its own column: {columns:?}");
 }
</file context>

…ipts-v1 before its receipted creation, as the TUI and SDK clients do
@teamleaderleo

Copy link
Copy Markdown
Collaborator

Review (codex gpt-6-astra high, next-review): SHIP at 895a703

SHIP at 895a703

Visual verdict: no images; Leo tries the build.

  1. [P2][follow-up] No after screenshots or gallery artifact were provided (review/images/README.txt), so visual comparison was unavailable.

Follow-ups:

  • [P2][follow-up] No after screenshots or gallery artifact.

@cmux-bot
cmux-bot Bot temporarily deployed to ci-routing-agent November 1, 2026 21:49 Inactive
@cmux-bot
cmux-bot Bot temporarily deployed to ci-routing-agent November 1, 2026 21:49 Inactive
@teamleaderleo

Copy link
Copy Markdown
Collaborator

Review (next-review patch-id; carried): SHIP at bb9f876

The independent SHIP at 895a703 carries to this head: the PR's own change (git diff $(git merge-base feat-cmux-next HEAD) HEAD) has the same git patch-id --verbatim (be809a7abacd3790) at both heads, and no merge between them was resolved by hand. Nothing new to review. A newer BLOCK, or any change to the PR's own diff, ends the carry.

@cmux-bot
cmux-bot Bot temporarily deployed to ci-routing-agent November 2, 2026 12:02 Inactive
@cursor

cursor Bot commented Nov 2, 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.

@teamleaderleo

Copy link
Copy Markdown
Collaborator

Review (next-review patch-id; carried): SHIP at 370ba16

The independent SHIP at 895a703 carries to this head: the PR's own change (git diff $(git merge-base feat-cmux-next HEAD) HEAD) has the same git patch-id --verbatim (be809a7abacd3790) at both heads, and no merge between them was resolved by hand. Nothing new to review. A newer BLOCK, or any change to the PR's own diff, ends the carry.

@teamleaderleo

Copy link
Copy Markdown
Collaborator

Review (next-review patch-id; carried): SHIP at 27fa49c

The independent SHIP at 895a703 carries to this head: the PR's own change (git diff $(git merge-base feat-cmux-next HEAD) HEAD) has the same git patch-id --verbatim (be809a7abacd3790) at both heads, and no merge between them was resolved by hand. Nothing new to review. A newer BLOCK, or any change to the PR's own diff, ends the carry.

@teamleaderleo

Copy link
Copy Markdown
Collaborator

Review (next-review patch-id; carried): SHIP at 245ef96

The independent SHIP at 895a703 carries to this head: the PR's own change (git diff $(git merge-base feat-cmux-next HEAD) HEAD) has the same git patch-id --verbatim (be809a7abacd3790) at both heads, and no merge between them was resolved by hand. Nothing new to review. A newer BLOCK, or any change to the PR's own diff, ends the carry.

@teamleaderleo

Copy link
Copy Markdown
Collaborator

Review (next-review patch-id; carried): SHIP at 55dd725

The independent SHIP at 895a703 carries to this head: the PR's own change (git diff $(git merge-base feat-cmux-next HEAD) HEAD) has the same git patch-id --verbatim (be809a7abacd3790) at both heads, and no merge between them was resolved by hand. Nothing new to review. A newer BLOCK, or any change to the PR's own diff, ends the carry.

@blacksmith-sh

This comment has been minimized.

@teamleaderleo

Copy link
Copy Markdown
Collaborator

Review (next-review patch-id; carried): SHIP at c6dd7a9

The independent SHIP at 895a703 carries to this head: the PR's own change (git diff $(git merge-base feat-cmux-next HEAD) HEAD) has the same git patch-id --verbatim (be809a7abacd3790) at both heads, and no merge between them was resolved by hand. Nothing new to review. A newer BLOCK, or any change to the PR's own diff, ends the carry.

@teamleaderleo

Copy link
Copy Markdown
Collaborator

Review (next-review patch-id; carried): SHIP at 6c45be6

The independent SHIP at 895a703 carries to this head: the PR's own change (git diff $(git merge-base feat-cmux-next HEAD) HEAD) has the same git patch-id --verbatim (be809a7abacd3790) at both heads, and no merge between them was resolved by hand. Nothing new to review. A newer BLOCK, or any change to the PR's own diff, ends the carry.

@teamleaderleo

Copy link
Copy Markdown
Collaborator

Review (next-review patch-id; carried): SHIP at 25fa715

The independent SHIP at 895a703 carries to this head: the PR's own change (git diff $(git merge-base feat-cmux-next HEAD) HEAD) has the same git patch-id --verbatim (be809a7abacd3790) at both heads, and no merge between them was resolved by hand. Nothing new to review. A newer BLOCK, or any change to the PR's own diff, ends the carry.

This branch was previously deployed

3 inactive deployments
ci-routing-agent — 25fa7152 Deployed Nov 2, 2026 by github-actions[bot] via cmux-next macOS placement #63850
artifacts — 25fa7152 Deployed Nov 2, 2026 by cmux-bot[bot] via publish tree-addressed cmux-tui #102758
sentry-dsyms — 25fa7152 Deployed Nov 2, 2026 by cmux-bot[bot] via upload cmux-tui dSYMs to Sentry #102758
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.

2 participants