Context
PR #152 introduced the 断り書き Stop hook (claude/hooks/block_excuse_phrases.py) and PR #153 fixed a Claude Code transcript flush race for pure-text turns. The hook now reliably catches 断り書き usage on every turn type, including pure-text responses.
A side effect surfaces in the chat UI: every block emits a verbose "Stop hook feedback: ..." message visible to the user, on top of the model's natural acknowledgment-and-rewrite. The signal is the correction itself; the noise is a multi-paragraph block notification plus an explicit "ごめん書き直す" preamble in the model's reply.
This issue tracks reducing that noise. Current behavior is acceptable for now but verbose.
Options
| Approach |
UX impact |
Cost / risk |
A. Replace reason with additionalContext in the hook output JSON |
Block notification disappears from the chat. Model still receives the reconsideration prompt as silent context, so reconsideration behavior is unchanged. The model's reply may still contain an acknowledgment ("rewriting...") that surfaces in the chat. |
One-line code change. Empirically verify Claude Code accepts additionalContext for Stop hook block decisions. |
| B. A combined with REASON text rewritten to instruct silent rewrite (e.g. "Rewrite without comment, do not apologize, output only the corrected response") |
Block notification gone, model's acknowledgment also suppressed. |
A plus prompt tuning; risk of the model occasionally ignoring the silent-rewrite instruction (LLM nondeterminism). |
| C. Retroactively erase the original output containing 「正直」 etc. so only the corrected version reaches the user |
True no-trace-of-bad-version behavior. |
Not achievable at the hook level. Requires Claude Code core to buffer assistant output until the Stop hook approves. |
Decision (deferred)
Investigated 2026-05-01. Will revisit when verbosity becomes annoying in practice.
The current behavior is informative — the bad-then-corrected dual visibility preserves narrative flow ("here is what was wrong, here is the corrected version") that pure-silent rewrite would break. LLM nondeterminism makes Option B's acknowledgment suppression unreliable in the worst case.
Upstream
Option C would benefit from a Claude Code feature: buffered Stop hook output, where assistant text is held until the Stop hook decides whether to approve or block. Currently the assistant text is streamed to the user before the Stop hook fires. Filing this as a feature request to anthropics/claude-code is a separate decision; not pursued in this issue.
References
Context
PR #152 introduced the 断り書き Stop hook (
claude/hooks/block_excuse_phrases.py) and PR #153 fixed a Claude Code transcript flush race for pure-text turns. The hook now reliably catches 断り書き usage on every turn type, including pure-text responses.A side effect surfaces in the chat UI: every block emits a verbose "Stop hook feedback: ..." message visible to the user, on top of the model's natural acknowledgment-and-rewrite. The signal is the correction itself; the noise is a multi-paragraph block notification plus an explicit "ごめん書き直す" preamble in the model's reply.
This issue tracks reducing that noise. Current behavior is acceptable for now but verbose.
Options
reasonwithadditionalContextin the hook output JSONadditionalContextfor Stop hook block decisions.Decision (deferred)
Investigated 2026-05-01. Will revisit when verbosity becomes annoying in practice.
The current behavior is informative — the bad-then-corrected dual visibility preserves narrative flow ("here is what was wrong, here is the corrected version") that pure-silent rewrite would break. LLM nondeterminism makes Option B's acknowledgment suppression unreliable in the worst case.
Upstream
Option C would benefit from a Claude Code feature: buffered Stop hook output, where assistant text is held until the Stop hook decides whether to approve or block. Currently the assistant text is streamed to the user before the Stop hook fires. Filing this as a feature request to
anthropics/claude-codeis a separate decision; not pursued in this issue.References