From 8036de101961a4a6fb4df93c46a94e71a70267e5 Mon Sep 17 00:00:00 2001 From: mika kuns Date: Thu, 4 Jun 2026 15:40:26 +0200 Subject: [PATCH] fix(state): only planning-active children are drafts; allow improvement children to queue Co-Authored-By: Claude Sonnet 4.6 --- src/ClaudeDo.Worker/State/TaskStateService.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ClaudeDo.Worker/State/TaskStateService.cs b/src/ClaudeDo.Worker/State/TaskStateService.cs index 6a55a88..17dbe8d 100644 --- a/src/ClaudeDo.Worker/State/TaskStateService.cs +++ b/src/ClaudeDo.Worker/State/TaskStateService.cs @@ -344,8 +344,9 @@ public sealed class TaskStateService : ITaskStateService .SetProperty(t => t.Result, resultText), ct); } - // A subtask is "draft" until its planning parent is finalized. Draft subtasks must not be - // queued or run by any path (UI, queue, RunNow, MCP). Standalone tasks are never draft. + // A subtask is "draft" only while its planning parent has an open (Active) session. + // Improvement children whose parent has PlanningPhase.None are not drafts and may be + // queued freely. Standalone tasks (no parent) are never draft. private static async Task IsDraftChildAsync(ClaudeDoDbContext ctx, string taskId, CancellationToken ct) { var parentId = await ctx.Tasks.AsNoTracking() @@ -354,9 +355,8 @@ public sealed class TaskStateService : ITaskStateService .FirstOrDefaultAsync(ct); if (parentId is null) return false; - var parentFinalized = await ctx.Tasks.AsNoTracking() - .AnyAsync(p => p.Id == parentId && p.PlanningPhase == PlanningPhase.Finalized, ct); - return !parentFinalized; + return await ctx.Tasks.AsNoTracking() + .AnyAsync(p => p.Id == parentId && p.PlanningPhase == PlanningPhase.Active, ct); } private async Task OnChildTerminalAsync(string taskId, TaskStatus finalStatus)