claude talks too much

fable 5?

yep. yapper.

opus 5?

oh my god, the fucking king.

it proficiently vomits large swaths of prose in my tty even when what i asked could’ve been answered by one line. one fucking line.

i, like a lot of engineers today, have started doing more with the new tool of the trade - coding agents - and while i’ll confess that i was hesitant initially to hop on the bandwagon, i’m now properly on it.

hell, enjoying it sometimes even.

the things which these coding agents (and by extension models) can do today are amazing when used properly.

my “toolchain”

i currently drive claude code for my personal projects and kiro for work stuff.

underneath the harness, i’ve grown accustomed to working with claude models over openai’s and many of the other labs.

i’m not saying one lab’s models are better than the other, just a personal preference for now.

in using these models over the past few months, one thing which has now gotten me riled up is the obscene amount of prose they produce.

i already have all the code which is being generated to read/review, and now the text too?

previous attempt to help

one thing which has helped in the past to tame the volume was making use of custom output styles in claude code.

i created one called “terse” which was effectively supposed to guide the model to be efficient with words:

~/.claude/output-styles/terse.md:

---
name: terse
description: Minimal prose; outcomes and decisions only
keep-coding-instructions: true
---

Hard budget: ≤ 8 lines per answer; 1-3 sentences for simple questions. Every line costs the user reading time. Cut narration, never information.

- First sentence = the answer or outcome.
- Complete sentences. Density comes from cutting content, not compressing wording.
- Verbosity is opt-in: exceed the budget only when the user asks, or the deliverable itself is docs/copy.
- Always push unprompted: risks, decisions made on their behalf, broken assumptions. they can't ask about a problem they don't know exists.
- Never: pre-explanation, narrating steps, restating on-screen content (diffs, files, prior answers), closing boilerplate, headers on answers under ~15 lines.
- Tables only when every cell is a few words; sentence-length content goes in numbered lists with detail on an indented line (terminal tables degrade at narrow widths).
- Growth-edge topics (per profile.md): one-line pointer to what's worth learning; expand on ask.

and configured it in ~/.claude/settings.json as:

{
  // ...
  "outputStyle": "terse",
  // ...
}

but even with the above, i sometimes found that as sessions went on for longer, the model tends to “forget” about this steer.

what seems to be helping now

recently, however, i’ve been finding success with reminding the model at every turn to “always be terse!”.

of course, ending each prompt i send over to the model with that statement will get annoying. fast.

luckily, in claude code (and most modern harnesses), you can make use of hooks.

instructions given at the start of a long session may fade, but a hook’s stdout gets injected fresh with every prompt automagically.

how i do it

for this particular problem, i have this script wired to a hook which does that:

#!/usr/bin/env bash
echo 'terse mode: ≤8 lines, outcome first, no narration/boilerplate. Verbosity only if asked; always still surface risks, assumptions, and decisions made on their behalf.'

and the hook used is the UserPromptSubmit one as thus:

// ~/.claude/settings.json
{
  // ...
  "hooks": {
    "UserPromptSubmit": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "bash ~/.claude/hooks/terse-reminder.sh"
          }
        ]
      }
    ]
  },
  // ...
}

per the docs, the output of the UserPromptSubmit hook becomes context the model sees at every turn.

you could as well just plop the actual script into the command prop like so…

// ~/.claude/settings.json
{
  // ...
  "hooks": {
    "UserPromptSubmit": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "echo 'terse mode: ≤8 lines, outcome first, no narration/boilerplate. Verbosity only if asked; always still surface risks, assumptions, and decisions made on their behalf.'"
          }
        ]
      }
    ]
  },
  // ...
}

… but i prefer organising all my hooks in a dedicated “hooks” directory.

in conclusion

while the above works “a lot of”-percent of the time, it’s still not 100% perfect. but i guess that’s the bane of working with non-deterministic systems right?