Claude Code 2.1.316: subagent effort becomes a setting, ultrathink gets a kill switch, and Opus fast mode has 30 days left
Claude Code 2.1.316 hit npm at 00:42 UTC this morning. I read the changelog over coffee because this release touches the three things I care about most in an agent config: what effort level subagents run at, what the ultrathink keyword costs, and which model settings quietly carry an expiry date. O

Claude Code 2.1.316 hit npm at 00:42 UTC this morning. I read the changelog over coffee because this release touches the three things I care about most in an agent config: what effort level subagents run at, what the ultrathink keyword costs, and which model settings quietly carry an expiry date.
One numbering detail first. The changelog goes 2.1.312, then 2.1.314, then 2.1.316. Version 2.1.313 is the number the trojanized Claude Code extension claimed on Cursor's marketplace last week, so the real release train skipped it. 2.1.315 shipped to npm on October 30 with no changelog entry at all. If you version-pin in CI, pin to numbers that actually exist in the release history.
The line that matters: CLAUDE_CODE_SUBAGENT_EFFORT sets the effort level subagents run at when nothing else names one, instead of inheriting the session's.
That default inheritance is the quiet cost multiplier in multi-agent runs. When I fan work out to subagents, each one picks up the effort level of the session that spawned it. A session I set to high effort for a hard design question will also run its log-reading, file-summarizing, checklist-running subagents at high effort. Those jobs do not need it. I wrote about the coordination side of running agents in parallel before. This is the budget side of the same setup, and until today there was no session-wide default for it. You named the effort in each subagent prompt, or you accepted the inheritance.
The standard place is the env block in settings:
{ "env": { "CLAUDE_CODE_SUBAGENT_EFFORT": "low" } } Enter fullscreen mode Exit fullscreen mode Or as a one-off for a single project:
CLAUDE_CODE_SUBAGENT_EFFORT = low claude Enter fullscreen mode Exit fullscreen mode One honest caveat: the changelog does not enumerate the accepted values. The effort settings the product exposes are the picker levels, low through xhigh, so start with the level you actually want delegated work to run at and confirm on your install with /model. The point of the setting is the split itself. Your main session can reason at high effort while the delegated work runs at a lower one.
CLAUDE_CODE_DISABLE_ULTRATHINK turns the ultrathink keyword off entirely.
Context for why that exists. This release also aligns VS Code with the terminal: typing ultrathink now runs that turn at xhigh effort, with a rainbow indicator in the chat box. Ultrathink is not a thinking-budget nudge anymore, it selects the top of the effort range for the whole turn.
That is what you want when you typed it on purpose. It is not what you want when the word shows up somewhere you did not intend: a pasted terminal log, a doc the agent reads, a rules file that mentions it in prose. The keyword fires on the text, not on your intent. If a team wants predictable spend, an off switch that kills the keyword and makes effort an explicit choice is the safer default. Solo users who never type it by accident lose nothing by leaving it on.
The deprecation line has a date in it, which is why I treat it as the urgent item. Fast mode for Opus 4.8 was deprecated on October 30. It gets removed on November 30. After removal, fast mode requests on Opus 4.8 return an error and do not fall back to standard Opus 4.8. The migration path named in the changelog is Opus 5.5, which matches what I saw when Claude Code switched its default model.
Check anything that pins a model string:
grep -rn "opus" ~/.claude/settings.json.claude/settings.json.claude/settings.local.json 2>/dev/null Enter fullscreen mode Exit fullscreen mode If a script or a managed config selects fast mode on Opus 4.8, November 30 is not a slowdown, it is an error. This is also a good moment to pin exact model ids instead of aliases, because the alias surface keeps moving.
Most of this release faces individual developers, but three items land on the Claude apps gateway:
Two fixes matter beyond their one-line descriptions.
--restricted sessions no longer upload files from outside the working directories when a Read allow rule covered them. A read permission widening into upload reach is exactly the kind of cross-tool interaction I watch for in guardrail configurations, and this one got closed.
Subagents that inherited a parent subagent's model no longer move to the main model when a background job or message wakes them. If you run nested delegation, a cheap subagent model was sometimes flipping back to the expensive main model mid-run. That is a real budget leak, now fixed.
Also smaller but welcome: the sonnet, opus and haiku aliases on Vertex AI and Bedrock no longer show an error mid-session when the newest model is not yet available to the account or region. They switch to an older model, which is what they were supposed to do all along.
The direction is consistent across releases: effort, model and budget keep getting separated into independently configurable pieces. Every split is a knob you now own. Set the defaults deliberately, and the inheritance stops deciding for you.