From 071a3b2eb3aabdd0b91e81a864f62ff565ef2e20 Mon Sep 17 00:00:00 2001 From: John Fawcett Date: Sat, 4 Apr 2026 15:01:21 +0000 Subject: [PATCH 1/2] fix(reconciler): parameterize circuit breaker SQL query Replace strftime template literal interpolation with a JS-computed cutoff timestamp passed as a bound SQL parameter. Same 30-minute window, no behavioral change. --- cloudflare-gastown/src/dos/town/reconciler.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cloudflare-gastown/src/dos/town/reconciler.ts b/cloudflare-gastown/src/dos/town/reconciler.ts index 27b1e9f84..8fb0c31f5 100644 --- a/cloudflare-gastown/src/dos/town/reconciler.ts +++ b/cloudflare-gastown/src/dos/town/reconciler.ts @@ -52,6 +52,7 @@ const CIRCUIT_BREAKER_WINDOW_MINUTES = 30; * beads that eventually succeeded (status = 'closed'). */ function checkDispatchCircuitBreaker(sql: SqlStorage): Action[] { + const cutoff = new Date(Date.now() - CIRCUIT_BREAKER_WINDOW_MINUTES * 60_000).toISOString(); const rows = z .object({ failure_count: z.number() }) .array() @@ -61,11 +62,11 @@ function checkDispatchCircuitBreaker(sql: SqlStorage): Action[] { /* sql */ ` SELECT count(*) as failure_count FROM ${beads} - WHERE ${beads.last_dispatch_attempt_at} > strftime('%Y-%m-%dT%H:%M:%fZ', 'now', '-${CIRCUIT_BREAKER_WINDOW_MINUTES} minutes') + WHERE ${beads.last_dispatch_attempt_at} > ? AND ${beads.dispatch_attempts} > 0 AND ${beads.status} != 'closed' `, - [] + [cutoff] ), ]); From 4f0d3c1ea2d5a493d3e94378d7ce070e99d00244 Mon Sep 17 00:00:00 2001 From: John Fawcett Date: Sat, 4 Apr 2026 15:08:41 +0000 Subject: [PATCH 2/2] WIP: container eviction save