Skip to content

cmux NEXT menus: one row grid for every menu, and a lint for menus with their own paddings - #24295

Merged
teamleaderleo merged 15 commits into
feat-cmux-nextfrom
cmux/menu-metrics
Oct 29, 2026
Merged

teamleaderleo merged 15 commits into
feat-cmux-nextfrom
cmux/menu-metrics

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 22, 2026 •

Copy link
Copy Markdown
Collaborator

Leo, 2026-10-21, forwarding two screenshots from Lawrence: "lawrence sent this... idk if we genearlized the left alignment across all stuff yet". Then, on the sidebar's profile menu: "left alignment on the profile settings dropdown/pop i think is similar...".

What the screenshots show (described here; the images stay private):

  • Sidebar group ⋮ menu (New Workspace in Group, Pin Group, Options, Collapse Group, Move to Top, Move, Ungroup, Close All in Group, Delete Group, Close Other Groups): the hover highlight and the separators look flush to the menu's left edge.
  • Pane [+] menu (New Terminal Tab … Split Right, Toggle Pane Zoom, Search Tabs…, Show in Tab Bar ›): the highlight and separators are inset, and "Show in Tab Bar" has no icon but its text lines up with the iconed rows.
  • Profile menu (sidebar footer avatar): the current profile's small avatar is the only image in the menu, and AppKit pushed that row's "Default" to the right of every other row's text.

cmux NEXT had no shared menu grid. A survey found nine menu surfaces using about seven different grids:

  • highlight insets 4, 5, 6, 8 and 12 pt;
  • text columns anywhere from 12 to 44 pt;
  • separators at 0, 6, 8, 10, 12, 14 pt or AppKit's own.

Nothing checked them.

