diff --git a/tests/ClaudeDo.Worker.Tests/Repositories/TaskRepositoryPlanningTests.cs b/tests/ClaudeDo.Worker.Tests/Repositories/TaskRepositoryPlanningTests.cs index 648b97a..c95fe8e 100644 --- a/tests/ClaudeDo.Worker.Tests/Repositories/TaskRepositoryPlanningTests.cs +++ b/tests/ClaudeDo.Worker.Tests/Repositories/TaskRepositoryPlanningTests.cs @@ -282,4 +282,29 @@ public sealed class TaskRepositoryPlanningTests : IDisposable Assert.False(ok); } + + [Fact] + public async Task GetNextQueuedAgentTask_SkipsDraftPlanningPlanned() + { + var listId = await CreateListAsync(); + var agentTagId = await _tags.GetOrCreateAsync("agent"); + + async Task T(TaskStatus s, bool withTag, string? parent = null) + { + var t = MakeTask(listId, s, parentId: parent); + await _tasks.AddAsync(t); + if (withTag) await _tasks.AddTagAsync(t.Id, agentTagId); + return t; + } + + var planning = await T(TaskStatus.Planning, withTag: true); + var planned = await T(TaskStatus.Planned, withTag: true); + var draft = await T(TaskStatus.Draft, withTag: true, parent: planning.Id); + var queued = await T(TaskStatus.Queued, withTag: true); + + var picked = await _tasks.GetNextQueuedAgentTaskAsync(DateTime.UtcNow); + + Assert.NotNull(picked); + Assert.Equal(queued.Id, picked!.Id); + } }