fix(worker): emit PlanningMergeAborted (not Conflict) on non-conflict merge failures

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
mika kuns
2026-04-24 18:32:52 +02:00
parent 3008c36921
commit ce23f64dc3

View File

@@ -96,11 +96,23 @@ public sealed class PlanningMergeOrchestrator
var current = state.CurrentSubtaskId;
var result = await _merge.ContinueMergeAsync(current, ct);
if (result.Status != TaskMergeService.StatusMerged)
if (result.Status == TaskMergeService.StatusConflict)
{
await _broadcaster.PlanningMergeConflict(planningTaskId, current, result.ConflictFiles);
return;
}
if (result.Status != TaskMergeService.StatusMerged)
{
_logger.LogWarning(
"Planning continue blocked on subtask {Subtask}: {Msg}",
current, result.ErrorMessage);
_states.TryRemove(planningTaskId, out _);
await _broadcaster.PlanningMergeAborted(planningTaskId);
return;
}
await _broadcaster.PlanningSubtaskMerged(planningTaskId, current);
state.CurrentSubtaskId = null;
@@ -144,11 +156,11 @@ public sealed class PlanningMergeOrchestrator
if (result.Status != TaskMergeService.StatusMerged)
{
await _broadcaster.PlanningMergeConflict(
planningTaskId, subtaskId,
new[] { result.ErrorMessage ?? "merge blocked" });
keepState = true;
return;
_logger.LogWarning(
"Planning merge blocked on subtask {Subtask}: {Msg}",
subtaskId, result.ErrorMessage);
await _broadcaster.PlanningMergeAborted(planningTaskId);
return; // keepState stays false → finally removes the state entry
}
await _broadcaster.PlanningSubtaskMerged(planningTaskId, subtaskId);