This PR, the first of three:

  • One source: schemas/menu-metrics/menu-metrics.json is the row grid of every menu: highlight inset and radius, separator inset, state, icon and text columns, and the shortcut column. scripts/cmux-next/gen-menu-metrics.py writes it into MenuMetrics.generated.swift and the --cmux-menu-* CSS tokens in desktop.css (the same pattern as the motion and type scales). --check runs in the cmux-next checks job.

  • The values are native macOS menu metrics (the same values cmux NEXT menus: right-click menu rows keep native macOS metrics #24036 adopted for themed rows, Leo on the chat menu: "so much ... padding ... all over the place"):

    • a row's icon, or its title in a menu without icons, starts at 15 pt, where AppKit's separators start;
    • 14 pt icons, then the title at 35;
    • a state column only in a menu with a checkmark (mark at 10, icon at 22);
    • the highlight 5 pt in, radius 5;
    • shortcuts and chevrons right-aligned 12 pt from the edge.
  • Every themed NSMenu (right-click, ⋮, the pane [+], the toolbar menus, the palette's NSMenus) reads it through ThemedMenuRowView. Icon-less rows' text sits on the text column whenever any row of the menu has an icon.

  • The name and color header (workspace and group menus) sits on the grid: the field's box on the rows' highlight edge, the first swatch on the icon column.

  • The profile menu is themed in the sidebar's scope like the other sidebar menus, so the avatar sits on the icon column and every row's text starts at one x.

  • A lint: scripts/cmux-next/check-menu-metrics.py fails any menu surface (a Swift menu, popup or picker row, item, header, strip or style type, or an editor row) that declares its own horizontal metric, draws its highlight at its own inset, or places a row part at its own x. The surfaces not on the grid yet are listed in its DEBT set, which only shrinks:

    • the sidebar and tab group editors;
    • the palette actions menu;
    • native page popups (PopupRowView, WebPopupHost, PopupStyle);
    • the extensions bubble.

    The second PR (cmux/menu-metrics-panels) moves those and empties the list. The third (cmux/menu-metrics-web) moves the webviews' menus (ui/Menu, the agent pane's context and project menus, the composer menus) onto the CSS tokens and adds the CSS half of the lint. The composer's quick model menu (QuickModelMenu.tsx, modelPicker.css) belongs to another lane and is left out.

Icon and text x, before and after (pt from the menu's edge)

Measured on the captures below (first ink pixel from the menu's border; glyph side bearing adds about 1-2 pt to the layout x), and on the layout by MenuGridTests:

Surface Before: icon / text After: icon / text
Sidebar group menu (right-click or ⋮) ink 24 / 45 ink 17 / 36 (layout 15 / 35)
Pane [+] (new tab) menu ink 23 / 45 ink 16 / 36 (layout 15 / 35)
Empty tab-strip menu (Split Right, Search Tabs…, Show in Tab Bar ›) ink 23-24 / 45 ink 16 / 36 (layout 15 / 35)
All other themed NSMenus (registry menus) layout 22 / 44 layout 15 / 35; 22 / 42 with a checkmark
Name + color header field 12, first swatch 15 field 5 (highlight edge), first swatch 15 (icon column)
Profile menu AppKit's own menu: "Default" text at 36, other rows at 18 (no icons) avatar ink 16, every row's text at ink 37
Highlight inset / separators (themed NSMenus) 5 / 15 5 / 15 (unchanged; now read from the grid)
Sidebar group editor (PR 2) 14 / 34-36 15 / 35
Tab group editor (PR 2) – / 20 – / 15
Palette actions menu (PR 2) 12 / 38-40 15 / 35
Page popups (PR 2) check 18.5 / 26 10 / 22
Web ui/Menu, agent pane menus (PR 3) 12 / 12-30 15 / 35

The highlight and separators of the themed NSMenus already sat at 5 and 15 pt, so in these captures only the icon and text columns move. The profile menu before is AppKit's own menu, so that pair also differs in glass and row height; after, it is themed like every other sidebar menu. The glass is unchanged.

Capture: fleet builds of the head fbe2687820a8 (job c6cee7ed4d465766e881f5b6) and of the base 139966bc8efe (job c1bad6975a96), driven on a capture mini. Light appearance, with the menus' glass as drawn. The sidebar, pane [+] and tab-strip menus are cmux-ci capture window snapshots, and the mini's text check found nothing private in them. The profile menu blocks the app's snapshot call while it is open, so its two stills are screen grabs from a capture slot, cropped to the app's window.

Sidebar group menu (right-click on the "cmux-next app" header)

Before After
group menu before group menu after

Sidebar group menu, highlight on the first row (Down once)

Before After
group menu highlight before group menu highlight after

Pane [+] (new tab) menu

Before After
plus menu before plus menu after

Empty tab strip menu (Split Right, Search Tabs)

Before After
strip menu before strip menu after

Sidebar footer profile menu

Before After
profile menu before profile menu after

Leo-ask: ask-8c953bd096
Leo-ask: ask-63bba70b57 (the menu half; the git repo detection half is with agent-message-style)

Changelog

Changed: Menus line up the same way everywhere: icons in one column, names in the next, shortcuts on the right.

Observed / Not run

  • Observed:
    • gen-menu-metrics.py --check, check-menu-metrics.py (passes; fails on a scratch fixture with a menu row's own titleX, NSRect(x: 3 and insetBy(dx: 5), and prepush-gate.py (clean).
    • Before/after captures of the group, group-highlight, [+], empty-strip and profile menus from fleet builds of the base 139966bc8efe and fbe2687820a8 (the head before the lint-only commit fe42235c), measured above.
    • check-menu-metrics.py self-test (4 must-fail, 4 must-pass examples, including multiline NSRect, constraint and insetBy cases) and the full run: 141 menu surface files on the grid, 7 in DEBT.
    • Codex (xhigh) review: FIX at 47fcda49 (surface discovery and one-line scanning in the lint), fixed in fe42235c.
  • Not run here: the fleet run of MenuGridTests, ThemedMenuTests, MenuIdentityHeaderTests, SidebarMenuLookTests, ActionSurfaceParityTests and ProfileMenuTests is queued; the PR's own CI runs the CmuxNext suites.
  • I could not reproduce Lawrence's flush highlight on the group menu in a real build: at base it already sat 5 pt in.

Follow-up at fec559a (review BLOCK at 8591d00)

Right-click menus went native on the base since the captures above (e01bdd4694c, Lawrence: "make sure our right click stuff context menu is standard macos ... we don't want ANYTHING custom besides the icons"), so cmux no longer draws its own menu rows. This head keeps rows native and puts them on the grid through their icons:

  • NSMenu.themeRows(in:) fits every ordinary row's image into the grid's square icon box (MenuMetrics.iconSize, 14 pt, shape kept, template and VoiceOver description kept, a second theming changes nothing). AppKit's one image column is then the grid's in every menu, and the profile menu's larger avatar no longer pushes the text column right.
  • MenuGridTests measures native rows (no custom row view, every icon in the grid's box) instead of the removed ThemedMenuRowView; a new test covers the fit.
  • "Menu metrics" joins the workflow's STYLE_CHECKS, so a red lint warns like the other style guards.
  • check-menu-metrics.py no longer flags the menu bar status icon (MenuBarIcon) or the Mac screen switch's knob inset, both new on the base and not menu rows.
  • Observed: MenuGridTests (7) and NativeContextMenuTests (5) pass on a fleet Mac at fec559a (cmux-ci step a9baf938903d53df5c712eeb); both lint scripts pass.

No capture: the captures above predate the native-menu switch on the base; at this head the only visible change is that a menu icon larger than 14 pt (the profile avatar) is drawn in the 14 pt box.

Agent session: agent session

🤖 Generated with Claude Code

teamleaderleo and others added 4 commits October 21, 2026 22:37
…a lint for menus with their own paddings, and the profile menu on it

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15c08-98d9-7e82-ac8f-c5e8f40c3cab&host=cosmic-gray
… 15, a state column only with a checkmark, 14 pt icons)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15c08-98d9-7e82-ac8f-c5e8f40c3cab&host=cosmic-gray
…; a state column only in a menu with a checkmark

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15c08-98d9-7e82-ac8f-c5e8f40c3cab&host=cosmic-gray
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Owned by context-menus on cosmic-gray · session

@teamleaderleo

teamleaderleo commented Oct 22, 2026 •

Copy link
Copy Markdown
Collaborator Author

Owned by an agent session · took over from an earlier session · session

@teamleaderleo teamleaderleo added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 22, 2026
@github-actions

github-actions Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

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

Review fc2d495: 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=pr24295 -f ref=cmux/menu-metrics -f platform=macos -f backend_mode=local

Unclear: web / react-apps-check failed: no known signature; failed step: Check webview test shards.

CI failed on fc2d495ae0 (run 40895030150 attempt 1): 1 code, 1 unknown.

Job Verdict Why
web / react-apps-base-check (4) code a web test failed
web / react-apps-check unknown no known signature; failed step: Check webview test shards

Failures:

  • seen on other PRs inspector-section-order-browser.test.tsx Session Info's six-dot handles > every section has one: failed (job)
  • seen on other PRs markdown-table-obsidian.test.ts markdown tables (webkit) > a drag across cells selects text from the press to the pointer, not whole...: failed (job)
Matched log lines
web / react-apps-base-check (4): (fail) Session Info's six-dot handles > every section has one [0.59ms]

Not re-run automatically: web / react-apps-base-check (4), web / react-apps-check are not machine failures.

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.

red: cmux-next checks (god files, concurrency, crash safety, l10n); base red: the same failure on the base 400cb08; does not block
red: web / Web status; base red: the same failure on the base 400cb08; does not block
red: web / react-apps-base-check (4); no finished base run on 400cb08 to compare; do not merge until green; see lane-rules
red: web / react-apps-check; base red: the same failure on the base 400cb08; does not block

Gallery before/after for fc2d495: 16 states rendered, 4 images differ, 1880 more touched states not rendered. Images are in the run's artifact, not on this public PR.

gh run download 40895030245 -R manaflow-ai/cmux -n gallery-advisory-24295-fc2d495ae0b05209ab240fa45fd0e4c59e17799b (then read gallery-review.json)

States
State Theme Status Diff Picked by
pages.agent-activity/empty Apple System Colors Light unchanged 0% own desktop.css
pages.agent-activity/empty Apple System Colors unchanged 0% own desktop.css
pages.agent-activity/split Apple System Colors Light unchanged 0% own desktop.css
pages.agent-activity/split Apple System Colors unchanged 0% own desktop.css
pages.agent-activity/split-earlier-frame Apple System Colors Light unchanged 0% own desktop.css
pages.agent-activity/split-earlier-frame Apple System Colors unchanged 0% own desktop.css
pages.agent-activity/split-no-frames Apple System Colors Light unchanged 0% own desktop.css
pages.agent-activity/split-no-frames Apple System Colors unchanged 0% own desktop.css
pages.agent-activity/timeline Apple System Colors Light unchanged 0% own desktop.css
pages.agent-activity/timeline Apple System Colors unchanged 0% own desktop.css
pages.agent-activity/grid Apple System Colors Light unchanged 0% own desktop.css
pages.agent-activity/grid Apple System Colors unchanged 0% own desktop.css
pages.agent-activity/grid-viewer Apple System Colors Light unchanged 0% own desktop.css
pages.agent-activity/grid-viewer Apple System Colors unchanged 0% own desktop.css
agent-pane.add-project-panel/environment Apple System Colors Light unchanged 0% host-stylesheet desktop.css
agent-pane.add-project-panel/environment Apple System Colors unchanged 0% host-stylesheet desktop.css
agent-pane.add-project-panel/sources Apple System Colors Light unchanged 0% host-stylesheet desktop.css
agent-pane.add-project-panel/sources Apple System Colors unchanged 0% host-stylesheet desktop.css
agent-pane.add-project-panel/directory Apple System Colors Light unchanged 0% host-stylesheet desktop.css
agent-pane.add-project-panel/directory Apple System Colors unchanged 0% host-stylesheet desktop.css
agent-pane.add-project-panel/keyboard Apple System Colors Light unchanged 0% host-stylesheet desktop.css
agent-pane.add-project-panel/keyboard Apple System Colors unchanged 0% host-stylesheet desktop.css
agent-pane.addressed-message/relayed Apple System Colors Light unchanged 0% host-stylesheet desktop.css
agent-pane.addressed-message/relayed Apple System Colors unchanged 0% host-stylesheet desktop.css
agent-pane.agent-message-row/sent Apple System Colors Light changed 0.0237% host-stylesheet desktop.css
agent-pane.agent-message-row/sent Apple System Colors changed 0.0224% host-stylesheet desktop.css
agent-pane.agent-message-row/lanes Apple System Colors Light unchanged 0% host-stylesheet desktop.css
agent-pane.agent-message-row/lanes Apple System Colors unchanged 0% host-stylesheet desktop.css
agent-pane.agent-message-row/sent-subagents Apple System Colors Light unchanged 0% host-stylesheet desktop.css
agent-pane.agent-message-row/sent-subagents Apple System Colors unchanged 0% host-stylesheet desktop.css
agent-pane.agent-message-row/sent-hover Apple System Colors Light changed 0.0252% host-stylesheet desktop.css
agent-pane.agent-message-row/sent-hover Apple System Colors changed 0.0232% host-stylesheet desktop.css

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

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Bead cx-6laah created for this PR by the cmux coordinator.

@blacksmith-sh

blacksmith-sh Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

Found 10 test failures on Blacksmith runners:

Failures

Test View Logs
/tmp/tmpnjd6of6r/summary-fail.json (live):/summary-fail.json (live): View Logs
/tmp/tmpr3fq_x6a/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
test/inspector-section-order-browser.test.tsx/inspector-section-order-browser.test.tsx View Logs
test/inspector-section-order-browser.test.tsx/inspector-section-order-browser.test.tsx View Logs
test/markdown-table-obsidian.test.ts/markdown-table-obsidian.test View Logs
test/markdown-table-obsidian.test.ts/markdown-table-obsidian.test View Logs

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

…grid; the sidebar themes the profile menu (no CmuxNextApp growth); the highlight links the shortcuts docs

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15c08-98d9-7e82-ac8f-c5e8f40c3cab&host=cosmic-gray
@cursor

cursor Bot commented Oct 22, 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.

…pressions split over lines

Codex review of #24295: surface discovery skipped menus named only *Menu
(BrowserDownloadsMenu) and the rules read one line at a time. The rules now
run over the whole file, and every run first checks them against examples
they must fail and pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15c08-98d9-7e82-ac8f-c5e8f40c3cab&host=cosmic-gray
@cursor

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

Orphaned: no activity for 14 h, and no lane holds a lease on it. The orphan sweep could not merge feat-cmux-next in: conflicts in Packages/macOS/CmuxNext/Sources/CmuxNextDesign/ThemedMenuRowView.swift. Listed for a lane to resolve.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6-astra xhigh, next-review): SHIP at fe42235

No blocking findings.

The metrics consistency check and lint self-tests pass. macOS tests and the full-repository lint could not be verified from this partial snapshot.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6-astra high, next-review): SHIP at 9544e64

No blocking findings.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex-review-box/gpt-6-astra high, lane-place): SHIP at 2a20673

SHIP

No blocking findings. Both menu-metrics checks pass. AppKit build and runtime tests could not run in this Linux box.

@teamleaderleo teamleaderleo removed the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 29, 2026
@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 29, 2026
… note

The commit reached the branch without a Sidebar-Look: trailer; the note's
log is how such a commit is reviewed once (prepush-gate sidebar_owner).

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

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6-astra high, review-router): SHIP at fc2d495

