Original Reddit post

Since everyone is having a great time with it, I collected some solutions that you can utilize to manage Opus 5 communication nightmare style. Ordered from “weakest” to “strongest”. CLAUDE.md instructions Write your rules down first. Be concise on its own barely registers, because it’s abstract and it has rarely anything the model can act on reliably. However a well written rule that specifies the shape you want does significantly better. Below is the one I use for reply verbosity, paste-ready for your own CLAUDE.md :

Reply shape - Lead with the answer in the first sentence, before any table, list, or caveat. - Carry status, comparisons, and any multi-item result in a table or bullet list, never a prose paragraph. - Cap unbroken prose at two paragraphs; if a third starts, convert the run to a bullet list or table. - Give each item its own bullet row, not a clause buried across sentences. - Compose in this shape from the start; do not draft prose and reshape it afterward.

Output styles An output style is a step up. A simple CLAUDE.md file rides in as a user message after the system prompt; an output style modifies the system prompt itself, and Claude Code adds its instructions to the end of that prompt (per the output-styles docs: https://code.claude.com/docs/en/output-styles ). — name: Reply shape description: Reply-shape rule as a style: answer first, tables and bullets over prose walls. keep-coding-instructions: true — … the instructions from the first point … Note: Still instruction, so the model can still drift, but it drifts less than from a line buried in a file. A hook that gates the output (best) Hooks enabling the capability to run a script in the harness at a fixed moment. It is deterministic where the rule and the style depend on the model choosing to comply, which makes it the strongest of the three. #!/usr/bin/env bash # Stop hook: if the reply ran long, send it back once to tighten up. # The Stop event hands us the finished reply on stdin. reply=“$(jq -r ‘.last_assistant_message // “”’)” # Your bar. Word count here; a line count or a preamble check works the same way. You can implement other rules as well, not just length here. limit=180 words=“$(printf ‘%s’ “$reply” | wc -w | tr -d ’ ')” if [ “$words” -gt “$limit” ]; then # Exit 2 blocks the stop; this line goes back to the model as its instruction. echo “Your reply ran ${words} words; the budget is ${limit}. Rewrite it under ${limit} words: put the answer in the first sentence, then cut the preamble, the recap, and the summary of what you did.” >&2 exit 2 fi exit 0 Then wire it in .claude/settings.json . A Stop hook takes no matcher: { “hooks”: { “Stop”: [ { “hooks”: [ { “type”: “command”, “command”: “${CLAUDE_PROJECT_DIR}/.claude/hooks/ gate-length.sh” } ] } ] } } submitted by /u/cleverhoods

Originally posted by u/cleverhoods on r/ClaudeCode