Regression: /effort writes to global settings.json mid-session, breaking previously-isolated parallel sessions
TL;DR
/effort used to be per-session. It isn't anymore. It now writes to ~/.claude/settings.json (user scope) and silently shifts every other live session at their next prompt. **The worst part isn't shifting down — it's shifting up without the user knowing, and burning Max-plan weekly tokens on operations the user thought were running at low.**
There's an undocumented env var (CLAUDE_CODE_EFFORT_LEVEL) that restores per-session isolation, which suggests the prior behavior is recoverable.
Context — how we use Claude Code
We run Opus 4.7 (1M context) for multi-hour project sessions. Several windows are usually open in parallel, each on a different long thread (architecture, implementation, documentation, batch operations).
Within one window, the level of reasoning needed shifts as the task moves. A design conversation needs xhigh. The implementation pass needs high. The cleanup at the end can run on low. Adjusting /effort mid-session as the work changes shape is part of the workflow, not an exception.
What changed (regression)
Earlier behavior: /effort was per-session. You only had to remember which level you'd picked when opening a new window — once running, each session held its own. That worked fine for parallel multi-window use.
Current behavior: /effort writes to ~/.claude/settings.json and the next prompt in any other live session reads the new value. Lowering effort in window A drops window B mid-thought, with no notification in B.
Why this matters more than "wrong reasoning level"
The asymmetric pain is on the upward shifts:
- Window C is running on
lowfor an hour of mechanical batch operations (file moves, renames, formatting fixes). Token cost expected to be minimal. - Meanwhile, window A bumps to
xhighfor an architecture deep-dive. - Window C's next batch operation now silently runs at
xhigh. Samemvcommand, same trivial output — but with full deep-thinking budget consumed.
On Max-plan accounting (Max 20x in our case), those wasted tokens count against the weekly quota. The user can't see that it happened, can't predict it, can't budget around it. Effort level is an invisible knob being twisted by other windows.
The downward case ("my Opus session dropped to low mid-thought") is annoying. The upward case is silent token theft from the user's quota.
Repro
- Open two
claudewindows. - In window A:
/effort xhigh. Submit a prompt — confirms xhigh. - In window B: submit a prompt — also xhigh, despite never being set there.
- In window B:
/effort low. Submit a prompt. - In window A: submit a prompt — now low. The architectural reasoning session has been silently downgraded.
To see the token-burn version: invert. Start B at low for batch work, bump A to xhigh, watch B's tokens balloon on its next prompt without any user input there.
Why prior issues don't cover this
#49166 and #37303 are closed as COMPLETED — but the underlying behavior is unchanged. The --effort startup flag covers "I want a new session pinned to level X." It does not address "I want mid-session /effort adjustment to affect only this session," which is what users have been reporting since.
#43061 (open) requests this for /model — same root cause, different surface.
Workaround (and what it implies)
CLAUDE_CODE_EFFORT_LEVEL env var, set before launch, restores per-session isolation:
\\\bash\
alias cc='CLAUDE_CODE_EFFORT_LEVEL=high claude'
\\
Each cc invocation is a separate process with its own env snapshot. /effort from elsewhere can't reach in. This works because the env var sits above settings.json in the precedence chain.
The fact that this works confirms the underlying machinery still supports per-session levels. The bug is that the default behavior persists /effort to global config.
Proposed fix
Pick one:
- Stop persisting
/effort(and/model) to global config. Treat them as session-scoped runtime state. Cleanest. - Add
--no-persistorsessionScopeOnlysetting so users can opt into the prior behavior. - At minimum, document
CLAUDE_CODE_EFFORT_LEVELso other users don't lose hours and quota to unexplained level shifts they didn't make.
Environment
- macOS 25.4.0 (Darwin)
- Claude Code 2.1.138
- Plan: Claude Max 20x
- Models: Opus 4.7 (1M context), Sonnet 4.6, Haiku 4.5
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