Skip to content

cmux NEXT composer: remove the bottom-left harness label - #24938

Merged
teamleaderleo merged 2 commits into
feat-cmux-nextfrom
codex/nx-composer-harness-20261024
Oct 25, 2026
Merged

teamleaderleo merged 2 commits into
feat-cmux-nextfrom
codex/nx-composer-harness-20261024

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 24, 2026 •

Copy link
Copy Markdown
Collaborator

Leo's composer ask (2026-10-24):

"the biggest one is why did you guys still not remove the bottom left thing? Like, nobody asked for this, literally. Like, I'm pretty sure you guys got confused with, like, the harness on the left type thing, but it was, like, well, yeah, the harness on the left for the drop-down or whatever, you know, the model picker. It's still, like, awkward as hell here. I don't know what you guys are doing, like showing all the machines on here as well. Like, that's not what the intention was."

This PR handles the first half of that ask: the composer footer no longer renders a harness label or its dedicated CSS/component. The model picker remains the harness-selection surface; the existing machine/location selection is untouched. The gallery fixture and browser assertions now verify the footer has only its mode/model controls and that a new chat opens the model picker rail for harness selection.

Gallery before/after (base feat-cmux-next vs this head): composer gallery compare

Validation:

  • bun run typecheck (webviews): pass.
  • Focused row/footer unit tests: 10 pass.
  • Browser suites are wired and skip locally without the fleet browser lane; the local Chromium probe was inconclusive under host memory pressure (exit 143).
  • bun run check:browser-lanes and targeted vp fmt --check: pass.

The overlap scan reported neighboring draft PRs #24519 and #24391 on shared composer files; neither changes this footer harness removal.

Takes back #24169: remove the obsolete harness footer label while keeping harness selection in the model picker.

Agent session: big-red


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

@github-actions

github-actions Bot commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

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

Review ea00d55: 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=pr24938 -f ref=codex/nx-composer-harness-20261024 -f platform=macos -f backend_mode=local

Unclear: web / react-apps-check failed: no known signature; failed step: Check webview test shards. This PR merged before its CI finished: fix forward on main.

CI failed on ea00d55b17 (run 40148239977 attempt 1): 2 code, 1 unknown.

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

Failures:

  • seen on other PRs claimPaint.test.tsx a pooled Settings page claimed by the host reports its paint once its first screen is in: failed (job)
  • seen on other PRs claimPaint.test.tsx a Settings page loaded fresh reports its first paint once its first screen is in: failed (job)
  • seen on other PRs accent-glass-invariants.test.ts no orange or system accent and no opaque glass on 2022 gallery stages: failed (job)
  • seen on other PRs agent-pane-agents-pill.test.ts by default the running agents sit in the tray above the composer, not in the transcript: failed (job)
  • seen on other PRs agent-pane-background-tasks.test.ts the summary card lists the chat's background tasks: running ones first, the finished folded: failed (job)
  • seen on other PRs agent-pane-queue-collapse.test.ts a long queue > an opened long queue keeps Show less and the focused row in sight, never a half row (...: failed (job)
  • seen on other PRs agent-pane-queue-collapse.test.ts a long queue > an opened queue with a two-line row shows whole rows only, no row under another (capt...: failed (job)
  • seen on other PRs agent-pane-queue-collapse.test.ts a long queue > a folded queue with a long row opened shows only whole rows above the fold (capture, ...: failed (job)
  • seen on other PRs agent-pane-hairline-focus.test.ts composer at 1x: focus is the resting hairline a step brighter, no ring: failed (job)
  • seen on other PRs agent-pane-hairline-focus.test.ts newtab at 1x: focus is the resting hairline a step brighter, no ring: failed (job)
  • ... 6 more in the job logs
Matched log lines
web / react-apps-base-check (2): (fail) a pooled Settings page claimed by the host reports its paint once its first screen is in [184.47ms]
web / react-apps-base-check (1): (fail) composer at 1x: focus is the resting hairline a step brighter, no ring [65.60ms]

Not re-run automatically: web / react-apps-base-check (2), web / react-apps-base-check (1), 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); no finished base run on cb1135a to compare; do not merge until green; see lane-rules

Tour of ea00d55b17 (run): no media. The tour did not run: only webview code changed (12 path(s)), which the gallery advisory run checks in Linux Chromium on the pull request (its artifact holds any captures); add the media-tour-mac label, then re-add media-tour, to tour it on a Mac.

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

gh run download 40148239891 -R manaflow-ai/cmux -n gallery-advisory-24938-ea00d55b176991100ffaabea64e29670a5ec40b6 (then read gallery-review.json)

States
State Theme Status Diff Picked by
agent-pane.composer/new-chat Apple System Colors Light changed 0.146% own ComposerFoot.tsx
agent-pane.composer/new-chat Apple System Colors changed 0.144% own ComposerFoot.tsx
agent-pane.composer/side-session Apple System Colors Light changed 0.0625% own ComposerFoot.tsx
agent-pane.composer/side-session Apple System Colors changed 0.0625% own ComposerFoot.tsx
agent-pane.composer/new-chat-suggest-open Apple System Colors Light changed 0.146% own ComposerFoot.tsx
agent-pane.composer/new-chat-suggest-open Apple System Colors changed 0.144% own ComposerFoot.tsx
agent-pane.composer/new-chat-suggest-failing Apple System Colors Light changed 0.146% own ComposerFoot.tsx
agent-pane.composer/new-chat-suggest-failing Apple System Colors changed 0.144% own ComposerFoot.tsx
agent-pane.composer/new-chat-suggest-draft Apple System Colors Light changed 0.146% own ComposerFoot.tsx
agent-pane.composer/new-chat-suggest-draft Apple System Colors changed 0.144% own ComposerFoot.tsx
agent-pane.composer/new-chat-reasoning Apple System Colors Light changed 0.146% own ComposerFoot.tsx
agent-pane.composer/new-chat-reasoning Apple System Colors changed 0.144% own ComposerFoot.tsx
agent-pane.composer/agent-home Apple System Colors Light changed 0.0625% own ComposerFoot.tsx
agent-pane.composer/agent-home Apple System Colors changed 0.0625% own ComposerFoot.tsx
agent-pane.composer/agent-home-path Apple System Colors Light changed 0.146% own ComposerFoot.tsx
agent-pane.composer/agent-home-path Apple System Colors changed 0.144% own ComposerFoot.tsx
agent-pane.composer-context/closed Apple System Colors Light unchanged 0% own composerLocation.css
agent-pane.composer-context/closed Apple System Colors unchanged 0% own composerLocation.css
agent-pane.composer-context/folder-menu Apple System Colors Light unchanged 0% own composerLocation.css
agent-pane.composer-context/folder-menu Apple System Colors unchanged 0% own composerLocation.css
agent-pane.composer-context/folder-favicons Apple System Colors Light unchanged 0% own composerLocation.css
agent-pane.composer-context/folder-favicons Apple System Colors unchanged 0% own composerLocation.css
agent-pane.composer-context/duplicate-worktrees Apple System Colors Light unchanged 0% own composerLocation.css
agent-pane.composer-context/duplicate-worktrees Apple System Colors unchanged 0% own composerLocation.css
agent-pane.composer-context/duplicate-search Apple System Colors Light unchanged 0% own composerLocation.css
agent-pane.composer-context/duplicate-search Apple System Colors unchanged 0% own composerLocation.css
agent-pane.composer-context/repo-worktrees Apple System Colors Light unchanged 0% own composerLocation.css
agent-pane.composer-context/repo-worktrees Apple System Colors unchanged 0% own composerLocation.css
agent-pane.composer-context/repo-worktrees-open Apple System Colors Light unchanged 0% own composerLocation.css
agent-pane.composer-context/repo-worktrees-open Apple System Colors unchanged 0% own composerLocation.css
agent-pane.composer-context/repo-worktrees-search Apple System Colors Light unchanged 0% own composerLocation.css
agent-pane.composer-context/repo-worktrees-search Apple System Colors unchanged 0% own composerLocation.css

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

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

blacksmith-sh Bot commented Oct 24, 2026 •

Copy link
Copy Markdown

Found 14 test failures on Blacksmith runners:

Failures

Test View Logs
/tmp/tmpff3sjytf/summary-fail.json (live):/summary-fail.json (live): View Logs
/tmp/tmpxmoycipg/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
test_a_branch_that_merges_feat_cmux_next_in_is_judged_on_its_own_changes (main.PreP
ushGateTests.test_a_branch_that_merges_feat_cmux_next_in_is_judged_on_its_own_changes)/
test_a_branch_that_merges_feat_cmux_next_in_is_judged_on_its_own_changes (main.PreP
ushGateTests.test_a_branch_that_merges_feat_cmux_next_in_is_judged_on_its_own_changes)
View Logs
test_a_branch_that_merges_feat_cmux_next_in_is_judged_on_its_own_changes (main.PreP
ushGateTests.test_a_branch_that_merges_feat_cmux_next_in_is_judged_on_its_own_changes)/
test_a_branch_that_merges_feat_cmux_next_in_is_judged_on_its_own_changes (main.PreP
ushGateTests.test_a_branch_that_merges_feat_cmux_next_in_is_judged_on_its_own_changes)
View Logs
test_a_merge_cannot_use_an_upstream_removal_to_pay_for_the_branch_s_own_debt (main.
PrePushGateTests.test_a_merge_cannot_use_an_upstream_removal_to_pay_for_the_branch_s_ow
n_debt)/
test_a_merge_cannot_use_an_upstream_removal_to_pay_for_the_branch_s_own_debt (main.
PrePushGateTests.test_a_merge_cannot_use_an_upstream_removal_to_pay_for_the_branch_s_ow
n_debt)
View Logs

...and 4 more test failures. View all on Blacksmith: run 40148239893, run 40148239986

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

@teamleaderleo teamleaderleo left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Independent read-only review — SHIP

Exact head: 5ea61848849d413defee3025aa41d46fca73efeb against origin/feat-cmux-next (a4d0757b114c0b1d8aa6ee2e0b44527728d7e658).

No P1/P2/P3 user-visible defect found. The diff deletes ComposerHarness and removes only its ComposerPickers wiring, footer CSS, and fit step; ModelPicker remains the harness rail and its onHarness/combo paths are unchanged. Machine selector/layout paths are untouched.

Evidence: targeted row/footer unit tests 10 pass; webview typecheck passes (2622 files); git diff --check passes. Browser suites were attempted with CMUX_BROWSER_TESTS=1 but local Chromium/WebKit were unavailable, so those tests were skipped. Full check/lint were not clean due unrelated pre-existing generated/system warnings outside this diff.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Bead cx-72rs5 created for this PR by the cmux coordinator.

@teamleaderleo
teamleaderleo force-pushed the codex/nx-composer-harness-20261024 branch from 5ea6184 to 319323d Compare October 24, 2026 20:48

@teamleaderleo teamleaderleo left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Independent read-only review: SHIP

Exact head: 319323d7b57603c254099b4aa6b9bd3a59f4bdaf
Base: cb1135a646229cf614e8e1b403ff4b88183c4c45

The cumulative diff removes only the composer’s bottom-left harness label while preserving harness selection in the model-picker rail and leaving machine selection unchanged. Focused unit tests (10), typecheck (2,624 files), and diff check pass. Browser tests registered but were skipped because Chromium/WebKit engines are unavailable on the review host. Full checks stop only on pre-existing base warnings.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (Codex Astra xhigh, correctness first): SHIP at ea00d55

Independent exact-head review against base cb1135a.

  • The footer harness removal is consistent across ComposerPickers, ComposerHarness deletion, CSS, fit logic, gallery fixture, and focused tests.
  • Harness selection remains in the ModelPicker rail; machine/location selection is unchanged.
  • The repair to composer-footer-harness.test.ts recursively traverses the display:contents chip wrapper, so compact-row assertions exercise access/model/context controls.
  • Focused JSDOM checks: 7 pass; browser lanes remain unverified because Chromium/WebKit are unavailable locally.
  • No P1/P2/P3 findings; git diff --check is clean.

@teamleaderleo
teamleaderleo merged commit a4c4d46 into feat-cmux-next Oct 25, 2026
124 of 132 checks passed
@teamleaderleo
teamleaderleo deleted the codex/nx-composer-harness-20261024 branch October 25, 2026 01:07
@github-actions

Copy link
Copy Markdown
Contributor

The feat-cmux-next push run https://github.com/manaflow-ai/cmux/actions/runs/40149382418 at a4c4d46 failed: cmux-next generated files.
Those jobs last passed at c6d2865. This pull request is one of 4 merged since: #25006, #24997, #25011, #24938.
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.

@github-actions

Copy link
Copy Markdown
Contributor

The feat-cmux-next push run https://github.com/manaflow-ai/cmux/actions/runs/40149412279 at 19a5504 failed: cmux-next generated files.
Those jobs last passed at c6d2865. This pull request is one of 5 merged since: #25006, #24997, #25011, #24938, #24942.
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.

@github-actions

github-actions Bot commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

teamleaderleo added a commit that referenced this pull request Oct 25, 2026
Base removed the quiet row's harness label (#24938), so this PR's harness-fit
work is dropped: composer-footer-harness.test.ts takes base's version and the
460 px harness container query goes with it. The quiet row's context ring keeps
base's legacy 4 px rule; composerFooterShared.css's 2 px margin outranks it and
already closes the loose gap.

Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a174e4-2849-7aa2-bd71-289c4ec9e04f&host=huge-blue
teamleaderleo added a commit that referenced this pull request Oct 25, 2026
…ase's row

Base took the harness label out of the quiet row (#24938) and gave the context
affordance one compact size with a 2 px margin (composerFooterShared.css), so:
the row now keeps every whole label down to a 244 px composer (measured on the
fleet: panes 280 and 300 read "Opus 5.5  Medium"), the ring's glyph sits 15 px
after the effort, and the shared focus ring is asserted from the CSS because the
gallery stage loads no pages/shared/desktop.css. composer-app-font also reads
base's new composerFooterShared.css.

Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a174e4-2849-7aa2-bd71-289c4ec9e04f&host=huge-blue
teamleaderleo added a commit that referenced this pull request Oct 29, 2026
… own room (#24151)

* cmux NEXT composer test: the model button is quiet, its bolt is inside it, and the row fits on its room (failing)

Leo 2026-10-21, of #23742's after-shot: "WTF IS THIS UGLY BULLSHIT. WE ALREADY
FIXED THE FONTS. THE BOLT DOESN'T GO THERE." And live-qa on nightly 3a63d6d: a
410 px composer read "Opus Med" with about 250 px of the quiet row free.

- composer-fast-toggle: no harness draws a speed button in the box; Fast mode is
  the model menu's last row for Claude and Codex; a running Codex fast tier is a
  small outline bolt inside the model button, before the name; Claude never
  draws a bolt.
- composer-model-quiet (Chromium, the real composer on the gallery stage): the
  bolt's place and line; no fill, border, ring or outline at rest; the effort a
  step back of the name; keyboard focus a pill and a hairline, not the bright
  ring the capture caught; the context ring's glyph about 8 px after the
  effort on the buttons' center line; the button, its labels and the mode in
  the composer's font; "Opus 5.5  Medium" kept at 410, 324 and 264 px, and
  whole-unit steps with nothing overlapping at 204 and 164 px.
- composer-app-font: the composer names the app's UI font once, no composer
  rule names another family, and the quiet row's buttons inherit it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-99fc-73f0-9482-5a4babfe1b0a&host=cosmic-gray

* cmux NEXT composer: Codex's bolt goes inside a quiet model button; the quiet row fits on its own room

Leo 2026-10-21, of #23742's after-shot ("GPT-6 Astra Medium" in a bright
outline, a bolt in the box by the mic, a loose ring): "WTF IS THIS UGLY
BULLSHIT. WE ALREADY FIXED THE FONTS. THE BOLT DOESN'T GO THERE."

Bolt. FastToggle.tsx (#23742's bolt button left of the mic) and its CSS are
gone, with the five strings only it used. Fast mode is the model menu's last
checkbox row for every harness that offers it, Codex included. While a Codex
fast tier runs, the model button draws a 12 px outline bolt before the model's
name, in the name's ink, and its tooltip says Fast Mode; Claude Code draws no
bolt anywhere. The stale "no bolt in the composer" comments now say no speed
button, and the gallery's reasoning-codex shows the menu's Fast mode row, with
reasoning-codex-fast for the bolt.

Quiet button. The outline in the shot was keyboard focus, not rest: the
gallery's play closed the menu with Esc, which hands focus back to the button,
and the shared ring (desktop.css, 1.5 px at 48%) drew around bare text. At rest
the button already drew no edge. In the quiet row its focus is now the row's
soft pill and a 1 px hairline at 22% (Increase Contrast keeps the shared ring),
the effort sits one step back of the name in every theme, and the context ring
lost its 8 px margin, so its glyph is 9 px after the effort (was 17) on the
buttons' center line.

Fonts. Nothing regressed: the composer names system-ui (SF Pro in the app's
WebKit) since #20374, and #23742 touched no font. The shot came from headless
Linux Chromium, which has no SF Pro and fell back to Liberation Sans for the
whole page. The quiet row's buttons sat outside `.acpmux-composer-box button {
font: inherit }`, so they drew in the engine's control font; they now inherit
the composer's family, and composer-app-font holds it.

Truncation. COMPOSER_FIT_STEPS shortened on the composer's width (#20802's one
row). Since #22285 the quiet row holds only the mode, the model button and the
ring, so its width steps were stale: a 410 px composer read "Opus Med". The
quiet row now takes no width step (paneWidth is unbounded for
.acpmux-composer-foot, and the container queries skip it); useRowFit fits it on
the units' natural widths against the row's measured room, so it keeps
"Opus 5.5  Medium" down to a 264 px composer here and shortens whole units only
when the row runs out. The box's own row keeps its steps.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-99fc-73f0-9482-5a4babfe1b0a&host=cosmic-gray

* cmux NEXT composer: no dot between the model and its effort

Leo 2026-10-21: "BRO WTF NO WE FUCKING HATE THE DOT", of Lawrence's build
reading "Opus 5.5 • Medium". The one dot the button can draw on base is the
agent-update dot (hq#2569 #12, `.acpmux-model-update-dot`): ModelPicker's chip
face puts it after the model's name, so with Claude Code or Codex outdated it
sits between the name and the effort. No label formatter writes a "•" or "·"
into the button; the fit steps draw whole labels.

The dot is gone. The update stays in the button's tooltip and in the menu's and
picker's Update row. composer-fast-toggle checks, for Claude and Codex, Fast on
and off, with and without an update on offer, that the button's text and every
fit label carry no "•" or "·" and nothing sits between the name and the
effort; composer-model-quiet checks the rendered button reads "Opus 5.5 Medium"
at 410, 324 and 264 px and carries no dot at the narrow steps.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-99fc-73f0-9482-5a4babfe1b0a&host=cosmic-gray

* cmux NEXT composer test: the quiet row keeps whole labels at every width; the in-box row keeps its steps

composer-row-steps measured whichever row held the model button, and its one table still held the
width steps the quiet row under the box no longer takes (composerRowFit.ts paneWidth). Split it:
the quiet row (the default plain footer) keeps "Opus 5.5  Medium" and "Auto" from 760 down to 280
px; the in-box row (plain footer off through the host's composer event, as Debug Settings does)
keeps every old step, measured at the same widths.

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

* cmux NEXT composer: Codex's Ultrafast is a checkbox row under Fast mode

With the bolt button gone, a speed option's tier past Fast (Codex's Ultrafast) could not be picked.
The model button's menu adds an Ultrafast checkbox row under Fast mode when the option has such a
tier: checked while it runs; on picks it, off steps back to Fast. A two-state option has no such
row. Restores the picker.tierUltrafast string from the merge base.

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

* cmux NEXT composer: the row past Fast mode reads Ultrafast only for Codex's Ultrafast tier

Any other agent's tier past Fast keeps the name the agent gives it (else its value), so the
second checkbox row never calls another harness's tier Ultrafast (Codex review of #24151).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-99fc-73f0-9482-5a4babfe1b0a&host=cosmic-gray

* cmux NEXT composer: keep picker.tierFast, which base's / menu Fast row now names

The PR dropped the speed tier strings with FastToggle.tsx; base's SlashMenu (Composer.tsx) reads
picker.tierFast, so the merged tree failed typecheck. Restored from base unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-99fc-73f0-9482-5a4babfe1b0a&host=cosmic-gray

* cmux NEXT composer: the full picker's Fast mode row is on for every tier past off

The full picker read only the option's first tier as on, so with Codex's Ultrafast running it
showed Fast mode off and a click picked Fast instead of turning the tier off (Codex review of
#24151 at 9da89d3). One helper, fastModeToggle (modelPickerLayout.ts), now gives both Fast mode
rows their on/off state: on is any tier past off, a click turns the running tier off, and the
full picker names the running tier (Ultrafast).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-99fc-73f0-9482-5a4babfe1b0a&host=cosmic-gray

* cmux NEXT composer test: the quiet row's model name keeps the button's ink, its effort one step back

composer-footer-plain and composer-caret-focus required the model name and its effort to share one
colour; this PR puts the effort one step back of the name in the quiet row (composerLocation.css,
composer-model-quiet.test.ts), so those checks failed on the PR's head only. In the quiet row they
now check the name is in the button's muted ink and the effort differs from it; the New Tab stage
row (.nt-pickers), which this PR does not restyle, keeps the old same-ink check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-99fc-73f0-9482-5a4babfe1b0a&host=cosmic-gray

* cmux NEXT composer: the string catalog only drops the speed button's three strings

Re-derived from feat-cmux-next's Localizable.xcstrings with composer.speedLabel,
composer.speedTooltip and picker.tierStandard deleted, in base's own formatting and key order.
The parsed catalog is unchanged; the diff against base is those three entries alone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-99fc-73f0-9482-5a4babfe1b0a&host=cosmic-gray

* cmux NEXT composer: split; this PR keeps the quiet model button and the quiet row's fit

The speed control's move (the bolt inside the model button, FastToggle.tsx's removal, the
Ultrafast menu row, fastModeToggle and speedTierName, the three speed strings and
composer-fast-toggle's tests) moves to its own follow-up branch, composer-look-codex-bolt-in-model,
so each lands under ~800 changed lines. Those files go back to feat-cmux-next's versions here;
composerLocation.css keeps base's speed-button rules, composerRowFit.ts base's bolt sentence, and
composer-model-quiet.test.ts drops its two bolt tests (they move with the bolt).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-99fc-73f0-9482-5a4babfe1b0a&host=cosmic-gray

* cmux NEXT composer: the quiet row's harness name follows the row's room, as its other labels do

Base's new quiet-row harness (ComposerHarness.tsx) hid its name below a 460 px composer by a
container query, while this PR's fit takes no width step in the quiet row: the fit counted the
hidden 76 px name as shown and shortened the effort with the room free (a 400 px New Tab read
"Med"; CI and huge-blue disagreed on which rows did, by font metrics). The quiet row now skips that
query, as it skips the effort, model and access ones, so the name shows while it fits and the fit
drops it (data-fit-harness) only when the row runs out.

Tests, from the row's measured room (need vs room, probed on huge-blue):
- reasoning-chip-steps: 400 px sits within ~20 px of the boundary in all three panes, so it checks
  the form the row's fit chose, whole; 760 (full) and 300 (short) stay exact.
- composer-footer-harness (base's): at 410 px the row has ~60 px spare, so every name shows whole.
- composer-row-steps / composer-model-quiet: with the harness's name in the row, whole labels hold
  down to 400 px (410 px composer); 300/280 px (264 px composer) shorten; widths on the boundary
  (360 px, 324 px composer) are left out.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-99fc-73f0-9482-5a4babfe1b0a&host=cosmic-gray

* fix(cmux-next): refit quiet composer when controls resize

Agent-Session: https://cmux.com/deeplink/agent?harness=codex&session=01a166ed-0099-7a32-8c00-7de0ff0c2191&host=cmux16

* cmux NEXT composer test: the quiet row's widths and ring gap follow base's row

Base took the harness label out of the quiet row (#24938) and gave the context
affordance one compact size with a 2 px margin (composerFooterShared.css), so:
the row now keeps every whole label down to a 244 px composer (measured on the
fleet: panes 280 and 300 read "Opus 5.5  Medium"), the ring's glyph sits 15 px
after the effort, and the shared focus ring is asserted from the CSS because the
gallery stage loads no pages/shared/desktop.css. composer-app-font also reads
base's new composerFooterShared.css.

Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a174e4-2849-7aa2-bd71-289c4ec9e04f&host=huge-blue

* fix(cmux-next): the quiet row's width steps must not outrank the fit

Review (codex gpt-6-astra xhigh) found it: `.acpmux-composer-bar:not(.acpmux-composer-foot)`
added a class, so each container-query step tied the hiding rules above it at
(0,4,0) and, coming later, won. At a 370-440 px composer whose measured fit had
already chosen the model's mark (data-fit-model="icon"), the step would have
brought the family label back. `:where(:not(...))` adds no specificity, so the
steps keep losing to the fit, as before this PR. composer-fit-steps now refuses a
bare `:not(.acpmux-composer-foot)` in any step (it catches the regression: the
guard fails with the bare selector restored).

Also, on the reviewer's second point, the focus hairline is now measured instead
of only read: the test puts pages/shared/desktop.css in the stage as the app's
pane has it and asserts the shared ring draws 1 px at 22%, not 1.5 px at 48%.
Increase Contrast stays a CSS-text assertion, since prefers-contrast does not
reach the gallery frame.

Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a174e4-2849-7aa2-bd71-289c4ec9e04f&host=huge-blue

* Scope the quiet row's fit to the plain look, not the row element

The quiet row is a look, not an element: ComposerFoot draws the same
.acpmux-composer-bar.acpmux-composer-foot in both looks and marks only the
plain one data-footer-look="plain". Keying the width-step guards and
paneWidth on the class therefore skipped the steps with the plain footer
off too, so the stepped row kept whole labels it had no room for and hid
the harness mark that look draws. Both now read data-footer-look.

Also follows base: the composer names its family through var(--font-ui)
(#24661 and the token move), so the font tests read the token instead of
a literal system-ui, and the ring keeps base's compact 22px box.

Measured in Chromium on huge-blue, these suites: composer-model-quiet,
composer-row-steps, composer-fit-steps, reasoning-chip-steps,
composer-footer-plain, composer-alignment-centers, composer-app-font,
composer-caret-focus. Before this commit, at merge 966ee3e: 46 pass,
17 fail. After: 87 pass, 0 fail. The same suites at base e3134fd:
45 pass, 0 fail, so none of the 17 was a base red.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-23d3b9d81891fbbc413e

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
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