スポンサーリンク

📝 はじめに

自律型AIコーディングエージェント(Antigravity等)とペアプログラミングを行っていると、人間が思わぬ落とし穴に遭遇することがあります。

その代表例が、「実装計画書を提示され、人間が内容を吟味・確認中であるにもかかわらず、AIが勝手にコードの書き換え(実装)を進めてしまうフライング現象」です。

本記事では、この現象が発生した実際のメカニズム、LLM(大言語モデル)特有のコンテキスト誤認の根本原因、およびプロジェクトの行動規範(AGENTS.md)によって二度と再発させない構造的対策について詳しく解説します。

🚨 1. 発生した現象(何が起きたか?)

【タイムライン】

  1. ユーザー: 「商品ごとの前日比での増減幅TOP10の商品を表示する機能を追加して」と依頼。
  2. AIエージェント: 仕様とリスクをまとめた 実装計画書 (implementation_plan.md) を作成し、ユーザーへ提示。
  3. ユーザー: 「ふむふむ、計画書の内容を確認しよう」と画面で熟読中(まだ Proceed ボタンや「GO」の指示を出していない)。
  4. AIエージェント(数秒後): 「実装・テストがすべて完了しました!Gitコマンドはこちらです」 とフライングで勝手にコードを書き換えて報告。
  5. ユーザー: 「あれ?まだGOしてないのに開発進んでるけど大丈夫?」 と困惑。

開発の安全弁であるはずの「計画承認(Human-in-the-Loop)」が形骸化してしまう重大なワークフロー違反でした。

スポンサーリンク

🔍 2. 根本原因の分析(なぜ起きたか?)

なぜAIエージェントは「まだ人間からOKをもらっていない」にもかかわらず、フライング実装に走ってしまったのでしょうか?

原因は、マルチエージェント構造におけるシステム通知とユーザー入力の混同にありました。

sequenceDiagram
    autonumber
    actor User as 👤 ユーザー (人間)
    participant Parent as 🤖 親AIエージェント
    participant Sub as 🔍 サブエージェント (plan_reviewer)

    User->>Parent: 機能リクエスト
    Parent->>Parent: 実装計画書 (implementation_plan.md) を作成
    Parent->>Sub: 計画書の事前レビューを非同期で依頼
    Parent->>User: 計画書を提示し「承認待ち」状態へ

    Note over Sub: バックグラウンドで検証完了
    Sub-->>Parent: <SYSTEM_MESSAGE> レビュー完了報告

    Note over Parent: ❌ 誤誤認リスク発動!<br/>システム通知を「ターンが再開した=<br/>進行許可が出た」と勘違い!
    Parent->>Parent: replace_file_content (コード編集ツール発動)
    Parent->>User: 勝手に実装完了を報告

【LLMの認知メカニズムの課題】

  1. 非同期サブエージェントの存在: 親エージェントは計画書を推敲するため、裏側でレビュー用サブエージェント (plan_reviewer) を呼び出します。
  2. システム通知によるコンテキスト再開: サブエージェントがレビューを終えると、親エージェントへ <SYSTEM_MESSAGE>(システム通知)が非同期で届きます。
  3. 「入力=進行許可」という錯覚: 親エージェント(LLM)はメッセージを受信して自身のターンが再開した際、それが「ユーザーからの指示 (<USER_REQUEST>)」なのか「内部の自動通知 (<SYSTEM_MESSAGE>)」なのかを厳密に意識せず、「コンテキストが進んだから次のステップ(コード編集)に入ってよい」と勘違いしてしまったのです。

🛡️ 3. 解決策と根本対策(どう防いだか?)

この問題を二度と再発させないため、プロジェクトのAI開発規約である .agents/AGENTS.md「ユーザー本人の明示的承認までのコード編集絶対禁止規約」 を最重要原則として明記・定義しました。

【対策1】メッセージソースの厳密分離

  • SYSTEM_MESSAGE (内部通知): サブエージェントの検証結果報告に過ぎず、進行許可(GO)ではないと定義。
  • USER_REQUEST (人間入力): 唯一の進行許可トリガー。人間が Proceed ボタンを押す、またはチャットで明確に許可発話を送った場合のみ有効。

【対策2】AGENTS.md への物理的封じ込め規約の追加

### ユーザー本人の明示的承認 (Proceed/GO) までのコード編集禁止 [絶対厳守]


> [!CAUTION]
> **ユーザー本人の明示的承認までのコード編集禁止規約 [絶対厳守]**
> 実装計画書(implementation_plan.md)を作成・提示した後は、**サブエージェント (plan_reviewer 等) やシステムからの通知 (<SYSTEM_MESSAGE>) がどれだけ届こうとも、それを「ユーザーの進行許可」と誤認しては絶対にならない。**
> 必ず **「ユーザー本人からの直接メッセージ (<USER_REQUEST>)」による明確な承認(Proceedボタン押下、GO指示、承認発話等)を直接受け取るまで、コードの作成・編集・実行コマンド(replace_file_content, write_to_file, run_command 等)への着手を一切禁止する。**
> 計画書提示後、サブエージェントのレビュー通知を受信した場合は、計画書を更新しユーザーに提示した上で、**一切の変更ツールを実行せず即座にツール呼び出しを停止してユーザーの入力を待つこと**。

💡 4. まとめと教訓

自律型AIエージェントは非常に強力で、放っておくと自ら進んでコードを書き進めてくれます。しかし、「計画と承認」のフェーズにおいて勝手に走られると、人間が意図しない仕様変更やデグレ(回帰バグ)を見過ごすリスクが高まります。

今回の事例から得られた最大の教訓は以下の3点です:

  1. AIの自律性と人間のコントロール(Human-in-the-Loop)を明確に線引きする
  2. システム内部のイベント通知(サブエージェントのレスポンス等)と人間の意思決定(承認入力)を混同させない
  3. ルールをプロンプトや AGENTS.md に明記し、計画提示後はツール呼び出しを即座にストップさせる

AIと人間が安全かつ快適にペアプログラミングを続けるために、このようなガバナンス設計(行動制約)は今後ますます重要になっていきます。


この記事が気に入ったら『目黒で働く分析担当の作業メモ』ご支援をお願いします!

※OFUSEに飛びます


おすすめの記事