fix(worker): document and test Queued→Failed guard in FailAsync
OverrideSlotService dispatches RunAsync before calling StartRunningAsync, so a preflight failure (list not found, worktree setup) can reach MarkFailed while the task is still Queued. The guard is intentional, not dead code. - Add comment in FailAsync explaining the OverrideSlotService preflight gap - Add FailAsync_FromQueued_TransitionsToFailed test - Update CLAUDE.md transition table with the precise rationale Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -232,6 +232,21 @@ public sealed class TaskStateServiceTests : IDisposable
|
||||
Assert.Equal("boom", t.Result);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task FailAsync_FromQueued_TransitionsToFailed()
|
||||
{
|
||||
// OverrideSlotService can call MarkFailed before StartRunningAsync when a
|
||||
// preflight step (list lookup, worktree setup) fails — the task is still Queued.
|
||||
var id = await SeedTaskAsync(TaskStatus.Queued);
|
||||
|
||||
var result = await _sut.FailAsync(id, DateTime.UtcNow, "list not found", default);
|
||||
|
||||
Assert.True(result.Ok);
|
||||
var t = await GetTaskAsync(id);
|
||||
Assert.Equal(TaskStatus.Failed, t.Status);
|
||||
Assert.Equal("list not found", t.Result);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task FailAsync_FromDone_Rejects()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user