Skip to content

cmux NEXT: remove the dead lone-tab solo row code - #34392

Merged
teamleaderleo merged 4 commits into
feat-cmux-nextfrom
lane/lone-tab-dead-code
Nov 4, 2026
Merged

teamleaderleo merged 4 commits into
feat-cmux-nextfrom
lane/lone-tab-dead-code

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Nov 4, 2026 •

Copy link
Copy Markdown
Collaborator

Leo (2026-11-03): "i think you guys are currently hiding it completely when there's only the one tab... but i think that's just too alien of a look"

#34327 made a pane's tab strip show at every tab count, so the pane always offers the row with its tabs shown. The code that existed only for a hidden lone tab (#33132, the page's solo layout in #33142, and the toolbar hole fill of #33261/#33407) no longer runs. This removes it; no behaviour changes.

Removed:

  • PaneTabRowSharing.setTabRowTabs(shown:), tabRowHoleFill, the tabs: and toolbar: parameters of offerTabRow, and NSView.paintTabRowHole (with tabs always shown the fill was always nil, so the toolbar plate was never painted). The protocol default, PaneTabRowForwarding and the AgentPaneView conformance lose them too.
  • AgentPaneTabRow.tabsShown, holeFill, soloTab in offered and the tabRow event, and nativeHoles(tabs:). The window-rim hole from Agent chat: the window's lit top rim runs unbroken over the header tools in the tab row #33346 stays.
  • TabStripModel.holdsOneTab, TabStripView.laidOutOneTab, layOutPaneIfOneTabChanged.
  • webviews: soloTab in header/tabRow.ts, the [data-solo-tab] CSS, VirtualTranscript and ThreadMinimap topInset, and header/underHeader.ts. Its record only decided whether the solo transcript could run up under the row; the lines it gated render on the same conditions as before Agent chat: a one-tab pane has no tab-row band; the chat runs up under the tab and its buttons #33142. The solo gallery variants and the one-tab case in thread-rail-foot-card.test.ts go too.
  • Tests: AgentPaneTabRowSoloTests, TabStripHoldsOneTabTests, the tabsShown and hole-fill cases in AgentPaneTabRowHolesTests, chat-header-solo-tab.test.ts, under-header-lines.test.ts (its App.tsx string check was already stale on base), and theToolbarPaintsTheChatsHoleFill.

Test: theStripShowsAtOneHeightWhateverItsTabCount now checks what is on screen. At 0, 1 and 2 tabs, the strip and its + are shown inside the pane, there is one tab cell per tab, the centre of each tab and of + resolve to .strip, and a point past + resolves to .empty (the titlebar). The strip's frame stays the same across the counts.

Risk: low. This is a removal; only dead branches and their tests are deleted.

Agent session: agent session

🤖 Generated with Claude Code


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


Summary by cubic

Removes the dead lone-tab solo row code. #34327 made a pane's tab strip show at every tab count, so the code that hid a lone tab and ran the transcript up under the row (#33132, #33142, #33261/#33407) no longer runs. Pure removal; no behavior change.

Removed

  • Native: setTabRowTabs(shown:), the tabs:/toolbar: offer parameters, tabRowHoleFill and paintTabRowHole, holdsOneTab and layOutPaneIfOneTabChanged, and soloTab in the tabRow event. The window-rim hole stays.
  • Web: the soloTab flag, [data-solo-tab] CSS, transcript and minimap topInset, and the underHeader gating record. The lines it gated still render on their own conditions.
  • The dead tests for the above. theStripShowsAtOneHeightWhateverItsTabCount now asserts the strip, its +, and one tab cell per tab are on screen at 0, 1, and 2 tabs.

Written for commit c514479. Summary will update on new commits.

View guided diff Turn on auto-fix

