Skip to content

cmux NEXT model picker: every harness its own tab again (claude-sr2 models back), and Claude Code gets full model ids - #27692

Open
austinywang wants to merge 7 commits into
feat-cmux-nextfrom
fix/restore-per-harness-model-picker
Open

austinywang wants to merge 7 commits into
feat-cmux-nextfrom
fix/restore-per-harness-model-picker

Conversation

@austinywang

@austinywang austinywang commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

Summary

The model picker in cmux NEXT nightly (1.0.0-nightly.4093446036501, built from 6c1a5ab) regressed. This PR fixes two problems.

1. Custom harnesses lost their tab and their models. #26969 (merged 2026-10-29, 7f7d931) folded every harness that draws the Claude or Codex mark into one rail tab (canonicalHarnesses). A harness like claude-sr2, which is its own profile with icon = "claude", disappeared from the rail. It became a launch-only row inside Claude Code's tab and showed no models. Claude Code (acp), Claude Code (sr), Codex (work) and the other launch configurations went the same way.

This PR reverts #26969: the webview side is equivalent to git revert 7f7d9315343c (its two conflicts are context from later commits). It removes canonicalHarnesses, the variants block and the canonical-harnesses-* gallery states, and restores test/model-menu-started-chat-fork.test.tsx to its pre-#26969 version. The density (#27320), search grouping (#27303), Provider row (#27151), checkmark (#27232) and empty-search (#26962) fixes stay as they are.

The revert alone still left a launch configuration that is not the running harness (claude-sr2 in a Claude Code chat, Claude (work), Codex (work)) as a launch-only tab with no models, as before #26969. Now, when its own catalog entry has a model that can be picked, it is an ordinary tab that lists those models; picking one starts the chat on that harness, as picking a Codex model does. An entry with no pickable models (none listed, or its probe failed) still launches from its tab. In a started chat every other tab still forks; a launch configuration with models now shows "Fork to …" on its tab like any harness, instead of forking on the tab click.

2. GUI chats failed with "There's an issue with the selected model (opus-5-5)". A chat started with a versioned family name (opus-5-5) failed every turn, while the header still read "Claude Code · Opus 5.5". Claude Code accepts opus or claude-opus-5-5, but it sends opus-5-5 to the API exactly as typed. The session's own log shows [claude-code:unrecognized_model] {"model":"opus-5-5"} followed by a 404 model_not_found. The Claude stdio translator (claude_stdio::model_id) now passes Claude Code the full id at spawn (--model), on session/set_model and on the model config option. It does this only for opus-/sonnet-/haiku- followed by a digit. Aliases, full ids and other providers' names pass through unchanged. This applies the rule live_models::claude::launch_id already uses.

Testing

Remote runs only (rbx; this Mac had no agent-identity for cmux-ci and no Freestyle key):

  • webviews (bun 1.4.4 on rbx, lane picker-restore-27692-web, tree of c329f8d): bun test test/model-menu-started-chat-fork.test.tsx test/model-menu-compact.test.tsx test/model-menu-providers.test.tsx test/signed-out-rail.test.tsx test/composer-footer-harness.test.ts: 82 pass, 1 skip (browser lane), 0 fail. New tests: claude-sr2 keeps its tab and lists its models, mounted on claude-sr2 and on claude (picking its model starts claude-sr2); a named entry with models starts from one of them; one with no models still launches from its tab; a second launch entry of one family lists its own models and starts itself.
  • Rust (rbx, lane picker-restore-27692, 51f9ccc): cargo test --locked -p acpmux --lib claude_stdio::tests: 19/19, including versioned_family_names_reach_claude_code_as_full_ids. Later commits touch only webviews.
  • vp fmt --check over webviews: clean.

Changelog

  • Fixed: the model picker shows every harness, including custom ones such as claude-sr2, as its own tab with its models again.
  • Fixed: a chat started with a model like opus-5-5 no longer fails every turn with "There's an issue with the selected model".

🤖 Generated with Claude Code


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


Summary by cubic

