[BUG] Model picker: `s` (use this session only) is honoured for the model but the effort column still writes effortLevel to settings.json globally
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):
~/.claude/settings.jsonbefore:"model": "opus[1m]","effortLevel": "high"(file mtime 2026-08-13 21:04).- In a running session,
/model→ change the effort column toxhigh→ commit withs(use this session only). ~/.claude/settings.jsonafter:"effortLevel": "xhigh", file mtime 2026-08-15 11:08:40 — rewritten by thespath.- Newly started sessions open at
xhigh. The effort choice propagated globally despites.
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 —
/modelsilently persistseffortLeveltosettings.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 —
/modeland/effortmutate globalsettings.json, framed around the agents/fleet view, and asserts both are global. That framing is now partly stale, and it is not about theskey. - #85774 —
/model <name>typed directly has no session-only equivalent. That is about the absence ofson the direct-typed form; this is aboutsbeing present and only half-applied. - #85968 — feature request for session-scoped model selection. Already shipped as
s; this issue is thatsis incomplete. - #30726 —
effortLevel: maxsilently 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
3 Comments
Reproduced on v2.1.233 (macOS).
Steps:
"effortLevel": "high"in~/.claude/settings.json.claude, type/model, press → once so the effort column showsxHigh effort, then presss(use this session only).~/.claude/settings.json.Observed: the confirmation says
Set model to ... for this session only with xhigh effort, butsettings.jsonwas rewritten from"effortLevel": "high"to"effortLevel": "xhigh". New sessions inherit xhigh. Themodelkey was left alone, as expected.Expected:
sleavessettings.jsonuntouched 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
sor 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
Reproduced on Linux with Claude Code v2.1.233.
Steps: fresh config with
settings.jsoncontaining"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 withs(use this session only).Result: the confirmation message even says "Set model to Opus 5 for this session only with xhigh effort" — but
settings.jsonis rewritten with"effortLevel": "xhigh"(themodelkey is left untouched, confirming the model half ofsis honoured). New sessions then inherit the changed effort level.So the report is accurate:
sapplies session scope to the model column only, while the effort column is persisted globally on commit, silently. Marking as confirmed.🤖 Generated with Claude Code
Filed a follow-up proposing a
-s|--sessionflag for the typed form (/model <name>//effort <name>), citing this issue as evidencesdoesn't fully cover effort today: #89548