Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 12 additions & 6 deletions cloudflare-gastown/src/dos/town/reconciler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -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]
),
]);

Expand Down Expand Up @@ -1049,8 +1050,7 @@ export function reconcileReviewQueue(
b.${beads.columns.rig_id}, b.${beads.columns.updated_at},
b.${beads.columns.metadata},
rm.${review_metadata.columns.pr_url},
b.${beads.columns.assignee_agent_bead_id},
b.${beads.columns.metadata}
b.${beads.columns.assignee_agent_bead_id}
FROM ${beads} b
INNER JOIN ${review_metadata} rm ON rm.${review_metadata.columns.bead_id} = b.${beads.columns.bead_id}
WHERE b.${beads.columns.type} = 'merge_request'
Expand Down Expand Up @@ -1140,12 +1140,18 @@ export function reconcileReviewQueue(
// Rule 4: PR-strategy MR beads orphaned (refinery dispatched then died, stale >30min)
// Only in_progress — open beads are just waiting for the refinery to pop them.
// Skip when refinery code review is disabled: poll_pr keeps the bead alive via
// updated_at touches, and no refinery is expected to be working on it.
// last_poll_at touches, and no refinery is expected to be working on it.
// Use last_poll_at (set by poll_pr each tick) to determine staleness; fall back
// to updated_at for old beads that predate the last_poll_at field.
if (
refineryCodeReview &&
mr.status === 'in_progress' &&
mr.pr_url &&
staleMs(mr.updated_at, ORPHANED_PR_REVIEW_TIMEOUT_MS)
staleMs(
(typeof mr.metadata?.last_poll_at === 'string' ? mr.metadata.last_poll_at : null) ??
mr.updated_at,
ORPHANED_PR_REVIEW_TIMEOUT_MS
)
) {
const workingAgent = hasWorkingAgentHooked(sql, mr.bead_id);
if (!workingAgent) {
Expand Down