{"slug": "how-to-make-claude-code-stop-writing-output-essays", "title": "How to Make Claude Code Stop Writing Output Essays", "summary": "Claude Code users frustrated by verbose AI output can enforce brevity by appending a system prompt file via the --append-system-prompt-file flag, which overrides the weaker CLAUDE.md approach, according to a developer's guide. The guide ranks four options—CLAUDE.md, Skills, appended system prompt, and Stop hooks—and recommends the alias-based system prompt for most users, while noting Stop hooks offer the only true enforcement at the cost of token-consuming retries.", "body_md": "I can't stand reading long output.\n\nNot \"I mildly prefer brevity.\" I mean I hit a wall of text in my terminal and my brain refuses. I asked Claude to fix a nav dropdown, it fixed it, and then it wrote me eleven lines summarizing the fix I had just watched it make. Tool calls are visible. I saw the diff. I don't need the recap.\n\nSound familiar?\n\nTelling it to be concise doesn't work. Not reliably. I had a memory saved that said \"keep replies SHORT, she reacts strongly to long output,\" and it still handed me a status inventory with four headers.\n\nSo I went looking for what actually holds. Four options, ranked from weakest to strongest.\n\n## CLAUDE.md\n\nThe obvious one. Put your rule in `./CLAUDE.md`\n\nfor a project, or `~/.claude/CLAUDE.md`\n\nfor every project on the machine.\n\nThis is where most people stop, and it's the weakest option. Not because it doesn't load, it does, every session. It's that your rule sits in a file competing with project context, tool definitions, and a conversation that grows all afternoon. By hour two it's noise.\n\nOne thing that genuinely helps: put the rule at the very top of the file, not buried at the bottom. Position matters more than I expected.\n\nUse this if you want something scoped, visible, and easy to change. Don't expect it to hold under a long session.\n\n## Skills\n\nSkip this one. I went down this path first and it's a dead end for this problem.\n\nSkills load when they're invoked. That's the whole design. A skill that says \"write concisely\" only helps if the model remembers to invoke it, which is the exact failure you're trying to fix. You'd be relying on the thing that's already unreliable.\n\nSkills are great. They're just the wrong tool for always-on behavior.\n\n## Append a system prompt\n\nThis is what I landed on.\n\nClaude Code takes a `--append-system-prompt-file`\n\nflag. Whatever is in that file gets appended to the system prompt every single turn. Not memory, not context, the actual system prompt.\n\nWrite your rules to a file:\n\n```\n~/.claude/concise.md\n```\n\nThen alias the command so you don't have to remember the flag:\n\n```\n# ~/.zshrc\nalias claude='claude --append-system-prompt-file ~/.claude/concise.md'\n```\n\nOpen a new terminal and you're done. Every session, every project, no flag to remember.\n\nTwo tradeoffs worth knowing. It applies everywhere, which I wanted but you might not. And it's invisible, so six months from now you may forget why your output looks different. Leave yourself a comment in the alias.\n\nWhat goes in the file matters more than the mechanism. \"Be concise\" is useless. Ban specific behaviors:\n\n- No recapping work the user just watched\n- No status inventories unless asked\n- No preamble (\"Great\", \"You're right\", \"Let me\")\n- No closing summary paragraph\n- No unsolicited next-step menus\n- Answer first, context second\n\nSpecific prohibitions beat vague vibes. Every time.\n\n## A Stop hook\n\nThis is the only option that actually forces anything.\n\nHooks are different from everything above. The harness runs them, not the model. A `Stop`\n\nhook fires when Claude finishes a response, and it can block that response and send feedback, forcing a retry. You configure it in `settings.json`\n\nalongside whatever else you're running.\n\nThat's real enforcement. Nothing else on this list is.\n\nI passed on it for two reasons. A blocked response means a retry, and a retry means more tokens, which is a strange way to solve \"you're wasting my tokens yapping.\" And any length check crude enough to write is crude enough to block an answer that genuinely needed the room.\n\nIf you want determinism and you accept the cost, this is your option. I wanted most of the benefit without the retry loop.\n\n## What I'd tell you to do\n\nStart with CLAUDE.md and append a system prompt. The alias is one line, it works everywhere, and you can delete it in five seconds.\n\nSpend your effort on the rules file, not the mechanism. Ban behaviors by name. Vague instructions produce vague compliance.\n\nAnd be honest with yourself about why you want this. Walls of text aren't a preference problem, they're a wall. Tuning your tools around how your brain actually works isn't precious. It's the whole point of having tools you can configure.\n\nThe model won't hold a rule you only mention once. Put it somewhere structural.", "url": "https://wpnews.pro/news/how-to-make-claude-code-stop-writing-output-essays", "canonical_source": "https://tessakriesel.com/how-to-make-claude-code-stop-writing-output-essays/", "published_at": "2026-07-31 18:18:00+00:00", "updated_at": "2026-07-31 18:23:42.446381+00:00", "lang": "en", "topics": ["ai-tools", "developer-tools", "large-language-models"], "entities": ["Claude Code", "Anthropic"], "alternates": {"html": "https://wpnews.pro/news/how-to-make-claude-code-stop-writing-output-essays", "markdown": "https://wpnews.pro/news/how-to-make-claude-code-stop-writing-output-essays.md", "text": "https://wpnews.pro/news/how-to-make-claude-code-stop-writing-output-essays.txt", "jsonld": "https://wpnews.pro/news/how-to-make-claude-code-stop-writing-output-essays.jsonld"}}