Repository navigation
cmux NEXT model picker: compact like Claude Code's menu (as wide as its rows), one tab per harness pinned - #30194
Conversation
… close to the name; gallery widths and Leo's routes rail Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-3cf6bed67d0bb92a21bd
|
cmux status (one comment, edited in place; each line is updated by the job that owns it) Review App of this head (app.zip, kept 1 day)
Gallery before/after for
States
Pick other states with a Unclear: CI failed on
Failures:
Matched log linesNot re-run automatically: Written by red: cmux-next checks (god files, concurrency, crash safety, l10n); no finished base run on cefc64e to compare; do not merge until green; see lane-rules Shipped in:
|
|
Found 9 test failures on Blacksmith runners: Failures
|
… stable to every tab Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-3cf6bed67d0bb92a21bd
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-3cf6bed67d0bb92a21bd
…dth (#25796) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-3cf6bed67d0bb92a21bd
…er narrows it Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-3cf6bed67d0bb92a21bd
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-3cf6bed67d0bb92a21bd
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-3cf6bed67d0bb92a21bd
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-3cf6bed67d0bb92a21bd
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-3cf6bed67d0bb92a21bd
|
Review (subagent claude-opus-5-5 medium): SHIP at dca8c99 The full review at 8169d24 was a SHIP. The ResizeObserver lifecycle is correct: it disconnects on unmount, the next open gets a fresh node, and it cannot loop. Follow-ups:
|
…eed run Base 762fda7 (after #30652 and #30194) adds center-line violations to the folded-run, queued-from-agent, hover-fade and incoming-message states; the base replay cannot excuse them until base has the checker, so they join the baseline rows from gallery-health run 41322226213. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a
…#31124) In the compact fit menu (#30194) a short searched row's middle falls on its effort item, which sits over the row and takes the click, so react-apps-check shard (7) timed out clicking 'Sonnet 5.5'. Agent-Session: https://cmux.com/deeplink/agent?id=aid-25f47763ee5347118457 Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…30256) * gallery health: gate layout shift on load and every play step (element boxes per frame) WIP: baseline seeded in a following commit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * gallery: shift scenarios play Codex folds and the debug load_seed history; document the shift gate Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * gallery health: check the design specs' geometry rules from the DOM of every state Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * gallery-matrix: write shift rows from the worst seeding run A state that shifts in some runs got a 0 row when rows were written from the least run, and would then fail unrelated PRs on its flaky runs. Review follow-ups 2 and 3 on #30250. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * gallery: older-history waits on a boolean (typecheck) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * gallery-matrix: seed shift-baseline.json from two gallery-health runs Rows from the worst of #30250's two full gallery-health runs (0ac1691 and a17daa5): 2763 states, 561 with a non-zero row. A state at 0 now fails on any shift; the rest fail past their row by a quarter. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * gallery: a wait step never fails a play; gallery health scores its shift The webview suite found that measuring waitFor as a step made existing plays fail on what they wait for: the header PR button arriving (header-tools), the mention list opening (composer-mention), the composer controls settling (narrow-layouts). A wait now goes unjudged in judgeStep, for shift, anchor moves, long frames and settle. Its shift is still measured and scored against the state's row in gallery health's shift baseline. Test: bun test test/gallery-shift.test.ts. The new case fails on the previous head and passes here. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * gallery: say a wait step still gets the popup-layer check Review follow-up on #30250. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * gallery: smooth zero-row shift limit, copy-proof violation keys, listboxes only in popups Three review follow-ups on #30256, fixed before the geometry baseline is seeded so its keys do not bake them in: - Every shift row's limit now adds LIMIT_SLACK (0.0005), a 0 row's included. A 0 row was ten times stricter than a tiny row, at the level where frame timing alone scores. - Violation keys use the row id, data-id, data-value, value or aria-label before an element's text, so a copy-only PR does not rename a listed violation. Plain generated ids are never used. - A listbox counts as a menu only inside a popover or dialog, so pane-wide list panels do not trip menu-fit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * gallery-matrix: reseed shift rows from three runs, seed geometry rows Shift rows are rebuilt from the worst of three full gallery-health runs: the two on #30250 and this PR's run at 92c5bb5 on base 593b25f. That gives 2843 states, 608 of them non-zero. Base moved after the first seed, and one flaky state, model-picker#quick-search-field-opencode (0.0024 to 0.0081 across renders), came out as this PR's own red. Geometry rows come from that run: 2841 states, 345 with listed violations. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * Gallery geometry baseline: add the violations base gained since the seed run Base 762fda7 (after #30652 and #30194) adds center-line violations to the folded-run, queued-from-agent, hover-fade and incoming-message states; the base replay cannot excuse them until base has the checker, so they join the baseline rows from gallery-health run 41322226213. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * Shift baseline: motion.sync-list#inserts-from-second-client row 0.0059 The insert from a second client animates the list rows into place; three seed runs scored 0, gallery-health run 41327725064 scored 0.0059 on the Replay click. A real insert moves rows, so its row is that run's score. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * Gallery baselines: seed shift rows from the worst of five full runs Full renders (this PR changes scripts/gallery-matrix) kept turning up states that shift in some runs and in every attempt of that run (guest-page.waiting#decided, artifact-panel#svg, settings-menus#customized), so three seed runs were not enough. Shift rows are rebuilt from scratch as the worst score of the three seed runs plus gallery-health runs 41322226213 and 41335560293; geometry rows gain the 3 keys the last run saw. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ays) (#30265) * gallery health: gate layout shift on load and every play step (element boxes per frame) WIP: baseline seeded in a following commit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * gallery: shift scenarios play Codex folds and the debug load_seed history; document the shift gate Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * gallery health: check the design specs' geometry rules from the DOM of every state Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * gallery: real-shaped recorded Claude and Codex chats (anonymized replays) Leo, 2026-11-01: "how about like the apparatuses for improving ui verification? let's examine what we can do better for our workflows". anonymize-recording.ts turns an acpmux session recording into a fixture with none of its words (same lengths, line breaks and punctuation; fake ids, fixed epoch). agent-pane.recorded-chats replays the #30176 Claude turn and a real Codex turn steered by agent inbox messages through the pane's own client, so gallery health's shift and geometry checks see real-shaped chats. Tests: bun test test/gallery-anonymize-recording.test.ts (2 pass). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * gallery-matrix: write shift rows from the worst seeding run A state that shifts in some runs got a 0 row when rows were written from the least run, and would then fail unrelated PRs on its flaky runs. Review follow-ups 2 and 3 on #30250. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * gallery: older-history waits on a boolean (typecheck) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * gallery-matrix: seed shift-baseline.json from two gallery-health runs Rows from the worst of #30250's two full gallery-health runs (0ac1691 and a17daa5): 2763 states, 561 with a non-zero row. A state at 0 now fails on any shift; the rest fail past their row by a quarter. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * gallery: a wait step never fails a play; gallery health scores its shift The webview suite found that measuring waitFor as a step made existing plays fail on what they wait for: the header PR button arriving (header-tools), the mention list opening (composer-mention), the composer controls settling (narrow-layouts). A wait now goes unjudged in judgeStep, for shift, anchor moves, long frames and settle. Its shift is still measured and scored against the state's row in gallery health's shift baseline. Test: bun test test/gallery-shift.test.ts. The new case fails on the previous head and passes here. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * gallery: say a wait step still gets the popup-layer check Review follow-up on #30250. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * gallery: smooth zero-row shift limit, copy-proof violation keys, listboxes only in popups Three review follow-ups on #30256, fixed before the geometry baseline is seeded so its keys do not bake them in: - Every shift row's limit now adds LIMIT_SLACK (0.0005), a 0 row's included. A 0 row was ten times stricter than a tiny row, at the level where frame timing alone scores. - Violation keys use the row id, data-id, data-value, value or aria-label before an element's text, so a copy-only PR does not rename a listed violation. Plain generated ids are never used. - A listbox counts as a menu only inside a popover or dialog, so pane-wide list panels do not trip menu-fit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * gallery-matrix: reseed shift rows from three runs, seed geometry rows Shift rows are rebuilt from the worst of three full gallery-health runs: the two on #30250 and this PR's run at 92c5bb5 on base 593b25f. That gives 2843 states, 608 of them non-zero. Base moved after the first seed, and one flaky state, model-picker#quick-search-field-opencode (0.0024 to 0.0081 across renders), came out as this PR's own red. Geometry rows come from that run: 2841 states, 345 with listed violations. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * Gallery geometry baseline: add the violations base gained since the seed run Base 762fda7 (after #30652 and #30194) adds center-line violations to the folded-run, queued-from-agent, hover-fade and incoming-message states; the base replay cannot excuse them until base has the checker, so they join the baseline rows from gallery-health run 41322226213. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * Shift baseline: motion.sync-list#inserts-from-second-client row 0.0059 The insert from a second client animates the list rows into place; three seed runs scored 0, gallery-health run 41327725064 scored 0.0059 on the Replay click. A real insert moves rows, so its row is that run's score. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * Gallery baselines: seed shift rows from the worst of five full runs Full renders (this PR changes scripts/gallery-matrix) kept turning up states that shift in some runs and in every attempt of that run (guest-page.waiting#decided, artifact-panel#svg, settings-menus#customized), so three seed runs were not enough. Shift rows are rebuilt from scratch as the worst score of the three seed runs plus gallery-health runs 41322226213 and 41335560293; geometry rows gain the 3 keys the last run saw. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * anonymize-recording: keep each event's kind in its typed output The scrubbed rest is typed through Omit of an index-signature type, which drops the required kind, so the merge with base failed the webviews type check (TS2741). The kind is a protocol word the scrubber keeps; set it from the event. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
Leo, 2026-11-01: "i also don't like the way this composer has so much space between stuff surely we can get more compact horizontally" / "see claude code has that" / "we have too many harnesses because you didn't put those things into accounts or whatever"
Spec:
design/model-picker.md(checklist 1 and new 21, teamleaderleo/leo-workspace PR onlane/design-model-picker-compact).What changes
.acpmux-quick-railed, from fix(next): size model picker to available content #26615), and its width probe measured every model of every harness, Legacy lists included. So the keys and the effort sat far from short names like "Opus 5.5".fit), as Claude Code's menu is. The probe leaves out Legacy models and adds the star and ⌘N columns.routes-one-tab,routes-account, and "one tab per harness: Claude and Codex routes are Account choices, never tabs".Gallery (
new-tab.quick-model-menu): 4 versions,fitpickedwidth-fit(picked; closest to Claude Code's)width-stable(every tab's rows)width-snug(tighter columns, 360px cap)width-wide(before)Before (
width-wide, dark) and after (width-fit, dark and light):Leo's rail, eight entries folded into four tabs, and its Account submenu with the routes:
Viewed after image: yes. Visual verdict: SHIP. The fit menu reads like Claude Code's: effort, star and ⌘N sit right after the names, with no empty band, and one mark per harness.
Tests
quick-model-menu-layout: 22 pass, including the two new ones and "harness controls keep their position while each direction follows visible content".model-menu-compact,QuickModelMenuandmodel-menu-started-chat-fork: 105 pass. vp fmt and vp lint are clean.Risk
Small: the compact menu's CSS width and its width probe, plus one ResizeObserver whose cleanup is the rail's ref callback (it disconnects when the rail unmounts or the menu closes).
Agent session: agent session
🤖 Generated with Claude Code