Fable 5: headless -p refusal triggered by benign verbosity-limiting hook injection (bisected repro)

Status Open
Maintainer reply None cached
Activity 0 comments · opened Aug 11, 2026

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.

  1. 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.
  2. Add a personal-style system-prompt addition via --append-system-prompt containing 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_turn 3/3.
  • Control: identical headless call with --model opus and --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_turn 3/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.

View original on GitHub ↗