← 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
A data/artifacts/6eb0315c9845/hf-qwen-coder-32b.htmlA data/artifacts/6eb0315c9845/hf-qwen-coder-32b.pngA data/artifacts/c135c54c4121/gemma3-12b.htmlA data/artifacts/c135c54c4121/gemma3-12b.pngA data/artifacts/c135c54c4121/hermes3-8b.htmlA data/artifacts/c135c54c4121/hermes3-8b.pngA data/artifacts/c135c54c4121/hf-qwen-coder-32b.htmlA data/artifacts/c135c54c4121/qwen3-14b.htmlA data/artifacts/c135c54c4121/qwen3-14b.pngM data/challenges.json
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 →