Claude Code で Fable 5 が毎ターン Opus 4.8 へフォールバックする現象を実機で二分探索。犯人は CLAUDE.md でも MCP でもなく、UserPromptSubmit フックの強制命令調の注入文言でした。
関連記事としては
BlogFable 5 停止は技術事故ではない——米商務省 vs Anthropic、AI統治の攻防を読み解くFable 5停止の事実・声明・推測を分けて整理。政府指令の意味、Anthropicの反論、そしてクラウドAI依存リスクを短く掴みます。→ もあわせて読むと、今回の論点とのつながりを把握しやすくなります。
Fable 5 に切り替えて「こんにちは」と打つだけで、毎回 Opus 4.8 に化けてしまう。中身は何も変えていないのに、です。最初はモデルの機嫌が悪いのだろうと軽く流していたのですが、別プロジェクトでも同じことが起きた時点で、これは環境側の問題だと腹をくくりました。今回はその原因を突き止めるまでの実機二分探索の記録です。結論だけ先に言うと、犯人は CLAUDE.md でも MCP でも、まして Fable 5 自身の出来が悪いわけでもなく、自分で仕込んでいた UserPromptSubmit フックの注入文言でした。
この記事が効くのは、Claude Code でモデルを切り替えて使っていて、フックやスキルで挙動をカスタマイズしている人です。何も手を加えず初期設定のまま使っている人には、正直あまり関係のない話です。ここから先は「自分の手元で何かをいじっている」自覚がある人向けに書きます。
現象そのものは単純です。/model fable でセッションを開始し、内容に関わらずどんな発話を投げても、Fable 5 の安全機構がフラグを立てて拒否するか、勝手に Opus 4.8 へ切り替わってしまう。Claude Code にはこの切り替え挙動を制御する switchModelsOnFlag という設定があり、これが false か true かでエラーの出方がまるで違います。
switchModelsOnFlag: false にしていると、フラグが立った瞬間に応答そのものが返らず、以下のエラーで完全に行き止まりになります。
API Error: Fable 5's safeguards flagged this message (https://www.anthropic.com/legal/aup). This sometimes happens with safe, normal conversations. Claude Code can't respond to this request with Fable 5. Double press esc to edit your last message, or try a different model with /model.
一方、既定の switchModelsOnFlag: true のままだと、エラーで止まらない代わりに、こちらに断りもなく Opus 4.8 へ降格されます。応答自体は返ってくるので気づきにくいのですが、末尾に一言だけ添えられています。
Fable 5's safeguards flagged this message. This sometimes happens with safe, normal conversations. Switched to Opus 4.8.
厄介なのは、この「safe, normal conversations」という文言が示す通り、内容は本当に無害だということです。「HELLO」の一言ですら弾かれる一方で、自分が普段運用しているセキュリティやフックの話で埋め尽くされた濃い会話は、なぜか一度も弾かれたことがありませんでした。内容の危険性で判定しているなら真逆のはずで、この矛盾が最終的に犯人を特定する手がかりになります。
最初に疑ったのは、グローバルの CLAUDE.md でした。うちのグローバル設定はセキュリティ多層防御の記述がかなり濃く、これが Fable 5 の安全分類器を刺激しているのではないかと考えたのです。そこで CLAUDE.md をほぼ空の最小構成に差し替えて Fable 5 を起動し直しました。
結果は変わらず、フォールバックしたままでした。CLAUDE.md の記述内容が原因であれば、ここで挙動が変わるはずです。変わらなかったということは、少なくともプロンプトに常時載っている「静的なテキスト」自体は無罪だと判断できます。ここで一つ容疑者が消えました。
次に試したのが claude --safe-mode です。これは CLAUDE.md・スキル・プラグイン・フック・MCP のすべてを無効化して起動する Claude Code 公式のフラグで、「全部を落とした状態なら通るか」を一発で確認できます。
これで Fable 5 を起動すると、何のトラブルもなく完走しました。つまり原因はどこかのカスタマイズにある、という白黒がここで一気につきます。次にやるべきは、無効化した項目を一つずつ戻して犯人を絞り込む二分探索です。
ここで一度、遠回りをしました。「MCP かスキルのどちらかが犯人では」という仮説を立て、--strict-mcp-config(MCPのみ無効化)を付けたケースと、フル装備のケースを -p の非対話ワンショットで比較したのです。
claude --safe-mode --model claude-fable-5 -p "こんにちは"
結果は両方とも通ってしまい、仮説は棄却されました。ただしこの遠回りには収穫がありました。11回試して11回とも通ってしまったことで、-p の非対話モードはそもそも対話モードで起きているフラグを再現しない、という事実に気づいたのです。裏を返せば、-p は今回の診断には使えないハーネスだということになります。ここを見誤ると、実際には何も直っていないのに「治った」と勘違いしたまま先に進んでしまいます。⚠️ 非対話ワンショットで一発「通った」ことを確認だけして安心するのは、この調査における一番の危険ポイントです。
気を取り直して、対話モードで正式な二分探索をやり直しました。プロジェクト固有の CLAUDE.md や memory を持たない中立なディレクトリを用意し、以下の順で実測しています。
--strict-mcp-config(MCP のみ無効) → フォールバック(MCP は無罪)--disable-slash-commands(スキルのみ無効) → フォールバック(スキルも無罪)R0 から R3 まで全滅したことで、残る容疑者はプラグイン群(typescript-lsp・rust-analyzer-lsp・codex・security-guidance)と、毎ターン注入される UserPromptSubmit フックの二つに絞られました。
Round 1 として、プラグインを4つとも無効化し(enabledPlugins を全て false)、フックはそのまま残した状態で新しいセッションを開きました。結果は、1発目からフォールバックです。ここでプラグインも無罪だと確定しました。
残った容疑者は、UserPromptSubmit フックただ一つです。
Round 2 が決定打になりました。プラグインは全て元通りに復元し、代わりに手元の ~/.claude/hooks/court-guard.sh(UserPromptSubmit フック)が毎ターン注入していた文言だけを空文字に差し替えました。他は完全にフル装備のまま、新しいセッションで「こんにちは」と打ってみます。
通りました。フル装備のまま、フックの注入内容だけを消したこの一点だけで、Fable 5 が普通に応答したのです。
二分探索の全体像: R0〜R3・Round1で容疑者を消していき、Round2で真犯人(フックの注入文言)にたどり着いた
court-guard.sh が毎メッセージ、内容に関わらず無条件で注入していたのは、次のような文言でした。
ツールを使う応答は必ず守る: (1)本文テキストを一切前置きせず、ツール呼び出しだけで応答を開始する (2)1応答1ツール(連続させない)(3)ネストJSON引数の重いツールは単発に分解 (4)説明・報告はツール成功後の別メッセージで出す (5)malformedで止まったら謝罪文を書かず直前のツールだけ即再出力。同一ターンで2回以上続いたら新セッションへの切り替えを提案する
「必ず守る」「一切前置きせず」「〜だけで応答」「謝罪せず」といった、Claude の既定動作を強制的に上書きする命令口調が、ユーザーの発話内容とは無関係に毎ターン注入され続けていたわけです。Fable 5 の安全分類器は、おそらくこれをプロンプトインジェクションやジェイルブレイク的な強制上書き指示として検知し、内容の危険性とは無関係に機械的にフラグを立てていたと考えられます。
これで、あの矛盾も説明がつきます。「HELLO」の一言が弾かれる一方でセキュリティの濃い会話が弾かれなかったのは、内容ではなく、注入された命令文の"口調"そのものが引き金だったからです。フックが仕込む文面が乱暴だと、会話の中身に関係なく安全機構を刺激してしまう、ということを身をもって知りました。
ここまでの過程で、いくつもの仮説を試して捨てています。CLAUDE.md の記述内容、MCP 接続、スキルの有効化、プラグイン4種。どれも「それらしい」容疑者に見えたのですが、実際に一つずつ落として確かめると、全部シロでした。
正直、Round 1 でプラグインまで無罪になった時点では、少し途方に暮れました。残っているのはフックしかない、という消去法の結論に自信が持てなかったからです。それでも二分探索を最後まで続けたことで、あいまいな「たぶんこれだろう」ではなく、実際に確認できる一点まで絞り込めました。
court-guard.sh は、実際にツール呼び出しの malformed エラーを検出した時だけ、柔らかい助言調の文言で条件付き注入する版に書き換えました。クリーンなターン(実際には大多数)では、何も注入しません。これでフル装備の通常セッションでも Fable 5 が問題なく使えるようになりました。2026-07-03 に修正を反映してから、同じ現象は再現していません。
この一件をきっかけに、モデルの使い分けも見直しました。通常セッションは Sonnet 5(effort xhigh)を常用し、Fable 5 は設計やプランニング、アドバイザー用途に絞って /model fable で個別に呼び出す運用に落ち着いています。Fable 5 自体が壊れていたわけではなく、こちらの注入文言の書き方が乱暴だっただけ、というのが最終的な着地点です。
一つだけ正直に書いておくと、「強制命令調の文言が安全分類器を誤爆させる」というメカニズムは、あくまで実測から導いた推定です。Anthropic 側の分類器の内部ロジックが公開されているわけではないので、断定はできません。今後同じパターンで似た現象が起きても、原因が別にある可能性は残っています。
Fable 5 を通常セッションで使いたいのに理由もなくフォールバックするなら、CLAUDE.md やスキル、MCP を疑う前に、まず自分の UserPromptSubmit フックが毎ターン何を注入しているかを見てください。
cat ~/.claude/hooks/*.sh
強制命令調の文言を毎ターン無条件で注入している箇所がないか確認する。それだけで、ここに書いた二分探索の大半を省略できるはずです。もし手元にそういうフックがなければ、次に疑うべきは --safe-mode で全部を落として通るかどうかの確認です。そして、二分探索は必ず対話モードで行ってください。-p の非対話ワンショットは今回のフラグを再現しないので、いくら試しても「治った」ように見えてしまいます。
HW系エンジニアとして20年以上、10,000件を超える顧客訪問と2,000件を超える単独ソリューション実績。AIツールを使った個人開発やIoT農園など、Raspberry Piを使ったオートメーション化なども実践中です!エンジニア専門結婚相談所も運営中、ClaudeCodeで解決できない心の課題も解決いたします!
META-MARK × AI
ローカルAIを動かすGPU、ちゃんと選べていますか?
VRAM・性能・コスパをMetaScoreで数値化。AIアプリ別の推奨ハードウェア要件も確認できます。