PlanningMergeOrchestrator._states is in-memory. A worker restart during a conflict pause left the list repo mid-merge with no recovery path: both ContinuePlanningMerge and AbortPlanningMerge threw "no in-progress merge", and re-Approving failed on the IsMidMergeAsync guard. AbortAsync now falls through to a stateless path when no _states entry exists: it looks up the parent's list WorkingDir and, if the repo is mid-merge, runs git merge --abort there directly, then broadcasts PlanningMergeAborted. Parent remains WaitingForReview — the next Approve restarts the unit merge (already-Merged child worktrees are skipped as before). ContinueAsync error message now points to AbortPlanningMerge as the recovery action. StartAsync mid-merge guard also carries an actionable hint. Tests: AbortAsync stateless + mid-merge (restart recovery), AbortAsync stateless + clean repo (clear error). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
23 KiB
23 KiB