複数ファイルパッチの「部分適用破損」とサンドボックスのトランザクション(Undo)防衛
1. 概要
AIエージェントによる大規模なコード書き換え(リファクタリング)において、複数のファイルにまたがるパッチ(差分適用)を一括して実行するケースは多い。 しかし、OpenCode(anomalyco/opencode#34311 および #15893)等のインシデント事例は、トランザクション(一貫性)管理や編集後の状態同期を欠いた差分適用ツールが、容易にワークスペースを不可逆的に破損(Corrupt)させるリスクを示している。 本稿では、複数パッチ部分失敗による破損メカニズムと、サンドボックス(sunaba)が実装している「UndoおよびASTによる一貫性防衛設計」について考察する。
2. インシデントの分析:差分適用失敗によるワークスペースの破損
2.1. ロールバックなき部分適用による一貫性崩壊
エージェントが複数ファイル(例:A.ts、B.ts、C.ts)にまたがる一連の差分適用ツール(apply_patch 等)を実行する際、処理がシーケンシャル(逐次的)にディスクへ書き込まれる設計になっていると、以下の障害が発生する(opencode#34311)。
A.tsとB.tsのパッチ適用は成功し、ディスク上のファイルが書き換わる。- 3ファイル目の
C.tsの書き込み時に、ディスクフル、キャッシュの不整合(Stale)、権限エラー、あるいはパッチ衝突が発生して適用が失敗する。 - ワークスペースの破損: ツールにロールバック(一括差し戻し)機能が備わっていないため、すでに書き換えられた
A.tsとB.tsは変更された状態でディスクに放置され、コードベース全体が中途半端な未完成の状態(Inconsistent State)になる。
この結果、プロジェクト全体のビルドやテストが即座に崩壊し、エージェントはシンタックスエラーの泥沼(Conflict Doom Loop)に入り込んで自力復旧ができなくなる。
2.2. フォーマッター実行後の「AIの記憶とディスクのズレ」
パッチ適用直後に Prettier などのコードフォーマッターや Linter が自動で実行され、インデントや改行が綺麗に補正されるシステムがある。 しかし、フォーマットによってファイルの「実際の行番号やインデント(空白数)」が変化したにもかかわらず、エージェントのメモリ内にあるファイルキャッシュ(記憶)が自動更新(再読込み)されない場合、以下のバグが発生する(opencode#15893)。
- エージェントは「フォーマット前の古い位置(行番号)」をベースに2回目の差分適用を指示する。
- ディスク側の実際のコードと位置がズレているため、2回目のパッチが位置ズレ(Off-by-one)で100%失敗する、あるいは全く異なる場所に誤適用されてコードが破壊される。
3. sunaba における「トランザクション防衛」と「フォーマット耐性」
これらの編集破壊リスクに対し、sunaba(検証サンドボックス)は、インフラと構文パースのレイヤーにおいて、AIによる編集の一貫性を担保する設計を強制している。
3.1. ジャーナルとロールバックによる一貫性(Undo)保証
sunabaは、ファイル編集を伴うツール(apply_patchやreplace_file_content)の実行前後の状態を監査ジャーナルに厳格に記録している(sunaba#96)。- 万が一、複数ファイルの一部でパッチ適用が失敗した際、または編集後のビルドチェック(
lint_in_container等)でエラーが検知された場合、undo_file_edit(編集取り消し) コマンドを一発走らせるだけで、変更前の完全に健全なスナップショット状態へワークスペース全体を瞬時にロールバック(復元)する。 - これにより、中途半端な書き換えがディスクに残留する「破損状態」を物理的に完全防止する。
3.2. ASTレベルのシンボル置換(edit_symbol)によるフォーマット耐性
- テキストの行番号や文字位置ベースの差分適用は、自動フォーマットによる「改行や空白の揺らぎ」に対して極めて脆弱である。
sunabaは、抽象構文木(AST)を解析して特定の関数定義やクラス定義のノードそのものを差し替えるedit_symbolを提供する。- ASTノードの置換は、ソースコード上の行数やインデントがフォーマッターによってどれだけ変化しようとも、位置ズレの影響を一切受けずに目的のコードだけをピンポイントで安全に変更できるため、AIの「記憶とディスクのズレ」による誤爆を構造的に排除する。
4. 結論
AIエージェントに複数ファイルの書き換えを任せる以上、パッチの部分的な失敗や自動フォーマットによる位置ズレは必然的に発生する。 これに対し、
- 失敗時にミリ秒で過去のスナップショットへ差し戻すロールバック(Undo)機構
- 位置に依存せず構文木レベルで確実にコードを書き換えるASTシンボル置換(
edit_symbol)
という sunaba のトランザクション設計は、コードベースの破損を未然に防ぎ、AIの編集精度を劇的に向上させるための、極めて強固で本質的な「防衛壁」であるといえる。
5. 参考文献 / 一次情報
- 複数ファイルのapply_patch部分失敗によるワークスペース破損: anomalyco/opencode#34311
- apply_patch後のフォーマットによる位置ズレとre-read同期の修正: anomalyco/opencode#15893
- apply_patchのジャーナル非対称と監査漏れの解消 (sunaba): masuda-masuo/sunaba#96