From a6f09ee6e30ff9b043b10344784e4b6856206a7b Mon Sep 17 00:00:00 2001 From: Kelly Date: Fri, 12 Dec 2025 22:15:16 -0700 Subject: [PATCH] fix: Calculate stale task count from heartbeat age --- backend/src/tasks/task-service.ts | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/backend/src/tasks/task-service.ts b/backend/src/tasks/task-service.ts index 55b2148c..f1f23b4e 100644 --- a/backend/src/tasks/task-service.ts +++ b/backend/src/tasks/task-service.ts @@ -615,15 +615,25 @@ class TaskService { return counts; } + // Get counts by status, with stale calculated from running tasks with old heartbeats const result = await pool.query( - `SELECT status, COUNT(*) as count + `SELECT + CASE + WHEN status IN ('running', 'claimed') + AND last_heartbeat_at < NOW() - INTERVAL '2 minutes' + THEN 'stale' + ELSE status + END as effective_status, + COUNT(*) as count FROM worker_tasks - GROUP BY status` + GROUP BY effective_status` ); for (const row of result.rows) { - const typedRow = row as { status: TaskStatus; count: string }; - counts[typedRow.status] = parseInt(typedRow.count, 10); + const typedRow = row as { effective_status: TaskStatus; count: string }; + if (typedRow.effective_status in counts) { + counts[typedRow.effective_status] = parseInt(typedRow.count, 10); + } } return counts;