The model got better, and I stopped reading it
Opus 5 wins the benchmarks and lost me somewhere in paragraph three. Two output styles later — one that fixes the words, one that fixes the shape — and a measurement of which colours a terminal will actually let a model use.
There is a habit I picked up this summer, and it took a while to notice it was new: I scroll to the bottom of the reply first.
Not because the answer is at the bottom. Because somewhere in the middle there is usually one sentence that needs a decision from me, and reading four hundred words to find it had quietly stopped being worth the time. The work underneath was good. The diffs were good. But the report about the work had turned into something I skimmed the way you skim a terms-of-service page, and skimming is exactly how you miss the line that says I could not verify this.
That is not a taste complaint. A report you do not finish reading is a report that failed at its only job.
It is not just you
I assumed this was me — wrong expectations, wrong prompts, too many sessions in one day. It is not.
The Hacker News thread Why does Opus 5 feel worse to work with? was sitting at 993 points and 871 comments when I read it, which makes it one of the largest model-specific threads since the launch. Alex Volkov’s post has the least diplomatic title of the lot — It’s not just you, Opus 5 is a “Jargon Douche” — and the same diagnosis: the model invents vocabulary, compresses ideas into abstractions, and produces text that is dense to read and impossible to scan.
The specific tics are so consistent that the thread reads like a shared bingo card:
| The tic | What it looks like |
|---|---|
load-bearing |
the flagship offender, applied to config keys, sentences, assumptions, anything |
| It’s not X, it’s Y | a reversal used as a rhetorical beat, several times per reply |
| the orbit | “sentences that orbit a point, then jump to it like it’s a revealed insight” |
| the fixed skeleton | restate the prompt, three paragraphs, one bullet list, the twist, the bottom line — for every topic |
| private vocabulary | seam, grain, pressure test, gate that needs wiring up |
My favourite example, because it is so ordinary, is from Volkov’s post: asked how to move from an iOS developer build to the public beta, the model answered that there is “nothing to install until public catches up”. Every word is English. The sentence is not.
Anthropic has clearly heard this — a built-in Concise style shipped in v2.1.237, which leads with the result and drops the narration. It is a good default and it would have solved maybe half of my problem. The other half is that I do not want short. I want scannable, which is a different axis, and I want it shaped the way I read.
Why the shape is the actual bug
Verbosity gets the blame because it is the visible symptom. It is not what hurt.
I read agent output in two passes. The first pass is a scan lasting a couple of seconds, hunting for exactly one thing: is there something here I have to act on? The second pass is optional and happens only if the first pass found something, or if I have time. That is not laziness, it is the only way to run several sessions at once.
A wall of prose defeats pass one completely. Everything in it has the same
visual weight, so the blocking question — should I keep the model key or put
it back? — is typographically identical to the sentence about how gzip is
configured. There is nothing for the eye to catch on. So either I read all of it
or I read none of it, and after the fourth session of the day the answer is
reliably none of it.
The fix therefore cannot be “write less”. It has to be write in fixed places, so that the scan knows where to look before it starts.
The lever
Claude Code has exactly one control that changes how the model writes rather than what it knows, and it is under-used because it looks like a theming feature. An output style is a Markdown file whose contents are appended to the end of the system prompt. Not a user message, not a memory file, not a skill that loads when something matches — the system prompt, every turn, whether or not the conversation gives it a reason to apply.
The three facts that matter before you write one:
- It replaces the coding instructions unless you say otherwise. A custom
style drops Claude Code’s built-in software-engineering guidance — how to scope
a change, how to verify work — unless the frontmatter sets
keep-coding-instructions: true. If you are changing the prose and not the job, that key is mandatory. Its default isfalse, which is the one setting in this whole feature most likely to bite you silently. - It is read once, at session start. Changing it mid-session does nothing
until
/clearor a new session. - Subagents do not get it. A subagent runs its own system prompt, so a style never reaches it. A fork does inherit, because a fork inherits the parent’s whole prompt.
The file goes in ~/.claude/output-styles/ for the user level, or
.claude/output-styles/ for a project, and you select it with /config. (The
standalone /output-style command was deprecated in v2.1.73 and removed in
v2.1.91 — if you have it in a runbook, it is now a no-op.)
I wrote two of them. The first fixes the words. The second fixes the shape as well, and only exists because the first one was not enough.
File one — fix the words
The words file borrows two things that already exist and takes one job from each.
ELI5 decides the vocabulary.
Explain Like I’m 5 is a subreddit, not a standard, and that is exactly why it
works as an instruction: it is a decade-long worked example of explaining a hard
thing to a smart adult without reaching for a term of art. The rule it gives you
is the shortest common word that is still correct — use, not utilize;
start, not initiate; about, not approximately.
ASD-STE100 decides the sentences. Simplified Technical English is a real specification, owned by the Aerospace, Security and Defence Industries Association of Europe, written in the 1980s so that an aircraft mechanic anywhere in the world reads one maintenance instruction and takes exactly one meaning from it. One topic per sentence, active voice, simple tenses, conditions before actions, instructions as commands. It is the most thoroughly field-tested anti-ambiguity standard in existence and it cost nothing to point a model at.
---
name: Simple English
description: ELI5 words + ASD-STE100 sentence rules, in the language you write in.
keep-coding-instructions: true
---
- Use the shortest common word that is correct.
- One topic per sentence. One instruction per sentence.
- Most sentences: 15 words or fewer. Hard limit: 20 for an instruction, 25
for a description. A technical name counts as one word.
- Active voice. `The test deletes the file`, not `The file is deleted by
the test`. Say who does what.
- Condition first, then the action: `If the port is busy, pick another one.`
- Write `do not`, `cannot`, `it is`. No contractions.
- `can` for ability, `must` for a requirement, `will` for the future. No
`may`, `might`, `could`, `would`, `should`. For advice: `I recommend …`.
Then a substitution table, which is the part that does the most work per line:
| Do not write | Write |
|---|---|
| utilize, leverage, employ | use |
| ensure, verify, confirm, validate | make sure, check |
| obtain, acquire, retrieve, fetch | get |
| demonstrate, indicate, illustrate | show |
| approximately, roughly, circa | about |
| in order to | to |
| due to the fact that, owing to | because |
| however, nevertheless, nonetheless | but |
| therefore, hence, consequently, thus | so |
| trivial / non-trivial | easy, small / hard, large |
| functionality | feature, what it does |
| orthogonal | separate, unrelated |
| caveat | but, warning |
Two rules keep this from becoming lossy, and they are the whole reason the file
is longer than the table. Everything technical is exempt — code, paths,
flags, error text, version numbers, and any real term of art. mutex stays
mutex; you add a plain sentence next to it the first time, you do not rename
it. And simple is not longer: the instruction is to cut filler before facts,
because the obvious failure mode of “explain it simply” is three friendly
paragraphs where one dense sentence was fine.
It is also not English-only, despite the name. The sentence rules hold in any language, and the file says to answer in whatever language the prompt was written in. Only the substitution table is language-specific.
The result, on a real before-and-after:
I’ve refactored the authentication middleware to leverage the existing session store, which should mitigate the race condition we were encountering during concurrent token refreshes; however, comprehensive verification will necessitate additional integration tests.
I changed the login check (
auth/middleware.ts). It now uses the session store that was already there. This fixes the bug where two token refreshes at the same time can break each other. One thing is still open. There are no integration tests for this path yet. So I cannot promise that it works in every case.
Same facts. The second one keeps the hedge instead of burying it in a subordinate clause at the end, which is the only difference I actually care about.
File two — fix the shape
The words file made every sentence readable and left the scan problem exactly where it was. A readable wall is still a wall.
So the second style adds a fixed layout: seven sections, always in this order, each with a coloured marker and a horizontal rule between them. Every section is optional except the answer.
| Order | Marker | Title | What goes in it |
|---|---|---|---|
| 1 | — | no title | The answer. 1 to 3 sentences. Always first. |
| 2 | 🔴 | NEEDS YOU |
Questions and decisions that block me. Numbered. |
| 3 | 🟢 | DONE |
Work that is finished and checked. |
| 4 | 🟠 | OPEN |
Problems found but not fixed. |
| 5 | 🔵 | PROGRESS |
The bar and the plan steps. |
| 6 | 🟡 | WATCH OUT |
Risks and things that bite later. |
| 7 | ⚪ | DETAIL |
Reasoning, evidence, tables. Safe to skip. |
The colour is the identity: red means act now, orange means not finished, white
means background. Pass one of my reading is now “is there a red section”, which
takes about as long as it takes to say. Everything else can wait for pass two,
and DETAIL — the section that used to be paragraphs one through six — is last
and explicitly skippable.
Progress gets a bar with the exact numbers next to it, because a bar alone is a picture:
```
Plan [███████████░░░░░░░░░] 4/7 57%
```
- ✅ 1. Step that is finished
- ▶️ 2. Step that runs now
- ⬜ 3. Step that is not started
The single most important line in the file is the one that turns all of it off:
Do not use the sections for a small answer. A question with a two-line answer gets two lines. The test: if the reply is about 6 lines or fewer, and it asks nothing, and it reports no work, then write plain prose.
Without that rule you get seven headings on top of “yes, port 8080 is free”, and
a format that fires on everything is just a different wall. The escape hatch is
what makes the structure trustworthy — a NEEDS YOU heading means something
precisely because most replies do not have one.
What the terminal will actually let you colour
The markers are emoji, and that was not an aesthetic decision. I tried to colour the text and found out you cannot.
Claude Code strips ANSI escape codes out of model output — there is an open
request to allow them,
#16668 — and it renders
no HTML. So free text has no colour channel at all. What does survive is
narrower than I expected, and I only know the shape of it because I measured it
with tmux capture-pane -e on 2026-08-24:
- Basic ANSI only. No truecolor anywhere in the rendered output.
- Six hues, all of them from syntax highlighting inside code fences: strings red, numbers and comments green, function names yellow, keywords blue, types and keys cyan, punctuation grey.
- Magenta never appears.
- A
difffence colours whole lines (+green,-red) and is the only way to tint something that reads as prose — but a fence does not wrap, and it copies as a fence, which is why theDONEandOPENlists are plain bullets and not a green diff block.
Emoji, meanwhile, render in colour anywhere, in any line, with no fence around them. That is the entire reason the design puts the colour in the marker and leaves the text monochrome: it is the only channel that exists. Six markers plus ✅ ▶️ ⬜ for steps is the complete set, and the file says so explicitly, because an emoji that means nothing is just noise wearing a colour.
What it costs
The style is input tokens on every session. Mine is 14 KB of system prompt. Prompt caching absorbs most of it after the first request, but it is not free, and a style long enough to specify seven sections is long enough to notice.
Two files have to travel together and neither one warns you. The style is the
.md; the switch is "outputStyle" in settings.json. The value must match the
name: in the frontmatter exactly — Busy Lukas, not the filename
busy-lukas — and a mismatch does not error. It silently falls back to the
default style.
A repo can override you invisibly. /config writes the key into that
project’s .claude/settings.local.json, which is gitignored on my machine — so a
per-repo override does not show up in git status and does not exist on a fresh
clone. I had four repos carrying a hand-clicked style from before it was a
default, which is a great way to spend an afternoon wondering why one project’s
replies look different from every other project’s.
And a style cannot make a model concise about the wrong thing. It reshapes
output; it does not decide what belongs in the output. If the model has
misjudged what matters, the seven sections will present that misjudgement in a
beautifully scannable layout. Structure is not editorial judgement, and I have
caught myself trusting a tidy DONE list slightly more than it earned.
The part I did not expect
I went in thinking of this as ergonomics — a nicer surface on the same work. What it actually changed was how much of the work I check.
When the blocking questions live in a fixed red section, I answer them. When they were sentence four of paragraph three, I answered maybe half of them and let the model pick a default for the rest, and I never once noticed I was doing it. The wall of text was not costing me reading time. It was costing me decisions I thought I was making.
Benchmarks measure whether the answer is right. Nothing measures whether it was read. Until something does, that gap is yours to close, and it turns out to be one Markdown file and one settings key.
Get the file
Everything above is excerpts. The whole style — both halves, the substitution table, the seven sections and the rule that switches them off — is a single Markdown file, and this is the one I actually run:
Download busy-lukas.md (14 KB)
Install it:
mkdir -p ~/.claude/output-styles
mv ~/Downloads/busy-lukas.md ~/.claude/output-styles/
Then /config → Output style → Busy Lukas, and start a new session,
because the file is only read at session start. keep-coding-instructions: true
is already in its frontmatter, so it adds to Claude Code’s built-in engineering
guidance instead of replacing it.
Two things to change before it is yours: the reader it describes is me, so
rewrite that paragraph — and if you rename the style, the name: and the
settings.json value have to match, per the section above.
Sources for the “not just you” section: the Hacker News thread Why does Opus 5 feel worse to work with?, Alex Volkov’s It’s not just you, Opus 5 is a “Jargon Douche”, a style comparison thread, and the official output styles documentation. The two things the word rules are built on: r/explainlikeimfive and ASD-STE100 Simplified Technical English.