Between 20 August and 6 September 2026 Claude Code went from 2.1.238 to 2.1.263 and shipped, among several hundred fixes, a dozen settings that materially change a production setup: bashOutputMaxChars and taskOutputMaxChars (up to 128K characters inline before output spills to a file), --restricted for untrusted repositories, PreModelSwitch/PostModelSwitch hooks, a /diff panel, /skill-doctor, per-agent experimental.cacheTtl, promptCacheTtl and subagentPromptCacheTtl, modelPicker, modelPricing, managedMcpServers, CLAUDE_CODE_SUBAGENT_MODEL_FORCE and a cache-miss cause in /cost. The default model also moved to Claude Fable 5.1 on 1 September at $10/$50 per million tokens with $0.25 cache reads and a 1M context. Below is what each one does, when it matters, and the JSON we now ship in every repo.
Output limits: stop losing the end of long commands
Version 2.1.261 (4 September) added bashOutputMaxChars and taskOutputMaxChars. Before this, a long test run or a chatty build had its output truncated inline and the remainder written to a file the model had to go read — an extra turn, and one the model sometimes skipped. You can now raise the inline limit up to 128K characters.
{
"bashOutputMaxChars": 65536,
"taskOutputMaxChars": 65536
}
Do not set both to the maximum reflexively. Every character of inline output is context. We settled on 64K for repos with verbose test runners and left the default elsewhere. The heuristic: if you see Claude reading a saved output file more than once a session, raise it.
--restricted: a real sandbox for repos you do not trust
Version 2.1.248 (27 August) added --restricted, also settable as CLAUDE_CODE_RESTRICTED=1. It removes the built-in tools that run commands or code and removes WebFetch, confines file tools to the working directory, refuses bypassPermissions, and ignores user, project and local settings files. That last part is the point: a malicious repository cannot smuggle in a .claude/settings.json that widens permissions, because in restricted mode settings files are not read at all. Use it for the first pass over any third-party codebase, any PR from an unknown contributor, and any "review this zip" request.
Model-switch hooks and forced subagent models
PreModelSwitch and PostModelSwitch (2.1.251, 28 August) fire when the session model changes and can block, confirm or annotate the switch. Teams with a cost policy — no Opus on the shared account after 6 pm, say — now enforce it in a hook instead of a Slack reminder. Pair it with CLAUDE_CODE_SUBAGENT_MODEL_FORCE (2.1.257, 1 September), which applies CLAUDE_CODE_SUBAGENT_MODEL — or the main model — to every subagent regardless of per-spawn or agent-definition overrides. That closes the gap where an agent definition quietly pins an expensive model.
The diff panel and cache-miss diagnostics
Two 2.1.260 (3 September) additions changed how we review. /diff opens a panel beside the conversation in fullscreen mode and shows uncommitted changes live as Claude edits — no more alt-tabbing to git diff between turns. And /cost, plus the status line's prompt_cache field, now states the likely cause of a prompt-cache miss: tool definitions changed, system prompt changed, or idle past the TTL. Read that line whenever a session feels expensive. In our experience the cause is almost always a changed tool set — an MCP server reconnecting, a skill listing that shifted — and it is fixable.
Cache TTLs you can now set
Version 2.1.243 (25 August) added promptCacheTtl and subagentPromptCacheTtl for API-key and cloud-provider users, and 2.1.248 added experimental.cacheTtl in agent frontmatter with values "5m" or "1h". The 1-hour TTL is the difference between a subagent that comes back to a warm cache and one that pays full input price on every spawn. If you run scheduled or long-lived agents, set the hour. Our earlier Fable 5.1 cache economics post has the arithmetic; with cache reads at $0.25 per million, a warm 200K-token context costs five cents to re-read.
---
name: nightly-audit
model: claude-fable-5-1
experimental:
cacheTtl: "1h"
---
Model picker, model pricing and managed MCP servers
modelPicker (2.1.243) curates the /model list into an ordered, labelled set — useful when your organisation has approved three models and you do not want a junior engineer discovering a fourth. modelPricing is a managed setting for your organisation's contracted per-model rates, so /cost reports what you actually pay. And managedMcpServers (2.1.259, 2 September) lets an organisation push HTTP or SSE MCP servers to every user, which is how you make an internal docs server or a ticketing server appear in everyone's session without each person editing config. Our MCP Server Pack now ships in the managed format for that reason.
Smaller ones we still turned on
timeFormat and timeZone (2.1.257) put a 24-hour clock in the right zone on the turn-end line, which matters more than it sounds when you read transcripts across regions. keybindingFlavor: "readline" (2.1.238) makes Ctrl+W delete to the previous whitespace like a shell. /effort s changes effort for the current session only. --permission-prompts none (2.1.259) is for unattended headless hosts and nowhere else. The SendFeedback tool (2.1.247) lets Claude draft a bug report when something goes wrong for you to review under /feedback; turn it off with feedbackDrafts if you would rather not. And since 2.1.239, cost estimates include the 1.1× US-only-inference premium, so if your organisation pins inference to the US the numbers in /cost are finally right.
The settings.json we now start every repo with
{
"bashOutputMaxChars": 65536,
"taskOutputMaxChars": 65536,
"timeFormat": "24h",
"timeZone": "Asia/Kolkata",
"keybindingFlavor": "readline",
"promptCacheTtl": "1h",
"subagentPromptCacheTtl": "1h",
"feedbackDrafts": true,
"hooks": {
"PreModelSwitch": [
{ "matcher": "", "hooks": [{ "type": "command", "command": "scripts/model-policy.sh" }] }
]
}
}
Plus --restricted as a shell alias for anything cloned from outside the organisation, and /skill-doctor on the first of the month.
Three settings we deliberately left off
--permission-prompts none is for unattended headless hosts, and only there. On a developer laptop it removes the one moment where a human can stop a wrong command; combine it with anything but --restricted and you have built an autonomous agent with your credentials. The maximum bashOutputMaxChars of 128K is the second: it exists for genuinely enormous outputs, but at that size a single command can consume a meaningful fraction of a session's context before the model has said a word. Start at 64K and raise per repo when you see repeated file reads. The third is feedbackDrafts off. The drafts are reviewed by you before anything is sent, and the reports have been the fastest route to a fix for two harness bugs we hit in August; there is no privacy reason to disable them that the review step does not already cover.
Rollout order for a team
Settings land in three places — user, project and managed — and the order you introduce them matters more than the values. Week one, managed only: modelPricing so /cost is true, modelPicker so the approved models are the visible ones, and managedMcpServers for the internal servers everyone needs. Nobody's workflow changes; the numbers become honest. Week two, project settings in the repo: output limits, cache TTLs, the PreModelSwitch hook with a policy script that only logs. Read the logs for a week before the script blocks anything. Week three, user-level quality of life: timeFormat, keybindingFlavor, and a --restricted alias documented in the onboarding page. And on the first working day of each month, everyone runs /skill-doctor and deletes the top item it flags. That cadence has kept a twelve-seat setup from accumulating the drift that made the August cleanup necessary in the first place.
Quick answers
What is the maximum for bashOutputMaxChars?
128K characters. Above the limit, output is saved to a file as before.
Does --restricted read my project settings?
No. It ignores user, project and local settings files, which is what makes it safe for untrusted repositories.
Which version added /skill-doctor?
2.1.261 on 4 September 2026. It needs 2.1.252 or later to run and is unavailable in sessions that skip feature-flag fetching.
What changed about the default model?
2.1.257 (1 September) made Claude Fable 5.1 the default Fable model: 1M context, $10 input and $50 output per million tokens, $0.25 per million for cache reads.
A last note on precedence, because it explains most "the setting did nothing" reports: managed settings win over project settings, which win over user settings. If a value you committed to the repo does not take effect, run /status. Since 2.1.261 it names the organisation policy source and, when a policy could not load, says why — most often a proxy not passing the endpoint through. That single line has ended more than one afternoon of confusion on our side, and it is the first thing to check before you touch any JSON.
Copy the JSON above into a fresh repo, run one normal session, then read /cost — the cache line should say warm on every turn after the first. The full set of files we run, hooks and model-policy script included, is in the Claude Code Production Pack and the CLAUDE.md Starter Templates Pack; the cheat sheet has the slash-command list, and the AI model cost calculator will price your session mix. Every product mentioned is available at wowhow.cloud — pay once, ship forever.
Originally published at wowhow.cloud
Top comments (0)