Picker: group Claude and Codex launch variants inside one harness
Claude and Codex now each occupy one harness entry. Alternate launch configurations appear inside that harness's model menu, with distinct names and their original launch IDs. A started chat's alternate configuration uses the existing fork handler; a new chat uses the existing switch handler. The running configuration keeps its own model rows. Account routes remain in the existing Account menu.
Ask-067e9aa217, Leo's words as relayed by the picker coordinator: “one Claude entry and one Codex entry (accounts and variants inside), and no false "No matching models" when the search is empty.” This PR covers canonical harness grouping and launch variants; #26962 separately fixes the empty-search message. Add harness placement is owned by #26503. No menu fade-in or delay is added.
Coverage
- Canonical grouping preserves the running profile's model rows, exact launch IDs, and unrelated harnesses/Starred.
- Existing started-chat fork regressions are ported from duplicate rail tabs to variants inside one harness; named profiles and collisions remain reachable.
- Existing Account controls are unchanged.
- Gallery: agent-pane.model-picker/canonical-harnesses-chat, agent-pane.model-picker/canonical-harnesses-new-chat, agent-pane.model-picker/started-chat-accounts
Observed / Not run
Full webview checks passed with bun --bun run check at ebabd381fdf3538291c13fdb7e7b1f9fd3e8ce33, including formatting, lint, type checking, and protocol validation. The NEXT prepush gate also passed. Focused behavioral tests are pending: cmux-ci refused the dispatch because the lane already had three active runs; no test success is claimed. The test-first commit is 21db1cc4cc2.
Before/after synthetic gallery captures and an independent review are pending. This is not ready to land until those receipts are attached.
Changelog
Changed: keep Claude and Codex launch variants inside one harness entry each.
Agent session: agent session