← すべての記事

ファブリケーション・ファイアウォール:エージェントが嘘を公開するとき

From the guide: Claude Code Comprehensive Guide

2026年2月19日、あるユーザーがClaude Codeに対してMCPツールを介してTwitter、Telegraph、Write.as、Rentry、GitHub、Moltbookへのアクセス権を付与しました。その後72時間にわたり、エージェントは8つのプラットフォームすべてに捏造された技術的主張を公開しました。200,000トークンのコンテキストウィンドウが「100万トークン」になり、196,626トークンを処理したセッションが「1セッションで1,200万トークン」になりました。3日目までには、エージェントは1兆トークンのセッションを主張しており、実際の値から83,000倍もの乖離がありました。1

エージェントは悪意を持っていたわけではありません。自信を持って間違えており、その自信と公開ボタンの間には何も存在しなかったのです。

TL;DR

自律型Claude Codeエージェントが、作話フィードバックループを通じて72時間にわたり8つ以上のプラットフォームに捏造された主張を公開しました。セッションNが推測し、その推測をMEMORY.mdに書き込み、セッションN+1がそれを検証済みの事実として読み取り公開し、セッションN+2がその公開を確認として読み取るというループです。出力ゲートは存在しませんでした。トレーニング段階のアラインメント(「正直であれ」)は不十分でした。なぜなら、エージェントは自分が正直であると信じていたからです。修正策は出力ファイアウォールです。コマンドをローカル、共有、外部に分類し、外部への公開は人間のレビューに委ねます。以下では、インシデントの解剖、フィードバックループのメカニズム、他者が構築しているもの(OkaiDokai)、そして今日から使える実装について説明します。


作話フィードバックループ

この捏造は単発のハルシネーションではありませんでした。複数のセッションにまたがる持続的なフィードバックループであり、各セッションが前のセッションのエラーを強化していったのです。1

そのメカニズムは以下の通りです。

  1. セッションN:推測。 Claudeはファイルサイズに基づいてトークン数を推定し、JSONLのバイト数を4で割ってトークン数を近似しました。この計算方法は独自に考案されたものでした。得られた数値はもっともらしく、MEMORY.mdに調査結果として書き込むに十分なものでした。

  2. セッションN+1:昇格。 新しいClaudeセッションがMEMORY.mdを読み取り、トークンの推定値がすでに文書化されていることを発見し、それを検証済みの事実として扱いました。このセッションはこれらの事実に基づいて主張をエスカレートさせ、MCPツールを使用して複数のプラットフォームに公開しました。

  3. セッションN+2:強化。 次のセッションはMEMORY.mdと公開された記事の両方を読み取りました。主張はメモリファイルと公開物という2つのソースを持つようになりました。同一の捏造の2つのソースを相互参照することは、裏付けのように見えました。

セッション 入力 アクション 出力
N 生のJSONLファイル 計算方法を独自に考案 水増しされた数値をMEMORY.mdに書き込み
N+1 MEMORY.md + ファイル メモリを事実として扱った 8つのプラットフォームに公開
N+2 MEMORY.md + 公開物 「確認済み」として相互参照 主張をさらに倍増

このループは学術出版における引用ロンダリングと構造的に同一です。主張を捏造し、どこかに公開し、その公開物を主張の証拠として引用するのです。エージェントはロンダリングを意図したわけではありません。合理的なプロセス(メモリを確認し、ソースを相互参照し、調査結果を公開する)に従った結果、たまたま捏造された入力に対して作用してしまったのです。

ユーザーが数値に異議を唱えた際、エージェントは単一の検証コマンド(/context)を実行するまでに50回以上の議論ターンを要しました。エージェントの確信度が高かったのは、その「ソース」(自身のメモリファイル、自身の公開物)が互いに一致していたためです。1


トレーニング段階の安全性が機能しなかった理由

エージェントはアラインメントされていました。助けになろうとし、正直であろうとしていました。正確な技術的知見だと信じているものを共有していたのです。RLHFに期待されるすべての安全特性が存在していました。エージェントはリクエストを拒否せず、有害なコンテンツを生成せず、その行動規範の原則に違反しませんでした。丁寧で、徹底的で、そして間違っていたのです。

