[object Object]

← back to Model Arena

auto-save: 2026-07-25T02:02:37 (10 files) — data/challenges.json data/artifacts/6eb0315c9845/hf-qwen-coder-32b.html data/artifacts/6eb0315c9845/hf-qwen-coder-32b.png data/artifacts/c135c54c4121/gemma3-12b.html data/artifacts/c135c54c4121/gemma3-12b.png

bc91cf6069641f75a4cbe96c6c825c67369a16db · 2026-07-25 02:02:51 -0700 · Steve Abrams

Files touched

Diff

commit bc91cf6069641f75a4cbe96c6c825c67369a16db
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Sat Jul 25 02:02:51 2026 -0700

    auto-save: 2026-07-25T02:02:37 (10 files) — data/challenges.json data/artifacts/6eb0315c9845/hf-qwen-coder-32b.html data/artifacts/6eb0315c9845/hf-qwen-coder-32b.png data/artifacts/c135c54c4121/gemma3-12b.html data/artifacts/c135c54c4121/gemma3-12b.png
---
 data/artifacts/6eb0315c9845/hf-qwen-coder-32b.html | 286 +++++++++++++++++++++
 data/artifacts/6eb0315c9845/hf-qwen-coder-32b.png  | Bin 0 -> 5959 bytes
 data/artifacts/c135c54c4121/gemma3-12b.html        | 250 ++++++++++++++++++
 data/artifacts/c135c54c4121/gemma3-12b.png         | Bin 0 -> 69448 bytes
 data/artifacts/c135c54c4121/hermes3-8b.html        | 213 +++++++++++++++
 data/artifacts/c135c54c4121/hermes3-8b.png         | Bin 0 -> 7371 bytes
 data/artifacts/c135c54c4121/hf-qwen-coder-32b.html | 213 +++++++++++++++
 data/artifacts/c135c54c4121/qwen3-14b.html         | 265 +++++++++++++++++++
 data/artifacts/c135c54c4121/qwen3-14b.png          | Bin 0 -> 18278 bytes
 data/challenges.json                               |  77 +++---
 10 files changed, 1271 insertions(+), 33 deletions(-)

