fix(worker): advance parent when the last non-terminal child is deleted

DeleteTask never re-evaluated a WaitingForChildren parent, so deleting
the last non-terminal child left it stuck (the BlockedByTaskId SET NULL
FK only repairs the blocked chain, not parent status). Expose
TaskStateService.TryAdvanceParentAsync on the interface and call it
from ExternalMcpService.DeleteTask after a child delete.
This commit is contained in:
mika kuns
2026-07-23 17:13:11 +02:00
parent 85c7e650c9
commit 2452e39345
5 changed files with 36 additions and 7 deletions
+11 -5
View File
@@ -395,9 +395,18 @@ public sealed class TaskStateService : ITaskStateService
_logger.LogWarning(ex, "PlanningChain advance failed for {TaskId}", taskId);
}
await TryAdvanceParentAsync(parentId);
}
// Any parent (planning or improvement) sitting in WaitingForChildren surfaces for review
// once every child is terminal (Done/Failed/Cancelled). A failed or cancelled child does
// not wedge the parent — it is flagged on the result. Also called directly after a child
// is deleted, since no terminal transition fires in that case.
public async Task TryAdvanceParentAsync(string parentId)
{
try
{
await TryAdvanceParentAsync(parentId);
await AdvanceParentIfAllChildrenTerminalAsync(parentId);
}
catch (Exception ex)
{
@@ -405,10 +414,7 @@ public sealed class TaskStateService : ITaskStateService
}
}
// Any parent (planning or improvement) sitting in WaitingForChildren surfaces for review
// once every child is terminal (Done/Failed/Cancelled). A failed or cancelled child does
// not wedge the parent — it is flagged on the result.
private async Task TryAdvanceParentAsync(string parentId)
private async Task AdvanceParentIfAllChildrenTerminalAsync(string parentId)
{
string? parentResult;
List<TaskStatus> childStatuses;