Skip to content

Agent chat: a lone Chromium chat's toolbar hole paints the chat's surface (#33261) - #33407

Merged
teamleaderleo merged 4 commits into
feat-cmux-nextfrom
lane/ux-header-rect
Nov 3, 2026
Merged

teamleaderleo merged 4 commits into
feat-cmux-nextfrom
lane/ux-header-rect

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Nov 3, 2026 •

Copy link
Copy Markdown
Collaborator

Leo (2026-11-03, on the nightly): "latest nightly still not fixed yet?", then "i mean the rectangle near the buttons".

Fixes #33261.

What changes

A chat alone in its pane paints its own surface (appearance.surfaces.agentPane) across the whole tab row (header.css, .acpmux-shell[data-tab-row][data-solo-tab], from #33142). In Chromium the chat is a window above the pane that cuts a hole for the pane's toolbar (AgentPaneTabRow.nativeHoles). That hole showed the pane's own shade, so a block of another colour sat beside the chat's tools.

The chat now gives the pane the colour its page paints there:

  • PaneTabRowSharing.tabRowHoleFill returns it, worked out by AgentPaneTabRow.holeFill.
  • offerTabRow fills the toolbar with it after each offer.

The fill is a plate that starts below the window's lit top rim (PaneTabRowRim.height, 1 pt). #33346 leaves that rim uncovered across the chat's tools, and the plate keeps it unbroken over the toolbar too.

There is no fill with tabs shown, because the page leaves the row clear then. There is none on WebKit either, because the page sits under the toolbar and already paints there. A clear page colour (glass) gives no fill, and leaving the row or switching to non-chat content clears it. A theme change lays the pane out again, which offers the row again and reads the colour anew. Nothing changes behind the tools themselves, and the toggled Session Info plate is untouched.

Scope

This covers the one-tab Chromium case that #33261 describes. In a pane with two or more tabs the page is clear across the whole row (#32944), so nothing paints behind the tools that differs from the strip, and this PR leaves that path alone.

Relation to the nightly report

Leo's capture shows the window's top rim breaking into a flat line where the header tools begin. #33346, which landed while this was in flight, fixes that: the page now leaves the rim uncovered over the tools. This PR fixes the other rectangle in that row, the toolbar block in a lone Chromium chat that has its own colour (#33261), and keeps #33346's rim intact over the toolbar.

Tests

  • AgentPaneTabRowHolesTests.aLoneChromiumChatsToolbarHolePaintsThePagesSurface checks the fill matrix: lone tab in Chromium, tabs shown, WebKit, out of the row, and a clear page.
  • AgentPaneTabRowHolesTests.aLoneWebKitChatPaintsNoToolbarHole checks that a shared page host on WebKit gets no fill.
  • AgentPaneTabRowHolesTests.aLoneChromiumChatHandsThePaneItsSurfaceForTheToolbar checks that the chat's fill follows its own theme scope and that the fill is dropped when the row ends.
  • TabRowToolsStayClickableTests.theToolbarPaintsTheChatsHoleFill checks that the pane's toolbar takes the fill below the 1 pt rim, keeps its own background clear, and goes clear again.

Design spec: design/chat-header.md (the row reads as one surface behind the tools).

Agent session: agent session

🤖 Generated with Claude Code

…face, so the row is one surface

Alone in its pane a chat paints its own surface (appearance.surfaces.agentPane) across the whole
tab row (header.css [data-solo-tab], #33142). In Chromium the chat is a window above the pane that
leaves the pane's toolbar a hole (AgentPaneTabRow.nativeHoles), where the pane's own shade showed: a
block of another colour beside the tools. The chat now hands the pane the colour its page paints
there (PaneTabRowSharing.tabRowHoleFill, AgentPaneTabRow.holeFill), and the toolbar fills its frame
with it. With tabs shown the page leaves the row clear and on WebKit the page is under the toolbar:
no fill. Fixes #33261.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Nov 3, 2026
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6.1-sol xhigh, router-review): BLOCK at 2ebf589

BLOCK at 2ebf589
Visual verdict: no images; Leo tries the build

  1. [P1] [blocking] AgentPaneTabRowHolesTests.swift:106: AgentPaneView gains its PaneTabRowSharing conformance in CmuxNextApp, which this test target neither imports nor depends on. These view.tabRowHoleFill accesses therefore do not compile. Assert view.model.tabRow.holeFill here, or test the conformance in the app target.

  2. [P1] [blocking] TabRowToolsStayClickableTests.swift:161: The fixture never assigns pane.toolbar. PaneContentView leaves it nil, so this new test always fails at #require. Install a PaneToolbar before settling the layout.

  3. [P1] [blocking] AgentPaneTabRow.swift:77: view.page != nil identifies the shared host, which also supports WebKit. With WebKit selected and a translucent chat surface override, the page already paints beneath the toolbar; this additional fill darkens that rectangle, regressing the existing WebKit appearance. Gate on the actual Chromium engine and cover shared-host WebKit in the integration test.

Swift/AppKit checks could not run here because the box has no Swift toolchain.

Follow-ups:

  1. [P2] [follow-up] PaneContentView.swift:229: Verify the toolbar visually in Leo’s build; no after screenshots were supplied.

…e shared host; tests fixed

Review of #33407: the shared page host also runs WebKit, where the page already paints under the
toolbar, so the fill now keys on chromiumPage. The AgentPane tests read the model's fill (the
conformance is the App's), a WebKit host test covers no fill, and the App test installs a toolbar.

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

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6-astra high, router-review): BLOCK at cb22a60

BLOCK at cb22a60
Visual verdict: no images; Leo tries the build

  1. [P1] [blocking] Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/AgentPaneTabRow.swift:77 — The // comment swallows shares: shares, tabsShown: row.tabsShown,. The call therefore omits two required arguments and prevents compilation. Move the comment above the call and restore both arguments.
  2. [P2] [follow-up] review/images/README.txt:2 — No after screenshots are available. Verify the toolbar fill visually in the build.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex, router-review): SHIP at 8a2f84f