Fixes two model-picker regressions in the cmux NEXT nightly: every harness is back to its own rail tab, and versioned model names no longer fail every chat turn.

  • Each harness and launch configuration gets its own tab. A launch configuration (like claude-sr2, Claude (work), Codex (work)) whose catalog entry lists pickable models shows them on its tab, and picking one starts the chat on that harness; one with no models, or whose probe left every model disabled, still launches directly from its tab. Removes the canonicalHarnesses folding and the variants submenu; the density, search, provider, checkmark, and empty-search fixes from later PRs stay intact.
  • The Claude stdio translator now hands Claude Code full model ids (claude-opus-5-5) at spawn, on session/set_model, and on the model config option. Bare aliases (opus), full ids, and other providers' names pass through unchanged.

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

View guided diff Turn on auto-fix

…ode full model ids

#26969 folded every harness that draws the Claude or Codex mark into one
rail tab. A custom harness such as claude-sr2 (its own profile with
icon = "claude") lost its tab and its model list, and Claude Code (acp),
Codex (work) and the other launch configurations became launch-only rows.
Restore the per-harness rail the picker had before (each harness and
launch configuration its own tab with its own models); the later density,
search, provider and checkmark fixes stay.

acpmux: a chat started or switched with a versioned family name
(opus-5-5) failed every turn because Claude Code sent it to the API as
typed. The Claude stdio translator now hands Claude Code the full id
(claude-opus-5-5) at spawn, on session/set_model and on the model config
option.

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

github-actions Bot commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

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

Review 4316e93: 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=pr27692 -f ref=fix/restore-per-harness-model-picker -f platform=macos -f backend_mode=local

Passes: CI passes on 4316e93a1a.

CI passes on 4316e93a1a (run 41159311168 attempt 1).

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

web and size checks: green

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

gh run download 41141551444 -R manaflow-ai/cmux -n gallery-advisory-27692-4316e93a1ad63b994f99a55d6b34ee6d804784f8 (then read gallery-review.json)

States
State Theme Status Diff Picked by
agent-pane.composer-pickers/closed Apple System Colors Light unchanged 0% own QuickModelMenu.tsx
agent-pane.composer-pickers/closed Apple System Colors unchanged 0% own QuickModelMenu.tsx
agent-pane.composer-pickers/pill-rail Apple System Colors Light unchanged 0% own QuickModelMenu.tsx
agent-pane.composer-pickers/pill-rail Apple System Colors unchanged 0% own QuickModelMenu.tsx
agent-pane.composer-pickers/model-menu Apple System Colors Light unchanged 0% own QuickModelMenu.tsx
agent-pane.composer-pickers/model-menu Apple System Colors unchanged 0% own QuickModelMenu.tsx
agent-pane.composer-pickers/model-more Apple System Colors Light unchanged 0% own QuickModelMenu.tsx
agent-pane.composer-pickers/model-more Apple System Colors unchanged 0% own QuickModelMenu.tsx
agent-pane.composer-pickers/model-focus Apple System Colors Light unchanged 0% own QuickModelMenu.tsx
agent-pane.composer-pickers/model-focus Apple System Colors unchanged 0% own QuickModelMenu.tsx
agent-pane.composer-pickers/model-press-drag-release Apple System Colors Light unchanged 0% own QuickModelMenu.tsx
agent-pane.composer-pickers/model-press-drag-release Apple System Colors unchanged 0% own QuickModelMenu.tsx
agent-pane.composer-pickers/effort-menu Apple System Colors Light unchanged 0% own QuickModelMenu.tsx
agent-pane.composer-pickers/effort-menu Apple System Colors unchanged 0% own QuickModelMenu.tsx
agent-pane.composer-pickers/effort-focus Apple System Colors Light unchanged 0% own QuickModelMenu.tsx
agent-pane.composer-pickers/effort-focus Apple System Colors unchanged 0% own QuickModelMenu.tsx
agent-pane.composer-row/claude-auto Apple System Colors Light unchanged 0% own QuickModelMenu.tsx
agent-pane.composer-row/claude-auto Apple System Colors unchanged 0% own QuickModelMenu.tsx
agent-pane.composer-row/long-model Apple System Colors Light unchanged 0% own QuickModelMenu.tsx
agent-pane.composer-row/long-model Apple System Colors unchanged 0% own QuickModelMenu.tsx
agent-pane.composer-row/leo-report Apple System Colors Light unchanged 0% own QuickModelMenu.tsx
agent-pane.composer-row/leo-report Apple System Colors unchanged 0% own QuickModelMenu.tsx
agent-pane.composer-row/granted Apple System Colors Light unchanged 0% own QuickModelMenu.tsx
agent-pane.composer-row/granted Apple System Colors unchanged 0% own QuickModelMenu.tsx
agent-pane.composer-row/fast-off Apple System Colors Light unchanged 0% own QuickModelMenu.tsx
agent-pane.composer-row/fast-off Apple System Colors unchanged 0% own QuickModelMenu.tsx
agent-pane.composer-row/fast-on Apple System Colors Light unchanged 0% own QuickModelMenu.tsx
agent-pane.composer-row/fast-on Apple System Colors unchanged 0% own QuickModelMenu.tsx
agent-pane.composer-row/queued Apple System Colors Light unchanged 0% own QuickModelMenu.tsx
agent-pane.composer-row/queued Apple System Colors unchanged 0% own QuickModelMenu.tsx
agent-pane.inline-model-effort/list Apple System Colors Light unchanged 0% own QuickModelMenu.tsx
agent-pane.inline-model-effort/list Apple System Colors unchanged 0% own QuickModelMenu.tsx

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 29, 2026
@blacksmith-sh

