← back to Model Arena
auto-data-snapshot: 2026-09-08T17:31:26 (1 data files) — data/challenges.json
67fe258e8555495896f2c587311d790282cfb811 · 2026-09-08 17:32:37 -0700 · auto-commit-fleet
Files touched
Diff
commit 67fe258e8555495896f2c587311d790282cfb811
Author: auto-commit-fleet <steve@designerwallcoverings.com>
Date: Tue Sep 8 17:32:37 2026 -0700
auto-data-snapshot: 2026-09-08T17:31:26 (1 data files) — data/challenges.json
---
data/challenges.json | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 87 insertions(+)
diff --git a/data/challenges.json b/data/challenges.json
index 4e26e25..9a1f0c7 100644
--- a/data/challenges.json
+++ b/data/challenges.json
@@ -36570,5 +36570,92 @@
"judging": false,
"aiPick": "claude-code",
"judged_at": "2026-09-08T22:56:21.648Z"
+ },
+ {
+ "id": "46d29b76eccd",
+ "title": "Remix: Wild Orbs (free-only rematch)",
+ "prompt": "Build a complete, polished single-file HTML5 Canvas game: an Asteroids-style game where the asteroids are replaced by ORBS, and EACH orb does something WILD and different when you shoot it. Include at least 8 visually distinct wild orb types, each with a clearly different on-hit behavior — splits into a homing swarm; explodes into a gravity well that sucks in bullets/ship; phases/teleports; spawns a black hole; reverses controls briefly; shatters into ricocheting shards; drops a time-slow bubble; chain-reaction color bomb; mirror-clones; rubber-band wall bounce. Ship: thrust + inertia + rotation + screen-wrap + fire with cooldown. Particles, bullet trails, screen shake, glow/gradients, escalating waves, score, lives, start + game-over screens. Sound via WebAudio. Controls: arrows/WASD to fly, space to shoot. Return ONE self-contained HTML file, no external assets/CDNs. Be very detailed and juicy.\n\nHere is a strong previous attempt at this exact challenge. IMPROVE on it — keep what works, fix its weaknesses, and elevate the visual quality and polish. Return a complete, improved single-file HTML document.\n\n=== PREVIOUS ATTEMPT (Claude Opus (Max plan)) ===\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>ORBFALL — Wild Orb Asteroids</title>\n<style>\n *{margin:0;padding:0;box-sizing:border-box;}\n html,body{width:100%;height:100%;overflow:hidden;background:#03030a;font-family:\"Trebuchet MS\",\"Segoe UI\",system-ui,sans-serif;}\n #wrap{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:radial-gradient(ellipse at 50% 40%,#0b0b22 0%,#04040e 55%,#000 100%);}\n canvas{display:block;image-rendering:auto;touch-action:none;}\n #ui{position:absolute;inset:0;pointer-events:none;}\n .screen{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;color:#e8f6ff;pointer-events:auto;\n background:radial-gradient(ellipse at 50% 45%,rgba(20,10,60,.72) 0%,rgba(3,3,12,.93) 70%);backdrop-filter:blur(3px);}\n .hidden{display:none!important;}\n h1{font-size:clamp(38px,9vw,96px);letter-spacing:.14em;font-weight:900;\n background:linear-gradient(180deg,#fff 0%,#7 df 40%,#8be9ff 45%,#b06cff 100%);\n -webkit-background-clip:text;background-clip:text;color:transparent;\n text-shadow:0 0 40px rgba(120,180,255,.35);margin-bottom:.1em;}\n h1 .sub{display:block;font-size:.20em;letter-spacing:.55em;color:#8fd6ff;-webkit-text-fill-color:#8fd6ff;margin-top:.4em;opacity:.85;}\n .tag{font-size:clamp(12px,1.7vw,17px);color:#9fb4d8;letter-spacing:.18em;text-transform:uppercase;margin-bottom:26px;}\n .keys{display:flex;gap:10px;flex-wrap:wrap;justify-content:center;margin-bottom:26px;max-width:min(760px,92vw);}\n .key{border:1px solid rgba(140,190,255,.28);background:rgba(20,32,64,.5);padding:8px 14px;border-radius:9px;font-size:13px;color:#cfe4ff;letter-spacing:.08em;}\n .key b{color:#7ff0d0;}\n .orblist{display:grid;grid-template-columns:repeat(auto-fit,minmax(158px,1fr));gap:8px;max-width:min(880px,94vw);margin-bottom:26px;}\n .orbcard{display:flex;align-items:center;gap:9px;background:rgba(12,18,40,.55);border:1px solid rgba(120,170,255,.16);border-radius:10px;padding:7px 10px;font-size:11.5px;color:#b9cdea;text-align:left;letter-spacing:.03em;}\n .dot{width:15px;height:15px;border-radius:50%;flex:0 0 auto;box-shadow:0 0 10px currentColor;background:currentColor;}\n .btn{pointer-events:auto;cursor:pointer;border:none;border-radius:999px;padding:16px 46px;font-size:19px;font-weight:800;letter-spacing:.2em;color:#04121a;\n background:linear-gradient(135deg,#7ff0d0,#63c8ff 55%,#b06cff);box-shadow:0 0 34px rgba(99,200,255,.5),0 8px 26px rgba(0,0,0,.5);\n transition:transform .12s ease,box-shadow .12s ease;font-family:inherit;text-transform:uppercase;}\n .btn:hover{transform:translateY(-2px) scale(1.03);box-shadow:0 0 52px rgba(140,220,255,.75),0 10px 30px rgba(0,0,0,.55);}\n .btn:active{transform:translateY(1px) scale(.98);}\n .small{margin-top:20px;font-size:12px;color:#6f84a8;letter-spacing:.12em;}\n #gameover h2{font-size:clamp(34px,7vw,72px);letter-spacing:.12em;color:#ff6f8f;text-shadow:0 0 30px rgba(255,80,120,.55);margin-bottom:.15em;font-weight:900;}\n .statrow{display:flex;gap:34px;flex-wrap:wrap;justify-content:center;margin:18px 0 26px;}\n .stat{min-width:110px;}\n .stat .v{font-size:32px;font-weight:800;color:#8be9ff;text-shadow:0 0 18px rgba(100,200,255,.5);}\n .stat .l{font-size:11px;letter-spacing:.22em;color:#7f93b6;text-transform:uppercase;margin-top:3px;}\n #toast{position:absolute;left:50%;top:14%;transform:translateX(-50%);font-size:clamp(16px,3.2vw,30px);font-weight:900;letter-spacing:.16em;\n text-transform:uppercase;color:#fff;opacity:0;text-shadow:0 0 22px currentColor;white-space:nowrap;}\n #wavebanner{position:absolute;left:50%;top:42%;transform:translate(-50%,-50%);font-size:clamp(30px,8vw,86px);font-weight:900;letter-spacing:.28em;\n color:#fff;opacity:0;text-shadow:0 0 40px #63c8ff;white-space:nowrap;}\n</style>\n</head>\n<body>\n<div id=\"wrap\">\n <canvas id=\"cv\"></canvas>\n <div id=\"ui\">\n <div id=\"toast\"></div>\n <div id=\"wavebanner\"></div>\n\n <div id=\"start\" class=\"screen\">\n <h1>ORBFALL<span class=\"sub\">wild orb protocol</span></h1>\n <div class=\"tag\">Ten orbs. Ten kinds of chaos. Shoot carefully.</div>\n <div class=\"keys\">\n <div class=\"key\"><b>←→</b> / <b>A D</b> rotate</div>\n <div class=\"key\"><b>↑</b> / <b>W</b> thrust</div>\n <div class=\"key\"><b>SPACE</b> fire</div>\n <div class=\"key\"><b>SHIFT</b> blink</div>\n <div class=\"key\"><b>P</b> pause</div>\n <div class=\"key\"><b>M</b> mute</div>\n </div>\n <div class=\"orblist\" id=\"orblist\"></div>\n <button class=\"btn\" id=\"startBtn\">Launch</button>\n <div class=\"small\">Screen wraps. Inertia is real. Nothing is safe.</div>\n </div>\n\n <div id=\"gameover\" class=\"screen hidden\">\n <h2>SIGNAL LOST</h2>\n <div class=\"tag\" id=\"goSub\">the orbs got you</div>\n <div class=\"statrow\">\n <div class=\"stat\"><div class=\"v\" id=\"goScore\">0</div><div class=\"l\">Score</div></div>\n <div class=\"stat\"><div class=\"v\" id=\"goWave\">1</div><div class=\"l\">Wave</div></div>\n <div class=\"stat\"><div class=\"v\" id=\"goPopped\">0</div><div class=\"l\">Orbs Popped</div></div>\n <div class=\"stat\"><div class=\"v\" id=\"goBest\">0</div><div class=\"l\">Best</div></div>\n </div>\n <button class=\"btn\" id=\"againBtn\">Again</button>\n <div class=\"small\">Press ENTER to relaunch</div>\n </div>\n </div>\n</div>\n\n<script>\n\"use strict\";\n/* ============================================================\n ORBFALL — single-file canvas arcade\n ============================================================ */\nconst cv = document.getElementById('cv');\nconst ctx = cv.getContext('2d', {alpha:false});\nlet W = 0, H = 0, DPR = 1;\n\nfunction resize(){\n DPR = Math.min(window.devicePixelRatio || 1, 2);\n W = window.innerWidth; H = window.innerHeight;\n cv.width = Math.floor(W*DPR); cv.height = Math.floor(H*DPR);\n cv.style.width = W+'px'; cv.style.height = H+'px';\n ctx.setTransform(DPR,0,0,DPR,0,0);\n}\nwindow.addEventListener('resize', resize);\nresize();\n\n/* ---------------- math helpers ---------------- */\nconst TAU = Math.PI*2;\nconst rand = (a=1,b=0)=> b + Math.random()*(a-b);\nconst randi = (a,b)=> Math.floor(rand(a,b));\nconst pick = arr => arr[Math.floor(Math.random()*arr.length)];\nconst clamp = (v,a,b)=> v<a?a:v>b?b:v;\nconst lerp = (a,b,t)=> a+(b-a)*t;\n\n// toroidal shortest delta\nfunction wrapDelta(a,b,size){ let d=b-a; if(d> size/2) d-=size; if(d<-size/2) d+=size; return d; }\nfunction wrapPos(o){\n if(o.x<-40) o.x+=W+80; else if(o.x>W+40) o.x-=W+80;\n if(o.y<-40) o.y+=H+80; else if(o.y>H+40) o.y-=H+80;\n}\nfunction torDist(ax,ay,bx,by){\n const dx=wrapDelta(ax,bx,W), dy=wrapDelta(ay,by,H);\n return Math.hypot(dx,dy);\n}\n\n/* ---------------- audio ---------------- */\nconst Sound = (()=>{\n let actx=null, master=null, muted=false;\n function ensure(){\n if(actx) return actx;\n try{\n actx = new (window.AudioContext||window.webkitAudioContext)();\n master = actx.createGain(); master.gain.value = 0.5; master.connect(actx.destination);\n }catch(e){ actx=null; }\n return actx;\n }\n function now(){ return actx? actx.currentTime : 0; }\n function tone(opt){\n const A = ensure(); if(!A || muted) return;\n if(A.state==='suspended') A.resume();\n const t0 = A.currentTime + (opt.delay||0);\n const o = A.createOscillator();\n const g = A.createGain();\n o.type = opt.type||'sine';\n o.frequency.setValueAtTime(opt.f0||440, t0);\n if(opt.f1!=null){\n if(opt.exp) o.frequency.exponentialRampToValueAtTime(Math.max(1,opt.f1), t0+(opt.dur||0.2));\n else o.frequency.linearRampToValueAtTime(opt.f1, t0+(opt.dur||0.2));\n }\n const vol = (opt.vol==null?0.2:opt.vol);\n g.gain.setValueAtTime(0.0001, t0);\n g.gain.exponentialRampToValueAtTime(Math.max(0.0001,vol), t0+0.008);\n g.gain.exponentialRampToValueAtTime(0.0001, t0+(opt.dur||0.2));\n let node = o;\n if(opt.filter){\n const f = A.createBiquadFilter(); f.type=opt.filter; f.frequency.value = opt.fc||900;\n node.connect(f); f.connect(g);\n } else node.connect(g);\n g.connect(master);\n o.start(t0); o.stop(t0+(opt.dur||0.2)+0.05);\n }\n function noise(opt){\n const A = ensure(); if(!A || muted) return;\n if(A.state==='suspended') A.resume();\n const dur = opt.dur||0.3;\n const len = Math.floor(A.sampleRate*dur);\n const buf = A.createBuffer(1,len,A.sampleRate);\n const d = buf.getChannelData(0);\n for(let i=0;i<len;i++){ d[i] = (Math.random()*2-1) * Math.pow(1-i/len, opt.decay||2); }\n const s = A.createBufferSource(); s.buffer = buf;\n const f = A.createBiquadFilter(); f.type = opt.filter||'lowpass';\n f.frequency.setValueAtTime(opt.fc||1200, A.currentTime);\n if(opt.fc1!=null) f.frequency.exponentialRampToValueAtTime(Math.max(40,opt.fc1), A.currentTime+dur);\n const g = A.createGain(); g.gain.value = (opt.vol==null?0.25:opt.vol);\n s.connect(f); f.connect(g); g.connect(master);\n s.start(); s.stop(A.currentTime+dur+0.02);\n }\n return {\n ensure,\n toggle(){ muted=!muted; if(master) master.gain.value = muted?0:0.5; return muted; },\n isMuted(){ return muted; },\n shoot(){ tone({type:'square',f0:880,f1:180,dur:0.09,vol:0.07,exp:true}); },\n thrust(){ noise({dur:0.06,fc:420,vol:0.035,decay:1}); },\n pop(hue){ tone({type:'triangle',f0:300+hue*1.4,f1:90,dur:0.22,vol:0.13,exp:true}); noise({dur:0.22,fc:2400,fc1:200,vol:0.10}); },\n boom(){ noise({dur:0.7,fc:1400,fc1:60,vol:0.32,decay:1.6}); tone({type:'sine',f0:120,f1:30,dur:0.6,vol:0.2,exp:true}); },\n hurt(){ tone({type:'sawtooth',f0:200,f1:50,dur:0.5,vol:0.2,exp:true}); noise({dur:0.4,fc:800,fc1:80,vol:0.2}); },\n blackhole(){ tone({type:'sine',f0:40,f1:220,dur:1.2,vol:0.16,exp:true}); noise({dur:1.2,fc:120,fc1:1800,vol:0.10,decay:0.6}); },\n swarm(){ tone({type:'sawtooth',f0:520,f1:1400,dur:0.3,vol:0.09,exp:true}); },\n phase(){ tone({type:'sine',f0:1400,f1:280,dur:0.28,vol:0.11,exp:true}); tone({type:'sine',f0:700,f1:2000,dur:0.28,vol:0.07,exp:true,delay:0.05}); },\n reverse(){ tone({type:'square',f0:160,f1:520,dur:0.45,vol:0.11,exp:true}); tone({type:'square',f0:520,f1:160,dur:0.45,vol:0.09,exp:true,delay:0.12}); },\n shard(){ for(let i=0;i<4;i++) tone({type:'square',f0:900+i*250,f1:400,dur:0.1,vol:0.05,exp:true,delay:i*0.03}); },\n slow(){ tone({type:'sine',f0:600,f1:120,dur:0.9,vol:0.13,exp:true}); },\n chain(i){ tone({type:'triangle',f0:400+i*90,f1:150,dur:0.16,vol:0.09,exp:true}); },\n mirror(){ tone({type:'triangle',f0:800,f1:1600,dur:0.2,vol:0.09,exp:true}); tone({type:'triangle',f0:1600,f1:800,dur:0.2,vol:0.07,exp:true,delay:0.04}); },\n rubber(){ tone({type:'sine',f0:220,f1:700,dur:0.22,vol:0.12,exp:true}); },\n gravity(){ tone({type:'sine',f0:900,f1:70,dur:0.8,vol:0.14,exp:true}); },\n wave(){ [523,659,784,1046].forEach((f,i)=>tone({type:'triangle',f0:f,dur:0.28,vol:0.10,delay:i*0.085})); },\n extra(){ [660,880,1320].forEach((f,i)=>tone({type:'square',f0:f,dur:0.16,vol:0.10,delay:i*0.07})); },\n over(){ [440,330,247,165].forEach((f,i)=>tone({type:'sawtooth',f0:f,f1:f*0.5,dur:0.5,vol:0.14,exp:true,delay:i*0.16})); },\n blink(){ tone({type:'sine',f0:1800,f1:420,dur:0.18,vol:0.08,exp:true}); }\n };\n})();\n\n/* ---------------- orb types ---------------- */\nconst ORB_TYPES = [\n { key:'swarm', name:'Swarmling', hue:130, c1:'#8dff9f', c2:'#0f5a2c', desc:'Splits into homing swarm' },\n { key:'gravity', name:'Sinkhole', hue:280, c1:'#c58bff', c2:'#3a0f6b', desc:'Explodes into a gravity well' },\n { key:'phase', name:'Phaser', hue:190, c1:'#7ff0ff', c2:'#0a4b60', desc:'Blinks away & teleports' },\n { key:'void', name:'Voidcore', hue:0, c1:'#ff5b7f', c2:'#1a0008', desc:'Spawns a black hole' },\n { key:'reverse', name:'Invertex', hue:40, c1:'#ffd166', c2:'#6b4200', desc:'Reverses your controls' },\n { key:'shard', name:'Glassbone', hue:210, c1:'#bcd8ff', c2:'#22314f', desc:'Shatters into ricochet shards' },\n { key:'slow', name:'Chronobub', hue:170, c1:'#7ff0d0', c2:'#0c4f45', desc:'Drops a time-slow bubble' },\n { key:'chain', name:'Chromabomb', hue:320, c1:'#ff8bd8', c2:'#5c0b40', desc:'Chain-reaction color bomb' },\n { key:'mirror', name:'Twinshell', hue:60, c1:'#f6ff8b', c2:'#585c00', desc:'Mirror-clones itself' },\n { key:'rubber', name:'Bounceball', hue:20, c1:'#ffa46b', c2:'#5e2100', desc:'Rubber-bands off the walls' }\n];\nconst TYPE_BY_KEY = Object.fromEntries(ORB_TYPES.map(t=>[t.key,t]));\n\n/* build start-screen legend */\n(function(){\n const el = document.getElementById('orblist');\n ORB_TYPES.forEach(t=>{\n const d = document.createElement('div');\n d.className='orbcard';\n d.innerHTML = `<span class=\"dot\" style=\"color:${t.c1}\"></span><span><b style=\"color:${t.c1}\">${t.name}</b><br>${t.desc}</span>`;\n el.appendChild(d);\n });\n})();\n\n/* ---------------- input ---------------- */\nconst keys = Object.create(null);\nlet pausedByKey = false;\nwindow.addEventListener('keydown', e=>{\n const k = e.key.toLowerCase();\n if([' ','arrowup','arrowdown','arrowleft','arrowright'].includes(k)) e.preventDefault();\n if(keys[k]) return;\n keys[k]=true;\n if(k==='p' && G.state==='play'){ pausedByKey=!pausedByKey; }\n if(k==='m'){ const m = Sound.toggle(); toast(m?'MUTED':'SOUND ON', '#9fb4d8'); }\n if(k==='enter'){\n if(G.state==='start') startGame();\n else if(G.state==='over') startGame();\n }\n if((k==='shift') && G.state==='play') blink();\n}, {passive:false});\nwindow.addEventListener('keyup', e=>{ keys[e.key.toLowerCase()]=false; });\nwindow.addEventListener('blur', ()=>{ for(const k in keys) keys[k]=false; });\n\n/* ---------------- game state ---------------- */\nconst G = {\n state:'start',\n score:0, best:+(localStorage.getItem('orbfall_best')||0), lives:3, wave:0,\n popped:0, nextExtra:5000,\n shake:0, shakeX:0, shakeY:0,\n slowT:0, // time-slow bubble timer\n reverseT:0, // reversed controls\n flash:0, flashC",
+ "remixOf": "9e978d77c375",
+ "remixSource": "claude-code",
+ "designTools": false,
+ "created_at": "2026-09-08T23:59:36.447Z",
+ "winner": null,
+ "runs": [
+ {
+ "model": "qwen3-14b",
+ "status": "done",
+ "error": null,
+ "seconds": 276,
+ "cost": 0,
+ "started_at": "2026-09-08T23:59:36.476Z",
+ "finished_at": "2026-09-09T00:04:12.431Z",
+ "queued_at": "2026-09-08T23:59:36.453Z",
+ "bytes": 27858,
+ "thumb": true,
+ "aiScore": 9,
+ "aiReason": "The game is well-polished and fulfills the challenge requirements effectively.",
+ "aiScores": {
+ "qwen2.5vl:7b": 9
+ },
+ "aiSpread": 0
+ },
+ {
+ "model": "gemma3-12b",
+ "status": "done",
+ "error": null,
+ "seconds": 219,
+ "cost": 0,
+ "started_at": "2026-09-09T00:04:12.437Z",
+ "finished_at": "2026-09-09T00:07:51.015Z",
+ "queued_at": "2026-09-08T23:59:36.459Z",
+ "bytes": 21606,
+ "thumb": true,
+ "aiScore": 9,
+ "aiReason": "The game fulfills the challenge well and has good visual quality.",
+ "aiScores": {
+ "qwen2.5vl:7b": 9
+ },
+ "aiSpread": 0
+ },
+ {
+ "model": "hermes3-8b",
+ "status": "done",
+ "error": null,
+ "seconds": 115,
+ "cost": 0,
+ "started_at": "2026-09-09T00:07:51.022Z",
+ "finished_at": "2026-09-09T00:09:45.543Z",
+ "queued_at": "2026-09-08T23:59:36.465Z",
+ "bytes": 18118,
+ "thumb": true,
+ "aiScore": 9,
+ "aiReason": "The game is well-polished and fulfills the challenge requirements effectively.",
+ "aiScores": {
+ "qwen2.5vl:7b": 9
+ },
+ "aiSpread": 0
+ },
+ {
+ "model": "claude-code",
+ "status": "done",
+ "error": null,
+ "seconds": 308,
+ "cost": 0,
+ "started_at": "2026-09-08T23:59:36.481Z",
+ "finished_at": "2026-09-09T00:04:44.752Z",
+ "queued_at": "2026-09-08T23:59:36.471Z",
+ "bytes": 57781,
+ "thumb": true,
+ "aiScore": 9,
+ "aiReason": "The game fulfills the challenge well and has high visual quality.",
+ "aiScores": {
+ "qwen2.5vl:7b": 9
+ },
+ "aiSpread": 0
+ }
+ ],
+ "judging": false,
+ "aiPick": "qwen3-14b",
+ "judged_at": "2026-09-09T00:10:41.252Z"
}
]
\ No newline at end of file
← 9c460ec auto-data-snapshot: 2026-09-08T16:14:09 (1 data files) — dat
·
back to Model Arena
·
auto-data-snapshot: 2026-09-08T21:15:02 (1 data files) — dat 45547fb →