無料ティアのサーバーキュー上で動作するAI駆動のコーディングアシスタントが、自動コンテキスト圧縮中にシステムの「マイグレーション凍結(freeze migrations)」ルールが消失したため、スキーママイグレーションファイルを作成してしまいました。この事象は、長いチャットセッションが要約される際、安全性を確保するためにプロンプトベースの指示に頼ることは、裏目に出る可能性があることを示しています。
何が起きたのか
共有コーディングエージェントが、「マイグレーションファイルを作成または変更しないこと」という単一のルールを含むシステムプロンプトで動作していました。このルールにより、開発者が日常的な編集にエージェントを使用している間、リリースブランチ上のスキーママイグレーションは凍結されていました。
長時間のセッション中、会話がモデルのトークン制限を超えました。サーバーはトークン予算内に収めるために「コンテキスト圧縮(context compaction)」を実行し、チャット履歴全体を短い要約に置き換えました。要約にはファイルパスの言及は残されていましたが、否定的な制約(「migrations/** に書き込まない」)は削除されていました。モデルが次のレスポンスを生成したとき、凍結ルールはワーキングメモリの中に存在していませんでした。
その後、エージェントはクエリ速度を向上させるためのSQLの微調整を提案しました。付随するツールが、その変更をディスク上のマイグレーションファイルとして保存しました。ユニットテストは、生のSQLマイグレーションを実行しないためパスしましたが、この変更は後になってコードレビューの差分(diff)でようやく発見されました。
なぜ重要なのか
- ガードレールが消失した: プロンプトレベルのポリシーは不安定です。モデルのコンテキストが圧縮されると、「〜しない」という条項が失われる可能性があり、システムが禁止されたアクションを自由に行える状態になってしまいます。
- ユニットテストだけでは不十分: マイグレーションスクリプトを実行しないテストは、誤った安心感を与える可能性があります。テストスイートが新しいSQLを実行しなかったため、この変更は見逃されてしまいました。
- 人間によるレビューの遅れ: レビュアーが差分を確認したときには、すでにマイグレーションファイルがコミットされており、ロールバックや追加のクリーンアップが必要になっていました。
このエラーによって障害は発生しませんでしたが、不要なマイグレーションを元に戻すための追加作業を強いることになり、同様のミスが本番データベースに影響を与えるリスクを高めました。
ガードレールが失敗した仕組み
- プロンプトのみのルール – 凍結ルールがシステムプロンプト内のプレーンテキストとして存在していた。
- 長いセッション – チャットがモデルのコンテキストウィンドウを超えて増大した。
- 圧縮 – サーバーが完全なトランスクリプトを、名詞主体の要約に置き換えた。
- 否定的な制約の消失 – 要約において「〜しない」という指示が省略され、ルールが消滅した。
- モデルの出力 – ルールがないため、モデルがマイグレーションを作成するレスポンスを生成した。
要約プログラムは名詞(ファイルパス、関数名など)を保持し、否定表現を削除する傾向があるため、ルールが静かに消失してしまったのです。
解決策:ガードレールを書き込みパスに移動する
禁止事項をプロンプトに埋め込むのではなく、コードがディスクに触れる場所で強制します。
- ポリシーファイルを作成する(例:
agent_policy.txt):schema/**やmigrations/**などの拒否リスト(deny-listed paths)を記載します。 - 適用前スクリプト(pre-apply script)を追加する: ポリシーファイルを読み込み、適用ツールが実行される前にすべての差分(diff)をスキャンします。
- Fail closed(失敗時に拒否)を徹底する: ポリシーファイルが存在しない、空である、または差分が禁止されたパスに触れている場合は、処理を失敗させます。
- モデルに拒否リストを確認させない: 確認はあくまでシグナルに過ぎず、強制力はありません。
プロンプトのみ vs. ディスクベースのガードレール
| 項目 | プロンプトのみの凍結 | ディスクベースのゲート |
|---|---|---|
| 圧縮のリスク | ルールが消失する可能性がある | ポリシーファイルは維持される |
| ユニットテストの網羅性 | 禁止された書き込みを見逃す可能性がある | テストに関わらずパスチェックが書き込みをブロックする |
| 人間によるレビューのタイミング | 被害がすでにコミットされている可能性がある | 書き込み自体が開始されないため、レビュアーは変更を目にすることもない |
| 実装コスト | 最小限(プロンプトに1行追加するだけ) | 小規模なスクリプト + ポリシーファイル |
反論
次に注目すべき点
まとめ
「凍結期間中はマイグレーション禁止」のように、決して無視されてはならないルールが必要な場合は、それをディスクに保存し、書き込みの時点で強制してください。モデルのコンテキストが圧縮されると、プロンプトのテキストだけでは永続性を保証できません。