Scope: the follow-up delta 2a20673..fc2d495 (sidebar owner note logs 350b65e); the earlier SHIP covered 2a20673.

The log truthfully describes the supplied sidebar diff: showProfileMenu now applies themeRows(in: host.themeScope.fullStrength).
The entry includes the correct 11-character SHA and links to the matching full commit.
This documentation-only delta changes no product behavior or tests and uses the gate’s established logging mechanism without weakening it.
No bug or flake risk identified in this delta.

Agent session: agent session

@teamleaderleo
teamleaderleo merged commit 6c1a5ab into feat-cmux-next Oct 29, 2026
200 of 210 checks passed
@teamleaderleo
teamleaderleo deleted the cmux/menu-metrics branch October 29, 2026 18:47
@github-actions

github-actions Bot commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

@lawrencecchen

lawrencecchen commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

The "Sidebar look owner sweep" step of the cmux-next checks names this PR's commit on feat-cmux-next. It scans every commit since 342462c, so every PR's checks print this line (job 123695447456 on #27454):

6c1a5ab8bf3 cmux NEXT menus: one row grid for every menu, and a lint for menus wit (Packages/macOS/CmuxNext/Sources/CmuxNextSidebar/Views/SidebarFooterBand.swift): no `Sidebar-Look:` trailer. Add `Sidebar-Look: <the user's words>` (and edit plans/cmux-next/sidebar-owner.md) or `Sidebar-Look: no visual change`.

The commit has landed, so a trailer is no longer possible. The fix is an entry for 6c1a5ab in plans/cmux-next/sidebar-owner.md. A question for Leo, the author: what text should the entry have? Your words for the look, or "no visual change". This is an ##[error] line, not a red check, so it blocks nothing.

@lawrencecchen

Copy link
Copy Markdown
Contributor

Why your entry is waited for: #27634 makes the "Pushed commits add no violations" step fail when the sidebar sweep finds a commit with no record. Today the step never fails, because its pipe has no pipefail. Without an entry for 6c1a5ab in plans/cmux-next/sidebar-owner.md, every push run of feat-cmux-next would go red. So #27634 is held, without ready-to-land, until your entries for 4367c16 and 6c1a5ab are in. Pull request runs already show this commit only as a warning (#27632).

teamleaderleo added a commit that referenced this pull request Oct 30, 2026
4367c16 (#24073), 6c1a5ab (#24295) and eb8105b (#27561)
reached feat-cmux-next as squash merges without a Sidebar-Look trailer;
their branch commits are already logged in sidebar-owner.md.

Sidebar-Look: no visual change

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-8ac862c5f65d08f98445
teamleaderleo added a commit that referenced this pull request Oct 30, 2026
…for the Sidebar-Look sweep

The CI sweep from 342462c names 4367c16, 6c1a5ab and
eb8105b: base's squash merges of PRs whose branch commits are
already logged. Log them by their squash sha.

Sidebar-Look: no visual change
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-8ac862c5f65d08f98445
teamleaderleo added a commit that referenced this pull request Oct 30, 2026
…bar-Look trailer (#28326)

4367c16 (#24073), 6c1a5ab (#24295) and eb8105b (#27561) reached
the base branch without a Sidebar-Look: trailer, so the sidebar owner sweep in
cmux-next checks fails every PR whose merge includes them. Logging their shas
in sidebar-owner.md is the gate's documented path for such a commit
(prepush-gate.py sidebar_owner: "reviewed once instead of failing every later
sweep").


Agent-Session: https://cmux.com/deeplink/agent?id=aid-159afad10a5ab45ea16c

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
lawrencecchen added a commit that referenced this pull request Oct 31, 2026
…mmits stay errors (#27632)

* test(prepush-gate): a pull request's sidebar sweep warns on a base commit and errors on its own

Red on the base: prepush-gate.py has no --own-range ('unrecognized arguments').
On 2026-10-29 two feat-cmux-next commits without a Sidebar-Look record (#24073,
#24295) put an ##[error] on every pull request's cmux-next checks, and
next-autoland read it as the PR's own red (#27454 and four more PRs).

* ci(cmux-next): a pull request's sidebar sweep names a base commit as a warning; its own commits stay errors

The "Pushed commits add no violations" step sweeps every commit since
342462c for a Sidebar-Look record. On a pull request run it printed
::error for base commits too: 4367c16 (#24073) and 6c1a5ab (#24295)
put an error on every feat-cmux-next pull request's checks, and next-autoland
read that line as the PR's own red, so #27454 and four more PRs stayed held.

prepush-gate.py --own-range BASE..HEAD (the sweep only): a finding on a commit
inside the range is an ::error and fails the sweep as before; one on a commit
outside it is a ::warning that names the commit and plans/cmux-next/sidebar-
owner.md. cmux-next.yml passes --own-range HEAD^1..HEAD on pull request runs
only. A push sweep of feat-cmux-next is unchanged: every commit without a
record is still an error there, so the base's debt stays visible on the branch.

risk_tier.py classify: normal. Test: test_cmux_next_prepush_gate's new case fails
on the base and passes; the whole file passes (40 tests).

* ci(cmux-next): own-range on pull_request runs only; the warning carries the whole finding (review of #27632)

A workflow_dispatch run (feat-cmux-next, next-batch/*, a PR branch) checks out a
branch tip, not GitHub's merge commit, so HEAD^1..HEAD there is the tip commit
only: the != push test turned the branch's own debt into warnings. Now
== pull_request, as the app-FFI pin step tests. The warning text is the whole
finding, % and newlines escaped for the workflow command.
cmux-bot Bot added a commit that referenced this pull request Oct 31, 2026
* test(sidebar): cover fold accessibility activation

Exercise Done and Show more through AXPress, including row reuse and hidden rows. Native execution is pending the fleet route; this lane has no Swift compiler.

Agent-Session: https://cmux.com/deeplink/agent?id=aid-75c97562a83401f2d167

* fix(sidebar): let VoiceOver activate Done and Show more

Route AXPress through the same fold action as mouse clicks, rebind the callback when rows are reused, and reject hidden or stale fold elements. Native red/green execution is pending the fleet route.

Sidebar-Look: no visual change
Agent-Session: https://cmux.com/deeplink/agent?id=aid-75c97562a83401f2d167

* test(sidebar): isolate recycled fold view from live registry

Sidebar-Look: no visual change
Agent-Session: https://cmux.com/deeplink/agent?id=aid-75c97562a83401f2d167

* test: cover keyboard activation of sidebar disclosure rows

Agent-Session: https://cmux.com/deeplink/agent?id=aid-c24cb66e0a77ead34e65

* fix: include sidebar disclosure rows in keyboard walk

Agent-Session: https://cmux.com/deeplink/agent?id=aid-c24cb66e0a77ead34e65

* test: use key codes for disclosure navigation events

Agent-Session: https://cmux.com/deeplink/agent?id=aid-c24cb66e0a77ead34e65

* fix: stabilize keyboard disclosure focus and tests

Agent-Session: https://cmux.com/deeplink/agent?id=aid-c24cb66e0a77ead34e65

* test(sidebar): a fold reload or click elsewhere drops the old fold's focus

Covers the two Sol findings on #27961: a removed disclosure that comes back
must not bring back its ring, and a click on another disclosure must move
keyboard focus off the ringed one so Space acts on the clicked row.

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

* fix(sidebar): move fold focus to a clicked disclosure

A click on Done or Show more left keyboard focus and its ring on the
disclosure the keyboard had reached, so the next Space or Return toggled
that one. The click now moves focus to the clicked disclosure without a
ring (as a click on a group header does), and a fold row draws its ring only
when the keyboard moved focus there.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-8ac862c5f65d08f98445
Sidebar-Look: no visual change

* docs(sidebar): log the fold keyboard commits for the Sidebar-Look sweep

89e3362 and cefa3bc reached the branch without a Sidebar-Look
trailer; both are behavior changes that draw only the existing keyboard
focus ring on a fold row.

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

* docs(sidebar): log base's squash commits of #24073, #24295 and #27561 for the Sidebar-Look sweep

The CI sweep from 342462c names 4367c16, 6c1a5ab and
eb8105b: base's squash merges of PRs whose branch commits are
already logged. Log them by their squash sha.

Sidebar-Look: no visual change
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-8ac862c5f65d08f98445

* test(sidebar): a tab click must take keyboard focus off a disclosure

Red test for the review finding: after the keyboard focuses Show more,
a click on a tab row leaves focusedFold set, so Return or Space still
toggles the old disclosure.

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

* fix(sidebar): a click on a tab or any other row takes focus off a disclosure

The .tab mouse-down selected the tab but left focusedFold (and a clicked
group header's focus) set, so Return or Space toggled the old disclosure
and the arrows walked on from it. Every row kind but a group header or a
disclosure now clears the keyboard focus on press, as workspace and item
clicks already did: tab, section, empty section, empty group, folder,
block and status rows.

Sidebar-Look: no visual change

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

* test(sidebar): drop the tab-row fold test; base deleted sidebar tab rows

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

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: cmux-bot[bot] <348531757+cmux-bot[bot]@users.noreply.github.com>

This branch was previously deployed

1 inactive deployment
ci-routing-agent — fc2d495a Deployed Oct 29, 2026 by teamleaderleo via namespace autofix #6290
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