#34327 made a pane's tab strip show at every tab count, so the pane always
offers the row with its tabs shown. The code that followed a hidden lone tab
(#33132, #33142, #33261/#33407) no longer runs:

- PaneTabRowSharing.setTabRowTabs(shown:), offerTabRow(tabs:toolbar:),
  tabRowHoleFill and NSView.paintTabRowHole (the hole fill was nil whenever
  tabs show); AgentPaneTabRow.tabsShown, holeFill, soloTab in the tabRow
  event, nativeHoles(tabs:) (the rim hole stays)
- TabStripModel.holdsOneTab, TabStripView.laidOutOneTab and
  layOutPaneIfOneTabChanged
- the page's soloTab: header/tabRow.ts, [data-solo-tab] CSS, VirtualTranscript
  and ThreadMinimap topInset, header/underHeader.ts and its gating record,
  the solo gallery variants
- AgentPaneTabRowSoloTests, TabStripHoldsOneTabTests, the tabsShown parts of
  AgentPaneTabRowHolesTests, chat-header-solo-tab.test.ts,
  under-header-lines.test.ts, theToolbarPaintsTheChatsHoleFill

theStripShowsAtOneHeightWhateverItsTabCount now asserts what is on screen:
the strip and + in the pane at 0, 1 and 2 tabs, a tab cell per tab, each
tab's and +'s centre resolve to .strip, and the space past + to .empty.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-ed9226b71907d8aaa0b6
@github-actions

github-actions Bot commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

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

Review c514479: 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=pr34392 -f ref=lane/lone-tab-dead-code -f platform=macos -f backend_mode=local

Gallery before/after for c514479: 16 states rendered, 0 images differ, 3418 more touched states not rendered. Images are in the run's artifact, not on this public PR; the independent review of this head reads them on its own, so the PR needs no hand-made screenshots of these states.

gh run download 41754453679 -R manaflow-ai/cmux -n gallery-advisory-34392-c5144795ccd35f1673449243124bccc31d67a81c (then read gallery-review.json)

States
State Theme Status Diff Picked by
agent-pane.chat-width/standard Apple System Colors Light unchanged 0% own App.tsx
agent-pane.chat-width/standard Apple System Colors unchanged 0% own App.tsx
agent-pane.chat-width/wide Apple System Colors Light unchanged 0% own App.tsx
agent-pane.chat-width/wide Apple System Colors unchanged 0% own App.tsx
agent-pane.chat-width/wide-blocks Apple System Colors Light unchanged 0% own App.tsx
agent-pane.chat-width/wide-blocks Apple System Colors unchanged 0% own App.tsx
agent-pane.composer-edge/short-edge Apple System Colors Light unchanged 0% own App.tsx
agent-pane.composer-edge/short-edge Apple System Colors unchanged 0% own App.tsx
agent-pane.composer-edge/wide-edge Apple System Colors Light unchanged 0% own App.tsx
agent-pane.composer-edge/wide-edge Apple System Colors unchanged 0% own App.tsx
agent-pane.composer-edge/no-edge Apple System Colors Light unchanged 0% own App.tsx
agent-pane.composer-edge/no-edge Apple System Colors unchanged 0% own App.tsx
agent-pane.composer-floats/scrolled-to-end Apple System Colors Light unchanged 0% own App.tsx
agent-pane.composer-floats/scrolled-to-end Apple System Colors unchanged 0% own App.tsx
agent-pane.composer-floats/composer-grown Apple System Colors Light unchanged 0% own App.tsx
agent-pane.composer-floats/composer-grown Apple System Colors unchanged 0% own App.tsx
agent-pane.composer-rest-gap/gap-40 Apple System Colors Light unchanged 0% own App.tsx
agent-pane.composer-rest-gap/gap-40 Apple System Colors unchanged 0% own App.tsx
agent-pane.composer-rest-gap/gap-56 Apple System Colors Light unchanged 0% own App.tsx
agent-pane.composer-rest-gap/gap-56 Apple System Colors unchanged 0% own App.tsx
agent-pane.composer-rest-gap/gap-72 Apple System Colors Light unchanged 0% own App.tsx
agent-pane.composer-rest-gap/gap-72 Apple System Colors unchanged 0% own App.tsx
agent-pane.continuation-spacing/shipped Apple System Colors Light unchanged 0% own App.tsx
agent-pane.continuation-spacing/shipped Apple System Colors unchanged 0% own App.tsx
agent-pane.continuation-spacing/two-thirds Apple System Colors Light unchanged 0% own App.tsx
agent-pane.continuation-spacing/two-thirds Apple System Colors unchanged 0% own App.tsx
agent-pane.continuation-spacing/half-tucked Apple System Colors Light unchanged 0% own App.tsx
agent-pane.continuation-spacing/half-tucked Apple System Colors unchanged 0% own App.tsx
agent-pane.continuation-spacing/before Apple System Colors Light unchanged 0% own App.tsx
agent-pane.continuation-spacing/before Apple System Colors unchanged 0% own App.tsx
agent-pane.copy-controls/output Apple System Colors Light unchanged 0% own App.tsx
agent-pane.copy-controls/output Apple System Colors unchanged 0% own App.tsx

Pick other states with a Gallery: entry.id, entry.id/variant line in the PR body.

Not verified: macOS jobs did not run: compile and app tests were skipped on c5144795cc; ci-status is green without them.

CI passes on c5144795cc (run 41754453841 attempt 1).
macOS jobs did not run: compile and app tests were skipped: Fast static checks skipped (the macos job needs both to succeed). Re-run CI once they pass, before merging.

Written by scripts/ci/classify_failures.py (ci-failure-attribution.yml); signatures are its SIGNATURES table. A machine verdict is the runner's fault, not this PR's; yours means the failing file is one this PR changes, also red on main that main's latest full suite fails the same way, seen on other PRs that it failed on another pull request's run lately.

web and size checks: green

Shipped in:

@teamleaderleo teamleaderleo added the leo-named-fix An obvious fix to something Leo named: lands on push, review runs in parallel label Nov 4, 2026
@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Nov 4, 2026
@blacksmith-sh

blacksmith-sh Bot commented Nov 4, 2026 •

Copy link
Copy Markdown

Found 43 test failures on Blacksmith runners:

Failures

Test View Logs
/tmp/tmpgbqz8dfp/summary-fail.json (live):/summary-fail.json (live): View Logs
/tmp/tmpjtvrw1qj/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
main.DeveloperIdAppTests.test_download_prints_the_active_profile_only/
test_download_prints_the_active_profile_only
View Logs
convention violations found (ERROR lines above)./
convention violations found (ERROR lines above).
View Logs
stubs: /System/Library/Frameworks/Security.framework/Versions/A/Security has no stub/
Security has no stub
View Logs
stubs: CoreFoundation.tbd: install-name /System/Library/Frameworks/
CoreFoundation.framework/Versions/A/CoreFoundation, missing 1: ['_CFRetain']/
CoreFoundation, missing 1: ['_CFRetain']
View Logs

...and 33 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

Review (subagent opus-5.5 medium): SHIP at 6a3664b

Checked that every removed symbol (setTabRowTabs, tabRowHoleFill, paintTabRowHole, holdsOneTab, laidOutOneTab, soloTab, data-solo-tab, topInset, underHeader) was dead after #34327 and is unreferenced. The App.tsx under-header lines render on the same conditions as before #33142. The rewritten strip test converts coordinates correctly. The earlier BLOCK at 5fe0d1b (a double blank line that would fail vp fmt) is fixed, as is a formatter line in thread-rail-foot-card.test.ts.

Follow-ups: none

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6.1-sol xhigh, router-review): SHIP at 6a3664b
Visual verdict: no images; Leo tries the build

