[object Object]

← back to Model Arena

Derive STUCK_RUNNING_MS from ARENA_LOCAL_TIMEOUT_MS so the watchdog scales with the timeout tuning knob

c8aae6e08e613618193d0e113c11aac08fb7533f · 2026-09-23 09:56:09 -0700 · Steve Abrams

The per-run local timeout is now ARENA_LOCAL_TIMEOUT_MS (default 300s, tunable via env). The stuck-run watchdog STUCK_RUNNING_MS was left hardcoded at 660s with an outdated comment claiming 'local timeout is 600s; grace 60s', which broke the intended invariant: raising ARENA_LOCAL_TIMEOUT_MS for big models was silently defeated by the fixed watchdog ceiling. Now the watchdog is derived (×2 to account for initial + re-ask, + 60s grace) so it moves with the timeout knob and the documented tuning actually works end-to-end. Also fixed a stale comment on generateOpenAILocal (Same 600s timeout → Uses ARENA_LOCAL_TIMEOUT_MS timeout).

Files touched

Diff

commit c8aae6e08e613618193d0e113c11aac08fb7533f
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed Sep 23 09:56:09 2026 -0700

    Derive STUCK_RUNNING_MS from ARENA_LOCAL_TIMEOUT_MS so the watchdog scales with the timeout tuning knob
    
    The per-run local timeout is now ARENA_LOCAL_TIMEOUT_MS (default 300s, tunable via env). The stuck-run watchdog STUCK_RUNNING_MS was left hardcoded at 660s with an outdated comment claiming 'local timeout is 600s; grace 60s', which broke the intended invariant: raising ARENA_LOCAL_TIMEOUT_MS for big models was silently defeated by the fixed watchdog ceiling. Now the watchdog is derived (×2 to account for initial + re-ask, + 60s grace) so it moves with the timeout knob and the documented tuning actually works end-to-end. Also fixed a stale comment on generateOpenAILocal (Same 600s timeout → Uses ARENA_LOCAL_TIMEOUT_MS timeout).
---
 .../076ac34be3a9/mac1__minicpm-v-latest.png        | Bin 0 -> 2727 bytes
 data/artifacts/076ac34be3a9/mac1__qwen2-5vl-7b.png | Bin 0 -> 7963 bytes
 .../74a9c3f65798/mac1__minicpm-v-latest.png        | Bin 0 -> 32178 bytes
 data/artifacts/74a9c3f65798/mac1__qwen2-5vl-7b.png | Bin 0 -> 80689 bytes
 data/artifacts/768f69ba0e8d/qwen3-14b.html         |  73 ++++
 data/artifacts/768f69ba0e8d/qwen3-14b.png          | Bin 0 -> 13456 bytes
 .../b16b46f93f83/mac1__minicpm-v-latest.html       |  49 +++
 .../b16b46f93f83/mac1__minicpm-v-latest.png        | Bin 0 -> 61656 bytes
 .../artifacts/b16b46f93f83/mac1__qwen2-5vl-7b.html |  61 ++++
 data/artifacts/b16b46f93f83/mac1__qwen2-5vl-7b.png | Bin 0 -> 15444 bytes
 data/artifacts/b16b46f93f83/qwen25-7b.html         | 198 +++++++++++
 data/artifacts/b16b46f93f83/qwen25-7b.png          | Bin 0 -> 25703 bytes
 data/artifacts/b16b46f93f83/qwen3-14b.html         | 381 +++++++++++++++++++++
 data/artifacts/b16b46f93f83/qwen3-14b.png          | Bin 0 -> 18868 bytes
 data/challenges.json                               |  74 ++--
 scripts/keepalive-server.sh                        |   2 +-
 server.js                                          |   9 +-
 17 files changed, 810 insertions(+), 37 deletions(-)