blacksmith-sh Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

Found 8 test failures on Blacksmith runners:

Failures

Test View Logs
/tmp/tmpn_p9cdgn/summary-missing.json (live):/summary-missing.json (live): View Logs
/tmp/tmprzaaw9uv/summary-fail.json (live):/summary-fail.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_every_listed_hook_is_one_glaeda_released_with_the_check (main.SigningHooksInSt
epWithGlaedaTests.test_every_listed_hook_is_one_glaeda_released_with_the_check)/
test_every_listed_hook_is_one_glaeda_released_with_the_check (main.SigningHooksInSt
epWithGlaedaTests.test_every_listed_hook_is_one_glaeda_released_with_the_check)
View Logs

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

@austinywang

Copy link
Copy Markdown
Contributor Author

Correctness review (subagent, head 9089506), and the resolution of each finding:

  1. Blocker: fast gates fails vp fmt --check on webviews/test/model-menu-started-chat-fork.test.tsx. The pre-Picker: group Claude and Codex launch variants inside one harness #26969 restore brought back long lines. To do: run bunx vp fmt on that file.
  2. Should fix: railByHarness still marks claude-sr2 as launch: true (agentKey claude, suffix sr2) when it isn't the running harness. Its models then show only when that harness runs, which is the pre-Picker: group Claude and Codex launch variants inside one harness #26969 behaviour. To do: decide whether the revert is the intended design or whether non-running profile harnesses should also list their models, and pin that with a test mounted on claude.
  3. No leftover references to canonicalHarnesses, variants or canonical-harnesses-*.
  4. Rust: compiles, and model_id is correct. cargo test -p acpmux --lib claude_stdio::tests gives 19/19 on rbx at this head, the new versioned_family_names_reach_claude_code_as_full_ids included.
  5. Nit: ${model} substitution in profile argv/env (hub/spawn.rs) does not pass through model_id.
  6. Nit: model_id is case-sensitive.

Follow-up is tracked in #27723. A Claude agent chat takes over to turn this into a proper revert of #26969.

austinywang and others added 2 commits October 29, 2026 17:34
…models

Make the webview side equivalent to `git revert 7f7d931`: the
launch-profiles gallery states it added go, and railByHarness keeps its
pre-#26969 comment.

A launch configuration that is not the running harness (claude-sr2,
Claude (work), Codex (work)) was a launch-only tab with no models, before
and after #26969. When its own catalog entry lists models, it is now an
ordinary rail tab that shows them; picking one starts the chat on that
harness, as picking a Codex model does. An entry with no models still
launches from its tab. In a started chat every other tab still forks.

Format model-menu-started-chat-fork.test.tsx for vp fmt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review follow-ups: a launch entry whose probe failed (every row
disabled) keeps its one-click launch tab, the profile branch of
railByHarness gets a test (a second launch entry of one family lists
its own models and starts itself), and the started-chat rail drops a
duplicate return.

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