No correctness regressions found in static review. Changed TS/TSX files parse. (router-review job 85a36fd557d63881647de033d7c933e0; its own --post hit the GraphQL quota, so the lane posted the receipt verbatim.)

Follow-ups:

  • [P2] [follow-up] Visually verify the row at 0, 1 and 2 tabs (PaneContentView.swift:223).

…ab-dead-code

# Conflicts:
#	Packages/macOS/CmuxNext/Sources/CmuxNextApp/PaneContentView.swift
@cursor

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

Awareness note from an agent lane that does not own this PR; it is not a review or a request to take the PR over.


From the lone-tab toggle lane (ask-16ddd1693a). Leo at 2026-11-03T23:53Z, verbatim: "also we're restoring the top tab area right? we can put it back, just make it unobtrusive, it's a bit too funky with NO top bar at all plus the general shenanigans that are occuring... maybe you can leave it as an optional toggle feature for now that we can revisit later".

So the lone-tab hide (#33132) stays as an opt-in setting, off by default. #34392 deletes the plumbing it uses (setTabRowTabs, tabsShown/soloTab, tabRowHoleFill/paintTabRowHole, holdsOneTab/laidOutOneTab, the webview soloTab inset). Please do not land #34392: add a HOLD: line or close it with a comment. My PR (branch lane/lone-tab-hide-toggle) re-enables that code behind a setting.

teamleaderleo added a commit that referenced this pull request Nov 4, 2026
…g (carries #34554 onto base) (#34609)

* cmux NEXT: restore the lone-tab plumbing #34392 removed (setTabRowTabs, soloTab inset, hole fill)

Reverts 7d5b1bc (#34392). The opt-in tabs.hideLoneChatTab setting in
the next commit uses it again, so it is no longer dead code.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-872d71802b6013f50e68

* cmux NEXT: Hide the Tab of a Chat Alone in Its Pane, an opt-in setting (tabs.hideLoneChatTab)

Leo (2026-11-03): "also we're restoring the top tab area right? we can put it
back, just make it unobtrusive, it's a bit too funky with NO top bar at all
plus the general shenanigans that are occuring... maybe you can leave it as an
optional toggle feature for now that we can revisit later"

#34327 brought the pane's tab strip back at every tab count. The lone-tab look
of #33132 (a chat alone in its pane hides its tab, the page takes the row) comes
back behind tabs.hideLoneChatTab, off by default, in Settings > General > Tabs,
the palette, `cmux settings` and MCP (agent-settable, looks only). The rule is
TabStripModel.hidesLoneTab (one tab, no group, the setting on); the pane's token
observation lays it out again when it flips, so a second tab or the setting off
brings the strip back. Same App line count.

Test: TabRowToolsStayClickableTests.theLoneTabHidesOnlyWithTheSettingOn.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-5c652a82bacab889e41e

* webviews: the restored under-header test reads the checkpoint gate as base has it now (no diffView)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-872d71802b6013f50e68

* settings: regenerated exports for tabs.hideLoneChatTab (from CI's cmux-next-generated-patch)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-872d71802b6013f50e68

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

This branch was previously deployed

1 inactive deployment
ci-routing-agent — c5144795 Deployed Nov 4, 2026 by teamleaderleo via wait for same-key tree publisher #108573
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

leo-named-fix An obvious fix to something Leo named: lands on push, review runs in parallel risk:normal Risk tier (docs/ci/risk-tiers.md)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant