If you run long Claude Code sessions on Opus 5, you’ve probably met the end-of-session report: five paragraphs, a “Current state” section, numbered open questions with a mini-essay each, a “Net:” summary of everything it just said, and a closing “Want me to…?”. All accurate. None of it readable at the end of a long day.
For weeks I typed the same reply back — too much, succinct, bullet points — and the next answer would be perfect. So the model can do it. It just doesn’t by default, and “be concise” in your instructions doesn’t fix that.
Here’s what does.
Three things work against you:
CLAUDE.md is read once, at the start. Three hours and a few hundred tool calls later it’s a long way back in the context — which is exactly when the walls of text show up.The fix is to give the model a fixed shape to fill, and to repeat it on every single prompt.
Every reply that reports work, status or analysis gets exactly three groups, and every bullet is numbered by its group:
1.1, 1.2, …2.1, 2.2, …3.1, 3.2, …The numbers are what make it a conversation instead of a wall: the prefix is fixed per group and doesn’t shift when a group is empty, so you answer with “3.2 — later” instead of quoting the line you mean.
Plus hard limits, because “short” without numbers drifts: one line per bullet, about twelve words, at most five bullets per group, empty groups left out, and nothing after the groups. That last one kills the “Want me to…?” closer — any question for you goes in Decisions, where you’ll actually see it.
A few carve-outs keep it from becoming its own kind of annoying. Analysis gets up to eight bullets, then Decisions. A plain question gets a plain one-to-three line answer. A mid-task progress note is one line.
Add this to ~/.claude/CLAUDE.md so it applies to every project, and delete any older answer-style section that disagrees with it:
## Answer style — three numbered groups
Every reply that reports work, status or analysis uses only these groups, each a bold
label with numbered short bullets under it. Leave out any group that is empty.
- **Done** — fixed, shipped or verified. Each bullet names where: PR link or path. `1.1`, `1.2`, …
- **Pending** — in flight or waiting. Each bullet names what it waits on. `2.1`, `2.2`, …
- **Decisions** — choices only I can make. Each bullet is one question with its options. `3.1`, `3.2`, …
Every bullet opens with its number and a dash — `3.2 - Ship it now, or after the release?`
The prefix is fixed by group (Done `1.x`, Pending `2.x`, Decisions `3.x`) and never shifts
when a group is left out, so I can answer with a bare number instead of quoting a line.
One line per bullet, about twelve words or fewer, at most five bullets per group. No
paragraphs, no background, no recap of the steps taken, no restating the request, no
explanation of how something works unless asked. Nothing after the groups — no "Want me
to…?" closer; a question for me belongs in **Decisions**.
Analysis or advice (parsing someone's message, weighing options) gets at most eight
numbered bullets, then **Decisions**. A mid-task progress note is one short line. A plain
question gets a plain one-to-three line answer. Write longer only when I explicitly ask
for a doc, a design or an explanation.
This is the part that actually makes it stick. A UserPromptSubmit hook runs every time you send a message, and whatever it prints as additionalContext gets attached to that prompt — so the rule is always sitting right next to your latest message, no matter how long the session has run.
Save this as ~/.claude/hooks/terse-output.sh:
#!/bin/bash
cat <<'JSON'
{"hookSpecificOutput":{"hookEventName":"UserPromptSubmit","additionalContext":"REPORT FORMAT (hard rule, overrides default verbosity, applies to every reply that reports work, status, or analysis):\nUse only these three groups, each a bold label followed by numbered short bullets; leave out any group that is empty:\n**Done** - fixed, shipped, or verified; each bullet names where (PR link or path). Numbered 1.1, 1.2, ...\n**Pending** - in flight or waiting; each bullet names what it waits on. Numbered 2.1, 2.2, ...\n**Decisions** - choices only I can make; each bullet is one question with its options. Numbered 3.1, 3.2, ...\nRules:\n- Every bullet starts with its number and a dash: '1.1 - ...'. The prefix is fixed by group (Done 1.x, Pending 2.x, Decisions 3.x) and does not shift when a group is left out, so I can reply with just '3.2'.\n- One line per bullet, about 12 words or fewer, at most 5 bullets per group.\n- No paragraphs, no background, no recap of steps taken, no restating the request, no explaining how something works unless asked.\n- Nothing after the groups: no 'Want me to...?' closer; a question for me goes in Decisions.\n- Analysis or advice (parsing a message, weighing options): at most 8 numbered bullets, then Decisions.\n- Mid-task progress notes: one short line, no groups.\n- A plain question gets a plain one-to-three line answer, no groups.\n- Write longer only when I explicitly ask for a doc, a design, or an explanation."}}
JSON
Make it executable:
chmod +x ~/.claude/hooks/terse-output.sh
Add this to ~/.claude/settings.json. If you already have a hooks block, merge the UserPromptSubmit entry into it rather than replacing the whole thing:
{
"hooks": {
"UserPromptSubmit": [
{
"hooks": [
{
"type": "command",
"command": "~/.claude/hooks/terse-output.sh",
"timeout": 5000
}
]
}
]
}
}
Start a new session and run /hooks — you should see terse-output.sh listed under UserPromptSubmit. Then ask for something with real output, like a small fix, and look at the reply.
Here’s the same kind of report before and after.
Before:
Here’s my read, grounded in how the client actually deploys today.
Current state: The client is a managed install, auto-pushed to every machine. Printers are self-service items that already appear grouped under a category… (four more paragraphs, three numbered questions, a “Net:” summary, and “Want me to check X, or draft the reply?”)
After:
Done 1.1 - The every-prompt hook used to say “prose only”; it now requires these three groups. 1.2 - The global CLAUDE.md answer-style section now matches that rule.
Pending 2.1 - Sessions already open pick up the new rule from their next prompt.
Decisions 3.1 - Also turn off the recap block after each turn?
Ten seconds to read, and the one decision I need to make is at the bottom where I can’t miss it.