fix(next): choose model and effort together in picker rows
Leo: "do you think there's a solution to be, like, picking the model as well as the effort at the same time without needing to, like, double click or triple click the thing?"
Inline effort is explicitly opt-in (inlineEffort: true): ModelPicker enables it only when a combined model/effort operation is available, and the dedicated inline-effort gallery enables it. Omitted or false callers retain their Effort submenu and do not show effort segments. Catalog normalization preserves absent capability versus explicit []. The running model uses live session-filtered choices; nonrunning rows use advertised catalog capabilities.
Each enabled model row now exposes the efforts advertised by that model as compact, keyboard-accessible segments. Clicking a segment selects the model and effort through the existing combined operation, including deferred application after the harness reports the model. Clicking the model name keeps the current effort; changing effort on the current model uses the session effort callback, preserving session-specific levels such as Ultracode. An explicit empty per-model effort capability suppresses both inline segments (including session Ultracode) and the standalone Effort fallback, even when stale session options still advertise levels. An absent capability may use live session choices for the current model. Callers without a combined model/effort operation retain their existing Effort action.
The gallery compares joined, spaced, underline, chat, and compact variants. Joined is the selected treatment: it reads as one choice group while keeping distinct hit targets and the model label separate. The effort labels use the composer content-size token, and the compact rail keeps readable geometry in narrow panes. Existing colour and glass tokens remain unchanged.
Gallery: agent-pane.inline-model-effort/joined, agent-pane.inline-model-effort/spaced, agent-pane.inline-model-effort/underline, agent-pane.inline-model-effort/chat, agent-pane.inline-model-effort/compact
Validation at frozen head bcc2ac5e968cb8985fd91806d69db46770f8d134 (source_tree 03428efbc95997e7525932f46873818fcabd78f4), base 0c8336391b32df85bcdd7db7eac2f3f0f82a54d8:
-
Final-head 40657736039, job
6623d08e9d294037b184600a5555c40d: QuickModelMenu 9 passed (37 assertions), real ModelPicker regressions 6 passed (17 assertions), Chromium layout 12 passed (56 assertions), typecheck 2,891 files with no errors, lint no warnings/errors. Receipt:command_seconds 45.982,exit_code 0. The final diff is 790 changed lines. -
Product-code green after at predecessor
ebe270dcceba40b2e607bcd1df424c1793a16c77(no product changes since): 40649142760, job873fc20add204235aa2122506f9b1c9c: QuickModelMenu 9 passed (37 assertions), real ModelPicker regressions 5 passed (15 assertions), Chromium layout 12 passed (56 assertions), typecheck 2,891 files with no errors, lint no warnings/errors. Receipt:command_seconds 35.394,exit_code 0. -
Red before: 40648784010 at regression-only head
64e35951c10c6599ef3e1cf7b5cef694a7188e1d(product unchanged from cd245): 3 passed / 2 failed. An explicit-empty current model incorrectly showed one Ultracode segment with inline enabled and an Effort submenu with inline disabled. The same real ModelPicker tests now pass; absent-capability and focus cases passed before and after. -
Earlier provider suite comparison run 40640495386 compared exact base
0c8336391b32df85bcdd7db7eac2f3f0f82a54d8with predecessorb276e11a22d6cb04b4b52eec0df15dc6c1cc8365: both had 13 passed / 2 failed / 42 assertions. The matching failures weremodel-menu-providers.test.tsx:355(more.clickon undefined) and:392(More modelsundefined). This comparison was not rerun after the opt-in and explicit-empty capability repairs.
Chromium before/after capture 40646690411 passed at cd2456003a5665f79152652d00896d79eedddb13 against base 0c8336391b32df85bcdd7db7eac2f3f0f82a54d8 (83.699 seconds). The same fixture rendered on both revisions: New Tab and chat in light/dark on base and head, plus head spaced, underline, and compact variants, for 14 PNGs. The capture asserts that base has no inline effort segments and head does. All 14 synthetic gallery captures are published in pr-media.
| Context | Before | After |
|---|---|---|
| New Tab, light | ![]() | ![]() |
| New Tab, dark | ![]() | ![]() |
| Chat, light | ![]() | ![]() |
| Chat, dark | ![]() | ![]() |
Gallery alternatives:
| Alternative | Light | Dark |
|---|---|---|
| Compact | View | View |
| Spaced | View | View |
| Underline | View | View |
Haiku has no effort segments in these captures because the synthetic fixture explicitly declares efforts: []; Opus and Sonnet declare their own nonempty effort arrays. These captures exercise Haiku as an unselected row; they did not establish correctness for a current model with stale session effort options. The new real ModelPicker regression exposed and fixed that separate current-model leak, as the red-before/green-after receipts show. This fixture demonstrates the no-effort case; it is not a claim about a live provider’s Haiku catalog.
Risk is limited to model/effort selection routing and keyboard navigation; focused regressions cover combined selection, model-only selection, current-model effort selection, explicit no-effort rows, fallback effort, provider layouts, and focus restoration. The prior provider comparison is recorded separately from the final-head green focused run.
Agent session: agent session