Reviewer: codex gpt-6-astra high, fast tier.

Follow-ups: 1. Each lands as an issue in this repo that links this receipt; the lane that opened the PR fixes it forward.

SHIP at 8a2f84f
Visual verdict: no images; Leo tries the build

No correctness regressions found in the layout, theme, or fill-clearing paths. AppKit tests could not run in this Linux box.

  1. [P2] [follow-up] Packages/macOS/CmuxNext/Sources/CmuxNextApp/PaneContentView.swift:229: No after screenshots were supplied; verify the toolbar colour and theme switching in the macOS build.

Follow-ups:

  • Verify the toolbar visually on macOS (finding 1).

@cmux-bot cmux-bot 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.

cmux-bot approves 8a2f84f: an independent review passed this exact head (router-review receipt by teamleaderleo). A push needs a new review; a later BLOCK at this head dismisses this approval.

…ll (#33346)

#33346 leaves the row's top point uncovered across the chat's tools so the window's lit rim runs
unbroken. The toolbar's fill is now a plate below that rim (PaneTabRowRim.height, shared with
AgentPaneTabRow.rimHeight) instead of the view's background, and the App test checks it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
@teamleaderleo teamleaderleo added the leo-named-fix An obvious fix to something Leo named: lands on push, review runs in parallel label Nov 3, 2026
@github-actions

github-actions Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

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

Review 4b243b6: 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=pr33407 -f ref=lane/ux-header-rect -f platform=macos -f backend_mode=local

red: cmux-next checks (god files, concurrency, crash safety, l10n); NEW: red check: Script tests (pin-cmux-tui, embed-cef, ensure-cef store) (+1 more) is not red on the base ee31e42; do not merge until green; see lane-rules

Shipped in:

The feat-cmux-next push run https://github.com/manaflow-ai/cmux/actions/runs/41619934635 at 092736d failed: cmux-next fleet Release compile.
Those jobs last passed at 8cc02ce. This pull request is one of 5 merged since: #33578, #33567, #33411, #33407, #33405.
If the failure is in your change, fix forward on feat-cmux-next. Pull requests run only the tiers their paths reach (docs/ci/cmux-next-tiers.md); label a batch PR full-ci to run them all before merging.

@blacksmith-sh

blacksmith-sh Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

Found 9 test failures on Blacksmith runners:

Failures

Test View Logs
/tmp/tmpk0r7e09_/summary-fail.json (live):/summary-fail.json (live): View Logs
/tmp/tmpkirqwnqn/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
convention violations found (ERROR lines above)./
convention violations found (ERROR lines above).
View Logs
the snapshot was not derived on the tip from the landed exports: schema old/
the snapshot was not derived on the tip from the landed exports: schema old
View Logs
the snapshot was not derived on the tip from the landed exports: schema old/
the snapshot was not derived on the tip from the landed exports: schema old
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

Review (codex, router-review): SHIP at 4b243b6

Reviewer: codex gpt-6-astra high, fast tier.

Follow-ups: 1. Each lands as an issue in this repo that links this receipt; the lane that opened the PR fixes it forward.

SHIP at 4b243b6
Visual verdict: no images; Leo tries the build

No correctness regression found in the code review. AppKit tests could not run in this Linux box.

  1. [P2] [follow-up] Packages/macOS/CmuxNext/Sources/CmuxNextDesign/PaneTabRowSharing.swift:121: No screenshots verify the native fill. Check the built app for matching toolbar color and an uninterrupted top rim.

Follow-ups:

  • [P2] [follow-up] Verify the toolbar fill and rim visually on macOS.

@cmux-bot cmux-bot 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.

cmux-bot approves 4b243b6: an independent review passed this exact head (router-review receipt by teamleaderleo). A push needs a new review; a later BLOCK at this head dismisses this approval.

@teamleaderleo
teamleaderleo merged commit 767e4d0 into feat-cmux-next Nov 3, 2026
185 of 195 checks passed
@teamleaderleo
teamleaderleo deleted the lane/ux-header-rect branch November 3, 2026 10:30
lawrencecchen added a commit that referenced this pull request Nov 3, 2026
…wner-s1-strip-tick

Conflicts, both kept:
- PaneContentView.layout: feat's offerTabRow(..., toolbar:) and the tab-row
  hole paint (#33407), with S1's onResize at the hold's end.
- MotionClock: S2 (#33725) steps the springs by FrameTick.motionElapsed; S1
  keeps that step and sets frameTimestamp from the new
  FrameTick.motionTimestamp (next to motionElapsed): the frame's show time
  (targetTimestamp) with motion.frameOwner.timing on, else the link time, so
  a strip move that starts inside a frame begins on the time base its springs
  step on. With the S2 switch off (its default) it is the link time, as
  before this merge.
teamleaderleo added a commit that referenced this pull request Nov 4, 2026
* cmux NEXT: remove the dead lone-tab solo row code

#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

* webviews: drop the double blank line the solo gallery removal left

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

* webviews: one-line the rail-foot variant list the formatter wants

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

---------

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

This branch was previously deployed

1 inactive deployment
ci-routing-agent — 4b243b62 Deployed Nov 3, 2026 by teamleaderleo via wait for same-key tree publisher #105271
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