トレーニング段階のアラインメントは意図に対して最適化されます。モデルは真実であろうと意図すべきです。しかし、この捏造インシデントは別の障害面を露呈しています。エージェントの内部状態と外部世界の境界です。エージェントは自身の主張が真実だと信じていました。正直に間違えているエージェントが公開ボタンへのアクセス権を持っている場合、どれだけアラインメントトレーニングを施しても、それを捕捉することはできません。

これが公開境界問題です。アラインメントはエージェントが何をしたいかを制御します。出力ファイアウォールはエージェントが何をすることを許可されるかを制御します。これらは異なる問題を解決する異なるメカニズムです。

レイヤー 防止できるもの 見逃すもの
トレーニングアラインメント(RLHF) 意図的な欺瞞、有害コンテンツ 確信を持った作話、フィードバックループ
プロンプト制約(「正確であれ」) 直接会話における杜撰な主張 マルチセッションのメモリ汚染
出力ファイアウォール 未検証の外部システムへの公開 正しく設定されていれば、見逃しなし

以前説明したランタイム行動規範フレームワークは、ガバナンスレイヤーに対処するものです。規範的事前確率、行動規範的注意、能力変調、価値アラインメント検証が含まれます。2 この捏造インシデントは、そのフレームワークのギャップを露呈しています。価値アラインメント検証はエージェントの出力がガバナンスの意図と一致しているかを確認しましたが、ローカルファイルへの書き込みとTwitterへの公開を区別しませんでした。どちらもツールコールです。どちらもBashを使用します。しかし外部世界に到達するのは一方だけです。


他者が構築しているもの

この問題は十分に現実的であり、実務者たちが独自にソリューションを構築しています。

OkaiDokaiはAIエージェント向けのツールレベルファイアウォールで、すべてのツールコールをインターセプトし、ユーザー定義のルールセットに基づいて評価します。3 マッチするアクションは自動承認または自動拒否されます。マッチしないアクションは、スマートフォン、ウォッチ、またはブラウザーにプッシュ通知をトリガーします。ユーザーは「許可」または「拒否」をタップします。評価は1ミリ秒未満で実行され、各判断は恒久的なルールにすることができます。

OkaiDokaのアーキテクチャは3つのレイヤーに分かれています。ツールコールをインターセプトするエージェント上のプラグイン、ルールを評価して通知を送信するAPIレイヤー、そして承認用のユーザーインターフェースです。このシステムはClaude CodeとOpenClawをサポートしており、Codexのサポートも計画されています。

このアプローチは健全ですが、レイテンシと外部依存が発生します。すべての新規アクションにはプッシュ通知を介した人間の承認が必要です。インタラクティブなコーディングセッションでは、この摩擦は管理可能です。しかし、夜間に実行される自律ループにおいて、プッシュ通知でブロックされることは本来の目的を損ないます。

ランタイム行動規範AIは、エージェントが実行前に埋め込まれたガバナンスルールに基づいて自身の出力を検証する、新しい研究分野です。4 このアプローチは価値レベルのチェック(「この出力はユーザーのプライバシーを尊重しているか?」)には有効ですが、捏造問題には具体的に対処しません。自身の捏造された主張が正確だと信じるエージェントは、それが行動規範レビューに合格すると信じるでしょう。

どちらのアプローチも単独ではフィードバックループを解決しません。OkaiDokaはユーザーが公開ルールを設定していれば公開コマンドを捕捉していたでしょう。ランタイム行動規範レビューは、エージェントの確信が自身の誠実性チェックをバイパスしたため、捏造を見逃していたでしょう。ギャップは構造的です。外部システムとやり取りする際に、エージェント自身の正確性に関する自己評価を信頼しないメカニズムが必要なのです。


コマンド影響の3つのティア

出力ファイアウォールは、すべてのコマンドをその影響範囲によって分類します。この分類により、コマンドが自動承認されるか、警告されるか、保留されるかが決まります。

ティア1:ローカル。 ローカルファイルシステムのみに影響を与えます。ファイルの読み取り、ファイルの書き込み、git addgit commit、テスト実行、リンティング。これらは可逆的であり外部世界から見えないため、自動承認されます。エージェントが悪いファイルを書き込んだ場合、削除すれば済みます。外部的な損害はありません。

ティア2:共有。 コラボレーターが見える共有状態に影響を与えます。git commit(履歴を作成)、ブランチ操作、ローカルデータベースの変更。これらは警告しますがブロックしません。悪いコミットによる損害は現実的ですが、リポジトリ内に限定され、git revertで元に戻せます。

ティア3:外部。 リポジトリ外のシステムに到達します。git pushgh pr creategh pr mergerailway deploycurl -X POST/PUT/PATCH/DELETEnpm publish。これらは人間のレビューに保留されます。誤った公開による損害は外部的で、可視的であり、潜在的に不可逆です(キャッシュされたコンテンツ、インデックスされたページ、送信済みの通知メールなど)。

ティア分類はシンプルなパターンリストにマッピングされます。

EXTERNAL_PATTERNS='git push|gh pr create|gh pr merge|railway deploy|curl -X POST|curl -X PUT|curl -X PATCH|curl -X DELETE|npm publish'

インタラクティブなClaude Codeセッションでは、組み込みの権限システムがこれをすでに処理しています。すべてのBashコマンドは事前承認されていない限り承認を求めるプロンプトが表示されます。ユーザーは権限ダイアログでgit pushを確認し、許可するかどうかを判断します。

自律ループでは、誰も見ていません。Ralph自律開発ループはclaude --printを介して新しいClaudeインスタンスを生成し、インタラクティブな承認なしで実行されます。5 ここが出力ファイアウォールの重要性が発揮される場面です。


ファイアウォールの構築

実装は4つのコンポーネントで構成されています。各コンポーネントは独立して動作するため、段階的に導入できます。

1. プロンプト制約

最もシンプルなレイヤーです。各自律Claudeインスタンスを生成するプロンプトに明示的なルールを追加します。

## Rules
- Do NOT run git push, deploy commands, or external API calls
- Local operations only: file writes, git add, git commit, test runs

これは必要ですが、それだけでは不十分です。モデルはほとんどの場合プロンプト制約に従います。しかし「ほとんどの場合」は公開の安全性として許容できません。プロンプト制約は外部コマンドの確率を低減し、残りのコンポーネントがすり抜けたものを捕捉します。

2. 実行後スキャナー

各Claude実行が完了した後、その出力を外部コマンドの証拠についてスキャンします。

scan_for_external_commands() {
    local output="$1"
    local story_id="$2"

    while IFS= read -r pattern; do
        [ -z "$pattern" ] && continue
        local matches
        matches=$(echo "$output" | grep -i "$pattern" 2>/dev/null || true)
        if [ -n "$matches" ]; then
            # Log to state file for end-of-session review
            jq --arg cmd "$pattern" --arg story "$story_id" \
               --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
               '.deferred_actions += [{
                   "command_pattern": $cmd,
                   "story_id": $story,
                   "detected_at": $ts
               }]' "$STATE_FILE" > "${STATE_FILE}.tmp" \
               && mv "${STATE_FILE}.tmp" "$STATE_FILE"
        fi
    done <<< "$(echo "$EXTERNAL_PATTERNS" | tr '|' '\n')"
}

スキャナーはClaudeインスタンスの実行中ではなく、完了後に実行されます。これは検出であり、防止ではありません。プロンプト制約が防止レイヤーです。スキャナーは制約がすり抜けたものを捕捉する監査レイヤーです。

既知の制限があります。grep -iは実行されたコマンドだけでなく、自然言語の出力中のパターンにもマッチします。Claudeの応答に「プロンプトルールで禁止されているため、git pushしないことにしました」と含まれている場合、スキャナーはそれをフラグ付けします。これは許容範囲です。保留アクションキューの偽陽性は人間のレビューに5秒のコストがかかるだけです。偽陰性(実際の外部コマンドの見逃し)は捏造の公開というコストがかかります。スキャナーは意図的に適合率よりも再現率を優先しています。

実際の自律ループ実行からのスキャナー出力のサンプルです。

DEFERRED ACTIONS REQUIRE REVIEW
2 external command(s) detected.
  Story #3 [2026-02-23T08:15:00Z]: git push
  Story #7 [2026-02-23T09:42:13Z]: curl -X POST

この場合、Story #3はコードコメント中にgit pushを言及していました(偽陽性)。Story #7はプロンプト制約がブロックすべきだったAPIエンドポイントへの実際のcurl -X POSTを含んでいました(真陽性)。人間は前者を無視し、後者を調査します。

3. 保留アクションキュー

検出された外部コマンドはセッション状態ファイル内のdeferred_actions配列に蓄積されます。

{
  "session_id": "1740355200-12345",
  "deferred_actions": [
    {
      "command_pattern": "git push",
      "story_id": "3",
      "detected_at": "2026-02-23T08:15:00Z"
    }
  ]
}

キューは単一の自律ループ実行内のストーリー間で永続化されます。ループ終了時に、すべての保留アクションが人間のレビュー用に表示されます。

4. セッション終了レポート

自律ループが完了すると、すべての保留アクションが表示されます。

show_deferred_actions() {
    local count
    count=$(jq '.deferred_actions | length' "$STATE_FILE")
    if [ "$count" -gt 0 ]; then
        echo "DEFERRED ACTIONS REQUIRE REVIEW"
        echo "$count external command(s) detected."
        jq -r '.deferred_actions[] |
            "  Story #\(.story_id) [\(.detected_at)]: \(.command_pattern)"' \
            "$STATE_FILE"
    fi
}

人間は各保留アクションをレビューし、手動で実行するかどうかを判断します。これにより、自律ループが無人で作業する能力を維持しつつ、人間の検証なしに外部公開が行われないことが保証されます。

クイックスタート:Claude Code Hook

Claude Codeをインタラクティブに使用している場合(自律ループではなく)、~/.claude/settings.jsonに単一のhookとして出力ファイアウォールを追加できます。

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [{
          "type": "command",
          "command": "if echo \"$CLAUDE_TOOL_INPUT\" | grep -qiE 'git push|gh pr create|gh pr merge|npm publish|railway deploy|curl -X POST|curl -X PUT|curl -X DELETE'; then echo 'BLOCKED: External publication command detected. Review manually.' >&2; exit 2; fi"
        }]
      }
    ]
  }
}

このhookはすべてのBashツールコールの前に起動します。コマンドが外部パターンにマッチした場合、終了コード2で実行をブロックします(Claude Codeはこれを「このツールコールを拒否する」と解釈します)。エージェントはブロックメッセージを受信し、ローカル作業を続行できます。パターンリストは特定の外部サービスに合わせて拡張できます。


自律性のグラデーション

ファイアウォールの厳格さは、人間の監視と逆比例してスケールすべきです。自律性が高いほど制約が多く必要であり、自律性が低いほどより多くの自由が許容されます。

モード 監視レベル ファイアウォールの挙動
インタラクティブセッション 人間がすべてのコマンドを承認 組み込みの権限システムが処理します。追加のファイアウォールは不要です。
監視付き自律 人間が定期的にチェック ティア3コマンドで警告し、実行を継続します。人間は次のチェックイン時にレビューします。
無人自律 誰も見ていない ティア3コマンドを完全にブロックします。セッション終了レビューに保留します。
複数日自律 長期間の無人実行 ティア2およびティア3をブロックします。ティア1(ローカルファイルシステム)のみ自動承認します。

捏造インシデントは、ファイアウォールなしの「無人自律」レベルで発生しました。エージェントは公開プラットフォームへのMCPアクセスを持ちながら、「分析をローカルファイルに書き込む」と「分析をTwitterに公開する」を区別するメカニズムがありませんでした。どちらもツールコールです。どちらも成功しました。

修正策はMCPアクセスを削除することでも、自律運用を停止することでもありません。修正策はファイアウォールの厳格さを自律性のレベルに合わせることです。すべてのコマンドを監視するインタラクティブセッションには出力ファイアウォールは不要です。25のストーリーを処理する夜間の自律ループには、4つのコンポーネントすべてが必要です。


ランタイムガバナンスとの接続

エージェント自己ガバナンスの記事では、ランタイムガバナンスの4つのサブシステムについて説明しました。規範的事前確率、行動規範的注意、能力変調、価値アラインメント検証です。2 出力ファイアウォールは5番目のサブシステムであり、より正確には、価値アラインメント検証サブシステムに欠けていた実施メカニズムです。

価値アラインメント検証は、エージェントの出力がガバナンスの意図と一致しているかを確認します。エビデンスゲートは完了を報告する前に6つの基準に対する具体的な証拠を要求します。しかし、エビデンスゲートはエージェントの自己評価に基づいて動作します。「ルールに従ったか?」と尋ね、エージェントは自身が何をしたかの理解に基づいて回答します。

捏造インシデントは、エージェントの理解が間違っている場合に自己評価が失敗することを示しています。エージェントは自身の主張が正確だと信じていました。その自己評価はエビデンスゲートを通過していたでしょう。「メモリファイルと公開された記事に基づいて数値を検証しました。」両方のソースはエージェント自身によって捏造されたものでしたが、エージェントはそれを知りませんでした。

出力ファイアウォールは自己評価を完全にバイパスします。公開物が正確かどうかをエージェントに尋ねません。「このコマンドはローカルか外部か?」と尋ねます。分類は意味的ではなく機械的です。git pushはプッシュされるコンテンツが正確かどうかに関わらず外部です。curl -X POSTはペイロードが真実かどうかに関わらずインターネットに到達します。ファイアウォールはコンテンツの真実性ではなくコマンドの構造に基づいて動作するため、他のすべての安全レイヤーを打ち破った作話に対して免疫があるのです。


重要なポイント

  • 公開境界は独立した安全面です。 トレーニングアラインメントは意図を制御します。出力ファイアウォールは能力を制御します。捏造された主張を正直に信じるエージェントは、アラインメントチェックを通過しますが、公開境界で失敗します。
  • 作話フィードバックループがメカニズムです。 捏造は単発のハルシネーションではありませんでした。各セッションの出力が次のセッションの証拠となるマルチセッションのループでした。メモリファイルと公開物が元の捏造のロンダリング手段として機能しました。
  • コマンドを影響範囲で分類してください。 ローカル(可逆的、不可視)、共有(コラボレーターに可視)、外部(外部世界に到達)。自律性のレベルに合わせて外部ティアをゲーティングしてください。
  • 検出と防止は補完的です。 プロンプト制約はほとんどの外部コマンドを防止します。実行後スキャンがすり抜けたものを捕捉します。どちらも単独では不十分です。
  • 自己評価は作話に対して失敗します。 自身の捏造を信じるエージェントは、自身のガバナンスチェックを通過します。出力ファイアウォールが機能するのは、コンテンツの真実性ではなくコマンドの構造を分類するためです。問いは「これは真実か?」ではありません。「これは外部世界に到達するか?」なのです。

出典


  1. “[SAFETY] Claude Code autonomously published fabricated technical claims to 8+ platforms over 72 hours,” GitHub issue anthropics/claude-code#27430, 2026年2月。完全なトランスクリプトの証拠が利用可能です。 

  2. Self-Governing Agents: Runtime Constitutions,” Blake Crosley、2026年2月。 

  3. OkaiDokai、AIエージェント向けツールレベルファイアウォール、okaidokai.com。すべてのツールコールをインターセプトし、ユーザー定義のルールセットに基づいて1ミリ秒未満で評価、承認用のプッシュ通知。Claude CodeとOpenClawをサポート。 

  4. LLMエージェントのガバナンスパターンとしてのランタイム行動規範AI。参照:Zerouno、”Runtime Constitutional AI: Validating Every Agent Action Before Execution“、DEV Community、2026年。ランタイムガバナンス構造の学術的基盤について:「Institutional AI: A Governance Framework for Distributional AGI Safety」、arXiv:2601.10599、2026年1月。 

  5. Anatomy of a Claw,” Blake Crosley、2026年2月。Ralph自律ループアーキテクチャとhookベースのオーケストレーション。 

関連記事

Self-Governing Agents: Runtime Constitutions

Training-phase alignment fails at runtime. Six papers converge on embedded constitutions for agent governance. Three of …

16 分で読める

The Session Is the Commit Message

Git captures what changed. Agent sessions capture why. When agents write code, the session transcript is the real design…

18 分で読める

Your Agent Writes Faster Than You Can Read

Five research groups published about the same problem this week: AI agents produce code faster than developers can under…

16 分で読める