PJR-2M84 統合の merge commit 失敗時に merge を中断して develop を merge 途中のまま残さない
1. 概要
worktree 統合(finalizeRegisterWorktreeRun および Schedule タスクの統合段)は、exec ブランチを git merge --no-ff で develop へ取り込む。merge commit の作成が pre-commit hook で失敗すると、runner は merge を中断せずに失敗処理へ進む。develop は「conflict なし・merge 途中(MERGE_HEAD あり)」の状態で残り、続く wait 遷移の commit が fatal: cannot do a partial commit during a merge で失敗する。結果として develop は merge 途中のまま、register も waiting になり、人が git commit で merge を完了するしかない(PJR-YWPH、2026-09-21)。
hook で落ちた実際の原因(typecheck か lint か)は block reason に hook の装飾付き出力の先頭しか残らず、切り分けにも時間がかかった。
1.1. 決定事項
- merge commit が失敗した場合、runner は
git merge --abortで develop を merge 前の状態に戻し、worktree と exec ブランチを保持したままwaitingへ遷移する。waitcommit は merge 前の状態で行う。 - block reason には hook の装飾(罫線・色)を除いた失敗ステップ名と最初のエラー行を残し、全文は evidence(
integrate.log等)へ書く。 exec resumeの統合再開(PJR-J3G0)で同じ merge をやり直せることを統合テストで保証する。--abort自体が失敗した場合(極端な状態)は、その旨を stderr に出して手順(git merge --abortの手動実行)を案内する。
2. 完了条件
- merge commit を hook で失敗させる統合テストで、develop に
MERGE_HEADが残らず、waitcommit が成功し、worktree と exec ブランチが保持されている。 - block reason に失敗ステップ名と最初のエラー行が含まれ、装飾が含まれていない。
- 統合再開で同じタスクの merge をやり直して成功する統合テストがある。
exec-worktree-guideの失敗時の復旧手順が更新されている。npm run checkが通過している。
3. 作業内容
| No | 作業 | 担当 | 状態 | メモ |
|---|---|---|---|---|
| 1 | merge commit 失敗時の git merge --abort と block reason の整形を exec-worktree-ops / exec-run に実装する | DEV | done | hook 出力の要約と integrate.log 保存を実装 |
| 2 | hook で merge commit を落とす統合テストと、統合再開のやり直しテストを追加する | DEV | done | register pipeline の失敗・再開を E2E 検証 |
| 3 | exec-worktree-guide の復旧手順を更新する | DEV | done | abort、自動再開、手動復旧を追記 |
4. 対応結果
mergeWorktreeIntoCurrentが merge 失敗時にMERGE_HEADを確認し、merge 途中の場合だけgit merge --abortを実行するようにした。abort の失敗は黙殺せず、標準エラーと例外へ手動実行手順を含める。- hook の生出力から ANSI 制御と罫線を除き、失敗ステップ名と最初のエラー行を block reason に使うようにした。生の stdout / stderr と abort 結果は pipeline run 配下の
integrate.logへ保存する。 - abort 後は root の wait commit を ancestry-only merge で exec ブランチの祖先にしてから記帳内容を同期するようにした。これにより、checkpoint と wait commit がイベントファイルを別々に追加して起きる add/add 競合を避け、統合再開時は waiting から review への差分だけを merge する。
- merge commit を pre-commit hook で失敗させ、
MERGE_HEADが残らないこと、waitcommit が成功すること、worktree と exec branch が保持されること、装飾のない block reason と生ログが残ることを統合テストへ追加した。同じ run を統合段から再開し、agent を再実行せず merge が成功することも検証する。 - specdojo:exec-worktree-guide に自動 abort、Schedule / register の統合再開、abort 自体が失敗した場合の手動復旧手順を追記した。
- 残課題はない。
4.1. レビュー結果(2026-09-22)
codex-expert-executor が worktree で実装。初回は新規の統合テスト 2 件が親検証で失敗した。原因の一つはテスト側の hook が git rev-parse --verify MERGE_HEAD で統合 commit を判定していたことで、自動 merge の pre-merge-commit 時点では MERGE_HEAD が未作成のため hook が発火しない(手元で実測)。hook を使うテストではマーカーファイルか、pre-merge-commit から環境変数付きで pre-commit を exec する形で統合 commit を判定する。もう一つは実装側で、abort 後の syncExecBranchAfterWait が記帳ファイルの add/add 競合で失敗していた。切り分け結果を plan に追記して codex を再実行し、wait commit を exec ブランチの祖先にする形で解消した。単体 1507 件・統合 109 件・親検証 3 種を通過して統合した。