PJR-B2EC 再開時の同期で内容が同じ未追跡ファイルを戻せず再開が拒否される
1. 課題内容
--resume の同期で、統合先に入れた保護対象と同じ内容の未追跡ファイルが worktree に残ると stash から戻せず再開を拒否する。exec-operation-guide は内容が同じなら解消すると記載している
2. 影響範囲
| 観点 | 影響 |
|---|---|
| スコープ | exec run --resume で統合先を worktree へ取り込む同期(未コミットの成果の一時退避と復元) |
| スケジュール | v0.3.0 の公開前に直す |
| コスト | 保護対象を統合先へ適用して再開する手順が、worktree の該当ファイルを手で消さないと通らない |
| 品質 | exec-operation-guide の記載(内容が同じなら同期で解消される)と実装が一致しない |
| 関係者 | exec を再開する利用者と orchestrator |
3. 対応方針
| 項目 | 内容 |
|---|---|
| 原因 | 同期は未追跡ファイルを含めて stash し、統合先を merge してから復元する。統合先から同じパスのファイルが追跡済みとして入ると、内容が同じでも未追跡ファイルを復元できず(already exists, no checkout)、再開を拒否する |
| 対応策 | 復元の前に、退避した未追跡ファイルのうち、merge 後の追跡済みファイルと内容が同じものを復元の対象から外す(解消済みとして扱う)。内容が異なる場合は従来どおり拒否し、理由に該当パスを示す |
| 依存事項 | なし |
| 完了条件 | 統合先へ同じ内容のファイルを入れてから再開すると、手作業なしで同期が通ることを統合テストで確認する。内容が異なる場合は従来どおり拒否されることも確認する。exec-operation-guide の記載と一致させる。統合テストで子プロセスとして CLI を起動する場合は、実リポジトリの node_modules/.bin/tsx を絶対パスで起動する。fixture の agent-members.yaml は schema の必須項目(capabilities・proficiency・priority など)を満たす |
4. 対応結果
- stash に退避した未追跡ファイルを復元する前に、merge 後の追跡済みファイルと blob を比較するようにした。同一内容のパスは一時的に重複を解消して stash を適用し、統合先の追跡状態へ戻すため、手作業なしで再開できる。
- 内容が異なるパスは stash を適用する前に検出し、該当パスをエラーへ含めたうえで同期 merge を巻き戻す。元の未追跡ファイルは既存の復旧手順で worktree へ戻し、復旧に失敗した場合は stash を保持する。
- 同一内容なら同期が成功して clean になるケースと、異なる内容ならパスを示して拒否し元の worktree を復元するケースを
tests/src/exec-task-repos.integration.test.tsに追加した。
5. 関連ドキュメント
- prj-0002 の PJR-CM5W(
project/prj-0002/develop上): 事象が起きた実行 - prj-0001:pjr-p8tk-release-stabilization-criteria: v0.3.0 の公開前に直すと利用者が判断した(2026-10-12)