[object Object]

← back to Model Arena

fix daily-challenge timeout: 40min cap + fast-poll after settle + partial-result exit

78f2e7e71797ace6acbbf8a239bd3e22d38e19aa · 2026-08-05 04:07:06 -0700 · steve@designerwallcoverings.com

Files touched

Diff

commit 78f2e7e71797ace6acbbf8a239bd3e22d38e19aa
Author: steve@designerwallcoverings.com <steve@designerwallcoverings.com>
Date:   Wed Aug 5 04:07:06 2026 -0700

    fix daily-challenge timeout: 40min cap + fast-poll after settle + partial-result exit
---
 scripts/daily-challenge.js | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/scripts/daily-challenge.js b/scripts/daily-challenge.js
index 25e31d4..767ed2f 100644
--- a/scripts/daily-challenge.js
+++ b/scripts/daily-challenge.js
@@ -42,16 +42,21 @@ const sleep = ms => new Promise(r => setTimeout(r, ms));
   const c = await req('POST', '/api/challenges', { title: pick.t, prompt: pick.p, models: LOCAL });
   if (!c.id) { console.error('create failed', c); process.exit(1); }
   console.log('created', c.id, '—', pick.t);
-  // poll until settled + judged (cap ~20 min)
-  for (let i = 0; i < 150; i++) {
-    await sleep(8000);
+  // poll until settled + judged (cap ~40 min; reduce sleep to 3s after runs settle)
+  let settledAt = null;
+  for (let i = 0; i < 300; i++) {
+    await sleep(settledAt ? 3000 : 8000);
     const cur = await req('GET', '/api/challenges/' + c.id);
-    const settled = cur.runs.every(r => r.status === 'done' || r.status === 'error');
-    if (settled && !cur.judging && cur.judged_at) {
+    const settled = Array.isArray(cur.runs) && cur.runs.length > 0 &&
+      cur.runs.every(r => r.status === 'done' || r.status === 'error');
+    if (settled && !settledAt) settledAt = Date.now();
+    // exit success once judged, OR after runs settled for 8+ min with no judge (partial result)
+    const judgeTimeout = settledAt && (Date.now() - settledAt) > 8 * 60 * 1000;
+    if (settled && (!cur.judging && cur.judged_at || judgeTimeout)) {
       const done = cur.runs.filter(r => r.status === 'done').length;
-      const entry = { ts: new Date().toISOString(), id: c.id, title: pick.t, done, aiPick: cur.aiPick };
+      const entry = { ts: new Date().toISOString(), id: c.id, title: pick.t, done, aiPick: cur.aiPick || null, partial: judgeTimeout && !cur.judged_at };
       try { fs.appendFileSync(LOG, JSON.stringify(entry) + '\n'); } catch (e) { console.error('LOG APPEND FAILED', e); }
-      console.log('DONE', JSON.stringify(entry));
+      console.log(judgeTimeout ? 'PARTIAL (judge timeout)' : 'DONE', JSON.stringify(entry));
       return;
     }
   }

← b362c96 auto-save: 2026-08-04T08:01:22 (1 files) — data/challenges.j  ·  back to Model Arena  ·  fix judgeTimeout: 8min→35min, PARTIAL exits non-zero to trig 2b08a6e →