斜めから見たカラフルなコードのプログラミング画面
技術解説

AIエージェントが同じ過ちを繰り返す理由とその対策

目次を見る

AIエージェントはセッションをまたいで記憶を持たない。この単純な事実が、実運用では深刻な問題を引き起こす場合がある。

dev.to に投稿されたケーススタディが示す状況は、AI駆動開発を本格運用しているチームにとって他人事ではない。あるチームが`users`テーブルに`card_token`カラムを追加したところ、PCI-DSS(カード情報を扱うシステムに適用される国際的なセキュリティ基準)への準拠問題が発覚した。PCI-DSSは、カードデータが自社データベースに触れた瞬間に適用範囲が広がる。そのためチームはカラムを削除し、Stripeが管理するPaymentMethodに移行した。

問題は約1ヶ月後に起きた。決済の失敗が再発し、新しいClaude Codeセッションで調査を開始した。エージェントは前回の経緯をまったく知らない。そして提案した解決策は、`card_token`カラムの再追加だった。コードは残り、推論は消えた。これがAIエージェント特有のコンテキスト消失問題の本質である。

なぜエージェントは「なぜ」を忘れるのか

人間の開発者はコミットメッセージ、PRコメント、Slackのスレッドなど、意図せず判断の痕跡を残す。これらは後から「なぜこうなっているのか」を追うための手がかりになる。

AIエージェントはその痕跡を残さない。プロンプトとコンテキストはセッションが閉じると消える。`git blame`を使えば「いつ・何を」変えたかはわかる。しかし「なぜそうしなかったか」、つまりリバートされた試みや却下された設計案は、どこにも記録されない。

この問題は、エージェントが生成したコードの量が増えるほど顕在化する。人間なら「あの実装はコンプライアンス上NGだった」と記憶しているが、エージェントには前回の文脈が存在しない。結果として、すでに踏んだ地雷を再び踏む。

Selvedgeが実装する「推論の永続化」

この課題に対してSelvedgeというOSSツールが提案するアプローチは、推論をリアルタイムでキャプチャすることだ。事後にdiffから推測するのではなく、変更を加えた瞬間のエージェントの判断をそのまま記録する。

SelvedgeはMCP(Model Context Protocol)サーバーとして動作する。MCPはAnthropicが策定したオープンプロトコルで、AIエージェントが外部ツールやデータソースを呼び出すための標準インターフェイスである。Claude Codeなどのエージェントは、MCPを通じてSelvedgeの機能を呼び出せる。

設定は`CLAUDE.md`に4行追加するだけで完結する。このファイルはClaude Codeが参照するプロジェクトルールファイルで、「エンティティに触れる前に過去の試みを確認する」という指示をエージェントに与える。

pip install selvedge
selvedge setup

エージェントが`selvedge prior-attempts users.card_token`を実行すると、以下のような出力が返る。

users.card_token
Prior attempt 28 days ago (reverted after 2 days)
Reasoning: Added to store card tokens for one-click retries.
Outcome: REVERTED — kept card data out of our own DB to stay clear of
          PCI-DSS scope; moved to Stripe-managed methods.

この情報を受けたエージェントは、カラムを追加するのではなく、保存済みStripe PaymentMethodに対して`off_session`チャージを実行した。コンプライアンス違反を再度犯すことなく、決済の再試行を実現した。

データはプロジェクト直下の`.selvedge/`ディレクトリにSQLiteファイルとして保存される。アカウント登録不要、テレメトリなし、コアパスにLLM呼び出しなし、という設計になっている。推論テキストはエージェントが書いた文字列をそのまま保存する。

ツールが提供する8つのインターフェイスと相互運用性

Selvedgeが提供するツールは8種類に分類される。

  • prior_attempts / blame / diff / history: 過去の記録を参照する読み取り系
  • log_change: 変更と推論を記録する書き込み系
  • changeset / search / stale_decisions: 蓄積されたデータを横断的に扱う分析系

v0.3.9で追加されたエクスポート機能も注目点のひとつだ。`selvedge export --format agent-trace`は、CursorとCognition AIが策定したオープン帰属フォーマット「Agent Trace v0.1.0」形式で履歴を出力する。`selvedge import`でその形式を読み戻すことも可能で、ツール間で推論の履歴を持ち運べる設計になっている。

この相互運用性は重要な方向性を示している。特定ツールへのロックインを避け、推論の記録を「コードベースのインフラ」として扱うという考え方だ。Gitがコードの変更履歴を管理するように、AIが生成したコードの「意図の履歴」を管理する層が、今後の開発ワークフローに組み込まれていく可能性がある。

AI駆動開発が普及するにつれ、「なぜこのコードがここにあるのか」を追跡する仕組みは、コードレビューやインシデント対応の精度に直結する問題になっていく。

参考

My AI agent tried to ship a mistake we'd already reverted

この記事について: 本記事は AI を活用して作成し、forva AI 編集部が内容を確認・監修しています。

AI 駆動開発のご相談は forva AI へ。まずはお気軽にどうぞ。