Every session in this repo has opened with a hook for months now. It injects one ruleset: keep it short, drop the padding, keep the technical terms exact. I wired that up myself because I got tired of asking for brevity again in every conversation. Since version 2.1.237, Claude Code ships a built-in output style that promises roughly the same thing, called Concise.
My first thought was that I could throw my hook away. That turned out to be too quick, because the two do their work in different places inside the request, and the place matters more than the wording of the instruction.
What Concise is
An output style changes how Claude responds, not what Claude knows. The style gets appended to the end of the system prompt. There are five built-in styles now: Default, plus Proactive, Concise, Explanatory, and Learning.
Per the documentation, Concise does three things. The result comes first, preamble and narration drop away, and responses stay short by default. The engineering work itself stays as thorough as in Default. Ask for an explanation or more detail and you get a full answer.
One exception is nailed down explicitly: error reports, security warnings, and confirmations for destructive actions always keep their complete content. That is the right exception to carve out, because those are exactly the moments where answering short gets dangerous.
You set it through /config, under Output style. The standalone /output-style command is gone: deprecated in v2.1.73 and removed in v2.1.91. Type it out of habit and nothing happens.
Where the instruction lands
There are three places to steer your agent’s voice, and they behave differently.
| Output style | CLAUDE.md | Hook or skill | |
|---|---|---|---|
| Lands in | the system prompt | the project context | the conversation |
| Active from | session start, fixed | session start | the moment it fires |
| Changing it mid-session | needs a restart | needs a restart | works immediately |
| Effect on the cache | full request reprocessed | full request reprocessed | prefix stays intact |
| Reaches subagents | no | no | no |
| Choice is stored in | .claude/settings.local.json | the file in the repo | the config in the repo |
The cache column explains behaviour that otherwise looks arbitrary. Claude Code re-sends the whole context with every message, and the API reuses whatever stayed identical at the front. A change to the system prompt puts everything behind it out of reach, so the full request gets reprocessed. That is why a style change waits for a restart or a /clear instead of taking effect right away. A skill or hook appends its instruction as a conversation message, which leaves the cache intact.
The bottom row is the one I had underestimated. A subagent starts its own conversation with its own system prompt, so output styles apply to the main conversation only. Run a fan-out of ten agents and all ten write in the default voice, whatever you set for the main session.
The numbers, and the one that is missing
What is solid:
- Concise needs v2.1.237 or later. One version later, 2.1.238 carries a changelog fix for custom, project, and plugin output styles that drifted back to the default voice mid-session.
/output-stylehas been gone since v2.1.91, deprecated in v2.1.73.- Five built-in styles, where most write-ups still name two or three.
What is missing is a measurement. The documentation says Explanatory and Learning produce longer responses by design and therefore more output tokens, and that Concise does the opposite. There is no percentage and no test setup. For a feature presented as a saving, that is the most interesting paragraph nobody wrote. If you want to know what it saves you, you measure it yourself for a week.
On the input side the direction is known: every style appends text to the system prompt, so input tokens go up. Prompt caching absorbs most of that after a session’s first request.
The caveat
“Short” is defined by the vendor. The instruction text of the built-in styles is not published, so what counts as preamble and narration sits in a prompt you cannot read. With your own style or hook you see exactly what is being asked. Here you read a three-sentence description and trust the rest.
Noticing is on you. The style does not reach subagents, and until 2.1.238 a custom style could quietly fall back to the default voice mid-session. Both failures look identical from the outside: an answer arrives, just in a different register. That is a harder class of bug than an error message, because there is no moment where it visibly goes wrong.
Narration is also your intervention point. The announcement up front (“I am about to change these four files”) is not only padding. It is where you can stop something before it happens. Keeping error reports and destructive-action confirmations complete is the right line to draw. Everything below it has become negotiable, and that is a choice to make deliberately rather than switch on because short reads nicely.
What I do myself
My hook stays, for a reason that has nothing to do with the wording. That hook is version-controlled in the repo, so it travels to every machine and every worktree. The output style choice lands in .claude/settings.local.json, which is local and per project. What I set in one repo applies nowhere else.
Beyond that I keep two rules. I pick the style at the start of a session rather than halfway through, because switching mid-session costs a full reprocessing of the request. And I am going to track for a week what Concise does to my output tokens, since there is no published figure I can borrow from anyone.
What I do not know yet is whether I want both at once. A hook and a style that both ask for brevity is redundant, and doubling an instruction does not make a model twice as brief. So I am going to test it.
Frequently asked questions
Why does my output style only change after a restart?
Because the style lives in the system prompt, and Claude Code reads that once when a session starts. Changing it invalidates the entire cache you have built up. After a /clear or in a new session it is active.
Does the style apply to my subagents?
No. A subagent runs its own system prompt, so output styles cover the main conversation only. A fork is different: it inherits the parent’s system prompt.
Where is my choice stored?
In .claude/settings.local.json, at the project level. You can also set the outputStyle field by hand in a settings file, which is what you do in the desktop app where there is no menu.
Does an output style cost extra tokens?
On the input side yes, because the instruction is appended to the system prompt. Prompt caching absorbs that after a session’s first request. On the output side it depends on the style: Explanatory and Learning produce longer answers by design, Concise shorter ones. How much shorter has not been published.
Sources
- Claude Code CHANGELOG, version 2.1.237 (Concise introduced) and 2.1.238 (fix for drifting styles), accessed August 21, 2026
- Claude Code Docs, “Output styles”, accessed August 21, 2026
- Claude Code Docs, “How Claude Code uses prompt caching”, accessed August 21, 2026
Checked on August 21, 2026. The description of Concise, the five built-in styles, the storage location, and the subagent behaviour come from the official documentation; the version numbers from the changelog. What I could not verify: the instruction text of the built-in styles is not public, so “leads with the result” is the maker’s description rather than something I was able to read. There is also no published measurement of how much shorter Concise answers. Sources that contradict each other: several blog posts and an older German translation of the same documentation page still list two or three built-in styles and describe /output-style as the way to switch. The current English documentation lists five and states that the command was removed in v2.1.91. I follow the current primary source.
