From 4c4a0f3067c1e50c77602772f1189a09ed37622a Mon Sep 17 00:00:00 2001 From: Dotta Date: Thu, 9 Jul 2026 18:13:26 +0000 Subject: [PATCH] Stabilize low-trust heartbeat cleanup Co-Authored-By: Paperclip --- .../__tests__/low-trust-red-team-routes.test.ts | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/server/src/__tests__/low-trust-red-team-routes.test.ts b/server/src/__tests__/low-trust-red-team-routes.test.ts index f21d50edbff..f8fe6b53e8c 100644 --- a/server/src/__tests__/low-trust-red-team-routes.test.ts +++ b/server/src/__tests__/low-trust-red-team-routes.test.ts @@ -70,30 +70,31 @@ async function waitFor(condition: () => boolean | Promise, timeoutMs = throw new Error("Timed out waiting for condition"); } -function isHeartbeatRunEventFkError(error: unknown) { +function isHeartbeatCleanupFkError(error: unknown) { const message = error instanceof Error ? `${error.message} ${String(error.cause ?? "")}` : String(error); - return message.includes("heartbeat_run_events_run_id_heartbeat_runs_id_fk"); + return ( + message.includes("heartbeat_run_events_run_id_heartbeat_runs_id_fk") || + message.includes("activity_log_run_id_heartbeat_runs_id_fk") || + message.includes("heartbeat_runs_wakeup_request_id_agent_wakeup_requests_id_fk") + ); } async function deleteHeartbeatRunsAndWakeupsAfterActivityLogDrains(db: Db) { - let lastError: unknown = null; for (let attempt = 0; attempt < 10; attempt += 1) { - await db.delete(activityLog); await db.delete(heartbeatRunEvents); + await db.delete(activityLog); try { await db.delete(heartbeatRunEvents); await db.delete(heartbeatRuns); await db.delete(agentWakeupRequests); return; } catch (error) { - lastError = error; - if (!isHeartbeatRunEventFkError(error)) { + if (!isHeartbeatCleanupFkError(error) || attempt === 9) { throw error; } await new Promise((resolve) => setTimeout(resolve, 25)); } } - throw lastError; } function expectNoCanary(value: unknown, ...markers: string[]) {