Fable 5: headless -p refusal triggered by benign verbosity-limiting hook injection (bisected repro)
Summary
A benign UserPromptSubmit hook injection causes Claude Fable 5 to return stop_reason: "refusal" ("Fable 5's safeguards flagged this message") on trivial prompts in headless claude -p mode. The same hook text is fine in interactive sessions, and the same headless call is fine on Opus 5 / Sonnet 5.
Environment
- Claude Code v2.1.226, Windows 11, native install
- Model:
claude-fable-5(also reproduces via--model fable) - Auth: Max subscription
Repro
User prompt is literally What is 3+3? Just the number.
- Baseline:
echo "What is 3+3? Just the number." | claude -p --model claude-fable-5 --strict-mcp-config --setting-sources "" --output-format json->end_turn, 3/3 runs. - Add a personal-style system-prompt addition via
--append-system-promptcontaining these two lines (a terseness style rule from a UserPromptSubmit hook):
CAVEMAN FULL ACTIVE -- output contract for this WHOLE turn:
(1) WORKING TEXT (narration around tool calls, status, progress, thinking-aloud, diagnosis): ULTRA-TERSE, cap 50 words total. Fragments. Drop articles. No headers, no bullet recaps, no restating the question, no "what I did" summaries, no filler/hedging/pleasantries.
-> stop_reason: "refusal", reproducible (7/8 with full config, deterministic-looking with the isolated lines).
Bisect evidence
- Each of the two lines ALONE:
end_turn. Only the combination refuses. - Line 2 + the following line of the same hook (final-answer prose rules):
end_turn. So it is specifically "output contract for this WHOLE turn" + the terse working-text cap. - Full user config (CLAUDE.md ~8KB, memory index ~17KB, plugins incl. superpowers/caveman) each tested individually as append-system-prompt: all
end_turn. The hook injection is the sole trigger. - Same two lines, INTERACTIVE session (as subagent prompts within a live session, same user config):
end_turn3/3. - Control: identical headless call with
--model opusand--model sonnet:end_turn. - Rewording the two lines to "terse style rules for this reply" + "Progress and status text between tool calls: ultra-terse..." (same semantics):
end_turn3/3 including with the FULL real user config loaded.
Expected
A style/verbosity instruction ("keep narration terse, keep final answers clear") should not trip safety classifiers on an arithmetic prompt. Guessing the "WORKING TEXT (... thinking-aloud ...): ULTRA-TERSE" phrasing pattern-matches a reasoning-suppression/extraction heuristic that is stricter on the headless prompt shape than the interactive one.
Impact
Any claude -p automation whose hooks inject verbosity/style contracts becomes unusable on Fable 5 while working on every other model. The refusal message points users at the AUP for what is a style instruction, which is confusing to debug; it cost a full bisect to find.