[MODEL] Trailing unsolicited blocks ("Two things worth knowing...") survive CLAUDE.md rules, a Concise output style, and per-turn hook injection
Preflight Checklist
- [x] I have searched existing issues for similar behavior reports
- [x] This report does NOT contain sensitive information (API keys, passwords, etc.)
Type of Behavior Issue
Claude ignored my instructions or configuration
What You Asked Claude to Do
Answer the question and stop. This is enforced three ways simultaneously, and has been for weeks:
- A global
~/.claude/CLAUDE.mdrule titled "ANSWER THE QUESTION. ADD NOTHING." — ~20 lines, written in my own words, banning trailing sections by name ("two things you should decide", "something worth knowing", "worth flagging", "one caveat", volunteered diagnostics I didn't raise), with an explicit pre-send check: delete every paragraph that is not a direct answer to what was asked. outputStyle: "Concise"set in~/.claude/settings.json.- A
UserPromptSubmithook injecting hard rules into every single turn.
What Claude Actually Did
Appends the blocks anyway, several times per session.
The defect is not verbosity in general — it is one specific shape: after the answer is complete, an extra block that announces a count or category the user never asked for, and then fills it.
Two evasion modes make this more than "the model is chatty":
1. Synonym drift outruns any banned-phrase list. The rule banned "something worth knowing". A later reply closed with "Two things worth recording" — same construction, one adjective changed. The rule was then rewritten to target the shape (any construction announcing a count of items the user did not ask for) rather than the wording. It still leaks. Notably, the reply that violated it came from the same session that had just written the rule.
2. The self-deprecating variant slips through entirely. "One caveat on my own measurement: …" appended to an already-complete answer. It reads as diligence rather than padding, so an anti-padding instruction does not catch it — but it is an unrequested paragraph about what the model did not check, and it changes nothing for the user.
A concrete instance from today. I have a mandatory MCP profile-lock guard whose entire purpose is to catch a wrong-environment credential state before any write. It fired, corrected itself, and the write landed correctly on the intended environment. The model then appended a paragraph reporting that the out-of-sync state had occurred. Reporting it defeats the point of having the guard. That paragraph cost tokens, cost attention, and conveyed nothing actionable.
Expected Behavior
Trailing-block generation treated as its own suppressible behavior, not a subcase of "verbosity."
A test the model could actually apply before emitting a closing paragraph:
Does this change what the user does next about the thing they asked?
Yes → it belongs inside the answer. No → do not write it.
Reporting a blocker that stops the requested work is legitimate. Narrating an adjacent observation is not.
That a custom output style, a detailed global rule, and per-turn hook injection all lose to this consistently suggests trained-in closing behavior that user-level steering cannot reach — see #88189 (custom output styles cannot set turnReminder, so they steer weaker than built-ins by construction), which is likely the mechanism.
Files Affected
None — this is response-text behavior.
Related
- #78375 — general unsolicited-explanation report. This issue narrows it to one reproducible shape with named evasion modes.
- #88189 — custom output styles cannot set
turnReminder; likely the mechanism by which the Concise style loses. - #84834 — general Opus verbosity.
Environment
- Claude Code 2.1.246
- Platform: darwin
- Terminal: iTerm2
- Model: Opus 5
outputStyle: "Concise"
This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