cmux NEXT model picker: one tab per model family; transports and logins are Account routes
Leo (2026-10-31): "FING HELL WHY DO YOU GUYS STILLLLLLLLLLLLLLLLLLLLLL SHOW THESE AS SEPARATE HARNESSES" / "THE FING APP SERVER THE FING SR" / "WHY" / "WHERE IS THE FING ACCOUNTS"
His earlier asks on the same thing:
- 2026-10-25: "I don't know why you put the different accounts at the f***ing left as well. Like you just only harnesses. Okay? Only harnesses. And then if you're switching accounts, like you switch it in the middle."
- 2026-10-29: "Why the f*** did you remove the f***ing account switcher?"
The model menu's symbols row drew one tab per harness entry: four Claude sparks (Claude Code, claude-sr2, Claude (work), the SR route) and three OpenAI knots (Codex, its app server, Codex (work)). The split came from #28050 (carrying #27692), which gave "every harness its own tab again" by reverting #26969's grouping. #26071 had replaced the top tabs before that.
What changes
- One tab per model family. Every entry whose mark draws one brand is a route of that brand's tab (
familyTabsin QuickModelMenu.tsx). The tab opens on the chat's own route, else the first route with models. Its name is the family's (the lead route's name without a launch "(suffix)"). - The Account row picks the route. It lists the family's routes (login, SR route, app server, work setup) with the current one checked, then the running route's own accounts (the existing acpmux route switcher, API key and so on). Picking a route shows its models; a route with no models of its own starts it, or forks a started chat there, as its tab did. Selecting a model resolves its transport through that route, as before.
- Search heads matches with the family and lists a model that several routes run only once, from the tab's route.
- Search, effort, Legacy models, Fast mode, Starred and Add harness all stay. Held Fast mode lands only from the tab that holds it (router-review follow-up on #29664).
- Guard: pr-design-spec-check now names the picker checklist (
design/model-picker.md#checklist, leo-workspace #1965 and #1988) on every PR that changes picker files (checklistin.github/design-surfaces.json).
Spec: design/model-picker.md checklist items 1 and 2 ("tabs are model families; transports and routes are never tabs; account is a choice in the menu"). This PR builds on #29664 (Fast mode on every tab). #29615's opaque surface and right-column change touch other lines of modelPicker.css and QuickModelMenu.tsx.
Tests
- QuickModelMenu.test.tsx:
familyTabs,searchGroups, and "the symbols row draws one tab per family and the Account row switches its route". - model-menu-started-chat-fork.test.tsx: launch entries and transports are Account routes; fork and launch go through the route.
- quick-model-menu-layout.test.ts (Chromium): no "Claude Code (sr)" tab; its Account radio shows.
- tests/test_pr_design_spec_check.py: the checklist notice.
cmux-ci test: 8 picker unit suites (143 tests) and 3 browser suites pass after the last fixes.
Risk: medium. It is a visible picker change limited to the webview. Every route stays reachable from the Account row.
Agent session: agent session
š¤ Generated with Claude Code
![View with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/view-with-codesmith-dark-v3-3x.png)
![Autofix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/autofix-with-codesmith-dark-3x.png)
Need help on this PR? Tag @codesmith-bot with what you need.
Summary by cubic
Consolidates the model picker's symbols row so each model family is one tab instead of one tab per harness entry; SR, app-server, and work entries are now routes of their family's tab, chosen in the Account row.
- The Account row lists a family's routes (login, SR route, app server, work setup) with the current one checked, then the running route's own accounts. Picking a route shows its models, or starts or forks a chat there when it lists none. A tab opens on the chat's own route, else the first route that lists models.
- Search heads matches with the family name and lists a model that several routes run only once, from the tab's route.
- Fast mode is held per family tab: switching routes within the tab keeps the choice, only that tab's picks land with it, and the chat's own tab keeps the session's option.
pr-design-spec-checknow names the picker checklist (design/model-picker.md#checklist) on every PR that changes picker files.
Risk is medium: a visible picker change limited to the webview, and every route stays reachable from the Account row. Legacy models, effort, Starred, and Add harness are unchanged.