Skip to content

複数ファイルパッチの「部分適用破損」とサンドボックスのトランザクション(Undo)防衛

1. 概要

AIエージェントによる大規模なコード書き換え(リファクタリング)において、複数のファイルにまたがるパッチ(差分適用)を一括して実行するケースは多い。 しかし、OpenCode(anomalyco/opencode#34311 および #15893)等のインシデント事例は、トランザクション(一貫性)管理や編集後の状態同期を欠いた差分適用ツールが、容易にワークスペースを不可逆的に破損(Corrupt)させるリスクを示している。 本稿では、複数パッチ部分失敗による破損メカニズムと、サンドボックス(sunaba)が実装している「UndoおよびASTによる一貫性防衛設計」について考察する。


2. インシデントの分析:差分適用失敗によるワークスペースの破損

2.1. ロールバックなき部分適用による一貫性崩壊

エージェントが複数ファイル(例:A.tsB.tsC.ts)にまたがる一連の差分適用ツール(apply_patch 等)を実行する際、処理がシーケンシャル(逐次的)にディスクへ書き込まれる設計になっていると、以下の障害が発生する(opencode#34311)。

  1. A.tsB.ts のパッチ適用は成功し、ディスク上のファイルが書き換わる。
  2. 3ファイル目の C.ts の書き込み時に、ディスクフル、キャッシュの不整合(Stale)、権限エラー、あるいはパッチ衝突が発生して適用が失敗する。
  3. ワークスペースの破損: ツールにロールバック(一括差し戻し)機能が備わっていないため、すでに書き換えられた A.tsB.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_patchreplace_file_content)の実行前後の状態を監査ジャーナルに厳格に記録している(sunaba#96)。
  • 万が一、複数ファイルの一部でパッチ適用が失敗した際、または編集後のビルドチェック(lint_in_container等)でエラーが検知された場合、undo_file_edit(編集取り消し) コマンドを一発走らせるだけで、変更前の完全に健全なスナップショット状態へワークスペース全体を瞬時にロールバック(復元)する。
  • これにより、中途半端な書き換えがディスクに残留する「破損状態」を物理的に完全防止する。

3.2. ASTレベルのシンボル置換(edit_symbol)によるフォーマット耐性

  • テキストの行番号や文字位置ベースの差分適用は、自動フォーマットによる「改行や空白の揺らぎ」に対して極めて脆弱である。
  • sunaba は、抽象構文木(AST)を解析して特定の関数定義やクラス定義のノードそのものを差し替える edit_symbol を提供する。
  • ASTノードの置換は、ソースコード上の行数やインデントがフォーマッターによってどれだけ変化しようとも、位置ズレの影響を一切受けずに目的のコードだけをピンポイントで安全に変更できるため、AIの「記憶とディスクのズレ」による誤爆を構造的に排除する。

4. 結論

AIエージェントに複数ファイルの書き換えを任せる以上、パッチの部分的な失敗や自動フォーマットによる位置ズレは必然的に発生する。 これに対し、

  1. 失敗時にミリ秒で過去のスナップショットへ差し戻すロールバック(Undo)機構
  2. 位置に依存せず構文木レベルで確実にコードを書き換えるASTシンボル置換(edit_symbol

という sunaba のトランザクション設計は、コードベースの破損を未然に防ぎ、AIの編集精度を劇的に向上させるための、極めて強固で本質的な「防衛壁」であるといえる。


5. 参考文献 / 一次情報

Shiori pointer-RAG automation experiment.