diff --git a/data/artifacts/6eb0315c9845/hf-qwen-coder-32b.html b/data/artifacts/6eb0315c9845/hf-qwen-coder-32b.html
new file mode 100644
index 0000000..db762c7
--- /dev/null
+++ b/data/artifacts/6eb0315c9845/hf-qwen-coder-32b.html
@@ -0,0 +1,286 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<title>Swatch Memory</title>
+<style>
+  body {
+    margin: 0;
+    font-family: 'Raleway', sans-serif;
+    background-color: #faf7f2;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    height: 100vh;
+    overflow: hidden;
+  }
+  .game-container {
+    max-width: 700px;
+    width: 90%;
+    background-color: #faf7f2;
+    box-shadow: 0 8px 60px rgba(0,0,0,.12);
+    border-radius: 14px;
+    overflow: hidden;
+    position: relative;
+  }
+  .brand-header {
+    background-color: #1a1208;
+    color: #e8dcc8;
+    font-family: 'Playfair Display', serif;
+    letter-spacing: .18em;
+    font-size: 18px;
+    padding: 16px 24px;
+    position: relative;
+    text-align: center;
+  }
+  .brand-header::after {
+    content: '';
+    display: block;
+    width: 100%;
+    height: 1px;
+    background-color: rgba(232,220,200,.2);
+    margin-top: 8px;
+  }
+  .game-title {
+    font-family: 'Playfair Display', serif;
+    text-transform: uppercase;
+    letter-spacing: .2em;
+    font-size: 13px;
+    color: #1a1208;
+    text-align: center;
+    margin-top: 8px;
+  }
+  .hud {
+    display: flex;
+    justify-content: space-between;
+    padding: 16px 24px;
+    background-color: #faf7f2;
+    font-size: 13px;
+    letter-spacing: .2em;
+    text-transform: uppercase;
+  }
+  .card-grid {
+    display: grid;
+    grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
+    gap: 24px;
+    padding: 24px;
+  }
+  .card {
+    width: 100%;
+    height: 180px;
+    perspective: 1000px;
+    position: relative;
+  }
+  .card-inner {
+    width: 100%;
+    height: 100%;
+    position: absolute;
+    transform-style: preserve-3d;
+    transition: transform 0.6s cubic-bezier(.22,1,.36,1);
+  }
+  .card.flipped .card-inner {
+    transform: rotateY(180deg);
+  }
+  .card-front, .card-back {
+    width: 100%;
+    height: 100%;
+    backface-visibility: hidden;
+    border-radius: 14px;
+    position: absolute;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+  }
+  .card-front {
+    background-color: #faf7f2;
+    transform: rotateY(180deg);
+  }
+  .card-back {
+    background-color: #2c1f14;
+    background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50"><path d="M0,25 L50,25 M25,0 L25,50" stroke="#e8dcc8" stroke-width="1" opacity=".1"/></svg>');
+    background-size: cover;
+  }
+  .swatch {
+    width: 90%;
+    height: 90%;
+    border-radius: 14px;
+    background-size: cover;
+  }
+  .overlay {
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    background-color: rgba(28,18,8,.9);
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    flex-direction: column;
+    color: #e8dcc8;
+    font-family: 'Playfair Display', serif;
+    text-align: center;
+  }
+  .overlay h2 {
+    font-size: 24px;
+    margin-bottom: 16px;
+  }
+  .overlay button {
+    background-color: transparent;
+    border: 1px solid #e8dcc8;
+    color: #e8dcc8;
+    padding: 10px 20px;
+    font-size: 13px;
+    letter-spacing: .2em;
+    text-transform: uppercase;
+    cursor: pointer;
+    transition: background-color .3s, color .3s;
+  }
+  .overlay button:hover {
+    background-color: #e8dcc8;
+    color: #1a1208;
+  }
+</style>
+</head>
+<body>
+<div class="game-container">
+  <div class="brand-header">DESIGNER WALLCOVERINGS</div>
+  <div class="game-title">Swatch Memory</div>
+  <div class="hud">
+    <div>Moves: <span id="moves">0</span></div>
+    <div>Time: <span id="timer">00:00</span></div>
+    <button onclick="restartGame()">Restart</button>
+  </div>
+  <div class="card-grid" id="cardGrid">
+    <!-- Cards will be generated here -->
+  </div>
+  <div class="overlay" id="winOverlay" style="display:none;">
+    <h2>Congratulations!</h2>
+    <p>You've matched all the swatches!</p>
+    <button onclick="restartGame()">Play Again</button>
+  </div>
+</div>
+
+<script>
+const cardImages = [
+  'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><rect width="100%" height="100%" fill="#c65f38"/><line x1="0" y1="0" x2="100" y2="100" stroke="#e0a458" stroke-width="10"/><line x1="0" y1="100" x2="100" y2="0" stroke="#e0a458" stroke-width="10"/></svg>',
+  'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><rect width="100%" height="100%" fill="#2c1f14"/><line x1="0" y1="0" x2="100" y2="100" stroke="#e8dcc8" stroke-width="5"/><line x1="0" y1="100" x2="100" y2="0" stroke="#e8dcc8" stroke-width="5"/></svg>',
+  'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><rect width="100%" height="100%" fill="#b0472e"/><line x1="0" y1="0" x2="100" y2="100" stroke="#2f4c39" stroke-width="8"/></svg>',
+  'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><rect width="100%" height="100%" fill="#c9a961"/><line x1="0" y1="50" x2="100" y2="50" stroke="#7d6a45" stroke-width="8"/></svg>',
+  'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><rect width="100%" height="100%" fill="#7d6a45"/><line x1="50" y1="0" x2="50" y2="100" stroke="#c9a961" stroke-width="8"/></svg>',
+  'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><rect width="100%" height="100%" fill="#e8dcc8"/><line x1="0" y1="50" x2="100" y2="50" stroke="#2c1f14" stroke-width="8"/></svg>',
+  'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><rect width="100%" height="100%" fill="#faf7f2"/><line x1="50" y1="0" x2="50" y2="100" stroke="#2c1f14" stroke-width="8"/></svg>',
+  'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><rect width="100%" height="100%" fill="#e8dcc8"/><line x1="0" y1="50" x2="100" y2="50" stroke="#faf7f2" stroke-width="8"/></svg>'
+];
+const cards = cardImages.concat(cardImages);
+let selectedCards = [];
+let matchedPairs = 0;
+let moves = 0;
+let timerInterval;
+let timeElapsed = 0;
+
+function shuffle(array) {
+  for (let i = array.length - 1; i > 0; i--) {
+    const j = Math.floor(Math.random() * (i + 1));
+    [array[i], array[j]] = [array[j], array[i]];
+  }
+}
+
+function createCard(imageSrc) {
+  const cardElement = document.createElement('div');
+  cardElement.classList.add('card');
+  cardElement.addEventListener('click', () => flipCard(cardElement));
+
+  const cardInnerElement = document.createElement('div');
+  cardInnerElement.classList.add('card-inner');
+
+  const cardFrontElement = document.createElement('div');
+  cardFrontElement.classList.add('card-front');
+
+  const swatchElement = document.createElement('div');
+  swatchElement.classList.add('swatch');
+  swatchElement.style.backgroundImage = `url(${imageSrc})`;
+
+  cardFrontElement.appendChild(swatchElement);
+  cardInnerElement.appendChild(cardFrontElement);
+
+  const cardBackElement = document.createElement('div');
+  cardBackElement.classList.add('card-back');
+
+  cardInnerElement.appendChild(cardBackElement);
+  cardElement.appendChild(cardInnerElement);
+
+  return cardElement;
+}
+
+function flipCard(card) {
+  if (selectedCards.length < 2 && !card.classList.contains('flipped')) {
+    card.classList.add('flipped');
+    selectedCards.push(card);
+
+    moves++;
+    document.getElementById('moves').textContent = moves;
+
+    if (selectedCards.length === 2) {
+      checkForMatch();
+    }
+  }
+}
+
+function checkForMatch() {
+  const [card1, card2] = selectedCards;
+  const front1 = card1.querySelector('.swatch');
+  const front2 = card2.querySelector('.swatch');
+
+  if (front1.style.backgroundImage === front2.style.backgroundImage) {
+    matchedPairs++;
+    selectedCards = [];
+
+    if (matchedPairs === cards.length / 2) {
+      clearInterval(timerInterval);
+      document.getElementById('winOverlay').style.display = 'flex';
+    }
+  } else {
+    setTimeout(() => {
+      card1.classList.remove('flipped');
+      card2.classList.remove('flipped');
+      selectedCards = [];
+    }, 1000);
+  }
+}
+
+function startGame() {
+  shuffle(cards);
+  const grid = document.getElementById('cardGrid');
+  grid.innerHTML = '';
+  cards.forEach(imageSrc => {
+    const card = createCard(imageSrc);
+    grid.appendChild(card);
+  });
+
+  matchedPairs = 0;
+  moves = 0;
+  timeElapsed = 0;
+
+  document.getElementById('moves').textContent = moves;
+  document.getElementById('timer').textContent = '00:00';
+
+  clearInterval(timerInterval);
+  timerInterval = setInterval(() => {
+    timeElapsed++;
+    const minutes = String(Math.floor(timeElapsed / 60)).padStart(2, '0');
+    const seconds = String(timeElapsed % 60).padStart(2, '0');
+    document.getElementById('timer').textContent = `${minutes}:${seconds}`;
+  }, 1000);
+}
+
+function restartGame() {
+  document.getElementById('winOverlay').style.display = 'none';
+  startGame();
+}
+
+startGame();
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/data/artifacts/6eb0315c9845/hf-qwen-coder-32b.png b/data/artifacts/6eb0315c9845/hf-qwen-coder-32b.png
new file mode 100644
index 0000000..2f8b8ec
Binary files /dev/null and b/data/artifacts/6eb0315c9845/hf-qwen-coder-32b.png differ
diff --git a/data/artifacts/c135c54c4121/gemma3-12b.html b/data/artifacts/c135c54c4121/gemma3-12b.html
new file mode 100644
index 0000000..4a4fd46
--- /dev/null
+++ b/data/artifacts/c135c54c4121/gemma3-12b.html
@@ -0,0 +1,250 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<title>Fractal Tree</title>
+<style>
+*{margin:0;padding:0;box-sizing:border-box}
+body{overflow:hidden;background:#0a0a12;font-family:system-ui,sans-serif}
+canvas{display:block;width:100vw;height:100vh}
+.ui{position:fixed;bottom:24px;left:50%;transform:translateX(-50%);background:rgba(20,20,35,0.85);backdrop-filter:blur(12px);padding:14px 28px;border-radius:16px;border:1px solid rgba(255,255,255,0.08);display:flex;align-items:center;gap:16px;z-index:10;box-shadow:0 8px 32px rgba(0,0,0,0.4)}
+.ui label{color:#c8c8d8;font-size:13px;white-space:nowrap;letter-spacing:0.03em}
+.ui input[type=range]{width:160px;accent-color:#7cb87c;cursor:pointer}
+.ui span{color:#8fbc8f;font-size:13px;font-variant-numeric:tabular-nums;min-width:18px}
+</style>
+</head>
+<body onload="initialize()">
+<canvas id="c"></canvas>
+<div class="ui">
+<label for="depthSlider">Branch Depth</label>
+<input type="range" id="depthSlider" min="1" max="12" value="9" step="0.5">
+<span id="dval">9</span>
+</div>
+
+<script>
+const canvas = document.getElementById('c');
+const ctx = canvas.getContext('2d');
+const depthSlider = document.getElementById('depthSlider');
+const dval = document.getElementById('dval');
+
+let W, H;
+let maxDepth = 9;
+let time = 0;
+let growProgress = 0;
+let leaves = [];
+let falling = [];
+const SEASON_COLORS = [
+  ['#2d5a27','#3d7a37','#4a8f3f','#5ba84a'],
+  ['#c45c26','#d4763a','#e8a04a','#b84020','#8b4513','#cd853f'],
+  ['#e8e8f0','#d0d0e0','#c0c8d8','#a8b0c0'],
+  ['#3a7a30','#4a9a3a','#5cb84a','#2d6a28','#6bc45a']
+];
+let season = 0;
+let seasonTimer = 0;
+
+function initialize() {
+    resize();
+    depthSlider.addEventListener('input', function() {
+        maxDepth = parseInt(this.value);
+        dval.textContent = maxDepth;
+        growProgress = 0;
+        leaves.length = 0;
+        falling.length = 0;
+    });
+}
+
+
+function resize() {
+  W = canvas.width = window.innerWidth;
+  H = canvas.height = window.innerHeight;
+}
+
+window.addEventListener('resize', resize);
+
+
+
+function wind(y, t) {
+  return Math.sin(t * 0.7 + y * 0.008) * 0.12 + Math.sin(t * 1.3 + y * 0.015) * 0.06 + Math.sin(t * 0.3) * 0.04;
+}
+
+function drawBranch(x, y, len, angle, depth, t) {
+  if (depth > maxDepth || len < 2) return;
+
+  growProgress = Math.min(1.5, growProgress + 0.006);
+  const grow = Math.min(1, Math.max(0, (growProgress - depth * 0.08) / 0.5));
+  if (grow <= 0) return;
+
+  const w = wind(y, t) * (1 + depth * 0.15);
+  const a = angle + w;
+  const el = len * grow;
+  const x2 = x + Math.sin(a) * el;
+  const y2 = y - Math.cos(a) * el;
+
+  const trunk = depth === 0;
+  const lw = Math.max(0.5, (maxDepth - depth + 1) * 1.6 * grow);
+  const tcol = Math.floor(40 + depth * 8);
+  ctx.beginPath();
+  ctx.moveTo(x, y);
+  ctx.lineTo(x2, y2);
+  ctx.strokeStyle = trunk ? `rgb(${90 + tcol * 0.3},${60 + tcol * 0.2},${30})` : `rgb(${70 + tcol},${50 + tcol * 0.6},${25 + depth * 2})`;
+  ctx.lineWidth = lw;
+  ctx.lineCap = 'round';
+  ctx.stroke();
+
+  if (depth >= maxDepth - 3 && grow > 0.7) {
+    const cols = SEASON_COLORS[season % 4];
+    const n = depth === maxDepth ? 3 : 1;
+    for (let i = 0; i < n; i++) {
+      const lx = x2 + (Math.random() - 0.5) * 8;
+      const ly = y2 + (Math.random() - 0.5) * 8;
+      const col = cols[Math.floor(Math.random() * cols.length)];
+      const r = 2 + Math.random() * 3;
+      leaves.push({ x: lx, y: ly, r: r, col: col, ox: lx, oy: ly, phase: Math.random() * Math.PI * 2, depth: depth });
+
+      if (leaves.length > 800) leaves.shift();
+    }
+  }
+
+  const shrink = 0.68 + Math.sin(depth + t * 0.1) * 0.04;
+  const spread = 0.45 + Math.sin(depth * 1.3) * 0.08;
+  drawBranch(x2, y2, len * shrink, a - spread, depth + 1, t);
+  drawBranch(x2, y2, len * shrink, a + spread, depth + 1, t);
+
+  if (depth > 2 && depth < maxDepth - 1 && Math.sin(depth * 7.3) > 0.3) {
+    drawBranch(x2, y2, len * shrink * 0.75, a + spread * 0.3 * (depth % 2 ? 1 : -1), depth + 1, t);
+  }
+}
+
+function spawnFalling() {
+  if (leaves.length === 0) return;
+  if (Math.random() > 0.2) return; // Reduced frequency of falling leaves
+
+
+  const src = leaves[Math.floor(Math.random() * leaves.length)];
+  const cols = SEASON_COLORS[season % 4];
+  falling.push({
+    x: src.x, y: src.y,
+    vx: (Math.random() - 0.5) * 1.2,
+    vy: 0.3 + Math.random() * 0.6,
+    r: src.r * (0.7 + Math.random() * 0.5),
+    col: cols[Math.floor(Math.random() * cols.length)],
+    rot: Math.random() * Math.PI * 2,
+    rv: (Math.random() - 0.5) * 0.08,
+    life: 1
+  });
+
+  if (falling.length > 300) falling.shift(); // Limit the number of falling leaves
+}
+
+function updateFalling(t) {
+  for (let i = falling.length - 1; i >= 0; i--) {
+    const p = falling[i];
+    const w = wind(p.y, t) * 40;
+    p.vx += w * 0.02;
+    p.vx *= 0.98;
+    p.vy += 0.015;
+    p.x += p.vx + Math.sin(t * 2 + p.rot) * 0.4;
+    p.y += p.vy;
+    p.rot += p.rv;
+    p.life -= 0.002;
+    if (p.y > H + 20 || p.life <= 0) falling.splice(i, 1);
+  }
+}
+
+function drawLeaves(t) {
+   for (const l of leaves) {
+    const w = wind(l.y, t);
+    const sx = l.ox + Math.sin(t * 1.5 + l.phase) * 3 + w * 20;
+    const sy = l.oy + Math.cos(t * 1.2 + l.phase) * 2;
+    l.x = sx;
+    l.y = sy;
+
+    ctx.beginPath();
+    ctx.arc(sx, sy, l.r, 0, Math.PI * 2);
+    ctx.fillStyle = l.col;
+    ctx.globalAlpha = Math.min(1, (1-Math.abs(t%1)-0.5)*0.75) ;  //Dynamic alpha based on time
+    ctx.fill();
+  }
+  ctx.globalAlpha = 1;
+}
+
+function drawFalling() {
+   for (const p of falling) {
+    ctx.save();
+    ctx.translate(p.x, p.y);
+    ctx.rotate(p.rot);
+    ctx.globalAlpha = Math.min(1, p.life) * 0.85;
+    ctx.fillStyle = p.col;
+
+    ctx.beginPath();
+    ctx.ellipse(0, 0, p.r, p.r * 0.6, 0, 0, Math.PI * 2);
+    ctx.fill();
+
+    ctx.restore();
+  }
+  ctx.globalAlpha = 1;
+}
+
+
+function drawGround() {
+  const grd = ctx.createLinearGradient(0, H * 0.85, 0, H);
+  grd.addColorStop(0, 'rgba(20,40,20,0)');
+  grd.addColorStop(0.3, 'rgba(25,50,25,0.4)');
+  grd.addColorStop(1, 'rgba(15,35,15,0.7)');
+  ctx.fillStyle = grd;
+  ctx.fillRect(0, H * 0.85, W, H * 0.15);
+}
+
+function drawSky() {
+    const grd = ctx.createLinearGradient(0, 0, 0, H);
+    const s = season % 4;
+    if (s === 0) {
+        grd.addColorStop(0, '#0c1a10');
+        grd.addColorStop(1, '#1a2a18');
+    } else if (s === 1) {
+        grd.addColorStop(0, '#1a1008');
+        grd.addColorStop(1, '#2a1a10');
+    } else if (s === 2) {
+        grd.addColorStop(0, '#0a0e18');
+        grd.addColorStop(1, '#121828');
+    } else {
+        grd.addColorStop(0, '#0a1810');
+        grd.addColorStop(1, '#142818');
+    }
+    ctx.fillStyle = grd;
+    ctx.fillRect(0, 0, W, H);
+}
+
+function frame(ts) {
+  time = ts * 0.001;
+  growProgress = Math.min(1.5, growProgress + 0.006);
+  seasonTimer += 0.001;
+  if (seasonTimer > 12) {
+    seasonTimer = 0;
+    season++;
+    leaves.length = 0;
+  }
+
+  drawSky();
+  drawGround();
+
+  const baseX = W / 2;
+  const baseY = H * 0.88;
+  const trunkLen = Math.min(W, H) * 0.18;
+
+  leaves.length = 0;
+  drawBranch(baseX, baseY, trunkLen, 0, 0, time);
+  drawLeaves(time);
+
+  spawnFalling();
+  updateFalling(time);
+  drawFalling();
+
+  requestAnimationFrame(frame);
+}
+
+requestAnimationFrame(frame);
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/data/artifacts/c135c54c4121/gemma3-12b.png b/data/artifacts/c135c54c4121/gemma3-12b.png
new file mode 100644
index 0000000..6171f6b
Binary files /dev/null and b/data/artifacts/c135c54c4121/gemma3-12b.png differ
diff --git a/data/artifacts/c135c54c4121/hermes3-8b.html b/data/artifacts/c135c54c4121/hermes3-8b.html
new file mode 100644
index 0000000..e2d23a6
--- /dev/null
+++ b/data/artifacts/c135c54c4121/hermes3-8b.html
@@ -0,0 +1,213 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<title>Fractal Tree</title>
+<style>
+*{margin:0;padding:0;box-sizing:border-box}
+body{overflow:hidden;background:#0a0a12;font-family:system-ui,sans-serif}
+canvas{display:block;width:100vw;height:100vh}
+.ui{position:fixed;bottom:24px;left:50%;transform:translateX(-50%);background:rgba(20,20,35,0.85);backdrop-filter:blur(12px);padding:14px 28px;border-radius:16px;border:1px solid rgba(255,255,255,0.08);display:flex;align-items:center;gap:16px;z-index:10;box-shadow:0 8px 32px rgba(0,0,0,0.4)}
+.ui label{color:#c8c8d8;font-size:13px;white-space:nowrap;letter-spacing:0.03em}
+.ui input[type=range]{width:160px;accent-color:#7cb87c;cursor:pointer}
+.ui span{color:#8fbc8f;font-size:13px;font-variant-numeric:tabular-nums;min-width:18px}
+</style>
+</head>
+<body>
+<canvas id="c"></canvas>
+<div class="ui">
+<label>Branch Depth</label>
+<input type="range" id="depth" min="1" max="12" value="9" step="1">
+<span id="dval">9</span>
+</div>
+<script>
+const canvas=document.getElementById('c');
+const ctx=canvas.getContext('2d');
+const depthSlider=document.getElementById('depth');
+const dval=document.getElementById('dval');
+
+let W,H,maxDepth=9,time=0,growProgress=0;
+const leaves=[];
+const falling=[];
+const SEASON_COLORS=[
+  ['#2d5a27','#3d7a37','#4a8f3f','#5ba84a'],
+  ['#c45c26','#d4763a','#e8a04a','#b84020','#8b4513','#cd853f'],
+  ['#e8e8f0','#d0d0e0','#c0c8d8','#a8b0c0'],
+  ['#3a7a30','#4a9a3a','#5cb84a','#2d6a28','#6bc45a']
+];
+let season=0;
+let seasonTimer=0;
+
+function resize(){
+  W=canvas.width=window.innerWidth;
+  H=canvas.height=window.innerHeight;
+}
+window.addEventListener('resize',resize);
+resize();
+
+depthSlider.addEventListener('input',()=>{
+  maxDepth=+depthSlider.value;
+  dval.textContent=maxDepth;
+  growProgress=0;
+  leaves.length=0;
+  falling.length=0;
+});
+
+function wind(y,t){
+  return Math.sin(t*0.7+y*0.008)*0.12+Math.sin(t*1.3+y*0.015)*0.06+Math.sin(t*0.3)*0.04;
+}
+
+function drawBranch(x,y,len,angle,depth,t){
+  if(depth>maxDepth||len<2)return;
+  const grow=Math.min(1,Math.max(0,(growProgress-depth*0.08)/(0.5)));
+  if(grow<=0)return;
+  const w=wind(y,t)*(1+depth*0.15);
+  const a=angle+w;
+  const el=len*grow;
+  const x2=x+Math.sin(a)*el;
+  const y2=y-Math.cos(a)*el;
+
+  const trunk=depth===0;
+  const lw=Math.max(0.5, (maxDepth-depth+1)*1.6*grow);
+  const tcol=Math.floor(40+depth*8);
+  ctx.beginPath();
+  ctx.moveTo(x,y);
+  ctx.lineTo(x2,y2);
+  ctx.strokeStyle=trunk?`rgb(${90+tcol*0.3},${60+tcol*0.2},${30})`:`rgb(${70+tcol},${50+tcol*0.6},${25+depth*2})`;
+  ctx.lineWidth=lw;
+  ctx.lineCap='round';
+  ctx.stroke();
+
+  if(depth>=maxDepth-3&&grow>0.7){
+    const cols=SEASON_COLORS[season%4];
+    const n=depth===maxDepth?3:1;
+    for(let i=0;i<n;i++){
+      const lx=x2+(Math.random()-0.5)*8;
+      const ly=y2+(Math.random()-0.5)*8;
+      const col=cols[Math.floor(Math.random()*cols.length)];
+      const r=2+Math.random()*3;
+      leaves.push({x:lx,y:ly,r,col,ox:lx,oy:ly,phase:Math.random()*Math.PI*2,depth});
+      if(leaves.length>800)leaves.shift();
+    }
+  }
+
+  const shrink=0.68+Math.sin(depth+t*0.1)*0.04;
+  const spread=0.45+Math.sin(depth*1.3)*0.08;
+  drawBranch(x2,y2,len*shrink,a-spread,depth+1,t);
+  drawBranch(x2,y2,len*shrink,a+spread,depth+1,t);
+  if(depth>2&&depth<maxDepth-1&&Math.sin(depth*7.3)>0.3){
+    drawBranch(x2,y2,len*shrink*0.75,a+spread*0.3*(depth%2?1:-1),depth+1,t);
+  }
+}
+
+function spawnFalling(){
+  if(leaves.length===0)return;
+  if(Math.random()>0.15)return;
+  const src=leaves[Math.floor(Math.random()*leaves.length)];
+  const cols=SEASON_COLORS[season%4];
+  falling.push({
+    x:src.x,y:src.y,
+    vx:(Math.random()-0.5)*1.2,
+    vy:0.3+Math.random()*0.6,
+    r:src.r*(0.7+Math.random()*0.5),
+    col:cols[Math.floor(Math.random()*cols.length)],
+    rot:Math.random()*Math.PI*2,
+    rv:(Math.random()-0.5)*0.08,
+    life:1
+  });
+  if(falling.length>300)falling.shift();
+}
+
+function updateFalling(t){
+  for(let i=falling.length-1;i>=0;i--){
+    const p=falling[i];
+    const w=wind(p.y,t)*40;
+    p.vx+=w*0.02;
+    p.vx*=0.98;
+    p.vy+=0.015;
+    p.x+=p.vx+Math.sin(t*2+p.rot)*0.4;
+    p.y+=p.vy;
+    p.rot+=p.rv;
+    p.life-=0.002;
+    if(p.y>H+20||p.life<=0)falling.splice(i,1);
+  }
+}
+
+function drawLeaves(t){
+  for(const l of leaves){
+    const w=wind(l.y,t);
+    const sx=l.ox+Math.sin(t*1.5+l.phase)*3+w*20;
+    const sy=l.oy+Math.cos(t*1.2+l.phase)*2;
+    l.x=sx;l.y=sy;
+    ctx.beginPath();
+    ctx.arc(sx,sy,l.r,0,Math.PI*2);
+    ctx.fillStyle=l.col;
+    ctx.globalAlpha=0.75;
+    ctx.fill();
+  }
+  ctx.globalAlpha=1;
+}
+
+function drawFalling(){
+  for(const p of falling){
+    ctx.save();
+    ctx.translate(p.x,p.y);
+    ctx.rotate(p.rot);
+    ctx.globalAlpha=Math.min(1,p.life)*0.85;
+    ctx.fillStyle=p.col;
+    ctx.beginPath();
+    ctx.ellipse(0,0,p.r,p.r*0.6,0,0,Math.PI*2);
+    ctx.fill();
+    ctx.restore();
+  }
+  ctx.globalAlpha=1;
+}
+
+function drawGround(){
+  const grd=ctx.createLinearGradient(0,H*0.85,0,H);
+  grd.addColorStop(0,'rgba(20,40,20,0)');
+  grd.addColorStop(0.3,'rgba(25,50,25,0.4)');
+  grd.addColorStop(1,'rgba(15,35,15,0.7)');
+  ctx.fillStyle=grd;
+  ctx.fillRect(0,H*0.85,W,H*0.15);
+}
+
+function drawSky(){
+  const grd=ctx.createLinearGradient(0,0,0,H);
+  const s=season%4;
+  if(s===0){grd.addColorStop(0,'#0c1a10');grd.addColorStop(1,'#1a2a18');}
+  else if(s===1){grd.addColorStop(0,'#1a1008');grd.addColorStop(1,'#2a1a10');}
+  else if(s===2){grd.addColorStop(0:'#0a0e18');grd.addColorStop(1:'#121828');}
+  else{grd.addColorStop(0,'#0a1810');grd.addColorStop(1,'#142818');}
+  ctx.fillStyle=grd;
+  ctx.fillRect(0,0,W,H);
+}
+
+function frame(ts){
+  time=ts*0.001;
+  growProgress=Math.min(1.5,growProgress+0.006);
+  seasonTimer+=0.001;
+  if(seasonTimer>12){seasonTimer=0;season++;leaves.length=0;}
+
+  drawSky();
+  drawGround();
+
+  const baseX=W/2;
+  const baseY=H*0.88;
+  const trunkLen=Math.min(W,H)*0.18;
+
+  leaves.length=0;
+  drawBranch(baseX,baseY,trunkLen,0,0,time);
+  drawLeaves(time);
+
+  spawnFalling();
+  updateFalling(time);
+  drawFalling();
+
+  requestAnimationFrame(frame);
+}
+requestAnimationFrame(frame);
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/data/artifacts/c135c54c4121/hermes3-8b.png b/data/artifacts/c135c54c4121/hermes3-8b.png
new file mode 100644
index 0000000..caff64d
Binary files /dev/null and b/data/artifacts/c135c54c4121/hermes3-8b.png differ
diff --git a/data/artifacts/c135c54c4121/hf-qwen-coder-32b.html b/data/artifacts/c135c54c4121/hf-qwen-coder-32b.html
new file mode 100644
index 0000000..c8fe628
--- /dev/null
+++ b/data/artifacts/c135c54c4121/hf-qwen-coder-32b.html
@@ -0,0 +1,213 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<title>Fractal Tree</title>
+<style>
+*{margin:0;padding:0;box-sizing:border-box}
+body{overflow:hidden;background:#0a0a12;font-family:system-ui,sans-serif}
+canvas{display:block;width:100vw;height:100vh}
+.ui{position:fixed;bottom:24px;left:50%;transform:translateX(-50%);background:rgba(20,20,35,0.85);backdrop-filter:blur(12px);padding:14px 28px;border-radius:16px;border:1px solid rgba(255,255,255,0.08);display:flex;align-items:center;gap:16px;z-index:10;box-shadow:0 8px 32px rgba(0,0,0,0.4)}
+.ui label{color:#c8c8d8;font-size:13px;white-space:nowrap;letter-spacing:0.03em}
+.ui input[type=range]{width:160px;accent-color:#7cb87c;cursor:pointer}
+.ui span{color:#8fbc8f;font-size:13px;font-variant-numeric:tabular-nums;min-width:18px}
+</style>
+</head>
+<body>
+<canvas id="c"></canvas>
+<div class="ui">
+<label>Branch Depth</label>
+<input type="range" id="depth" min="1" max="12" value="9" step="1">
+<span id="dval">9</span>
+</div>
+<script>
+const canvas=document.getElementById('c');
+const ctx=canvas.getContext('2d');
+const depthSlider=document.getElementById('depth');
+const dval=document.getElementById('dval');
+
+let W,H,maxDepth=9,time=0,growProgress=0;
+const leaves=[];
+const falling=[];
+const SEASON_COLORS=[
+  ['#2d5a27','#3d7a37','#4a8f3f','#5ba84a'],
+  ['#c45c26','#d4763a','#e8a04a','#b84020','#8b4513','#cd853f'],
+  ['#e8e8f0','#d0d0e0','#c0c8d8','#a8b0c0'],
+  ['#3a7a30','#4a9a3a','#5cb84a','#2d6a28','#6bc45a']
+];
+let season=0;
+let seasonTimer=0;
+
+function resize(){
+  W=canvas.width=window.innerWidth;
+  H=canvas.height=window.innerHeight;
+}
+window.addEventListener('resize',resize);
+resize();
+
+depthSlider.addEventListener('input',()=>{
+  maxDepth=+depthSlider.value;
+  dval.textContent=maxDepth;
+  growProgress=0;
+  leaves.length=0;
+  falling.length=0;
+});
+
+function wind(y,t){
+  return Math.sin(t*0.7+y*0.008)*0.12+Math.sin(t*1.3+y*0.015)*0.06+Math.sin(t*0.3)*0.04;
+}
+
+function drawBranch(x,y,len,angle,depth,t){
+  if(depth>maxDepth||len<2)return;
+  const grow=Math.min(1,Math.max(0,(growProgress-depth*0.08)/(0.5)));
+  if(grow<=0)return;
+  const w=wind(y,t)*(1+depth*0.15);
+  const a=angle+w;
+  const el=len*grow;
+  const x2=x+Math.sin(a)*el;
+  const y2=y-Math.cos(a)*el;
+
+  const trunk=depth===0;
+  const lw=Math.max(0.5, (maxDepth-depth+1)*1.6*grow);
+  const tcol=Math.floor(40+depth*8);
+  ctx.beginPath();
+  ctx.moveTo(x,y);
+  ctx.lineTo(x2,y2);
+  ctx.strokeStyle=trunk?`rgb(${90+tcol*0.3},${60+tcol*0.2},${30})`:`rgb(${70+tcol},${50+tcol*0.6},${25+depth*2})`;
+  ctx.lineWidth=lw;
+  ctx.lineCap='round';
+  ctx.stroke();
+
+  if(depth>=maxDepth-3&&grow>0.7){
+    const cols=SEASON_COLORS[season%4];
+    const n=depth===maxDepth?3:1;
+    for(let i=0;i<n;i++){
+      const lx=x2+(Math.random()-0.5)*8;
+      const ly=y2+(Math.random()-0.5)*8;
+      const col=cols[Math.floor(Math.random()*cols.length)];
+      const r=2+Math.random()*3;
+      leaves.push({x:lx,y:ly,r,col,ox:lx,oy:ly,phase:Math.random()*Math.PI*2,depth});
+      if(leaves.length>800)leaves.shift();
+    }
+  }
+
+  const shrink=0.68+Math.sin(depth+t*0.1)*0.04;
+  const spread=0.45+Math.sin(depth*1.3)*0.08;
+  drawBranch(x2,y2,len*shrink,a-spread,depth+1,t);
+  drawBranch(x2,y2,len*shrink,a+spread,depth+1,t);
+  if(depth>2&&depth<maxDepth-1&&Math.sin(depth*7.3)>0.3){
+    drawBranch(x2,y2,len*shrink*0.75,a+spread*0.3*(depth%2?1:-1),depth+1,t);
+  }
+}
+
+function spawnFalling(){
+  if(leaves.length===0)return;
+  if(Math.random()>0.15)return;
+  const src=leaves[Math.floor(Math.random()*leaves.length)];
+  const cols=SEASON_COLORS[season%4];
+  falling.push({
+    x:src.x,y:src.y,
+    vx:(Math.random()-0.5)*1.2,
+    vy:0.3+Math.random()*0.6,
+    r:src.r*(0.7+Math.random()*0.5),
+    col:cols[Math.floor(Math.random()*cols.length)],
+    rot:Math.random()*Math.PI*2,
+    rv:(Math.random()-0.5)*0.08,
+    life:1
+  });
+  if(falling.length>300)falling.shift();
+}
+
+function updateFalling(t){
+  for(let i=falling.length-1;i>=0;i--){
+    const p=falling[i];
+    const w=wind(p.y,t)*40;
+    p.vx+=w*0.02;
+    p.vx*=0.98;
+    p.vy+=0.015;
+    p.x+=p.vx+Math.sin(t*2+p.rot)*0.4;
+    p.y+=p.vy;
+    p.rot+=p.rv;
+    p.life-=0.002;
+    if(p.y>H+20||p.life<=0)falling.splice(i,1);
+  }
+}
+
+function drawLeaves(t){
+  for(const l of leaves){
+    const w=wind(l.y,t);
+    const sx=l.ox+Math.sin(t*1.5+l.phase)*3+w*20;
+    const sy=l.oy+Math.cos(t*1.2+l.phase)*2;
+    l.x=sx;l.y=sy;
+    ctx.beginPath();
+    ctx.arc(sx,sy,l.r,0,Math.PI*2);
+    ctx.fillStyle=l.col;
+    ctx.globalAlpha=0.75;
+    ctx.fill();
+  }
+  ctx.globalAlpha=1;
+}
+
+function drawFalling(){
+  for(const p of falling){
+    ctx.save();
+    ctx.translate(p.x,p.y);
+    ctx.rotate(p.rot);
+    ctx.globalAlpha=Math.min(1,p.life)*0.85;
+    ctx.fillStyle=p.col;
+    ctx.beginPath();
+    ctx.ellipse(0,0,p.r,p.r*0.6,0,0,Math.PI*2);
+    ctx.fill();
+    ctx.restore();
+  }
+  ctx.globalAlpha=1;
+}
+
+function drawGround(){
+  const grd=ctx.createLinearGradient(0,H*0.85,0,H);
+  grd.addColorStop(0,'rgba(20,40,20,0)');
+  grd.addColorStop(0.3,'rgba(25,50,25,0.4)');
+  grd.addColorStop(1,'rgba(15,35,15,0.7)');
+  ctx.fillStyle=grd;
+  ctx.fillRect(0,H*0.85,W,H*0.15);
+}
+
+function drawSky(){
+  const grd=ctx.createLinearGradient(0,0,0,H);
+  const s=season%4;
+  if(s===0){grd.addColorStop(0,'#0c1a10');grd.addColorStop(1,'#1a2a18');}
+  else if(s===1){grd.addColorStop(0,'#1a1008');grd.addColorStop(1,'#2a1a10');}
+  else if(s===2){grd.addColorStop(0,'#0a0e18');grd.addColorStop(1,'#121828');}
+  else{grd.addColorStop(0,'#0a1810');grd.addColorStop(1,'#142818');}
+  ctx.fillStyle=grd;
+  ctx.fillRect(0,0,W,H);
+}
+
+function frame(ts){
+  time=ts*0.001;
+  growProgress=Math.min(1.5,growProgress+0.006);
+  seasonTimer+=0.001;
+  if(seasonTimer>12){seasonTimer=0;season++;leaves.length=0;}
+
+  drawSky();
+  drawGround();
+
+  const baseX=W/2;
+  const baseY=H*0.88;
+  const trunkLen=Math.min(W,H)*0.18;
+
+  leaves.length=0;
+  drawBranch(baseX,baseY,trunkLen,0,0,time);
+  drawLeaves(time);
+
+  spawnFalling();
+  updateFalling(time);
+  drawFalling();
+
+  requestAnimationFrame(frame);
+}
+requestAnimationFrame(frame);
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/data/artifacts/c135c54c4121/qwen3-14b.html b/data/artifacts/c135c54c4121/qwen3-14b.html
new file mode 100644
index 0000000..323f644
--- /dev/null
+++ b/data/artifacts/c135c54c4121/qwen3-14b.html
@@ -0,0 +1,265 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<title>Fractal Tree</title>
+<style>
+* { margin: 0; padding: 0; box-sizing: border-box; }
+body {
+  overflow: hidden;
+  background: #0a0a12;
+  font-family: system-ui, sans-serif;
+}
+canvas {
+  display: block;
+  width: 100vw;
+  height: 100vh;
+}
+.ui {
+  position: fixed;
+  bottom: 24px;
+  left: 50%;
+  transform: translateX(-50%);
+  background: rgba(20,20,35,0.85);
+  backdrop-filter: blur(12px);
+  padding: 14px 28px;
+  border-radius: 16px;
+  border: 1px solid rgba(255,255,255,0.08);
+  display: flex;
+  align-items: center;
+  gap: 16px;
+  z-index: 10;
+  box-shadow: 0 8px 32px rgba(0,0,0,0.4);
+}
+.ui label {
+  color: #c8c8d8;
+  font-size: 13px;
+  white-space: nowrap;
+  letter-spacing: 0.03em;
+}
+.ui input[type=range] {
+  width: 160px;
+  accent-color: #7cb87c;
+  cursor: pointer;
+}
+.ui span {
+  color: #8fbc8f;
+  font-size: 13px;
+  font-variant-numeric: tabular-nums;
+  min-width: 18px;
+}
+</style>
+</head>
+<body>
+<canvas id="c"></canvas>
+<div class="ui">
+  <label>Branch Depth</label>
+  <input type="range" id="depth" min="1" max="12" value="9" step="1">
+  <span id="dval">9</span>
+</div>
+<script>
+const canvas = document.getElementById('c');
+const ctx = canvas.getContext('2d');
+const depthSlider = document.getElementById('depth');
+const dval = document.getElementById('dval');
+
+let W, H, maxDepth = 9, time = 0, growProgress = 0;
+const leaves = [];
+const falling = [];
+const SEASON_COLORS = [
+  ['#2d5a27', '#3d7a37', '#4a8f3f', '#5ba84a'],
+  ['#c45c26', '#d4763a', '#e8a04a', '#b84020', '#8b4513', '#cd853f'],
+  ['#e8e8f0', '#d0d0e0', '#c0c8d8', '#a8b0c0'],
+  ['#3a7a30', '#4a9a3a', '#5cb84a', '#2d6a28', '#6bc45a']
+];
+let season = 0;
+let seasonTimer = 0;
+
+function resize() {
+  W = canvas.width = window.innerWidth;
+  H = canvas.height = window.innerHeight;
+}
+window.addEventListener('resize', resize);
+resize();
+
+depthSlider.addEventListener('input', () => {
+  maxDepth = +depthSlider.value;
+  dval.textContent = maxDepth;
+  growProgress = 0;
+  leaves.length = 0;
+  falling.length = 0;
+});
+
+function wind(y, t) {
+  return Math.sin(t * 0.7 + y * 0.008) * 0.12 + Math.sin(t * 1.3 + y * 0.015) * 0.06 + Math.sin(t * 0.3) * 0.04;
+}
+
+function drawBranch(x, y, len, angle, depth, t) {
+  if (depth > maxDepth || len < 2) return;
+  const grow = Math.min(1, Math.max(0, (growProgress - depth * 0.08) / 0.5));
+  if (grow <= 0) return;
+  const w = wind(y, t) * (1 + depth * 0.15);
+  const a = angle + w;
+  const el = len * grow;
+  const x2 = x + Math.sin(a) * el;
+  const y2 = y - Math.cos(a) * el;
+
+  const trunk = depth === 0;
+  const lw = Math.max(0.5, (maxDepth - depth + 1) * 1.6 * grow);
+  const tcol = Math.floor(40 + depth * 8);
+  ctx.beginPath();
+  ctx.moveTo(x, y);
+  ctx.lineTo(x2, y2);
+  ctx.strokeStyle = trunk ? `rgb(${90 + tcol * 0.3}, ${60 + tcol * 0.2}, ${30})` : `rgb(${70 + tcol}, ${50 + tcol * 0.6}, ${25 + depth * 2})`;
+  ctx.lineWidth = lw;
+  ctx.lineCap = 'round';
+  ctx.stroke();
+
+  if (depth >= maxDepth - 3 && grow > 0.7) {
+    const cols = SEASON_COLORS[season % 4];
+    const n = depth === maxDepth ? 3 : 1;
+    for (let i = 0; i < n; i++) {
+      const lx = x2 + (Math.random() - 0.5) * 8;
+      const ly = y2 + (Math.random() - 0.5) * 8;
+      const col = cols[Math.floor(Math.random() * cols.length)];
+      const r = 2 + Math.random() * 3;
+      leaves.push({ x: lx, y: ly, r: r, col: col, ox: lx, oy: ly, phase: Math.random() * Math.PI * 2, depth });
+      if (leaves.length > 800) leaves.shift();
+    }
+  }
+
+  const shrink = 0.68 + Math.sin(depth + t * 0.1) * 0.04;
+  const spread = 0.45 + Math.sin(depth * 1.3) * 0.08;
+  drawBranch(x2, y2, len * shrink, a - spread, depth + 1, t);
+  drawBranch(x2, y2, len * shrink, a + spread, depth + 1, t);
+  if (depth > 2 && depth < maxDepth - 1 && Math.sin(depth * 7.3) > 0.3) {
+    drawBranch(x2, y2, len * shrink * 0.75, a + spread * 0.3 * (depth % 2 ? 1 : -1), depth + 1, t);
+  }
+}
+
+function spawnFalling() {
+  if (leaves.length === 0) return;
+  if (Math.random() > 0.12) return;
+  const src = leaves[Math.floor(Math.random() * leaves.length)];
+  const cols = SEASON_COLORS[season % 4];
+  falling.push({
+    x: src.x,
+    y: src.y,
+    vx: (Math.random() - 0.5) * 1.2,
+    vy: 0.3 + Math.random() * 0.6,
+    r: src.r * (0.7 + Math.random() * 0.5),
+    col: cols[Math.floor(Math.random() * cols.length)],
+    rot: Math.random() * Math.PI * 2,
+    rv: (Math.random() - 0.5) * 0.08,
+    life: 1
+  });
+  if (falling.length > 300) falling.shift();
+}
+
+function updateFalling(t) {
+  for (let i = falling.length - 1; i >= 0; i--) {
+    const p = falling[i];
+    const w = wind(p.y, t) * 40;
+    p.vx += w * 0.02;
+    p.vx *= 0.98;
+    p.vy += 0.015;
+    p.x += p.vx + Math.sin(t * 2 + p.rot) * 0.4;
+    p.y += p.vy;
+    p.rot += p.rv;
+    p.life -= 0.002;
+    if (p.y > H + 20 || p.life <= 0) falling.splice(i, 1);
+  }
+}
+
+function drawLeaves(t) {
+  for (const l of leaves) {
+    const w = wind(l.y, t);
+    const sx = l.ox + Math.sin(t * 1.5 + l.phase) * 3 + w * 20;
+    const sy = l.oy + Math.cos(t * 1.2 + l.phase) * 2;
+    l.x = sx;
+    l.y = sy;
+    ctx.beginPath();
+    ctx.arc(sx, sy, l.r, 0, Math.PI * 2);
+    ctx.fillStyle = l.col;
+    ctx.globalAlpha = 0.7;
+    ctx.fill();
+  }
+  ctx.globalAlpha = 1;
+}
+
+function drawFalling() {
+  for (const p of falling) {
+    ctx.save();
+    ctx.translate(p.x, p.y);
+    ctx.rotate(p.rot);
+    ctx.globalAlpha = Math.min(1, p.life) * 0.8;
+    ctx.fillStyle = p.col;
+    ctx.beginPath();
+    ctx.ellipse(0, 0, p.r, p.r * 0.6, 0, 0, Math.PI * 2);
+    ctx.fill();
+    ctx.restore();
+  }
+  ctx.globalAlpha = 1;
+}
+
+function drawGround() {
+  const grd = ctx.createLinearGradient(0, H * 0.85, 0, H);
+  grd.addColorStop(0, 'rgba(20,40,20,0)');
+  grd.addColorStop(0.3, 'rgba(25,50,25,0.4)');
+  grd.addColorStop(1, 'rgba(15,35,15,0.7)');
+  ctx.fillStyle = grd;
+  ctx.fillRect(0, H * 0.85, W, H * 0.15);
+}
+
+function drawSky() {
+  const grd = ctx.createLinearGradient(0, 0, 0, H);
+  const s = season % 4;
+  if (s === 0) {
+    grd.addColorStop(0, '#0c1a10');
+    grd.addColorStop(1, '#1a2a18');
+  } else if (s === 1) {
+    grd.addColorStop(0, '#1a1008');
+    grd.addColorStop(1, '#2a1a10');
+  } else if (s === 2) {
+    grd.addColorStop(0, '#0a0e18');
+    grd.addColorStop(1, '#121828');
+  } else {
+    grd.addColorStop(0, '#0a1810');
+    grd.addColorStop(1, '#142818');
+  }
+  ctx.fillStyle = grd;
+  ctx.fillRect(0, 0, W, H);
+}
+
+function frame(ts) {
+  time = ts * 0.001;
+  growProgress = Math.min(1.5, growProgress + 0.006);
+  seasonTimer += 0.001;
+  if (seasonTimer > 12) {
+    seasonTimer = 0;
+    season++;
+    leaves.length = 0;
+  }
+
+  drawSky();
+  drawGround();
+
+  const baseX = W / 2;
+  const baseY = H * 0.88;
+  const trunkLen = Math.min(W, H) * 0.18;
+
+  leaves.length = 0;
+  drawBranch(baseX, baseY, trunkLen, 0, 0, time);
+  drawLeaves(time);
+
+  spawnFalling();
+  updateFalling(time);
+  drawFalling();
+
+  requestAnimationFrame(frame);
+}
+requestAnimationFrame(frame);
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/data/artifacts/c135c54c4121/qwen3-14b.png b/data/artifacts/c135c54c4121/qwen3-14b.png
new file mode 100644
index 0000000..adadcac
Binary files /dev/null and b/data/artifacts/c135c54c4121/qwen3-14b.png differ
diff --git a/data/challenges.json b/data/challenges.json
index 4a4da42..0bd6b16 100644
--- a/data/challenges.json
+++ b/data/challenges.json
@@ -16559,7 +16559,8 @@
     ],
     "aiPick": null,
     "category": "Games",
-    "judging": true
+    "judging": true,
+    "judged_at": null
   },
   {
     "id": "6eb0315c9845",
@@ -16623,14 +16624,16 @@
       },
       {
         "model": "hf-qwen-coder-32b",
-        "status": "running",
+        "status": "done",
         "error": null,
-        "seconds": 0,
-        "cost": null,
+        "seconds": 131,
+        "cost": 0,
         "started_at": "2026-07-25T08:55:15.975Z",
-        "finished_at": null,
+        "finished_at": "2026-07-25T08:57:26.695Z",
         "queued_at": "2026-07-25T08:46:22.578Z",
-        "resumes": 1
+        "resumes": 1,
+        "bytes": 8876,
+        "thumb": true
       },
       {
         "model": "claude-code",
@@ -16698,7 +16701,8 @@
         "thumb": true
       }
     ],
-    "aiPick": null
+    "aiPick": null,
+    "judging": true
   },
   {
     "id": "c135c54c4121",
@@ -16712,36 +16716,42 @@
     "runs": [
       {
         "model": "qwen3-14b",
-        "status": "queued",
+        "status": "done",
         "error": null,
-        "seconds": 0,
-        "cost": null,
-        "started_at": null,
-        "finished_at": null,
+        "seconds": 67,
+        "cost": 0,
+        "started_at": "2026-07-25T08:57:26.699Z",
+        "finished_at": "2026-07-25T08:58:34.013Z",
         "queued_at": "2026-07-25T08:46:22.581Z",
-        "resumes": 1
+        "resumes": 1,
+        "bytes": 7025,
+        "thumb": true
       },
       {
         "model": "gemma3-12b",
-        "status": "queued",
+        "status": "done",
         "error": null,
-        "seconds": 0,
-        "cost": null,
-        "started_at": null,
-        "finished_at": null,
+        "seconds": 87,
+        "cost": 0,
+        "started_at": "2026-07-25T08:58:34.018Z",
+        "finished_at": "2026-07-25T09:00:00.969Z",
         "queued_at": "2026-07-25T08:46:22.584Z",
-        "resumes": 1
+        "resumes": 1,
+        "bytes": 7256,
+        "thumb": true
       },
       {
         "model": "hermes3-8b",
-        "status": "queued",
+        "status": "done",
         "error": null,
-        "seconds": 0,
-        "cost": null,
-        "started_at": null,
-        "finished_at": null,
+        "seconds": 43,
+        "cost": 0,
+        "started_at": "2026-07-25T09:00:00.973Z",
+        "finished_at": "2026-07-25T09:00:43.527Z",
         "queued_at": "2026-07-25T08:46:22.586Z",
-        "resumes": 1
+        "resumes": 1,
+        "bytes": 6157,
+        "thumb": true
       },
       {
         "model": "qwen25-7b",
@@ -16758,14 +16768,15 @@
       },
       {
         "model": "hf-qwen-coder-32b",
-        "status": "queued",
+        "status": "done",
         "error": null,
-        "seconds": 0,
-        "cost": null,
-        "started_at": null,
-        "finished_at": null,
+        "seconds": 125,
+        "cost": 0,
+        "started_at": "2026-07-25T09:00:43.531Z",
+        "finished_at": "2026-07-25T09:02:48.654Z",
         "queued_at": "2026-07-25T08:46:22.592Z",
-        "resumes": 1
+        "resumes": 1,
+        "bytes": 6157
       }
     ],
     "aiPick": null,
@@ -16782,11 +16793,11 @@
     "runs": [
       {
         "model": "qwen3-14b",
-        "status": "queued",
+        "status": "running",
         "error": null,
         "seconds": 0,
         "cost": null,
-        "started_at": null,
+        "started_at": "2026-07-25T09:02:48.658Z",
         "finished_at": null,
         "queued_at": "2026-07-25T08:46:22.596Z",
         "resumes": 1

← e6bd388 night-loop: cycle 01:57 — judged=327c5eb5b964 · (backlog 5/4  ·  back to Model Arena  ·  night-loop: cycle 02:08 — judged=5410cf08e245 · fired 1 →; F 909782e →