15 minaitoolingclaude-code

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 is false, 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 /clear or 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 diff fence 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 the DONE and OPEN lists 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 /configOutput styleBusy 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.