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)