From 4fb6ba6be82712a3cc55fa12488a50b32dc45953 Mon Sep 17 00:00:00 2001 From: mika kuns Date: Fri, 17 Apr 2026 14:17:00 +0200 Subject: [PATCH] fix(worker): emit RunCreated after run row exists Remove premature RunCreated broadcast from WorkerHub.RunNow and the duplicate calls in RunAsync retry block and ContinueAsync. RunOnceAsync now owns the broadcast for every run, fired immediately after the row insert so the UI never receives an event for a non-existent row. --- src/ClaudeDo.Worker/Hub/WorkerHub.cs | 1 - src/ClaudeDo.Worker/Runner/TaskRunner.cs | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/ClaudeDo.Worker/Hub/WorkerHub.cs b/src/ClaudeDo.Worker/Hub/WorkerHub.cs index a8484d3..1ec9f78 100644 --- a/src/ClaudeDo.Worker/Hub/WorkerHub.cs +++ b/src/ClaudeDo.Worker/Hub/WorkerHub.cs @@ -37,7 +37,6 @@ public sealed class WorkerHub : Microsoft.AspNetCore.SignalR.Hub try { await _queue.RunNow(taskId); - await _broadcaster.RunCreated(taskId, 1, false); } catch (InvalidOperationException) { diff --git a/src/ClaudeDo.Worker/Runner/TaskRunner.cs b/src/ClaudeDo.Worker/Runner/TaskRunner.cs index 8e03b6b..0c05959 100644 --- a/src/ClaudeDo.Worker/Runner/TaskRunner.cs +++ b/src/ClaudeDo.Worker/Runner/TaskRunner.cs @@ -125,7 +125,6 @@ public sealed class TaskRunner var retryConfig = resolvedConfig with { ResumeSessionId = result.SessionId }; var retryPrompt = $"The previous attempt failed with:\n\n{result.ErrorMarkdown}\n\nTry again and fix the issues."; - await _broadcaster.RunCreated(task.Id, 2, true); var retryResult = await RunOnceAsync(task.Id, slot, runDir, retryConfig, 2, true, retryPrompt, ct); if (retryResult.IsSuccess) @@ -216,7 +215,6 @@ public sealed class TaskRunner await _broadcaster.TaskStarted(slot, taskId, now); var nextRunNumber = lastRun.RunNumber + 1; - await _broadcaster.RunCreated(taskId, nextRunNumber, false); var result = await RunOnceAsync(taskId, slot, runDir, resolvedConfig, nextRunNumber, false, followUpPrompt, ct); if (result.IsSuccess) @@ -255,6 +253,8 @@ public sealed class TaskRunner await runRepo.AddAsync(run, ct); } + await _broadcaster.RunCreated(taskId, runNumber, isRetry); + var arguments = _argsBuilder.Build(config); await using var logWriter = new LogWriter(logPath);