Skip to content

cmux NEXT panes: closing the right column leaves in the key's turn, never after the tab's close animation - #25163

Merged
teamleaderleo merged 10 commits into
feat-cmux-nextfrom
rail-opus-close-instant
Oct 26, 2026
Merged

teamleaderleo merged 10 commits into
feat-cmux-nextfrom
rail-opus-close-instant

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 25, 2026 •

Copy link
Copy Markdown
Collaborator

Leo's words (2026-10-25)

i also feel like it's weird how closing the right pane seems be like... waiting for the right tab's closing animation to PLAY before closing...? we should never block shit on the tab animation...

The chain

The "right pane" here is a column's only pane: the terminal column to the right of a docked chat, or the second column of the strip (the main-pane tour's "Closing the right column gives the chat its full width"). A pane with a split sibling already left in the key's turn. A column's only pane did not:

  1. Cmd-W / the close button → CloseUndoToasts.close → PaneController.prepareClose (CmuxNextApp/PaneController+Intents.swift:251): the store close intent drops the tab, and apply(snapshot()) hands the strip an empty tab list. With ui.animations.newTab on (the default since 528b9e9), TabStripView.sync (CmuxNextTabs/TabStripView+Sync.swift:117-125) keeps the tab as dying and plays the tabClose tween (200 ms).
  2. prepareClose then calls showPaneClose() (PaneController+Intents.swift:256), which goes through LayoutModel.showPaneClose → removingSplitPane (CmuxNextLayout/Model/LayoutModel+PaneClose.swift:70-80). That returns nil for a column's only pane (columns[index].root.removing(pane) is nil), so nothing is hidden and the focus does not move.
  3. The emptied column stays on screen, with its strip playing the tab's close, until the daemon's tree without the column comes back (LayoutModel.apply(screens:), a round trip, longer under load). Only then does the column leave and its neighbour spring. Close Pane (PaneHandlers+Verbs.swift:52) hit the same nil.

This came in with bca04e8 (lawrencecchen, "cmux-next close motion"), which left the column case to the daemon on purpose (its DESIGN.md "Doubts": "A column's only pane ... still leaves with the daemon's tree ... Next step if the round trip shows there."). It shows. This PR is that next step, as a fix-forward. No state now waits on the tab tween or the echo; the tween still plays on its own strip cell, which nothing waits on.

The fix

