[BUG] Model picker: `s` (use this session only) is honoured for the model but the effort column still writes effortLevel to settings.json globally

Status Open
Reported on v2.1.233
Maintainer reply ✓ Yes — bcherny
Activity 3 comments · opened Aug 15, 2026
💡 Likely answer: A maintainer (bcherny, collaborator) responded on this thread — see the highlighted reply below.

What's Wrong?

The /model picker has two commit actions in its footer: enter — set as default and s — use this session only. The picker edits two columns, model and effort.

Pressing s only applies session scope to the model column. The effort column is still written to ~/.claude/settings.json as effortLevel, so it becomes the global default and every session started afterwards inherits it.

So s is doing half of what it says. The user's intent when pressing it is "nothing here leaves this session", and one of the two things they just changed leaves anyway — silently, with no notice.

Observed (v2.1.233, macOS 26.6 arm64):

  1. ~/.claude/settings.json before: "model": "opus[1m]", "effortLevel": "high" (file mtime 2026-08-13 21:04).
  2. In a running session, /model → change the effort column to xhigh → commit with s (use this session only).
  3. ~/.claude/settings.json after: "effortLevel": "xhigh", file mtime 2026-08-15 11:08:40 — rewritten by the s path.
  4. Newly started sessions open at xhigh. The effort choice propagated globally despite s.

The model key was not observed to change in that run, consistent with s being honoured for the model column.

What Should Happen?

s should mean session-only for everything the picker just changed — both columns. Committing with s should leave settings.json byte-identical; enter should persist both model and effort.

This is what the standalone /effort command already does correctly — it distinguishes Set effort level to X (saved as your default for new sessions) from Set effort level to X (this session only). The picker's s path just isn't reaching that session-scoped write for its effort column.

Why this is worth fixing beyond the scope mismatch

The write happens on every commit through the picker, including when the user only meant to change the model — the effort column commits whatever value it is showing. Combined with effort levels that aren't offered for every model, this silently rewrites a user's global effort preference as a side effect of routine model switching. That downgrade path is already reported separately in #30726.

Related, and why this isn't a duplicate of any of them

  • #49076/model silently persists effortLevel to settings.json. Same underlying write, reported in April, auto-closed as a duplicate by the bot against #30726 and #20745 without being addressed on its own terms.
  • #20745 — model setting global across sessions. Closed as completed: the model half got session scope. The effort half was closed alongside it and did not. That is the asymmetry this issue is about, and it did not exist when #49076 was filed.
  • #66402/model and /effort mutate global settings.json, framed around the agents/fleet view, and asserts both are global. That framing is now partly stale, and it is not about the s key.
  • #85774/model <name> typed directly has no session-only equivalent. That is about the absence of s on the direct-typed form; this is about s being present and only half-applied.
  • #85968 — feature request for session-scoped model selection. Already shipped as s; this issue is that s is incomplete.
  • #30726effortLevel: max silently downgraded by the effort UI. A consequence of the same write, not the scope claim.

Environment Info

  • Version: 2.1.233
  • Platform: darwin (macOS 26.6, arm64)
  • Terminal: fish / iTerm2

View original on GitHub ↗

3 Comments

bcherny collaborator · 15 days ago

Reproduced on v2.1.233 (macOS).

Steps:

  1. Start with "effortLevel": "high" in ~/.claude/settings.json.
  2. Run claude, type /model, press → once so the effort column shows xHigh effort, then press s (use this session only).
  3. Check ~/.claude/settings.json.

Observed: the confirmation says Set model to ... for this session only with xhigh effort, but settings.json was rewritten from "effortLevel": "high" to "effortLevel": "xhigh". New sessions inherit xhigh. The model key was left alone, as expected.

Expected: s leaves settings.json untouched for both the model and the effort choice; only Enter should persist either.

Assessment: This looks like a genuine bug. The picker's own confirmation message says the change is "for this session only", yet the effort half is saved as the global default anyway. Internally the model and effort choices go through two different persistence paths, and only the model path checks whether you pressed s or Enter. It isn't a recent regression: the effort column has persisted globally from the picker ever since the session-only key was introduced (around v2.1.153), it was just never wired to respect it. The fix should be small — the effort path already supports a session-only mode, it just isn't being told to use it here.

🤖 Generated with Claude Code

bcherny collaborator · 6 days ago

Reproduced on Linux with Claude Code v2.1.233.

Steps: fresh config with settings.json containing "model": "opus", "effortLevel": "high" → start a session (opens as Opus 5 with high effort) → /model → adjust the effort row from High to xHigh with the arrow keys → commit with s (use this session only).

Result: the confirmation message even says "Set model to Opus 5 for this session only with xhigh effort" — but settings.json is rewritten with "effortLevel": "xhigh" (the model key is left untouched, confirming the model half of s is honoured). New sessions then inherit the changed effort level.

So the report is accurate: s applies session scope to the model column only, while the effort column is persisted globally on commit, silently. Marking as confirmed.

🤖 Generated with Claude Code

benthepsychologist · 5 days ago

Filed a follow-up proposing a -s|--session flag for the typed form (/model <name>//effort <name>), citing this issue as evidence s doesn't fully cover effort today: #89548