Antigravity のエージェントに「この関数を直して」と頼んだのに、しばらく動いた末に patch does not apply や hunk #2 FAILED といった一行を残して編集が止まる——。実装そのものはエージェントが正しく考えているのに、最後のファイル書き込みだけが空振りするこの症状は、複数のエージェントを並行で走らせ始めた頃から私の手元でも頻繁に起きるようになりました。
先に結論をお伝えします。このエラーのほとんどは、エージェントが書こうとしているコードの中身が間違っているわけではありません。エージェントがファイルを読んだ時点と、実際に差分を当てようとした時点で、ファイルの中身がずれてしまったことが原因です。つまりコードの問題ではなく、タイミングと状態管理の問題です。ここを取り違えると、何度プロンプトを書き直しても直りません。
まず「どちらの行で落ちているか」を読む
patch does not apply 系のエラーは、内部的には git apply や同等のパッチ適用処理が、差分の「文脈行(context line)」と実ファイルの行を照合できなかったときに出ます。エージェントは編集対象の前後数行を目印(アンカー)にして差分を作りますが、そのアンカー行が実ファイル側で1文字でも変わっていると照合に失敗します。
まず確認したいのは、エラーに添えられたハンク番号です。hunk #1 succeeded と出ていて hunk #2 FAILED で止まっているなら、ファイルの前半は当たっていて後半でずれたことを意味します。これは「ファイル全体が古い」のではなく「特定の箇所だけ別の何かが触った」サインで、原因の絞り込みに直結します。
なぜ「適用できないパッチ」が生まれるのか
私の環境で起きていた原因は、大きく三つに分かれていました。
一つ目は、保存時の自動整形(フォーマッタ)との競合です。Prettier や ESLint の --fix、エディタの format-on-save が、エージェントが読んだ直後にインデントやクォートを書き換えてしまうと、アンカー行が一致しなくなります。エージェントは 'single' クォートを前提に差分を作ったのに、保存フックが "double" に直してしまった、という食い違いが典型です。
二つ目は、複数エージェントの並行編集です。2014年から個人開発を続け、いまも壁紙・癒し系のアプリを複数本かかえているので、別々のサブエージェントに同じユーティリティファイルを触らせてしまうことがありました。片方がファイルを書き換えた直後にもう片方が古い差分を当てようとすれば、当然失敗します。
三つ目は、改行コードの不一致です。CRLF と LF が混在したリポジトリでは、エージェント側が LF を前提に差分を作っても、実ファイルが CRLF だと全行が「変更あり」と判定されて全滅します。Windows と macOS をまたいで開発していると静かに混入します。
対処1: 最新の状態を読み直させてから当てる
まず即効性があるのは、エージェントに編集対象をもう一度読み直させることです。Antigravity のチャットで、失敗したファイルを明示してから依頼し直します。
src/utils/format.ts を編集前にもう一度全文読み込んでから、
最新の内容に対して差分を作り直してください。
前回の差分は古いスナップショットに基づいていて適用に失敗しました。これでアンカー行が現在のファイルに揃い、当たるようになることがほとんどです。状態がずれているだけなので、コードの考え直しは不要です。
対処2: 保存時フォーマッタとエージェント編集の順番を固定する
再発を断つには、保存フックがエージェント編集に割り込まないようにします。私は AGENTS.md にフォーマッタの方針を明記し、エージェントの出力が既存スタイルに最初から合うようにしています。
# AGENTS.md(抜粋)
## コードスタイル
- フォーマッタは Prettier。設定は .prettierrc に従うこと。
- 文字列はシングルクォート、セミコロンあり、インデントは半角スペース2。
- 差分を作る前に対象ファイルの現状スタイルを確認し、それに合わせること。加えて、フォーマッタの設定ファイル自体をリポジトリに固定しておくと、エージェントの出力と保存後の状態が一致し、アンカーずれが起きにくくなります。
// .prettierrc
{
"singleQuote": true,
"semi": true,
"tabWidth": 2
}対処3: 改行コードをリポジトリ側で正規化する
改行コード由来の全滅は、.gitattributes で正規化すると根本から消えます。次の一行をリポジトリ直下に置き、テキストファイルの改行を LF に統一します。
# .gitattributes
* text=auto eol=lf既に CRLF が混入している場合は、設定を入れた後に一度だけ全ファイルを正規化し直します。
git add --renormalize .
git commit -m "Normalize line endings to LF"これでエージェントが前提とする LF と実ファイルが揃い、改行違いによる「全行変更」判定が起きなくなります。
並行編集をぶつけないための小さな運用
複数エージェントを使うときは、ファイル単位で担当を分けるのがいちばん確実です。私は Dolice Labs の4サイトと複数アプリを同時に回す中で、「同じファイルを二つのエージェントに同時に触らせない」という単純なルールだけで、適用失敗の大半が消えました。どうしても同じ領域を触るなら、片方の編集が完了してコミットされてから次を走らせる、という直列化で十分です。仕組みで防げる失敗は、プロンプトの工夫よりも運用の工夫で消すほうが安定します。
同じ症状で時間を溶かしている方の切り分けが少しでも早くなれば幸いです。