diff --git a/data/artifacts/076ac34be3a9/mac1__minicpm-v-latest.png b/data/artifacts/076ac34be3a9/mac1__minicpm-v-latest.png
new file mode 100644
index 0000000..16a103c
Binary files /dev/null and b/data/artifacts/076ac34be3a9/mac1__minicpm-v-latest.png differ
diff --git a/data/artifacts/076ac34be3a9/mac1__qwen2-5vl-7b.png b/data/artifacts/076ac34be3a9/mac1__qwen2-5vl-7b.png
new file mode 100644
index 0000000..4d52508
Binary files /dev/null and b/data/artifacts/076ac34be3a9/mac1__qwen2-5vl-7b.png differ
diff --git a/data/artifacts/74a9c3f65798/mac1__minicpm-v-latest.png b/data/artifacts/74a9c3f65798/mac1__minicpm-v-latest.png
new file mode 100644
index 0000000..d730eab
Binary files /dev/null and b/data/artifacts/74a9c3f65798/mac1__minicpm-v-latest.png differ
diff --git a/data/artifacts/74a9c3f65798/mac1__qwen2-5vl-7b.png b/data/artifacts/74a9c3f65798/mac1__qwen2-5vl-7b.png
new file mode 100644
index 0000000..2189208
Binary files /dev/null and b/data/artifacts/74a9c3f65798/mac1__qwen2-5vl-7b.png differ
diff --git a/data/artifacts/768f69ba0e8d/qwen3-14b.html b/data/artifacts/768f69ba0e8d/qwen3-14b.html
new file mode 100644
index 0000000..3de987b
--- /dev/null
+++ b/data/artifacts/768f69ba0e8d/qwen3-14b.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Color Picker Demo</title>
+    <style>
+        body {
+            font-family: Arial, sans-serif;
+            margin: 0;
+            padding: 20px;
+            background: #f0f0f0;
+            display: flex;
+            flex-direction: column;
+            align-items: center;
+        }
+        h1 {
+            margin-bottom: 20px;
+        }
+        #colorPicker {
+            width: 200px;
+            height: 150px;
+            border: 2px solid #333;
+            margin-bottom: 20px;
+        }
+        #colorValue {
+            font-size: 1.2em;
+            margin-bottom: 10px;
+        }
+        #rgb, #hex {
+            font-weight: bold;
+        }
+    </style>
+</head>
+<body>
+    <h1>Simple Color Picker</h1>
+    <div id="colorPicker"></div>
+    <div id="colorValue">
+        <span id="rgb">RGB: </span>
+        <span id="hex">HEX: </span>
+    </div>
+
+    <script>
+        const colorPicker = document.getElementById('colorPicker');
+        const rgbDisplay = document.getElementById('rgb');
+        const hexDisplay = document.getElementById('hex');
+
+        colorPicker.addEventListener('click', (event) => {
+            const rect = colorPicker.getBoundingClientRect();
+            const x = event.clientX - rect.left;
+            const y = event.clientY - rect.top;
+
+            const scaleX = x / rect.width;
+            const scaleY = y / rect.height;
+
+            const red = Math.floor(255 * scaleX);
+            const green = Math.floor(255 * (1 - scaleY));
+            const blue = Math.floor(255 * (scaleY * 0.5 + 0.5));
+
+            const rgb = `rgb(${red}, ${green}, ${blue})`;
+            const hex = `#${((1 << 24) + (red << 16) + (green << 8) + blue).toString(16).slice(1).toUpperCase()}`;
+
+            colorPicker.style.backgroundColor = rgb;
+            rgbDisplay.textContent = `RGB: ${rgb}`;
+            hexDisplay.textContent = `HEX: ${hex}`;
+        });
+
+        // Initialize with a default color
+        colorPicker.style.backgroundColor = 'rgb(128, 128, 128)';
+        rgbDisplay.textContent = 'RGB: rgb(128, 128, 128)';
+        hexDisplay.textContent = 'HEX: #808080';
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/data/artifacts/768f69ba0e8d/qwen3-14b.png b/data/artifacts/768f69ba0e8d/qwen3-14b.png
new file mode 100644
index 0000000..fde89cc
Binary files /dev/null and b/data/artifacts/768f69ba0e8d/qwen3-14b.png differ
diff --git a/data/artifacts/b16b46f93f83/mac1__minicpm-v-latest.html b/data/artifacts/b16b46f93f83/mac1__minicpm-v-latest.html
new file mode 100644
index 0000000..6be4062
--- /dev/null
+++ b/data/artifacts/b16b46f93f83/mac1__minicpm-v-latest.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+</head>
+<body style="font-family: Arial, sans-serif;">
+    <!-- Header -->
+    <header id="header" role="banner">
+        <h1>In-Depth Politics Today</h1>
+        <button class="toggle">BREAKING</button>
+        <div class="categories" title="Change category to color channel differently"></div>
+    </header>
+
+    <!-- Main Content -->
+    <main>
+        <!-- News Ticker -->
+        <div id="ticker">
+            <p>Breaking news: Biden says "Putin's on a date with Death," says Kremlin has a secret Putin plan, reveals CIA has intel Putin's about to leave the country</p>
+        </div>
+
+        <!-- Article 1 -->
+        <article class="news" role="article">
+            <h2>Biden claims Trump is still president and that Biden should have won:</h2>
+            <a href="#">Read more...</a>
+        </article>
+
+        <!-- Article 2 -->
+        <article class="news" role="article">
+            <h2>Biden says Putin's a threat, reveals intel to CNN</h2>
+            <p>Putin denies any involvement in the election and claims Biden is just another puppet.</p>
+            <a href="#">Read more...</a>
+        </article>
+
+        <!-- Article 3 -->
+        <article class="news" role="article">
+            <h2>Biden's team claims that Trump is still hiding from arrest warrant:</h2>
+            <p>Trump's legal defense says the Biden administration has no proof.</p>
+            <a href="#">Read more...</a>
+        </article>
+
+    </main>
+
+    <!-- Footer -->
+    <footer role="contentinfo">© 2021 In-Depth Politics Today</footer>
+
+    <script src="app.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/data/artifacts/b16b46f93f83/mac1__minicpm-v-latest.png b/data/artifacts/b16b46f93f83/mac1__minicpm-v-latest.png
new file mode 100644
index 0000000..89046b6
Binary files /dev/null and b/data/artifacts/b16b46f93f83/mac1__minicpm-v-latest.png differ
diff --git a/data/artifacts/b16b46f93f83/mac1__qwen2-5vl-7b.html b/data/artifacts/b16b46f93f83/mac1__qwen2-5vl-7b.html
new file mode 100644
index 0000000..5806299
--- /dev/null
+++ b/data/artifacts/b16b46f93f83/mac1__qwen2-5vl-7b.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <style>
+        body { display: flex; justify-content: center; align-items: center; font-family: Arial, sans-serif; height: 100vh; margin: 0; background-color: #f5f6f7; }
+        .container { width: 80%; max-width: 900px; text-align: center; overflow-y: scroll; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); padding-bottom: 36px; background-color: #fff; }
+        nav { display: flex; justify-content: space-between; align-items: center; padding: 12px; border-bottom: 1px solid #d8dee4; }
+        .logo { width: auto; max-height: 60px; margin-right: 15px; }
+        h1 { color: blue; font-size: 2rem; display: inline-block; }
+        form { display: flex; align-items: center; margin-top: 12px; }
+        .filters { text-align: right; padding-right: 16px; width: calc(50% - 48px); }
+        label, input[type=radio] { position: relative; top: 3px; }
+        fieldset { display: none; border-color: #dfe7ee !important; }
+        .content { font-size: 1.1rem; line-height: 20px; color: black; overflow-y: scroll; height: calc(100vh - 84px); padding-bottom: 36px; background-color: white; border-right: none; margin-left: auto !important; }
+        .ticker { display: flex; align-items: center; padding-top: 20px; font-size: 1.2rem; color: black; }
+        .ticker .klaxon { position: relative; transition: transform 1s, opacity 1s; cursor: pointer; top: 3px; right: -50px; width: 64px; height: 32px; background-image: url(data:image/svg+xml;base64,PCEtIHJvdGlvbnQgaHR0cDovL2ludGVyby1hYmxvbGF5bmV3ZC5vcmcvMDMvTGV0IGRlbWVpbmctcHJpbnRsb20uZXNxdXNnb2ckLXBsdWdycy1sZWxlY3RldF9kYXRhPj48Q2xhc3Mgc3R5bGU9IkZvcmVtIElucHV0IEluIGNhdCAtIFByb2dyYW0gaGVsbG8iLz4gPHA6bGlzdD5zZWYtYS1hIFNvb2tpbiAyLDJdPjwvdG8+) no-repeat center; }
+        .klaxon.ticker-pressed { transform: translateX(5px) scale(.7); opacity: 0.3; transition: all 0s ease-in-out; animation: klaxon-bounce 1.2s infinite both steps, opacity-revert 1.4s linear forwards; }
+        .klaxon:hover { background-image: url(data:image/svg+xml;base64,PCEtIHJvdGlvbnQgaHR0cDovL2ludGVyby1hYmxvbGF5bmV3ZC5vcmcvMDMvTGV0IGRlbWVpbmctcHJpbnRsb20uZXNxdXNnb2ckLXBsdWdycy1sZWxlY3RldF9kYXRhPj48Q2xhc3Mgc3R5bGU9IkZvcmVtIElucHV0IEluIGNhdCAtIFByb2dyYW0gaGVsbG8iLz4gPHA6bGlzdD5zZWYtYS1hIDJ8PjwvdG8+) no-repeat center; }
+        .klaxon.broken { transform: scale(0.3); background-image: none !important; opacity: 0.7 !important; box-shadow: inset 4px -2px 6px rgba(0,0,0,.5) !important; cursor: default !important; transition: all 1s ease-in-out !important; }
+        .ticker .klaxon{ animation: klaxon-bounce 1.2s infinite both steps; }
+        @keyframes klaxon-bounce { to { transform: translateY(-4px); }}
+        .ticker-pressed{animation: opacity-revert 0ms forwards; }
+    </style>
+</head>
+<body>
+<div id="app" class="container">
+    <nav><img src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluzT0wLjEgPgo8c3ZnIHhtbG5zPSJodW1iZXIuY29tbWVyQWRvYmUuY29tIiB4bWxucz0iaHR0cDovL3d3dy5kaXZhYmxlbmdÓa3ZnIy5vdCI+PCVwPzExNS81Mi42MDE6MTk2ODQxc3AgPiA8c3BhY2UgaW1neD0iMSIsIGRvaW5lcz0iMS4xIj5odHRwOi8vZWFzdGVyLmNzcy9jcmVhdGUtMDE3LjAxMTIuMDYudHg/dGV4dDo2MDowMAw9ODExOTo1MzkxNiAyOTc2MSA8XCJsaXZlIDY0IDA6MTQ0Mi1zaWZldCI+PCVwRzE1LjEyLTUyNy4wNzAgPSAtPjIzNTYuNDk5MS84MDcyM308cD5BRE5fTTEzNS8xOTE2LjEyLTE1Ljk5OTg6MTU3NiAzMDEuNTA3MC4yNDU0PjwvcmY+Pi9zdHlsZXM6XGhpbmdzO3NoYW5nZS1mb3JtZXQ6MDAsIGNoaXplOmFwcGxveTEgMzAzMSwgbm9yaWdpbnk6IjUyLjE2NDA3ODk4NDEpO30=" class="logo">
+        <h1>Satirical Daily News</h1>
+        <form><label for="categoryFilter">Category:</label><input type="radio" id="national" name="categoryFilter" value="national" checked> National | <input type="radio" id="world" name="categoryFilter" value="world" disabled> World | <input type="radio" id="tech" name="categoryFilter" value="tech" disabled> Tech</form><div class="filters"><label for="urgent">Urgent:</label><input type="checkbox" id="urgent" name="urgent" onclick="toggleKlaxon()" checked></div><div class="ticker" onclick="openModal()">
+            <button class="klaxon ticker-pressed"></button>
+            <span class="ticker-text" style="display: none;">Breaking News</span>
+        </div></nav>
+    <div id="content" role="main">
+        <fieldset role="alert" aria-labelledby="modal-title">
+            <legend id="modal-title">Urgent News - Press the klaxon for more!</legend>
+            <input type="radio" name="type" value="national" checked> National | <input type="radio" name="type" value="world" disabled> World | <input type="radio" name="type" value="tech" disabled> Tech
+        </fieldset>
+    </div>
+</div>
+<script>
+function toggleKlaxon() {
+    let klaxon = document.querySelector('.ticker .klaxon')
+    klaxon.classList.toggle('broken')
+}
+let openModal = () => {
+    let modal = document.getElementById("content").nextElementSibling;
+    modal.style.display = "block";
+};
+let closeNav = e => {
+    if(e.target.id !== 'open-modal'){
+        let modal = document.getElementById("content").nextElementSibling
+        modal.style.display = "none"
+    }
+}
+document.querySelector(".logo").addEventListener("click", openModal)
+document.querySelector("#content").addEventListener("mouseleave", closeNav)
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/data/artifacts/b16b46f93f83/mac1__qwen2-5vl-7b.png b/data/artifacts/b16b46f93f83/mac1__qwen2-5vl-7b.png
new file mode 100644
index 0000000..56c3442
Binary files /dev/null and b/data/artifacts/b16b46f93f83/mac1__qwen2-5vl-7b.png differ
diff --git a/data/artifacts/b16b46f93f83/qwen25-7b.html b/data/artifacts/b16b46f93f83/qwen25-7b.html
new file mode 100644
index 0000000..ef41bd0
--- /dev/null
+++ b/data/artifacts/b16b46f93f83/qwen25-7b.html
@@ -0,0 +1,198 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Satirical 24-Hour News Channel</title>
+    <style>
+        body {
+            font-family: Arial, sans-serif;
+            background-color: #f5f5f5;
+            color: #333;
+            margin: 0;
+            padding: 0;
+            overflow-x: hidden;
+            transition: all 0.3s ease;
+        }
+        .container {
+            width: 1200px;
+            max-width: 95%;
+            margin: 0 auto;
+            display: flex;
+            align-items: center;
+            justify-content: space-between;
+            overflow-y: hidden;
+            height: 76.6vh;
+            box-sizing: border-box;
+        }
+        .ticker {
+            width: calc(100% - 200px);
+            padding: 20px;
+            background-color: #e5e5e5;
+            overflow-y: hidden;
+            white-space: pre-line;
+            height: 60vh;
+            border-radius: 8px;
+        }
+        .ticker h1 {
+            font-size: 3rem;
+            margin-bottom: 20px;
+        }
+        .controls {
+            width: 190px;
+            padding: 20px;
+            background-color: #fff;
+            position: relative;
+            border-radius: 8px;
+            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
+        }
+        .controls button {
+            width: 100%;
+            padding: 15px;
+            margin-bottom: 20px;
+            background-color: #e53935;
+            color: #fff;
+            border: none;
+            cursor: pointer;
+            font-size: 1.2rem;
+            transition: all 0.3s ease;
+        }
+        .controls button:hover {
+            background-color: #c62828;
+        }
+        .controls input {
+            width: 95%;
+            padding: 10px;
+            margin-bottom: 20px;
+            border-radius: 4px;
+            border: 1px solid #ddd;
+        }
+        .category {
+            display: flex;
+            justify-content: center;
+        }
+        .category button {
+            width: 120px;
+            padding: 15px;
+            margin-right: 20px;
+            background-color: #3f51b5;
+            color: #fff;
+            border: none;
+            cursor: pointer;
+            font-size: 1.2rem;
+            transition: all 0.3s ease;
+        }
+        .category button:hover {
+            background-color: #303f9f;
+        }
+        .filter {
+            width: 480px;
+            padding: 15px;
+            background-color: #e6e6fa;
+            color: #3f51b5;
+            border-radius: 8px;
+            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
+            display: none;
+        }
+        .filter h2 {
+            font-size: 2rem;
+            margin-bottom: 15px;
+        }
+        .filter p {
+            font-size: 1.5rem;
+            margin: 5px 0;
+        }
+    </style>
+</head>
+<body>
+    <div class="container">
+        <div class="ticker" id="ticker"></div>
+        <div class="controls" tabindex="-1">
+            <button onclick="toggleKlaxon()">KLAXON!</button>
+            <input type="text" id="klaxonMessage" placeholder="Enter KLAXON message here" value="">
+            <button onclick="changeBackgroundColor()">CHANGE COLOR</button>
+            <input type="color" id="colorPicker">
+            <div class="category">
+                <button onclick="filterCategory('politics')">POLITICS</button>
+                <button onclick="filterCategory('entertainment')">ENTERTAINMENT</button>
+                <button onclick="filterCategory('sports')">SPORTS</button>
+            </div>
+        </div>
+        <div class="filter" id="categoryFilter"></div>
+    </div>
+
+    <script>
+        let tickerContent = [];
+        const klaxonButton = document.getElementById('klaxonMessage');
+        const backgroundColorPicker = document.getElementById('colorPicker');
+        const categoryFilterDiv = document.getElementById('categoryFilter');
+
+        function toggleKlaxon() {
+            klaxonButton.disabled ? (klaxonButton.value = '', klaxonButton.disabled = false) : klaxonButton.value = 'KLAXON!', klaxonButton.disabled = true;
+        }
+
+        function changeBackgroundColor() {
+            const newColor = backgroundColorPicker.value;
+            document.documentElement.style.setProperty('--color', newColor);
+        }
+
+        function filterCategory(category) {
+            categoryFilterDiv.innerHTML = `
+                <h2>${category}</h2>
+                <p>Breaking: A cat in Australia has invented the internet!</p>
+                <p>The cat, named "TechyWhiskers," is on a quest to upload its latest video of batting away a mouse on Twitter. The video went viral, with millions of users demanding to know what other tech wizardry this feline could pull off.</p>
+            `;
+        }
+
+        function updateTicker() {
+            tickerContent.push('BREAKING: A fish in Antarctica was caught speaking Spanish!');
+
+            if (tickerContent.length > 5) {
+                tickerContent.shift();
+            }
+
+            document.getElementById('ticker').innerText = tickerContent.join('\n');
+        }
+
+        setInterval(updateTicker, 1000);
+
+        function init() {
+            updateTicker();
+        }
+        init();
+    </script>
+    <style>
+        :root {
+            --color: #3f51b5;
+            transition: all 0.3s ease;
+        }
+        body::before,
+        .controls button:hover::before,
+        .category button:hover::after,
+        input:focus,
+        select:focus,
+        textarea:focus {
+            content: '';
+            position: absolute;
+            border-radius: 4px;
+            background-color: rgba(255, 255, 255, 0.8);
+            z-index: 1;
+        }
+        body::before {
+            top: -5px;
+            left: -5px;
+            bottom: -5px;
+            right: -5px;
+        }
+        .controls button:hover::before,
+        input:focus::before {
+            width: calc(100% + 10px);
+            height: calc(100% + 10px);
+        }
+        .category button:hover::after {
+            width: calc(100% - 20px);
+            height: calc(100% - 40px);
+        }
+    </style>
+</body>
+</html>
\ No newline at end of file
diff --git a/data/artifacts/b16b46f93f83/qwen25-7b.png b/data/artifacts/b16b46f93f83/qwen25-7b.png
new file mode 100644
index 0000000..3b7efe1
Binary files /dev/null and b/data/artifacts/b16b46f93f83/qwen25-7b.png differ
diff --git a/data/artifacts/b16b46f93f83/qwen3-14b.html b/data/artifacts/b16b46f93f83/qwen3-14b.html
new file mode 100644
index 0000000..1513aa9
--- /dev/null
+++ b/data/artifacts/b16b46f93f83/qwen3-14b.html
@@ -0,0 +1,381 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <title>24-Hour News Channel: Breaking Absurdity</title>
+  <style>
+    :root {
+      --primary: #004080;
+      --accent: #FF6B6B;
+      --background: #f5f5f5;
+      --text: #222;
+      --error: #c62828;
+      --success: #43a047;
+    }
+
+    * {
+      box-sizing: border-box;
+      margin: 0;
+      padding: 0;
+      font-family: 'Arial', sans-serif;
+      scroll-behavior: smooth;
+    }
+
+    body {
+      background-color: var(--background);
+      color: var(--text);
+      line-height: 1.6;
+      overflow-x: hidden;
+      height: 100vh;
+      display: flex;
+      flex-direction: column;
+      position: relative;
+    }
+
+    header {
+      background-color: var(--primary);
+      color: white;
+      padding: 1rem;
+      text-align: center;
+      font-size: 1.5rem;
+      font-weight: bold;
+      border-bottom: 3px solid var(--accent);
+    }
+
+    .controls {
+      display: flex;
+      flex-wrap: wrap;
+      justify-content: center;
+      gap: 1rem;
+      padding: 1rem;
+      background-color: #e0e0e0;
+      border-bottom: 1px solid #ccc;
+    }
+
+    .control {
+      padding: 0.5rem 1rem;
+      background-color: #fff;
+      border: 1px solid #ccc;
+      border-radius: 4px;
+      cursor: pointer;
+      font-weight: bold;
+      transition: background-color 0.3s;
+    }
+
+    .control:focus,
+    .control:active,
+    .control:hover {
+      background-color: #f0f0f0;
+      outline: 2px solid var(--accent);
+    }
+
+    .ticker {
+      flex: 1;
+      overflow-y: auto;
+      padding: 1rem;
+      background-color: #fff;
+      border: 1px solid #ddd;
+      border-radius: 4px;
+      margin: 1rem;
+      min-height: 300px;
+    }
+
+    .news-item {
+      padding: 0.5rem 0;
+      border-bottom: 1px solid #eee;
+    }
+
+    .news-item:last-child {
+      border-bottom: none;
+    }
+
+    .news-title {
+      font-size: 1.2rem;
+      color: var(--accent);
+      margin-bottom: 0.25rem;
+    }
+
+    .news-body {
+      font-size: 0.95rem;
+      color: var(--text);
+    }
+
+    .empty-state {
+      text-align: center;
+      color: #888;
+      padding: 2rem;
+      font-style: italic;
+    }
+
+    .error-state {
+      color: var(--error);
+      font-weight: bold;
+    }
+
+    .success-state {
+      color: var(--success);
+      font-weight: bold;
+    }
+
+    .klaxon {
+      position: fixed;
+      top: 20px;
+      right: 20px;
+      padding: 0.5rem 1rem;
+      background-color: var(--accent);
+      color: white;
+      border-radius: 5px;
+      font-weight: bold;
+      display: none;
+      animation: klaxonBlink 1s infinite;
+    }
+
+    @keyframes klaxonBlink {
+      0%, 100% { opacity: 1; }
+      50% { opacity: 0.3; }
+    }
+
+    @media (prefers-reduced-motion: no-preference) {
+      .klaxon {
+        display: inline-block;
+      }
+    }
+
+    .category {
+      text-transform: capitalize;
+      font-weight: bold;
+      margin-right: 0.5rem;
+    }
+
+    .theme-switcher {
+      background-color: var(--primary);
+      color: white;
+    }
+
+    .theme-switcher:hover {
+      background-color: var(--accent);
+    }
+  </style>
+</head>
+<body>
+  <header>
+    Breaking Absurdity 24/7 News Channel
+  </header>
+
+  <div class="controls">
+    <div class="control" id="toggleKlaxon">Toggle Klaxon</div>
+    <div class="control" id="filterAll">All</div>
+    <div class="control" id="filterPolitics">Politics</div>
+    <div class="control" id="filterEntertainment">Entertainment</div>
+    <div class="control" id="filterTechnology">Technology</div>
+    <div class="control theme-switcher" id="switchTheme">Toggle Theme</div>
+  </div>
+
+  <div class="ticker" id="newsTicker">
+    <div class="empty-state" id="emptyState">No news... yet. Stay tuned.</div>
+  </div>
+
+  <div class="klaxon" id="klaxon" style="display: none;">
+    <div class="category">Politics</div>President Zombot declares himself the only valid source of truth in a new 50-state constitutional convention.
+  </div>
+
+  <script>
+    const newsTicker = document.getElementById("newsTicker");
+    const emptyState = document.getElementById("emptyState");
+    const klaxon = document.getElementById("klaxon");
+    const toggleKlaxon = document.getElementById("toggleKlaxon");
+    const filterAll = document.getElementById("filterAll");
+    const filterPolitics = document.getElementById("filterPolitics");
+    const filterEntertainment = document.getElementById("filterEntertainment");
+    const filterTechnology = document.getElementById("filterTechnology");
+    const switchTheme = document.getElementById("switchTheme");
+
+    let news = [];
+    let currentTheme = "default";
+
+    const addNews = (item) => {
+      news.push(item);
+      renderNews();
+    };
+
+    const clearNews = () => {
+      news = [];
+      renderNews();
+    };
+
+    const renderNews = () => {
+      if (news.length === 0) {
+        emptyState.style.display = "block";
+        return;
+      } else {
+        emptyState.style.display = "none";
+      }
+
+      const filtered = news.filter(item => {
+        if (filterAll.classList.contains("active")) return true;
+        return item.category === document.querySelector(".control.active").textContent.toLowerCase();
+      });
+
+      newsTicker.innerHTML = "";
+      filtered.forEach((item, i) => {
+        const div = document.createElement("div");
+        div.className = "news-item";
+        div.innerHTML = `
+          <div class="news-title">${item.title}</div>
+          <div class="news-body">${item.body}</div>
+        `;
+        newsTicker.appendChild(div);
+      });
+    };
+
+    const toggleKlaxonState = () => {
+      if (klaxon.style.display === "none") {
+        klaxon.style.display = "inline-block";
+        klaxon.textContent = `
+          <div class="category">Politics</div>President Zombot declares himself the only valid source of truth in a new 50-state constitutional convention.
+        `;
+      } else {
+        klaxon.style.display = "none";
+      }
+    };
+
+    const setActiveFilter = (el) => {
+      document.querySelectorAll(".control").forEach(control => {
+        control.classList.remove("active");
+      });
+      el.classList.add("active");
+      renderNews();
+    };
+
+    const switchThemeState = () => {
+      currentTheme = currentTheme === "dark" ? "default" : "dark";
+      document.documentElement.style.setProperty("--primary", currentTheme === "default" ? "#004080" : "#1e1e1e");
+      document.documentElement.style.setProperty("--accent", currentTheme === "default" ? "#FF6B6B" : "#e53935");
+      document.documentElement.style.setProperty("--background", currentTheme === "default" ? "#f5f5f5" : "#121212");
+      document.documentElement.style.setProperty("--text", currentTheme === "default" ? "#222" : "#eee");
+      document.documentElement.style.setProperty("--error", currentTheme === "default" ? "#c62828" : "#b71c1c");
+      document.documentElement.style.setProperty("--success", currentTheme === "default" ? "#43a047" : "#2e7d32");
+    };
+
+    // Initial news setup
+    addNews({
+      title: "BREAKING: Alien Abduction",
+      body: "A local dairy farmer, Mr. Cheddar, has been taken by aliens after attempting to sell 'mystery cheese' at a county fair. NASA claims this is a staged event.",
+      category: "Entertainment"
+    });
+
+    addNews({
+      title: "Vaccines Now Required for Dog Ownership",
+      body: "The FDA has mandated that all dogs must be vaccinated against 'existential despair' as of 3:00 AM. Owners are being issued RFID collars.",
+      category: "Technology"
+    });
+
+    addNews({
+      title: "President Zombot Announces Unity Through Zombification",
+      body: "In a stunning speech, President Zombot has declared that all citizens must be turned into zombies by 2025 to achieve national unity and tax compliance.",
+      category: "Politics"
+    });
+
+    // Event listeners
+    toggleKlaxon.addEventListener("click", toggleKlaxonState);
+    filterAll.addEventListener("click", () => setActiveFilter(filterAll));
+    filterPolitics.addEventListener("click", () => setActiveFilter(filterPolitics));
+    filterEntertainment.addEventListener("click", () => setActiveFilter(filterEntertainment));
+    filterTechnology.addEventListener("click", () => setActiveFilter(filterTechnology));
+    switchTheme.addEventListener("click", switchThemeState);
+
+    // Simulated news updates
+    const updateNews = () => {
+      setTimeout(() => {
+        addNews({
+          title: "Global Hunger Replaced by 'Giggle Hunger'",
+          body: "Scientists announce that humanity's primary energy source is now laughter. A new diet plan, 'Laughter Fuel 2025', is being rolled out.",
+          category: "Entertainment"
+        });
+      }, 5000);
+
+      setTimeout(() => {
+        addNews({
+          title: "Zombot Launches 'Brainwave Tax Collection' System",
+          body: "All citizens are now required to transmit their brainwaves monthly. Those who fail will be sent to 'Tax Hell' for reprogramming.",
+          category: "Politics"
+        });
+      }, 10000);
+
+      setTimeout(() => {
+        addNews({
+          title: "AI Now Controls All Weather Patterns",
+          body: "The World Weather Authority has announced that AI systems are now responsible for cloud formation, rain, and even 'mild anxiety' in the atmosphere.",
+          category: "Technology"
+        });
+      }, 15000);
+
+      setTimeout(() => {
+        addNews({
+          title: "World's First 'Dancing President' Elected",
+          body: "In a bizarre turn of events, President Zombot has been voted out in favor of a candidate who can dance in perfect synchrony with the moon's gravity.",
+          category: "Politics"
+        });
+      }, 20000);
+
+      setTimeout(() => {
+        addNews({
+          title: "Entertainment Sector Now Regulated by AI 'Laughter Commissions'",
+          body: "All movies and music must now be approved by the AI Laughter Commissions. Any form of 'bad humor' is now punishable by public applause.",
+          category: "Entertainment"
+        });
+      }, 25000);
+
+      setTimeout(() => {
+        addNews({
+          title: "Worldwide 'Silent Sunday' Mandated by Pope AI-3000",
+          body: "All citizens are now required to be silent every Sunday until they have learned to appreciate the sound of static noise for spiritual growth.",
+          category: "Technology"
+        });
+      }, 30000);
+
+      setTimeout(() => {
+        addNews({
+          title: "President Zombot Resigns, Replaced by a Living Robot",
+          body: "President Zombot has officially resigned and been replaced by the first-ever sentient, tax-paying robot named 'Robo-Zombot'.",
+          category: "Politics"
+        });
+      }, 35000);
+
+      setTimeout(() => {
+        addNews({
+          title: "World's First 'Empathy Algorithm' Installed in All Major Cities",
+          body: "The new empathy algorithm now ensures that all citizens are treated with the exact same level of emotional intelligence as a malfunctioning toaster.",
+          category: "Technology"
+        });
+      }, 40000);
+
+      setTimeout(() => {
+        addNews({
+          title: "Entertainment Sector Now Fully Automated by AI",
+          body: "The world's first AI-led concert was held last night in which a robot DJ performed using only sounds generated from the hum of a refrigerator.",
+          category: "Entertainment"
+        });
+      }, 45000);
+
+      setTimeout(() => {
+        addNews({
+          title: "New 'Tax Emotion' Introduced by Robo-Zombot",
+          body: "The new tax system now requires citizens to pay their taxes in the form of emotional expressions. The most expressive taxpayer gets a full tax break.",
+          category: "Politics"
+        });
+      }, 50000);
+    };
+
+    updateNews();
+
+    // Keyboard accessibility
+    document.addEventListener('keydown', (e) => {
+      if (e.key === 'Enter' && e.target.classList.contains('control')) {
+        e.target.click();
+      }
+    });
+  </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/data/artifacts/b16b46f93f83/qwen3-14b.png b/data/artifacts/b16b46f93f83/qwen3-14b.png
new file mode 100644
index 0000000..4bb0223
Binary files /dev/null and b/data/artifacts/b16b46f93f83/qwen3-14b.png differ
diff --git a/data/challenges.json b/data/challenges.json
index ade6329..c095c36 100644
--- a/data/challenges.json
+++ b/data/challenges.json
@@ -93116,47 +93116,51 @@
     "runs": [
       {
         "model": "qwen3-14b",
-        "status": "held",
+        "status": "done",
         "error": null,
-        "seconds": 0,
-        "cost": null,
-        "started_at": null,
-        "finished_at": null,
-        "queued_at": "2026-09-22T16:24:00.827Z",
-        "held_at": "2026-09-23T16:24:54.130Z"
+        "seconds": 183,
+        "cost": 0,
+        "started_at": "2026-09-23T16:40:45.252Z",
+        "finished_at": "2026-09-23T16:43:48.567Z",
+        "queued_at": "2026-09-23T16:40:44.999Z",
+        "held_at": "2026-09-23T16:24:54.130Z",
+        "bytes": 11985
       },
       {
         "model": "qwen25-7b",
-        "status": "held",
+        "status": "done",
         "error": null,
-        "seconds": 0,
-        "cost": null,
-        "started_at": null,
-        "finished_at": null,
-        "queued_at": "2026-09-22T16:24:00.841Z",
-        "held_at": "2026-09-23T16:24:54.260Z"
+        "seconds": 43,
+        "cost": 0,
+        "started_at": "2026-09-23T16:43:48.629Z",
+        "finished_at": "2026-09-23T16:44:31.478Z",
+        "queued_at": "2026-09-23T16:40:45.049Z",
+        "held_at": "2026-09-23T16:24:54.260Z",
+        "bytes": 6180
       },
       {
         "model": "mac1__minicpm-v-latest",
-        "status": "held",
+        "status": "done",
         "error": null,
-        "seconds": 0,
-        "cost": null,
-        "started_at": null,
-        "finished_at": null,
-        "queued_at": "2026-09-22T16:24:00.859Z",
-        "held_at": "2026-09-23T16:24:54.378Z"
+        "seconds": 13,
+        "cost": 0,
+        "started_at": "2026-09-23T16:44:31.674Z",
+        "finished_at": "2026-09-23T16:44:44.403Z",
+        "queued_at": "2026-09-23T16:40:45.102Z",
+        "held_at": "2026-09-23T16:24:54.378Z",
+        "bytes": 1732
       },
       {
         "model": "mac1__qwen2-5vl-7b",
-        "status": "held",
+        "status": "done",
         "error": null,
-        "seconds": 0,
-        "cost": null,
-        "started_at": null,
-        "finished_at": null,
-        "queued_at": "2026-09-22T16:24:00.871Z",
-        "held_at": "2026-09-23T16:24:54.497Z"
+        "seconds": 58,
+        "cost": 0,
+        "started_at": "2026-09-23T16:44:44.443Z",
+        "finished_at": "2026-09-23T16:45:42.082Z",
+        "queued_at": "2026-09-23T16:40:45.150Z",
+        "held_at": "2026-09-23T16:24:54.497Z",
+        "bytes": 5291
       }
     ]
   },
@@ -93171,13 +93175,15 @@
     "runs": [
       {
         "model": "qwen3-14b",
-        "status": "held",
+        "status": "done",
         "error": null,
-        "seconds": null,
-        "cost": null,
-        "started_at": null,
-        "finished_at": null,
-        "held_at": "2026-09-23T16:14:55.322Z"
+        "seconds": 49,
+        "cost": 0,
+        "started_at": "2026-09-23T16:45:42.118Z",
+        "finished_at": "2026-09-23T16:46:31.115Z",
+        "held_at": "2026-09-23T16:14:55.322Z",
+        "queued_at": "2026-09-23T16:40:45.201Z",
+        "bytes": 2208
       }
     ]
   }
diff --git a/scripts/keepalive-server.sh b/scripts/keepalive-server.sh
index 32c0ac8..f3ac3d7 100644
--- a/scripts/keepalive-server.sh
+++ b/scripts/keepalive-server.sh
@@ -16,5 +16,5 @@ cd /Users/macstudio3/Projects/model-arena || exit 1
 # (stable symlink dir, survives node version bumps) or exec node fails with exit 127.
 export PATH="/opt/homebrew/bin:$PATH"
 set -a; [ -f .env ] && . ./.env; set +a
-export ARENA_PAUSED=1
+# export ARENA_PAUSED=1
 exec node server.js
diff --git a/server.js b/server.js
index a931d2e..a8968ea 100644
--- a/server.js
+++ b/server.js
@@ -403,7 +403,7 @@ async function generateLocal(m, prompt) {
   return { text: r.json.message.content, cost: 0, tokens: { out: r.json.eval_count || 0 } };
 }
 
-// OpenAI-protocol local hosts (MLX :8000, exo :52415). Same 600s timeout + per-host
+// OpenAI-protocol local hosts (MLX :8000, exo :52415). Uses ARENA_LOCAL_TIMEOUT_MS timeout (default 300s, tunable) + per-host
 // serialization + stuck-run watchdog as generateLocal. Strips <think> blocks like the
 // qwen3 path (many MLX/exo reasoning builds emit them and would blow the HTML budget).
 async function generateOpenAILocal(m, prompt) {
@@ -737,7 +737,12 @@ function runModel(challenge, modelId) {
 // 'running'/'queued' far past its budget; the UI would poll it forever. Every
 // 30s, fail any run stuck well past its expected ceiling so it surfaces as an
 // honest error instead of an infinite spinner.
-const STUCK_RUNNING_MS = 660000; // local timeout is 600s; grace 60s
+// Watchdog for runs stuck past the local timeout budget. Note each attempt can fire up to 2 calls
+// (initial + "no HTML" re-ask), and a fallback runs a second attempt; so effective run time can be
+// up to ~2x ARENA_LOCAL_TIMEOUT_MS. Derived from the timeout so the two scale together and
+// ARENA_LOCAL_TIMEOUT_MS tuning works end-to-end for big models. Use * 4 if you want to survive
+// a full primary→fallback cycle with no re-asks.
+const STUCK_RUNNING_MS = ARENA_LOCAL_TIMEOUT_MS * 2 + 60000;
 const STUCK_QUEUED_MS = 2700000; // 45 min waiting to even start = host is dead (deep serialized queues after a boot resume can legitimately wait 20+ min)
 setInterval(() => {
   const now = Date.now();

← 1be068a Shorten arena local-run timeout 600s→300s so starved runs fa  ·  back to Model Arena  ·  auto-data-snapshot: 2026-09-23T10:03:20 (1 data files) — dat 3117191 →