LayoutModel+PaneClose.swift:

  • removingSplitPane now removes a column's only pane together with its column, as long as another column stays (removingColumn(at:from:)). It reproduces the daemon's own projection, so the echo matches what is already on screen: project_layout_columns (a lone one-row column becomes the screen's tree, a lone pinned dock keeps its dock and width, pinned-dock-alone-v1) and normalize_dock_columns.
  • A close's sizes are worked out from scratch, not stored per split or column: even split ratios under layout.splitSizing (re-review fix 3) and column widths under layout.newColumnWidth fitScreen (review fix 2). What shows is: the daemon's widths, then the sizes of closes that already landed while another close was still pending (landedCloseRatios, landedCloseWidths), then each pending close in the order it was shown, with the sizing it leaves (CloseSizing.splitChanges and columnResizes) computed against the layout before it (overlayingPaneCloses). So overlapping closes, whether in one split chain or across columns, always show what the still-pending closes leave, whether their echoes arrive in order or out of order, or one is refused. The sizes go to the daemon once, when the screen's last pending close resolves (flushLandedCloseSizes). Closes that land in one snapshot are sized one by one in show order against a running tree (noteLandedCloses), so adjacent closes, each one's sibling gone too, still record their ratios. applyCloseSizing no longer sizes from the raw daemon trees for a close this window showed. A shown close no longer holds splitOverrides; it supersedes sent but unacknowledged ratios and widths of the splits and columns it resizes.

PaneController.showPaneClose (review fix 1): when the closed pane had the focus, it sends the focus coordinator the held topology minus that pane (FocusTopology.removing(pane:)). The focus reducer then picks the successor the same way as for any close: layout.closeFocus plus this window's focus history, per close-focus.md. That is the pick the echo's topology would make, so the echo leaves the focus alone. The layout shows the reducer's pick in the key's turn. The explicit .focusPane(successor) is gone; LayoutModel.successor is now only the model's stand-in until the reducer answers. The doc comments and DESIGN.md are updated. Lawrence's spring and perf design is unchanged: one layout pass, one spring from the key's frame, terminals resize at the spring's start, no extra apply or topology (PaneCloseApplyTests).

Tests (fleet)

New in PaneCloseMotionTests:

  • aColumnsOnlyPaneLeavesWithItsColumnInTheKeysTurn: chat dock + two columns, close the right column's only pane. In the key's turn: the focus is on p1, p2 is out of the model and has no host, c1's width is final (1.0), and p1's target is final. p1 grows in the first frame and lands on that target.
  • theDaemonsEchoesOfAColumnCloseChangeNothingOnScreen: the emptied-column echo and then the column-closed echo retarget nothing. One width intent goes, after the tree lost the column.
  • aRefusedColumnCloseBringsTheColumnAndItsWidthsBack
  • homesColumnBesideThePinnedDockLeavesInTheKeysTurn (pinned dock stays alone)
  • theColumnsLeftTakeTheDaemonsShapeInTheKeysTurn (lone column → splits; docks with no scrolling column scroll again)
  • aColumnCloseSetsItsFinalLayoutInTheKeysTurn (the measurement below)
  • aPaneWithNoSiblingLeavesWithTheDaemonsTree is renamed to theScreensLastPaneLeavesWithTheDaemonsTree. Its old strip.close("p1") == nil assertion pinned the behaviour this PR changes.

New in PaneCloseControllerTests, through the real WorkspaceContentController, its pane controllers, its focus coordinator and the store's echoes (review: the first tests bypassed the coordinator and only had one pending close):

  • theFocusGoesToTheLeftColumnsMostRecentPane: a left column [p1, p3] with p3 the most recently focused. Closing the right column focuses p3, and the echo keeps it there.
  • theFocusFollowsTheCloseFocusSetting(policy:expected:): three columns, focus history c13 then c12, close c12. With previousNeighbor the focus goes to p1; with mostRecent it goes to p3. The echo keeps it.
  • With a chat dock plus three columns at 1/3 under fitScreen, close c13 then c12 before either reply, then:
    • overlappingClosesKeepTheirWidthsThroughOrderedEchoes: c11 stays at 1 through both echoes, and one c11=1 intent goes, after the last echo.
    • overlappingClosesKeepTheirWidthsThroughOutOfOrderEchoes: the same, with c12's echo arriving first.
    • aRefusedSecondCloseBringsBackTheFirstClosesWidths: c11 = c12 = 0.5, and those widths go out once, at the first close's echo.
    • aSecondCloseRefusedAfterTheFirstLandedSendsTheFirstClosesWidths
    • aRefusedFirstCloseLeavesTheSecondClosesWidths: c11 = c13 = 0.5.
  • Re-review interleavings:
    • aCloseBeforeTheLastClosesWidthsAreAcknowledgedOwnsTheWidths: c13 closes and its echo lands, which sends c11 = c12 = 0.5. Before the daemon acknowledges those, c12 closes. c11 takes width 1 in that key's turn and keeps it through the acknowledgement and c12's echo. Fix: a shown close under fit-screen drops the sent, unacknowledged width overrides of the columns it resizes or removes (supersedeSentWidths).
    • aRefusedLaterCloseInOneChainKeepsTheEarlierClosesRatios: p1 | p2 | p3 | p4 in one chain; p4 closes, then p3. p3's close is refused while p4's is pending. The chain keeps p4's close sizing (s1 1/3, s2 1/2), not the daemon's quarters, until p4's echo; then the ratios go out once.
    • overlappingClosesInOneChainLandingInOneSnapshotEndEven: p4 then p3 close, and both echoes arrive in one snapshot. The chain ends even (s1 1/2), and one split:1=0.5 intent goes.
    • overlappingClosesInOneChainKeepTheirRatiosThroughTheirEchoes: both closes accepted. s1 stays at 1/2 through both echoes, and one split:1=0.5 intent goes, after the last echo.
    • aBackgroundCloseLeavesNoHiddenPaneForTheNextClosesFocus: columns A/B/C with C focused. B closes in the background, then C closes before B's echo. The focus goes to A, never to the hidden B, and the coordinator and the layout agree through both echoes. Fix: every shown close, focused or not, takes its pane out of the coordinator's held topology.

The tab half of the coordinator's spec (closing one tab of several switches the selected tab and content at once) already holds on base. prepareClose applies the strip and selection synchronously, and the tween runs on the dying cell only. No change there.

  • Red on base (62b3f90, tests only): fleet step ee074cdcc65962f6dd0adda3. The 6 new tests fail (close("p2") → nil, finalAt → 12, focusAt → 12) and the 11 existing ones pass.
  • Review fixes, red (0cee0a3: the new controller tests on top of the first fix): fleet step 593e762fce7a8f92a74e60ef. Every new controller test fails as the review described, with no crash:
    • With two overlapping closes, the first echo resized c11 to 0.5 and sent c11=0.5 while a close was still pending, then c11=1.0 (ordered and out-of-order echoes alike).
    • A refused second close left c11 at 1/3.
    • A refused first close left c11 at 1 and c13 at 1/3.
    • The focus went to pane:1 instead of the most recent pane:3, and mostRecent was ignored.
  • Review fixes, green (c2299b2): fleet step 795306b0d0707baef2bf235d. All 11 suites pass: PaneCloseControllerTests, PaneCloseMotionTests, PaneCloseApplyTests, PaneCloseCanvasTests, ColumnCloseMotionTests, ColumnCloseScrollMotionTests, FocusMoveRingFlashTests, EarlyTerminalGridTests, TerminalPaneMotionFinalGridTests, PaneBurstMotionTests, PinnedHomeDockTests. The click-to-final-layout measurement is unchanged (final target at frame 0, focus at frame 0, at rest at frame 39).
  • Re-review fixes, red (b8e20f3: the two new tests on top of c2299b2): fleet step 60595d023ccfe0b5ec377a6d.
    • c11 stays at 0.5 until the older widths' reply, and the acknowledgement keeps it at 0.5.
    • The coordinator still holds the hidden B, and the focus goes to pane:2.
  • Re-review fixes, green (6560305): fleet step b78042f8f194db6ee0995428. All 11 suites pass, and the measurement is unchanged.
  • Split-chain fix, red (e096969: the two chain tests on top of 6560305): fleet step e041f624ac855211c3ec75fb.
    • The refusal lost p4's sizing: s1 fell back to 0.25.
    • With both closes accepted, the first echo resized s1 to 1/3 and sent split:1=0.3333 and split:2=0.5 while a close was pending, then split:1=0.5.
  • Split-chain fix, green (c641532): fleet step ac54fb17b6e44be12390822b. All 11 close suites pass, and the measurement is unchanged. The step also listed two suite names that do not exist (SplitSizingTests, EvenSplitRatiosTests, 0 tests); those are not failures of this change. The real split and divider suites ran in step ce540458657f542f1e019bcf: SplitSpringMotionTests, SplitTerminalResizeCountTests, HiddenScreenMotionTests, DropPreviewLandingParityTests, BonsplitDropParityTests, DividerClickKeepsRatioTests, RowCloseMotionTests and HomeChiefPaneUncloseableTests all pass.
  • One-snapshot fix, red (9b336fc: the new test on top of c641532): fleet step 14b3c1028966b489659e7b85. s1 stayed at the daemon's 0.25 and no ratio intent was sent.
  • One-snapshot fix, green (39e4c0e): fleet step 80dc1346f7123b17d932287e. All 19 suites pass (the 11 close suites and the 8 split and divider suites), and the measurement is unchanged.
  • First round, green (bb73e2b): fleet step b18f6b4d5c7705e0120985d3 (PaneCloseMotionTests plus the neighbouring close, column, grid and burst suites): all 10 suites pass: PaneCloseMotionTests, PaneCloseApplyTests, PaneCloseCanvasTests, ColumnCloseMotionTests, ColumnCloseScrollMotionTests, FocusMoveRingFlashTests, EarlyTerminalGridTests, TerminalPaneMotionFinalGridTests, PaneBurstMotionTests, PinnedHomeDockTests.

Click to final layout (same harness, 120 Hz frames, daemon echo at 100 ms)

aColumnCloseSetsItsFinalLayoutInTheKeysTurn, closing the right column:

final target width of the left column focus on the left column emptied column on screen
before (base) frame 12 (the echo, ~100 ms; later under daemon load) frame 12 until the echo, showing the tab's close tween
after frame 0 (the key's turn) frame 0 never

Measured: base column close: final target at frame 12, focus at frame 12, at rest at frame 50; this PR column close: final target at frame 0, focus at frame 0, at rest at frame 39. Click to final layout and focus goes from 12 frames (100 ms, the echo) to 0. Click to rest goes from 50 to 39 frames (417 ms to 325 ms).

Risk

Medium-low and contained to a column's only pane in showPaneClose. If the local projection disagrees with the daemon's tree, the echo retargets once, the same as before this PR. A refused close (for example the daemon's dock-column-pinned) brings the column and its widths back. Not covered: a column with rows (still left to the daemon), and a refused close's superseded sent ratios or widths (one echo, as above). If a close that superseded sent widths is refused, the daemon's older widths show until those sent widths are acknowledged (one echo).

Before/after captures

Fleet builds: before = merge base 3e70949 (job 6ce5631fb42aa8dc2af25461), after = this PR's head c2299b2 (job 67c05afa75bef6a8111beb88). Capture minis cmux12s (before) and cmux8s (after). Steps: a terminal workspace, New Column, then Cmd-W on the right column's only tab. The window was recorded every display frame around the key (debug.new_tab frame_strip, half scale). The frames are the app's own composited window, and their text was checked for private data.

ms after Cmd-W Before (3e70949) After (c2299b2)
~15 / ~12 (the frame before the close shows) before 15 ms after 12 ms
~35 / ~36 before 35 ms after 36 ms
at rest (~62 ms on base) before rest (same as 36 ms)

Before: at 35 ms the emptied right column is back on screen. It has only its tab strip and no content, and the left column hasn't grown, because the column waits for the daemon's tree. The layout settles only at ~62 ms, after a one-frame flash at 25 ms. After: the next frame (36 ms) is already the final layout, with the left column taking the full width and no emptied column at any point.

On an idle capture mini the daemon answers in ~20-60 ms, so the before window is short here. It grows with daemon load, as the test numbers above show (frame 12 = 100 ms with the echo at 100 ms). Close Pane was not recorded separately: on the base build, a Close Pane of the right column in the agent-chats layout was refused (dock-column-pinned), and in this terminal layout it takes the same path as Cmd-W.

Stills after the steps (settled):

Before After
Light before light after light
Dark before dark after dark

Agent session: huge-blue

🤖 Generated with Claude Code

teamleaderleo and others added 2 commits October 25, 2026 15:45
… the key's turn (red)

Leo 2026-10-25: "closing the right pane seems be like... waiting for the right tab's closing
animation to PLAY before closing...? we should never block shit on the tab animation".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…the key's turn

The right column's only pane stayed, empty, until the daemon's tree without it came back, while its
strip played the tab's close tween; then the column left. showPaneClose now hides the column in the
key's turn as cmux-tui leaves it (project_layout_columns, normalize_dock_columns), holds the
fit-screen widths the close leaves under the close's transaction, and moves the focus to the nearest
column on the left, else the right (close-focus.md). A refused close brings it all back.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@cursor

cursor Bot commented Oct 25, 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 Author

Owned by rail-opus-01 on huge-blue · session

@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 25, 2026
@blacksmith-sh

blacksmith-sh Bot commented Oct 25, 2026 •

Copy link
Copy Markdown

Found 8 test failures on Blacksmith runners:

Failures

Test View Logs
/tmp/tmp8o6ooa56/summary-fail.json (live):/summary-fail.json (live): View Logs
/tmp/tmpff6uq0jk/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

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-31aqy created for this PR by the cmux coordinator.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next fast gates / post cmux-next/fast-gates is red on 18 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 added a commit that referenced this pull request Oct 25, 2026
…loses, through the controller (red)

Review of #25163: the optimistic focus must be the focus reducer's pick (layout.closeFocus, the
window's history), and overlapping closes under fit-screen must keep their widths through ordered
and out-of-order echoes and refusals, sending them once.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
teamleaderleo added a commit that referenced this pull request Oct 25, 2026
…erlapping column closes keep their widths

Review of #25163 (gpt-6-astra):
- The focus a close moves in the key's turn came from the layout's first pane of the sibling or the
  column on the left, sent as an explicit focus, so it ignored layout.closeFocus and the window's
  history and the echo never corrected it. PaneController.showPaneClose now sends the held focus
  topology without the pane; the focus reducer picks the successor as for any close.
- Column widths of shown closes are derived, not held per close: daemon widths, then widths of
  closes that landed while another was pending, then each pending close in order with the fit-screen
  sizing it leaves. Echoes in any order and refusals show what the closes still pending leave; the
  widths go to the daemon once, when the screen's last pending close resolves.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

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

Review 39e4c0e: 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=pr25163 -f ref=rail-opus-close-instant -f platform=macos -f backend_mode=local

@teamleaderleo
teamleaderleo force-pushed the rail-opus-close-instant branch from 633f849 to 6e6a72d Compare October 25, 2026 23:21
teamleaderleo added a commit that referenced this pull request Oct 25, 2026
…loses, through the controller (red)

Review of #25163: the optimistic focus must be the focus reducer's pick (layout.closeFocus, the
window's history), and overlapping closes under fit-screen must keep their widths through ordered
and out-of-order echoes and refusals, sending them once.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
teamleaderleo added a commit that referenced this pull request Oct 25, 2026
…erlapping column closes keep their widths

Review of #25163 (gpt-6-astra):
- The focus a close moves in the key's turn came from the layout's first pane of the sibling or the
  column on the left, sent as an explicit focus, so it ignored layout.closeFocus and the window's
  history and the echo never corrected it. PaneController.showPaneClose now sends the held focus
  topology without the pane; the focus reducer picks the successor as for any close.
- Column widths of shown closes are derived, not held per close: daemon widths, then widths of
  closes that landed while another was pending, then each pending close in order with the fit-screen
  sizing it leaves. Echoes in any order and refusals show what the closes still pending leave; the
  widths go to the daemon once, when the screen's last pending close resolves.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
teamleaderleo and others added 2 commits October 25, 2026 16:27
…loses, through the controller (red)

Review of #25163: the optimistic focus must be the focus reducer's pick (layout.closeFocus, the
window's history), and overlapping closes under fit-screen must keep their widths through ordered
and out-of-order echoes and refusals, sending them once.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…erlapping column closes keep their widths

Review of #25163 (gpt-6-astra):
- The focus a close moves in the key's turn came from the layout's first pane of the sibling or the
  column on the left, sent as an explicit focus, so it ignored layout.closeFocus and the window's
  history and the echo never corrected it. PaneController.showPaneClose now sends the held focus
  topology without the pane; the focus reducer picks the successor as for any close.
- Column widths of shown closes are derived, not held per close: daemon widths, then widths of
  closes that landed while another was pending, then each pending close in order with the fit-screen
  sizing it leaves. Echoes in any order and refusals show what the closes still pending leave; the
  widths go to the daemon once, when the screen's last pending close resolves.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

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

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next fast gates / post cmux-next/fast-gates is red on 20 of 23 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 and others added 2 commits October 25, 2026 17:24
…nowledged, and a background close then a focused one (red)

Re-review of #25163: an earlier close's sent widths still override a later close until their reply,
and a background close leaves its hidden pane in the focus topology for the next close to pick.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…kground close updates the focus topology

Re-review of #25163 (gpt-6-astra):
- A shown close under fit-screen drops the sent, unacknowledged width overrides of the columns it
  resizes or removes (an earlier close's flush): they applied after the closes in overlaid and held
  the survivor at the older width until their reply.
- Every shown close, focused or not, takes its pane out of the focus coordinator's held topology,
  so a later close of the focused pane before the first close's echo never picks the hidden pane.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
teamleaderleo and others added 2 commits October 25, 2026 17:57
…ir ratios through a refusal and their echoes (red)

Re-review of #25163: split overrides are keyed by split only, so a later close in the same chain
overwrites an earlier close's ratio, and its refusal drops it while the earlier close is pending.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ending close, in show order

Re-review of #25163 (gpt-6-astra): split overrides were keyed by split only, so overlapping closes in
one chain overwrote each other's ratios and a refused later close dropped the earlier close's while it
was still pending. A shown close no longer holds ratio overrides: overlayingPaneCloses derives each
pending close's even ratios against the layout before it, as for the fit-screen widths; ratios of
shown closes that land while another is pending wait in landedCloseRatios and go to the daemon once,
when the screen's last pending close resolves (flushLandedCloseSizes). A close supersedes sent,
unacknowledged ratios of the splits it resizes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

high-signal review link / link is red on 19 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.

teamleaderleo and others added 2 commits October 25, 2026 18:25
…emon snapshot end even (red)

Re-review of #25163: when both closed panes leave in one snapshot, each one's sibling is gone too, so
no landed ratio is recorded and the chain falls back to the daemon's unequal ratios.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… one by one, in show order

Re-review of #25163 (gpt-6-astra): noteLandedCloses took each landed close's sizing against the final
tree, where an adjacent closed pane's sibling is gone too, so it recorded nothing. It now removes the
landed panes one by one in show order from a running tree, each sizing what the one before left,
as the overlay showed them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@teamleaderleo
teamleaderleo merged commit c3cbea8 into feat-cmux-next Oct 26, 2026
151 of 166 checks passed
@teamleaderleo
teamleaderleo deleted the rail-opus-close-instant branch October 26, 2026 01:59
@github-actions

Copy link
Copy Markdown
Contributor

Shipped in:

This branch was previously deployed

1 inactive deployment
ci-routing-agent — 39e4c0e3 Deployed Oct 26, 2026 by teamleaderleo via namespace autofix #2855
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