Bug Description
The /model interactive picker silently writes the selected effortLevel to ~/.claude/settings.json as a persistent global default. This means every time you use /model to switch models, it overwrites your preferred effort level as a side effect — even if you only intended to change the model.
This is especially problematic when switching between Opus and Sonnet: since Sonnet doesn't support max effort, the picker defaults to high, which then gets persisted. The next time you open an Opus session, your effort level has been silently downgraded.
Steps to Reproduce
- Set
"effortLevel": "max" in ~/.claude/settings.json
- Start a new session, confirm effort is
max
- Use
/model to switch to Sonnet (or any model), then switch back to Opus
- End the session and start a new one
- Check
~/.claude/settings.json — effortLevel has been changed from "max" to "high" (or whatever the picker showed during selection)
Additional reproduction (race condition)
- Use
/model, select a model with low effort
- Immediately use
/model again and select max effort
- End the session —
settings.json may still contain "low" from the first call, as if the second call did not persist
Expected Behavior
Either:
- Option A:
/model should be session-only (as the documentation suggests) and should not write effortLevel to settings.json
- Option B: If persistence is intended,
/model should only persist the model selection, not the effort level — these are independent settings
Actual Behavior
/model writes both the model and the effort level to settings.json every time it's used. Users who have a preferred effortLevel: "max" find it silently downgraded after routine model switches.
Impact
From my own conversation history, this has silently overwritten my effortLevel at least 13 times over the past month:
- 12 times changed from
max → high (triggered by switching to Sonnet)
- 1 time changed from
max → low (triggered by scrolling through the picker)
Each time I had to manually discover and fix it, either by asking Claude to edit settings.json or by using /model again.
Environment
- Claude Code CLI (latest)
- macOS, Apple Silicon
- Model: claude-opus-4-6
Suggested Fix
Decouple model selection from effort level persistence. If a user has set effortLevel in their settings.json, the /model command should not overwrite it unless the user explicitly changes the effort level through a dedicated mechanism (e.g., editing settings.json or a dedicated /effort --persist command).
Bug Description
The
/modelinteractive picker silently writes the selectedeffortLevelto~/.claude/settings.jsonas a persistent global default. This means every time you use/modelto switch models, it overwrites your preferred effort level as a side effect — even if you only intended to change the model.This is especially problematic when switching between Opus and Sonnet: since Sonnet doesn't support
maxeffort, the picker defaults tohigh, which then gets persisted. The next time you open an Opus session, your effort level has been silently downgraded.Steps to Reproduce
"effortLevel": "max"in~/.claude/settings.jsonmax/modelto switch to Sonnet (or any model), then switch back to Opus~/.claude/settings.json—effortLevelhas been changed from"max"to"high"(or whatever the picker showed during selection)Additional reproduction (race condition)
/model, select a model withloweffort/modelagain and selectmaxeffortsettings.jsonmay still contain"low"from the first call, as if the second call did not persistExpected Behavior
Either:
/modelshould be session-only (as the documentation suggests) and should not writeeffortLeveltosettings.json/modelshould only persist the model selection, not the effort level — these are independent settingsActual Behavior
/modelwrites both the model and the effort level tosettings.jsonevery time it's used. Users who have a preferredeffortLevel: "max"find it silently downgraded after routine model switches.Impact
From my own conversation history, this has silently overwritten my
effortLevelat least 13 times over the past month:max→high(triggered by switching to Sonnet)max→low(triggered by scrolling through the picker)Each time I had to manually discover and fix it, either by asking Claude to edit settings.json or by using
/modelagain.Environment
Suggested Fix
Decouple model selection from effort level persistence. If a user has set
effortLevelin their settings.json, the/modelcommand should not overwrite it unless the user explicitly changes the effort level through a dedicated mechanism (e.g., editing settings.json or a dedicated/effort --persistcommand).