Copy link
Copy Markdown
Contributor Author

Correctness review (subagent), head 51f9ccc, and the resolution of each finding. Follow-ups are in c329f8d.

Verdict: no blockers. The revert of #26969 is complete (nothing in webviews refers to canonicalHarnesses, canonical-harnesses-* or the variant row), and the later density, search, Provider, checkmark and empty-search fixes are intact. The new launch-tab path takes models only from the entry's own catalog entry, never another account's, adds no duplicate tabs, and a pick goes through pickQuick → onCombo → switchHarness(harness, model).

  1. Should fix: the profile branch of railByHarness (ModelPicker.tsx) was untested. It only runs when two uncatalogued entries share a family. Fixed: new test "a second launch entry of a family lists its own models and starts itself" (one tab, its own Haiku and not the first entry's Opus, and a pick switches to claude-sr2-alt).
  2. Nit: a started chat's launch configuration with models now takes two clicks to fork (the tab, then "Fork to …"), like any harness tab; one with no models still forks on the tab click. Kept on purpose: every tab with models behaves like the Codex tab. The rewritten test asserts it, and the PR body says so.
  3. Nit: a configuration whose probe failed (every row disabled) lost its one-click launch. Fixed: hasModels counts only rows that can be picked, so such an entry keeps its launch tab.
  4. Nit: model_id is case-sensitive, and it would also prefix a proxy's own sonnet-4-… name. Not changed: Claude Code's names are lowercase, and the mapping is the same rule live_models::claude::launch_id already applies. The earlier review's ${model} nit (profile argv/env in hub/spawn.rs) is also unchanged, because that substitution serves every harness and must not apply a Claude-only rewrite.
  5. Nit: a duplicate if (family.launch) return … before an identical return. Fixed: removed.

Earlier review (head 9089506): the fast gates fmt red is fixed (vp fmt --check is clean and fast gates passes at 51f9ccc). Finding 2 there (claude-sr2 showed no models when it was not the running harness) is resolved by the launch-tab change above, with a test mounted on claude.

My own check of the exact diff against origin/feat-cmux-next: it matches git revert 7f7d9315343c plus the launch-tab change and the acpmux model_id fix. Tests: rbx webviews 82 pass, 0 fail on c329f8d's tree; rbx Rust claude_stdio::tests 19/19. CI reds that are not this PR's own: cmux-next/compile also fails on base b6554ad, and risk evidence holds until a person has looked.

@austinywang austinywang added the ready-to-land Reviewed at this head; next-autoland merges it into feat-cmux-next when its only reds are base reds label Oct 30, 2026
@austinywang austinywang removed the ready-to-land Reviewed at this head; next-autoland merges it into feat-cmux-next when its only reds are base reds label Oct 30, 2026
@teamleaderleo

Copy link
Copy Markdown
Collaborator

Review (codex gpt-6.1-sol high fast, review-router; started by the backlog lander): BLOCK at a327a7c

BLOCK

  1. P2 — folded launch profiles lose their model catalog. ModelPicker.tsx:311, ModelPicker.tsx:345-355 byId is built from the already-deduplicated list. uniqueHarnesses folds IDs such as claude-sr into the claude entry when their display name resolves to “Claude Code”, so byId has no claude-sr entry even though props.profiles[claude] contains it and the raw catalog has its models. hasModels(undefined) is therefore false and the profile is emitted as a launch-only tab with empty models. In a new chat, selecting that profile cannot choose its own models or start it with a selected model, contrary to the PR’s advertised behavior. Preserve per-profile catalog entries (or otherwise map folded IDs to their models) before deciding whether a profile is launch-only.

@teamleaderleo

Copy link
Copy Markdown
Collaborator

Review (codex gpt-6-astra high, fast, independent, via review-router): BLOCK at a327a7c

(Posted by the coordinator for awareness; the reviewing lane's broker can't comment on this PR. Nobody else pushes to this branch.)

@teamleaderleo

Copy link
Copy Markdown
Collaborator

Carried in #28050: your three commits, with your authorship, cherry-picked onto the feat-cmux-next tip, plus one fix for the exact-head review finding above (a launch entry whose probe failed keeps its launch tab: QuickFamily carries HarnessChoice.unavailable), with a test. It lands there; this PR stays yours to close.

teamleaderleo added a commit that referenced this pull request Oct 30, 2026
…feat-cmux-next tip (#28261)

* ci(next): the tip suite dispatcher also runs the daemon suite on the feat-cmux-next tip

A feat-cmux-next push never runs daemon-test, so the base had no "cmux-next
daemon tests" verdict for hours and base_red_excuse.py could not compare any
pull request's daemon red with it (#27692, #27868). The tip suite dispatcher
now has a daemon leg beside the Swift one (a matrix over the two suites): a
tip_daemon_suite run of cmux-next.yml, routed on the router's daemon tier
since the last daemon verdict, and dispatched regardless once the tip is 20
landings past it. Runs are told apart by name and tested commit, so a
same-tree run that tests a recorded sha after the tip moved still counts.
Before feat-cmux-next's cmux-next.yml takes the input, the daemon dispatch
warns instead of failing the tick.

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

* fix(ci): a deferred daemon suite run is pending, and only the unknown-input 422 is a warning

Review of #28261:
- A tip daemon suite run whose daemon-test was skipped (its tree was still
  publishing) was a no-verdict run, so the next tick dispatched the same sha
  again and two same-tree runs could follow. It is now pending for 90 minutes
  (DEFERRED_GRACE_MS): its same-tree run, named for the same sha, then gives
  the verdict. Past the grace it is a lost run and is retried. The Swift suite
  has no deferred state.
- Only GitHub's `Unexpected inputs provided: [...tip_daemon_suite...]` 422 is a
  warning; any other 422, and every Swift refusal, fails the tick.
- Tests: the deferred run, its same-tree run in flight and its verdict, the
  grace, the 422 messages, and the feat-cmux-next router printing swift= and
  daemon=.

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

* ci(rescue): a failed tip daemon suite run wakes a rescue when it completes

Review of #28261: the owned-pool rescue woke on a failed `cmux-next tip Swift
suite` dispatch but not on the new daemon suite's, so a runner refusal of its
daemon test waited for the two-hourly sweeper and the base had no daemon-test
verdict meanwhile. The `completed` wake now matches `cmux-next tip daemon
suite` too (completed_target already takes any cmux-next dispatch), with tests.

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

* fix(ci): the daemon suite's 20-landing floor counts from its newest verdict

Review of #28261: the floor counted from the routing base (the last green), so
a red periodic run after it made every later tick dispatch again once 20
landings had passed since the green. It now counts from the newest daemon
verdict of either kind (one more compare when that is not the green); routing
still diffs from the last green. Tests: a red verdict 1 landing back holds the
floor, 20 past it dispatches.

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

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
teamleaderleo added a commit that referenced this pull request Oct 30, 2026
…8283)

* ci(next): a tip daemon suite gives the base a daemon-test verdict

A feat-cmux-next push never runs daemon-test: its same-tree run has origin
push, and a dispatch's tree wait marker is superseded the moment the tip moves,
which in a landing burst is always before the tree publishes. So the base had
no "cmux-next daemon tests" verdict for hours, and base_red_excuse.py could
not compare any pull request's daemon red with it (#27692, #27868).

- cmux-next.yml takes tip_daemon_suite (main's tip suite dispatcher asks for
  it): path routing routes only the daemon tier, and the run is named
  `cmux-next tip daemon suite · <tested sha>` (same_tree_sha in same-tree mode).
- Its tree wait marker carries tip_suite=daemon. cmux_next_tree_notify.py
  starts it on the recorded sha after the tip moves (like the DEV daily) and
  passes tip_daemon_suite on, so the same-tree run keeps the name. Only a
  daemon-only dispatch on feat-cmux-next heads may carry it.
- base_red_excuse.py: when its window of the newest 100 base runs holds no
  verdict for swift test or daemon tests, it reads the base's newest tip suite
  runs of that job by name (at most 6 job lists).

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

* ci(guards): run test_cmux_tui_owned_mini_caches.py, which its registry lane names

#27840 registered tests/test_cmux_tui_owned_mini_caches.py as lane
"linux-guard" but no ci-guards.yml step ran it, so the execution registry
validator fails every pull request into feat-cmux-next ("linux-guard lane is
not run by any workflow"). The release-notary group of ci-guards now runs it,
beside the other cmux-tui artifact guards.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 43312b4)

* fix(ci): the tree wait marker step reads TIP_DAEMON_SUITE with a default

test_a_dispatch_whose_tree_was_building_gets_its_daemon_tests_later runs the
marker step's script with its own env, which has no TIP_DAEMON_SUITE, and the
KeyError failed "Checks job structure" on #28283. The script reads it with
.get(), and the test now covers the tip daemon suite marker: tip_suite=daemon
only for a tip_daemon_suite dispatch on feat-cmux-next.

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

* ci(guards): drop the owned-mini-caches step from this PR

Review: this branch's base predates #27840, so tests/test_cmux_tui_owned_mini_caches.py
is not in the branch and the step only passed on the merge commit with the
base. The registry error it fixed is a base red (feat-cmux-next fails the same
way); its fix goes in its own PR from a branch that has the file.

This reverts commit c0c10bc.

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

* fix(ci): the base dispatch fallback takes the newest verdict, green included

Review of #28283: the fallback read only tip suite runs, so a newer ordinary
dispatch that ran daemon-test (or swift-test) green was skipped and an older
red tip suite run excused the head. It now reads the base's completed
dispatches newest first and the first with a verdict for the job decides, a
green one included. DEV daily runs and the other job's tip suite never run the
job and are skipped unread; at most 6 job lists. Test: a newer green ordinary
dispatch over an older red tip suite refuses.

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

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	webviews/src/agent-session/acpmux/ModelPicker.gallery.tsx
@austinywang

Copy link
Copy Markdown
Contributor Author

Sweep fix: merge conflict with feat-cmux-next (478 behind) in ModelPicker.gallery.tsx. The base (#28020) renamed the composer's Provider row back to Account; this PR removes the canonical-harness variant plays. Resolution keeps both: the two canonical-harnesses-* plays stay removed and the comment uses the base's Account wording. No other references to the removed variants field remain. New head 4316e93. The head needs CI and a review receipt before relabel.

@teamleaderleo

Copy link
Copy Markdown
Collaborator

For awareness: branch picker-fork-rows-and-rail (PR coming shortly, into feat-cmux-next) touches the same block of QuickModelMenu.tsx. It keeps #26969's folded tabs but moves the "Fork to " rows out of the model list into the Account submenu, and fixes the rail squashing to one row (contain: size on .acpmux-quick-rail). This PR deletes that variant block and unfolds the tabs, so whichever lands second gets a small conflict there and in model-menu-started-chat-fork.test.tsx. If this one lands first, the Account submenu just keeps the account routes and the variant part of mine drops out; the rail height fix still applies.

@teamleaderleo

Copy link
Copy Markdown
Collaborator

Review (codex gpt-6.1-sol high fast, review-router; started by the backlog lander): SHIP at 4316e93

SHIP

No P1, P2, or P3 findings.

@cmux-bot cmux-bot Bot removed the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 31, 2026
@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 31, 2026
teamleaderleo added a commit that referenced this pull request Oct 31, 2026
…full model ids (carries #27692) + failed-probe launch tabs (#28050)

* fix(picker): give every harness its own rail tab again; pass Claude Code full model ids

#26969 folded every harness that draws the Claude or Codex mark into one
rail tab. A custom harness such as claude-sr2 (its own profile with
icon = "claude") lost its tab and its model list, and Claude Code (acp),
Codex (work) and the other launch configurations became launch-only rows.
Restore the per-harness rail the picker had before (each harness and
launch configuration its own tab with its own models); the later density,
search, provider and checkmark fixes stay.

acpmux: a chat started or switched with a versioned family name
(opus-5-5) failed every turn because Claude Code sent it to the API as
typed. The Claude stdio translator now hands Claude Code the full id
(claude-opus-5-5) at spawn, on session/set_model and on the model config
option.

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

* fix(picker): finish the #26969 revert; launch entries list their own models

Make the webview side equivalent to `git revert 7f7d931`: the
launch-profiles gallery states it added go, and railByHarness keeps its
pre-#26969 comment.

A launch configuration that is not the running harness (claude-sr2,
Claude (work), Codex (work)) was a launch-only tab with no models, before
and after #26969. When its own catalog entry lists models, it is now an
ordinary rail tab that shows them; picking one starts the chat on that
harness, as picking a Codex model does. An entry with no models still
launches from its tab. In a started chat every other tab still forks.

Format model-menu-started-chat-fork.test.tsx for vp fmt.

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

* fix(picker): a launch tab lists models only when one can be picked

Review follow-ups: a launch entry whose probe failed (every row
disabled) keeps its one-click launch tab, the profile branch of
railByHarness gets a test (a second launch entry of one family lists
its own models and starts itself), and the started-chat rail drops a
duplicate return.

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

* fix(picker): a launch entry whose probe failed keeps its launch tab

Review of #27692 (Codex, BLOCK at a327a7c): `hasModels` checked only
the rows' own `disabled`, and the harness-level `HarnessChoice.unavailable`
(its probe failed) was dropped when the rail rows were built, so a launch
entry whose probe failed but whose catalog still listed models became an
ordinary tab that could start a stale model. The QuickFamily now carries
`unavailable`, and `hasModels` is false for it, so such an entry launches
from its tab, as the PR said it would. A jsdom test covers it.

Co-Authored-By: Austin Wang <austinwang115@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-3cf6bed67d0bb92a21bd

* test(picker): the failed-probe launch entry is the one ComposerPickers keeps in the rail (probeFailed)

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

* fix(picker): no stale rows from a failed probe in launch tabs, Starred or search

Review of #28050 at 276eb52 (Codex, BLOCK): a launch tab kept its family's
rows, so reaching it with the arrow keys (which selects a tab without
launching it) showed a failed probe's stale models; Starred and the compact
menu's search also listed them. A launch tab now carries no rows, and a
harness whose probe failed lends none to Starred or the compact search unless
it runs the chat. A jsdom test walks the rail with the arrows.

Co-Authored-By: Austin Wang <austinwang115@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-3cf6bed67d0bb92a21bd

* Format the started-chat fork test

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

---------

Co-authored-by: Austin Wang <austinwang115@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
@lawrencecchen

Copy link
Copy Markdown
Contributor

Conflict wave: feat-cmux-next already contains this PR's change. 0083a60 "cmux NEXT model picker: every harness its own tab again ... (carries #27692) (#28050)" landed it. Of this PR's added lines, 170 of 189 are present in feat f06d9bd; the rest are later changes on feat to the same code. I pushed no merge. I did not close the PR; a person can close it.

@teamleaderleo

Copy link
Copy Markdown
Collaborator

For awareness: this PR has a SHIP review at its head, but GitHub reports it as conflicting with feat-cmux-next, so the lander's update-branch can't merge it and it can't land as is. Files that conflict in a test merge against the current base: cmux-tui/crates/acpmux/src/claude_stdio/outbound.rs, webviews/src/agent-session/acpmux/ModelPicker.gallery.tsx, webviews/src/agent-session/acpmux/ModelPicker.tsx, webviews/test/model-menu-started-chat-fork.test.tsx. Once feat-cmux-next is merged into the branch and the conflicts resolved, it needs only a quick review of the resolution before it can land. (From the conflict sweep; no push was made to this PR.)

@teamleaderleo

Copy link
Copy Markdown
Collaborator

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


Awareness: Batch 6 is building the picker on Lucas’s merged #32980 and preserving its harness/model/effort/account columns. The motion pass applies the shared SlidingIndicator to the family tabs; this lane does not push to #27692.

This branch was previously deployed

3 inactive deployments
artifacts — 4316e93a Deployed Oct 30, 2026 by austinywang via add the Windows daemon to the tree #85580
ci-routing-agent — 4316e93a Deployed Oct 30, 2026 by github-actions[bot] via cmux-next macOS placement #51535
sentry-dsyms — 4316e93a Deployed Oct 30, 2026 by austinywang via upload cmux-tui dSYMs to Sentry #85580
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.

3 participants