From 92f666f652e9292338ab6b8a1912b2c97f20a420 Mon Sep 17 00:00:00 2001 From: Ashley Mensah Date: Tue, 28 Apr 2026 17:42:43 +0200 Subject: [PATCH] fix(ci): cap retry-after and handle quota exhaustion gracefully --- .../issue-resolution/scripts/classify-candidates.mjs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/issue-resolution/scripts/classify-candidates.mjs b/.github/issue-resolution/scripts/classify-candidates.mjs index 336187da3..aa3017f2a 100644 --- a/.github/issue-resolution/scripts/classify-candidates.mjs +++ b/.github/issue-resolution/scripts/classify-candidates.mjs @@ -138,6 +138,10 @@ async function callGitHubModel(candidate) { if (res.status === 429) { const retryAfter = Number(res.headers.get("retry-after")) || 30; + if (retryAfter > 120) { + console.warn(` [QUOTA EXHAUSTED] API wants ${retryAfter}s wait — skipping remaining issues.`); + return null; + } console.warn(` [RATE LIMITED] Waiting ${retryAfter}s (attempt ${attempt + 1}/${MAX_RETRIES})...`); await sleep(retryAfter * 1000); continue; @@ -213,6 +217,12 @@ const decisions = []; for (const candidate of candidates) { const pre = preScore(candidate); const modelOut = await paced(() => callGitHubModel(candidate)); + + if (modelOut === null) { + console.warn(`\nQuota exhausted after ${decisions.length} issues. Writing partial results.`); + break; + } + const finalDecision = enforcePolicy(modelOut, pre); decisions.push({