composer: keep Fast mode in the picker
What changed
Leo asked for Fast mode to be tucked into the model picker. The compact picker and full picker now use the harness-reported Fast mode config option for every harness, including Codex. The separate lightning control is gone from chat and New Tab, while the native config id, on/off values, and current default remain unchanged.
“we just want to have that toggle inside the model picker” — Leo, 2026-10-28
Scope
- Reuses the existing Fast mode checkbox row after Account in QuickModelMenu.
- Keeps the full ModelPicker Fast mode row in the same surface.
- Removes the separate speed bolt rendering and its speed prop path.
- Takes back #24631: Leo explicitly asked to tuck Fast mode inside the model picker and remove the separate lightning control; this replaces only that PR's adjacent Codex bolt, while keeping its capability-driven New Tab behavior.
- Scopes remembered higher Fast tiers to the active chat, harness and option, so a newly selected chat does not inherit a previous chat's speed.
- Updates the Codex gallery state and narrow layout note to assert no bolt and a menu toggle.
- The New Tab path uses the same QuickModelMenu through ComposerPickers; no separate behavior or default was introduced.
Gallery variants
The composer gallery covers Claude and Codex Fast mode states, off and on, in chat and New Tab. The Codex variant now captures the before/after behavior: the model picker contains the toggle and the composer row has no lightning control.
Before and after
Actual React gallery captures, rendered on gcp-agent-lane-1 with Chromium at the same viewport per pair. Before is feat-cmux-next c30fa03db4b0f4c3da53d7c52e7af9172a872249; after is the reviewed PR head ffb90c3e667e95209dc1150cd2e311c9892ea539. The chat pair uses agent-pane.composer-pickers#model-menu at 640 × 560 CSS px; New Tab uses agent-pane.new-tab#model-picker-open at 760 × 560 CSS px. Both are gallery fixtures, not native fleet screenshots.
| Surface and theme | Before | After |
|---|---|---|
| Codex chat, dark | ![]() | ![]() |
| Codex chat, light | ![]() | ![]() |
| New Tab, dark | ![]() | ![]() |
| New Tab, light | ![]() | ![]() |
Performance
No perf numbers: This changes the placement and state of a configuration control; it does not change runtime performance.
Validation
bun test src/agent-session/acpmux/FastModeState.test.ts test/composer-fast-toggle.test.tsx src/agent-session/acpmux/QuickModelMenu.test.tsx src/agent-session/acpmux/EffortPicker.test.tsx(21 pass, 162 expectations)- Mounted composer chat-switch regression was red before the session-scoped memory fix and green after it: chat B chooses its first Fast tier, not chat A's remembered ultrafast tier.
CMUX_BROWSER_TESTS=1 bun test test/gallery-agent-pane-entries.test.ts --test-name-pattern="composer-pickers#fast-mode"(pass)- Targeted gallery health:
agent-pane.composer#reasoning-codexfailed at the earlier head due to a static-fixture assertion and now passes.agent-pane.composer#file-not-attachedfails on both this head and current base c30fa03db4b0f4c3da53d7c52e7af9172a872249. Five nearby model/narrow/headline states also fail identically on that base. vp fmt --check,vp lint,vp check --no-fmt --no-lint,python3 scripts/cmux-next/prepush-gate.py(pass)
Review (Astra independent, xhigh): SHIP at ffb90c3e667e95209dc1150cd2e311c9892ea539.
agent-identity footer
agent session







