← 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
A data/artifacts/076ac34be3a9/mac1__minicpm-v-latest.pngA data/artifacts/076ac34be3a9/mac1__qwen2-5vl-7b.pngA data/artifacts/74a9c3f65798/mac1__minicpm-v-latest.pngA data/artifacts/74a9c3f65798/mac1__qwen2-5vl-7b.pngA data/artifacts/768f69ba0e8d/qwen3-14b.htmlA data/artifacts/768f69ba0e8d/qwen3-14b.pngA data/artifacts/b16b46f93f83/mac1__minicpm-v-latest.htmlA data/artifacts/b16b46f93f83/mac1__minicpm-v-latest.pngA data/artifacts/b16b46f93f83/mac1__qwen2-5vl-7b.htmlA data/artifacts/b16b46f93f83/mac1__qwen2-5vl-7b.pngA data/artifacts/b16b46f93f83/qwen25-7b.htmlA data/artifacts/b16b46f93f83/qwen25-7b.pngA data/artifacts/b16b46f93f83/qwen3-14b.htmlA data/artifacts/b16b46f93f83/qwen3-14b.pngM data/challenges.jsonM scripts/keepalive-server.shM server.js
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 →