OverviewCode › R174
Code · blind round

R174 · Recursive fractal tree growing branch by branch

blind round 7/11 local models answered

Every answer below carries the name of the model that wrote it. Blind refers to the scoring: the review was done without knowing which model produced which answer — the published result names them.

2 of the 11 local models delivered nothing through our test harness in this round — for reasons that lie with our setup, not with the models. Those cards are marked DNF like any other, but they are not evidence about those models — the reason is noted on the card itself.

Show task
Create ONE self-contained HTML file (STRICT LIMIT: max 7000 characters in total — this is a budget on characters, not on lines, so removing line breaks does not help) that grows a recursive fractal tree on a <canvas>: generate a new tree with random branch angles and lengths, recursion depth 8-10, then animate it branch by branch so every branch visibly extends from its parent instead of appearing all at once. Terminal branches should grow small leaves or buds once their branch is complete. Add gentle wind sway using sine waves so the opened branches move slightly while new ones are still growing. Show a counter of branches that have appeared. After the full tree has unfolded, hold briefly, then restart with a fresh random tree. Smooth requestAnimationFrame animation, NO user input, starts immediately and keeps running (restart with a fresh random instance when finished). No external libraries, no comments needed. Output ONLY the HTML file content, nothing else.

The answers

Local models (Brain cluster) — identical prompt, shuffled order (the sequence is not a ranking)
qwen3:14bOK
Show code
<!DOCTYPE html>
<html><head><title></title><style>body{margin:0;overflow:hidden}canvas{display:block}</style></head><body onload="init()"><canvas id="c"></canvas><script>
const C = document.getElementById('c');
const ctx = C.getContext('2d');

let W, H;
let treeSegments = [];
let animationState = 'growing'; // growing, stable, resting
let segmentCounter = 0;
let lastTime = 0;

function resize() {
    W = window.innerWidth;
    H = window.innerHeight;
    C.width = W;
    C.height = H;
}
window.addEventListener('resize', resize);
resize();

// Branch structure: [start_x, start_y, initial_length, current_progress, max_depth]
function generateTree(x, y, length, depth) {
    if (depth <= 0 || length < 5) return [];
    
    let segments = [{ x1: x, y1: y, x2: x + length * Math.cos(0), y2: y - length * Math.sin(0), maxLen: length, progress: 0, depth: depth }];
    
    if (depth > 1) {
        let angle = Math.PI / 6; // Base angle
        for (let i = 0; i < 2; i++) {
            let newLength = length * (0.6 + Math.random() * 0.3);
            let newAngle = angle + (i === 0 ? -Math.PI/4 : Math.PI/4) + (Math.random() - 0.5) * Math.PI / 8;
            
            // Calculate end points for the child branch
            let nextX = x + length * Math.cos(newAngle);
            let nextY = y - length * Math.sin(newAngle);

            segments.push({ x1: nextX, y1: nextY, maxLen: newLength, progress: 0, depth: depth - 1, parentIndex: segments.length - 1 });
        }
    }
    return segments;
}

function init() {
    treeSegments = [];
    segmentCounter = 0;
    animationState = 'growing';
    lastTime = performance.now();
    resize();
    // Start the first tree from the bottom center, pointing up
    treeSegments = generateTree(W * 0.5, H - 50, H * 0.3, 10); 
    requestAnimationFrame(animate);
}

function updateProgress(deltaTime) {
    let finishedCount = 0;
    for (const seg of treeSegments) {
        if (seg.progress < 1) {
            // Growth speed based on depth/size for visibility
            let growthRate = Math.min(0.02, 0.05 / (seg.depth + 1));
            seg.progress += growthRate * deltaTime;
            if (seg.progress > 1) seg.progress = 1;
        }
    }
    return finishedCount; // Placeholder return
}

function drawTree(time) {
    ctx.clearRect(0, 0, W, H);
    let timeFactor = Math.sin(time / 1000 + 0) * 5;
    
    for (let i = 0; i < treeSegments.length; i++) {
        const seg = treeSegments[i];
        if (!seg || seg.progress === 0 && seg.depth <= 0) continue;

        // Calculate current end points based on progress
        let p = seg.progress;
        let lengthFactor = p;
        
        // Determine the starting point (x1, y1) relative to parent/canvas
        // For simplicity and stability, we recalculate segment coordinates using vectors:
        if (seg.depth === treeSegments[i-1]?.depth + 1 && i > 0) {
            // Find the true connection point from the previous segment's end
            let prev = treeSegments[i-1];
            let parentX = prev.x2;
            let parentY = prev.y2;

            // Calculate angle based on initial structure (this is complex to store precisely, 
            // so we approximate using relative start/end points and scaling by progress)
            let dx_full = seg.x2 - seg.x1;
            let dy_full = seg.y2 - seg.y1;

            // Recalculate the effective initial coordinates for this segment's growth path:
            seg.start_x = seg.x1; 
            seg.start_y = seg.y1;
            seg.end_x = seg.x2;
            seg.end_y = seg.y2;

        } else {
             // Initial segment or root node (using stored x1, y1 as start)
            seg.start_x = seg.x1; 
            seg.start_y = seg.y1;
            seg.end_x = seg.x2;
            seg.end_y = seg.y2;
        }

        // --- Wind Sway Calculation (applied to the whole segment) ---
        let swayX = Math.sin(time / 500 + i * 0.1) * timeFactor * (i % 3 === 0 ? 0.8 : 1);
        let swayY = Math.cos(time / 600 + i * 0.2) * timeFactor * (i % 4 === 0 ? 0.7 : 1);

        // --- Interpolation for current position ---
        let x_curr = seg.start_x + (seg.end_x - seg.start_x) * lengthFactor;
        let y_curr = seg.start_y + (seg.end_y - seg.start_y) * lengthFactor;

        // Apply sway to the drawn path
        let x1 = seg.start_x + swayX;
        let y1 = seg.start_y + swayY;
        let x2 = x_curr + swayX;
        let y2 = y_curr + swayY;


        // Draw Branch
        ctx.beginPath();
        ctx.moveTo(x1, y1);
        ctx.lineTo(x2, y2);
        ctx.strokeStyle = `rgba(45, 60, 30, ${0.5 + seg.depth * 0.1})`;
        ctx.lineWidth = Math.max(1, 3 - seg.depth * 0.3);
        ctx.lineCap = 'round';
        ctx.stroke();

        // Draw Leaves/Tips if complete
        if (seg.progress >= 0.99 && seg.depth > 0) {
            let leafX = x2 + swayX;
            let leafY = y2 + swayY;
             ctx.fillStyle = '#38761d';
            ctx.beginPath();
            ctx.arc(leafX, leafY, Math.max(0.5, 1 - seg.depth * 0.2), 0, Math.PI * 2);
            ctx.fill();
        }

    }
    
    // Display counter
    ctx.fillStyle = '#eee';
    ctx.font = '14px Arial';
    ctx.fillText(`Branches: ${segmentCounter}`, 10, 25);

    return true; // Always continue for now
}


function animate(time) {
    const deltaTime = time - lastTime;
    lastTime = time;

    if (animationState === 'growing') {
        updateProgress(deltaTime);
        drawTree(time);
        
        // Simple check: Assume growth is done if progress stabilizing after a few seconds
        setTimeout(() => {
            animationState = 'stable';
        }, 6000); // Growth phase lasts 6 seconds

    } else if (animationState === 'stable') {
        drawTree(time);

        // Hold for 2 seconds, then restart
        if (!window.restartTimer) window.restartTimer = setTimeout(() => {
            init();
        }, 2000);
    }
    
    requestAnimationFrame(animate);
}

</script></body></html>
mistral-small:24bHANGFORMAT
Show code
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Recursive Fractal Tree</title>
<style>
body {margin: 0; display:flex; justify-content:center; align-items:center; height:100vh; background:#f0f0f0;}
canvas {border:1px solid #000;}
</style>
</head>
<body>
<canvas id="treeCanvas" width="800" height="600"></canvas>
<div id="counter">Branches: 0</div>
<script>
const canvas = document.getElementById('treeCanvas');
const ctx = canvas.getContext('2d');
let branchCounter = 0;
let angleOffset = Math.PI / 4;

function drawTree(startX, startY, length, angle, branchingAngle, depth) {
    if (depth === 0) return;
    const endX = startX + length * Math.cos(angle);
    const endY = startY - length * Math.sin(angle);

    ctx.beginPath();
    ctx.moveTo(startX, startY);
    ctx.lineTo(endX, endY);
    ctx.stroke();

    if (depth > 1) {
        drawTree(endX, endY, length * 0.7, angle + branchingAngle, branchingAngle / 2, depth - 1);
        drawTree(endX, endY, length * 0.7, angle - branchingAngle, branchingAngle / 2, depth - 1);
    } else {
        ctx.beginPath();
        ctx.arc(endX, endY, 5, 0, Math.PI * 2);
        ctx.fillStyle = 'green';
        ctx.fill();
    }
}

function animateTree() {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    let angleOffset = Math.sin(Date.now() / 1000) * Math.PI / 36;
    drawTree(canvas.width / 2, canvas.height - 50 + 50*Math.sin(angleOffset), 180, -Math.PI/2, Math.PI/4, 8);
}

function updateCounter() {
    document.getElementById('counter').innerText = `Branches: ${branchCounter}`;
}

let treeDepth = 8;
while (treeDepth < 10) {
setInterval(() => {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    drawTree(canvas.width / 2, canvas.height - 50 + 50*Math.sin(angleOffset), 180, -Math.PI/2, Math.PI/4, treeDepth);
    updateCounter();
}, 1000);

function restartTree() {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    branchCounter = 0;
    treeDepth = Math.floor(Math.random() * 3) + 8;
}
requestAnimationFrame(restartTree);
}

</script>
</body>
</html>
```
qwen3.5:9bOKFORMAT
Show code
```html
<!DOCTYPE html>
<html>
<head>
<title>Fractal Tree Animation</title>
<style>body { margin: 0; overflow: hidden; background-color: #222; } canvas { display: block; }</style>
</head>
<body>
<canvas id="c"></canvas>
<script>
const c = document.getElementById('c');
const ctx = c.getContext('2d');

let W, H;
ctx.canvas.width = window.innerWidth;
ctx.canvas.height = window.innerHeight;
W = window.innerWidth;
H = window.innerHeight;

let treeData = [];
let animationState = {
    running: false,
    progress: 0, // Tracks how many segments have finished growing
    maxSegments: 0,
    timeElapsed: 0,
    windOffset: Math.random() * Math.PI * 2
};

const MAX_DEPTH = 9;
const MIN_BRANCHES = 1;
const MAX_BRANCHES = 3;

function generateTree(x, y, angle, length, depth, parentSegments) {
    let segments = [];
    segments.push({ x: x, y: y, angle: angle, length: length, depth: depth });

    if (depth === 0) return segments;

    const branches = Math.floor(Math.random() * (MAX_BRANCHES - MIN_BRANCHES + 1)) + MIN_BRANCHES;
    let currentX = x;
    let currentY = y;

    for (let i = 0; i < branches; i++) {
        const newAngle = angle + Math.random() * 0.6 - 0.3; // Small random deviation
        const newLength = length * (0.7 + Math.random() * 0.2);
        let nextX = currentX + newLength * Math.cos(newAngle);
        let nextY = currentY - newLength * Math.sin(newAngle);

        segments = segments.concat(generateTree(nextX, nextY, newAngle, newLength, depth - 1, segments));
    }
    return segments;
}

function initialize() {
    treeData = [];
    animationState.progress = 0;
    animationState.maxSegments = 0;
    animationState.timeElapsed = 0;
    animationState.running = true;

    // Generate the full structure once
    const initialSegments = generateTree(W / 2, H - 100, Math.PI / 2, 90, MAX_DEPTH, []);
    treeData = initialSegments;
    animationState.maxSegments = treeData.length;

    // Reset progress for animation start
    animationState.progress = 0;
}

function drawTree(t) {
    ctx.clearRect(0, 0, W, H);
    ctx.save();
    ctx.translate(W / 2, 0); // Start drawing from the center top

    const segments = treeData;
    let segmentCount = 0;
    let totalProgress = Math.min(1, animationState.progress / (animationState.maxSegments * 0.5 + 1));

    // Wind sway factor based on time and wind offset
    const windFactor = Math.sin((t * 0.002) + animationState.windOffset);

    for (let i = 0; i < segments.length; i++) {
        const seg = segments[i];
        // Determine current length based on progress and time
        let drawLength = Math.min(seg.length, totalProgress * seg.length + (t * 0.01));

        // Calculate start point of the segment based on parent's end position
        let startX = W / 2;
        let startY = H - 100; // Initial root position for simplicity in this model
        
        if (i > 0) {
            const parentSeg = segments[i-1];
            // Need to recalculate the true starting point by walking up the structure, 
            // but given the recursive nature and memory limits, we'll simplify:
            // Each segment draws relative to its stored position for a growing effect.
        }

        ctx.save();
        ctx.translate(seg.x, seg.y);
        
        // Apply wind sway only if the branch has grown significantly
        let currentAngle = seg.angle + (windFactor * 0.1);
        ctx.rotate(currentAngle);
        
        // Draw the segment
        ctx.strokeStyle = `rgba(45, ${Math.floor(200 + totalProgress * 55)}, 45, ${0.3 + totalProgress * 0.7})`;
        ctx.lineWidth = Math.max(1, seg.depth * 0.3);

        // Draw the line segment (from origin outwards)
        ctx.beginPath();
        ctx.moveTo(0, 0);
        ctx.lineTo(drawLength * Math.cos(seg.angle), -drawLength * Math.sin(seg.angle));
        ctx.stroke();

        // Handle leaves/buds at the end of fully grown branches (depth < 3 and progress near 1)
        if (seg.depth <= 2 && totalProgress >= 0.95 && i > 0) {
            let leafSize = Math.max(1, seg.depth * 0.5);
            ctx.fillStyle = '#6AA84F';
            // Draw a small dot near the end tip (adjusting for rotation and growth length)
            ctx.beginPath();
            ctx.arc(drawLength * Math.cos(seg.angle), -drawLength * Math.sin(seg.angle) + 1, leafSize, 0, Math.PI * 2);
            ctx.fill();
        }

        ctx.restore();
    }

    ctx.restore();
}

function animate(t) {
    if (!animationState.running) return;

    // Advance animation progress smoothly towards completion (1.0)
    let targetProgress = 1.0;
    const speedFactor = 0.02 / (animationState.maxSegments * 0.5 + 1); // Slower growth for deeper trees
    
    if (animationState.progress < animationState.maxSegments) {
        // Simulate discrete segment completion
        if (t * 0.01 % 0.1 < speedFactor * 20) { 
            let currentProgress = Math.min(1, (animationState.timeElapsed + 1) / (Math.PI * 2));
            animationState.progress += 0.01;
        }
    }

    // Update state variables
    animationState.timeElapsed++;
    const completionThreshold = 0.98;

    drawTree(t);

    if (animationState.progress >= animationState.maxSegments * completionThreshold) {
        // Tree fully grown, pause briefly
        setTimeout(() => {
            animationState.running = false;
            setTimeout(initialize, 1500); // Wait 1.5 seconds then restart
        }, 100);
    }

    requestAnimationFrame(animate);
}

window.onload = function() {
    // Initial setup and start the loop immediately
    initialize();
    animate(0);
};

</script>
</body>
</html>
```
qwen3-coder:30bBLANKFORMAT
Show code
```html
<!DOCTYPE html>
<html lang="en">
<head></head><body style="margin:0;overflow:hidden"><canvas id="c"></canvas><script>
const canvas = document.getElementById('c');
const ctx = canvas.getContext('2d');
let W, H;

function resize() {
    W = canvas.width = window.innerWidth;
    H = canvas.height = window.innerHeight;
}
window.addEventListener("resize", resize);
resize();

let treeState = {};
let animationFrameId = null;
let startTime = Date.now();

class Branch {
    constructor(x, y, length, angle, maxDepth) {
        this.start = { x: x, y: y };
        this.targetLength = length;
        this.angle = angle; // Radians
        this.maxDepth = maxDepth;
        this.progress = 0.0; // 0.0 to 1.0 for growth animation
        this.isFinished = false;
    }

    // Calculate current position based on progress
    getEnd(time) {
        const p = this.progress * (this.targetLength / 100); // Scale progress to length
        const windOffset = Math.sin((Date.now() + this.angle * 10) * 0.002) * 5;
        return {
            x: this.start.x + p * Math.cos(this.angle) - windOffset,
            y: this.start.y + p * Math.sin(this.angle)
        };
    }

    // Updates progress based on elapsed time or fixed steps
    updateProgress(elapsedTime) {
        if (this.isFinished) return;
        
        const growthRate = 0.015; // Fixed animation rate per frame
        this.progress = Math.min(1.0, this.progress + growthRate);

        if (this.progress >= 0.99 && this.targetLength < 2) {
            // If it's a small terminal branch and nearly done, mark it finished quickly
            this.isFinished = true;
        } else if (this.progress >= 1.0 - 0.02) { // Tolerance check for completion
             if(Math.abs(this.targetLength * Math.pow(0.7, this.maxDepth)) < 5){
                this.isFinished = true;
            }
        }
    }

    draw(time) {
        const end = this.getEnd(time);
        const currentLength = this.progress * this.targetLength;
        
        ctx.beginPath();
        ctx.moveTo(this.start.x, this.start.y);
        ctx.lineTo(end.x, end.y);
        ctx.strokeStyle = `rgba(34, 139, 34, ${0.5 + (1 - this.progress) * 0.5})`;
        ctx.lineWidth = Math.max(0.5, 6 * (this.targetLength / 100)); // Thicker at start
        ctx.lineCap = 'round';
        ctx.stroke();

        // Update start point for the next segment's drawing
        this.start = { x: this.getEnd(time).x, y: this.getEnd(time).y };
    }
}

/** Generates the full fractal structure (non-animated) */
function generateTreeStructure(startX, startY, length, angle, depth) {
    const branches = [];
    if (depth < 0) return branches;

    // Terminal branch: always create a small leaf/bud placeholder
    if (depth === -1) {
        branches.push({ type: 'leaf', x: startX, y: startY });
        return branches;
    }

    const currentBranch = new Branch(startX, startY, length, angle, depth);
    branches.push(currentBranch);
    
    // Split into two smaller branches
    const subLength = Math.max(1, length * 0.7);
    const splitAngle1 = angle - (Math.PI * (0.2 + Math.random() * 0.4));
    const splitAngle2 = angle + (Math.PI * (0.2 + Math.random() * 0.4));

    // Recurse
    branches.push(...generateTreeStructure(currentBranch.getEnd({}).x, currentBranch.getEnd({}).y, subLength, splitAngle1, depth - 1));
    branches.push(...generateTreeStructure(currentBranch.getEnd({}).x, currentBranch.getEnd({}).y, subLength, splitAngle2, depth - 1));

    return branches;
}

/** Main animation loop */
function animate() {
    const elapsed = Date.now();
    ctx.fillStyle = 'rgba(135, 206, 235, 0.4)'; // Sky blue fades background for movement illusion
    ctx.fillRect(0, 0, W, H);

    let totalBranches = 0;
    const allBranches = treeState.branches;

    // Update progress and draw
    for (let i = 0; i < allBranches.length; i++) {
        const b = allBranches[i];
        if (!b.isFinished) {
            b.updateProgress(elapsed);
        }
        b.draw(elapsed);
        totalBranches++;
    }

    // Draw leaves/buds at terminal points (those marked as 'leaf' objects in the initial generation)
    for (let i = 0; i < allBranches.length; i++) {
        const b = allBranches[i];
        if(b.targetLength === 1 && b.maxDepth === -2){ // Leaf placeholder check
            ctx.fillStyle = 'green';
            ctx.beginPath();
            ctx.arc(b.start.x, b.start.y, 2, 0, Math.PI * 2);
            ctx.fill();
        }
    }

    // Display counter
    const countElement = document.getElementById('branch-count');
    if (countElement) {
         countElement.textContent = `${totalBranches} branches observed`;
    }


    // Check for completion and restart
    let allFinished = true;
    for(let i=0; i < allBranches.length; i++){
        const b = allBranches[i];
        if(!b.isFinished){
            allFinished = false;
            break;
        }
    }

    if (allFinished && treeState.growing) {
        treeState.growing = false;
        setTimeout(() => {
             console.log("Tree finished growing. Restarting...");
             initializeCycle();
        }, 1500); // Pause for 1.5 seconds before restart
    }

    animationFrameId = requestAnimationFrame(animate);
}


function initializeCycle() {
    // Clear existing branches and state
    treeState.branches = [];
    treeState.growing = true;
    startTime = Date.now();

    const startX = W * 0.45;
    const startY = H - 50;
    const initialLength = Math.min(W, H) * 0.6;
    const initialAngle = -Math.PI / 2; // Pointing up

    // Generate structure (depth 8-10 is aggressive, let's stick to max depth 9 for performance/stability)
    let generatedBranches = generateTreeStructure(startX, startY, initialLength, initialAngle, 9);

    for(const b of generatedBranches){
        treeState.branches.push(b);
    }

    // Start animation if not already running
    if (!animationFrameId) {
        animate();
    }
}


// Initialize the UI and start the process
document.body.innerHTML = `<canvas id="c" style="display:block"></canvas><div id="branch-count" style="position:fixed;top:10px;left:10px;color:#fff;font-family:monospace;">Initializing...</div>`;

window.onload = initializeCycle;
</script></body></html>
```
deepseek-r1:14bERRBLANKFORMAT
Show code
```html
<!DOCTYPE html>
<html><title>Fractal Tree</title>
<head><style>canvas{border:1px solid #000; margin:20% auto;display:block}.count{position:absolute;top:20px;left:20px;color:#333}</style></head>
<body><canvas id=c width=800 height=600></canvas><div class=count>Branches: 0</div>
<script>
const canvas=document.getElementById('c'), ctx=canvas.getContext('2d'),
cWidth=canvas.width,cHeight=canvas.height,centerX=cWidth/2,startY=cHeight-100;
let angleOffset=0,count=0,maxDepth=8;

function fractal(x,y,angle,length,depth){
  if(depth>maxDepth)return;
  let newX=x+length*Math.cos(angle),newY=y+length*Math.sin(angle);
  ctx.beginPath();ctx.moveTo(x,y);ctx.lineTo(newX,newY);ctx.stroke();
  count++;
  if(depth<maxDepth-1){
    let leftAngle=angle+.2*(Math.random()+.5)+Math.sin(angleOffset)/4;
    fractal(newX,newY,leftAngle,length*.7,depth+1);
    let rightAngle=angle-.2*(Math.random()+.5)-Math.sin(angleOffset)/4;
    fractal(newX,newY,rightAngle,length*.7,depth+1);
  }
  if(depth==maxDepth){
    ctx.beginPath();
    ctx.arc(newX,newY,3,0,2*Math.PI);ctx.fill();
  }
}

function animate(timestamp){
  ctx.clearRect(0,0,cWidth,cHeight);
  if(count>=(Math.pow(2,maxDepth+1)-1)){
    ctx.fillStyle='#444'; ctx.font='20px Arial';
    ctx.fillText('Complete!',centerX-60,startY); 
    setTimeout(function(){location.reload()},1500);
    return;
  }
  angleOffset+=0.02;
  fractal(centerX,startY,Math.PI/2 + Math.sin(timestamp/300),100,0);
  document.querySelector('.count').textContent='Branches: '+count;
  requestAnimationFrame(animate);
}

fractal=centerX,startY,Math.PI/2,100,0; // Initial call
animate(); // Start animation
</script></body></html>
```
llama3.1:8bSTATFORMAT
Show code
```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Fractal Tree</title>
    <style>
        body {
            margin: 0;
            background-color: #f0f0f0;
        }
        canvas {
            border: 1px solid black;
        }
    </style>
</head>
<body>
<script>
    const canvas = document.createElement('canvas');
    canvas.width = 800;
    canvas.height = 600;
    document.body.appendChild(canvas);
    const ctx = canvas.getContext('2d');

    let treeDepth = Math.floor(Math.random() * 3) + 8;
    let wind = 0.1;

    function drawTree(x, y, angle, length, depth) {
        if (depth === 0) return;
        ctx.beginPath();
        ctx.lineWidth = 1 / (depth + 1);
        ctx.strokeStyle = `rgba(0, 0, 0, ${1 - (depth / treeDepth)})`;
        ctx.moveTo(x, y);
        let newAngle = angle + Math.random() * 2 - 1;
        let newX = x + length * Math.cos(newAngle);
        let newY = y + length * Math.sin(newAngle);
        ctx.lineTo(newX, newY);
        ctx.stroke();
        drawLeaf(newX, newY, length / 5, depth - 1);
        ctx.fillStyle = 'lime';
        ctx.fill();
        ctx.strokeStyle = `rgba(0, 0, 0, ${1 - (depth / treeDepth)})`;
        ctx.lineWidth = 1;
        let newX2 = x + length * Math.cos(newAngle + Math.PI / 4);
        let newY2 = y + length * Math.sin(newAngle + Math.PI / 4);
        ctx.lineTo(newX2, newY2);
        ctx.stroke();
        drawLeaf(newX2, newY2, length / 5, depth - 1);
        ctx.fillStyle = 'lime';
        ctx.fill();

        let newBranchLength = length * (Math.random() * 0.8 + 0.2);
        let newX3 = x + newBranchLength * Math.cos(angle);
        let newY3 = y + newBranchLength * Math.sin(angle);
        ctx.strokeStyle = `rgba(0, 0, 0, ${1 - (depth / treeDepth)})`;
        drawTree(newX3, newY3, angle, newBranchLength, depth - 1);

        let newX4 = x + length * Math.cos(newAngle + Math.PI / 2);
        let newY4 = y + length * Math.sin(newAngle + Math.PI / 2);
        ctx.strokeStyle = `rgba(0, 0, 0, ${1 - (depth / treeDepth)})`;
        drawTree(newX4, newY4, newAngle + Math.PI / 2, length, depth - 1);
    }

    function drawLeaf(x, y, r, depth) {
        ctx.beginPath();
        ctx.arc(x, y, r, 0, Math.PI * 2);
        ctx.fill();
    }

    let branchCount = 0;
    let startTime = performance.now();

    function animate() {
        const now = performance.now();
        if (now - startTime > 100) {
            treeDepth = Math.floor(Math.random() * 3) + 8;
            wind = 0.1;
            ctx.clearRect(0, 0, canvas.width, canvas.height);
            drawTree(canvas.width / 2, canvas.height - 10, Math.PI / 2, 100, treeDepth);
            branchCount = 0;
            startTime = now;
        } else {
            ctx.fillStyle = 'black';
            ctx.font = '24px Arial';
            ctx.textAlign = 'left';
            ctx.textBaseline = 'top';
            ctx.fillText(`Branches: ${branchCount}`, 10, 10);
            const angle = Math.PI / 2 + (Math.sin(now * 0.01) * wind);
            ctx.fillStyle = 'rgba(0, 0, 0, 1)';
            ctx.font = '24px Arial';
            ctx.textAlign = 'left';
            ctx.textBaseline = 'top';
            ctx.fillText(`Wind: ${wind.toFixed(2)}°`, 10, 40);

            let angleStep = (Math.PI / 4) * (now / 100);
            for (let i = -1; i <= treeDepth + 5; i++) {
                let j = Math.random() * 3;
                if (i >= 0 && i < treeDepth) {
                    branchCount++;
                }
                ctx.save();
                ctx.translate(canvas.width / 2, canvas.height - 10);
                ctx.rotate(angle + angleStep * i);
                ctx.beginPath();
                ctx.lineWidth = 1 / (Math.abs(i) + (treeDepth + 5));
                ctx.strokeStyle = `rgba(0, 0, 0, ${1 - ((i + j) / treeDepth)})`;
                ctx.moveTo(0, 0);
                let newX = Math.cos(angle * i) * 100;
                let newY = Math.sin(angle * i) * 100;
                ctx.lineTo(newX, newY);
                ctx.stroke();
                ctx.fillStyle = 'lime';
                if (i >= 0 && i < treeDepth) {
                    drawLeaf(newX, newY, 5, treeDepth - i);
                    ctx.fill();
                }

                let newX2 = Math.cos(angle * (i + j)) * 50;
                let newY2 = Math.sin(angle * (i + j)) * 50;
                if (i >= 0 && i < treeDepth) {
                    drawLeaf(newX2, newY2, 5, treeDepth - i);
                    ctx.fill();
                }
                ctx.restore();
            }

            requestAnimationFrame(animate);
        }
    }
    animate();
</script>
</body>
</html>
```
gemma4:26bharness
No answer reached us (ERR) — and the reason lies with our setup, not with the model: reasoning consumed the entire token budget (3 min 28 s, zero characters of answer); larger budgets are refused by the gateway Counted as a did-not-finish, but it is not evidence about this model.
qwen3:8bharness
No answer reached us (ERR) — and the reason lies with our setup, not with the model: reasoning consumed the entire token budget and the answer stayed empty; the gateway rejects budgets above 3000 tokens Counted as a did-not-finish, but it is not evidence about this model.
No usable answer reached the harness (ERR). Counted as a did-not-finish.
deepseek-r1:32bERRBLANKFORMAT
Show code
```html
<!DOCTYPE html><html><body style="background:#1a1a1a;display:flex;justify-content:center;align-items:center;height:100vh;margin:0"><canvas id="c" width=800 height=600></canvas><div id="count" style="position:absolute;top:20px;color:white;font-family:sans-serif"></div>
<script>
const c=document.getElementById('c'),ctx=c.getContext('2d'),countEl=document.getElementById('count');
let counter=0,wind=0,animId,depth=Math.floor(Math.random()*3)+8;

class Branch{
constructor(x,y,angle,length,left=null,right=null){
this.x=x;this.y=y;this.angle=angle;this.length=length;
this.left=left;this.right=right;
}
}

function init(){
ctx.fillStyle='#1a1a1a';ctx.fillRect(0,0,c.width,c.height);
counter=0;wind=0;
let trunkLength=Math.random()*20+30;
let rootX=c.width/2;rootY=c.height-50;
return createBranch(rootX,rootY,-Math.PI/2,trunkLength);
}

function createBranch(x,y,angle,length){
if(depth<=0||length<10)return null;
depth--;
let dx=length*Math.cos(angle);dy=length*Math.sin(angle);
let newX=x+dx;newY=y+dy;
let newAngle=angle+(Math.random()-0.5)*Math.PI/4;
let newLength=length*(Math.random()*0.6+0.4);
return new Branch(newX,newY,newAngle,newLength,
createBranch(newX,newY,newAngle-Math.PI/7,Math.max(length*0.7,10)),
createBranch(newX,newY,newAngle+Math.PI/7,Math.max(length*0.7,10)));
}

function growBranches(branches,current,i=0){
if(!branches[i]){i++;if(i<current.length)requestAnimationFrame(frame=>growBranches(current,i));return}
let b=branches[i];
ctx.beginPath();
ctx.moveTo(b.x,b.y);
ctx.lineTo(b.x+Math.cos(b.angle)*b.length,b.y+Math.sin(b.angle)*b.length);
ctx.stroke();
counter++;
countEl.textContent=`Branches: ${counter}`;
if(b.left||b.right)requestAnimationFrame(growBranches.bind(null,current.slice(i)));
else if(current[current.length-1]===b){
wind=0;
setTimeout(()=>{wind=Math.PI/8;},500);
}
}

function windSway(branches){
let time=Date.now()/200;
for(let b of branches){
b.angle+=Math.sin(time+wind)*0.04/(depth<3?1:2);
if(b.left)b.left.angle=b.angle+(Math.random()-0.5)*Math.PI/7;
if(b.right)b.right.angle=b.angle+(Math.random()-0.5)*Math.PI/7;
}
}

function drawTree(branches){
ctx.clearRect(0,0,c.width,c.height);
windSway(branches.map(b=>b));
drawBranches(branches);
}

function drawBranches(branches=[]){
for(let b of branches){
ctx.beginPath();
ctx.moveTo(b.x,b.y);
let dx=Math.cos(b.angle)*b.length;
let dy=Math.sin(b.angle)*b.length;
ctx.lineTo(b.x+dx,b.y+dy);
ctx.stroke();
if(b.left)drawBranches([b.left]);
if(b.right)drawBranches([b.right]);
}
}

function start(){
depth=Math.floor(Math.random()*3)+8;
const root=init();
const current=[root];
counter=current.length-1;
countEl.textContent=`Branches: 0`;
growBranches(current,current);
}

start();

requestAnimationFrame(function animate(t){
windSway(current);
drawTree(current);
animId=requestAnimationFrame(animate);
});
</script>
```
No usable answer reached the harness (ERR). Counted as a did-not-finish.
Outside the Brain cluster — same task, same character budget, collected through their own tooling (response times not comparable)
GPT-5.5 (Codex)frontier referenceOK
Show code
<!doctype html><html><head><meta charset=utf-8><title>Fractal Tree</title><style>html,body{margin:0;height:100%;overflow:hidden;background:#071018;color:#dfe;font:15px system-ui}canvas{display:block;width:100vw;height:100vh}.c{position:fixed;top:14px;left:16px;background:#0008;padding:7px 10px;border:1px solid #ffffff22;border-radius:6px}</style></head><body><canvas id=x></canvas><div class=c>Branches: <span id=n>0</span></div><script>
let c=x,g=c.getContext("2d"),N=n,W,H,D,all=[],tips=[],start=0,done=0,hold=0;
function R(a,b){return a+Math.random()*(b-a)}
function sz(){W=c.width=innerWidth*devicePixelRatio;H=c.height=innerHeight*devicePixelRatio;g.setTransform(1,0,0,1,0,0);g.scale(devicePixelRatio,devicePixelRatio);W=innerWidth;H=innerHeight}
onresize=sz;sz();
function make(){
 all=[];tips=[];done=0;hold=0;N.textContent=0;D=8+(Math.random()*3|0);
 let root={x:W/2,y:H-18,a:-Math.PI/2,l:H*R(.18,.24),d:D,p:-1,s:0};
 all.push(root);
 for(let i=0;i<all.length;i++){
  let b=all[i];if(!b.d){tips.push(i);continue}
  let k=b.d<3?Math.random()<.7?2:1:2+(Math.random()<.28),base=.64+.08*Math.random();
  for(let j=0;j<k;j++){
   let side=k==1?(Math.random()<.5?-1:1):j-(k-1)/2,ang=b.a+side*R(.28,.62)+R(-.13,.13);
   all.push({x:0,y:0,a:ang,l:b.l*R(base-.1,base+.08),d:b.d-1,p:i,s:all.length*80+R(0,100)});
  }
 }
 start=performance.now()
}
function pos(t){
 let P=[];for(let i=0;i<all.length;i++){let b=all[i],p=b.p<0?null:P[b.p],x=p?p.x2:b.x,y=p?p.y2:b.y,s=Math.sin(t*.0016+i*.7)*(.025+(.01*(D-b.d)));let a=b.a+s*wind(b,p),q=Math.min(1,Math.max(0,(t-start-b.s)/360));P[i]={x,y,x2:x+Math.cos(a)*b.l*q,y2:y+Math.sin(a)*b.l*q,q,a}}
 return P
}
function wind(b,p){return b.p<0?.35:(p?1.06:1)}
function draw(t){
 g.clearRect(0,0,W,H);
 let sky=g.createLinearGradient(0,0,0,H);sky.addColorStop(0,"#071018");sky.addColorStop(1,"#122016");g.fillStyle=sky;g.fillRect(0,0,W,H);
 let P=pos(t),cnt=0,complete=true;
 g.lineCap="round";
 for(let i=0;i<all.length;i++){
  let b=all[i],p=P[i];if(p.q>0)cnt++;if(p.q<1)complete=false;
  let w=Math.max(1,b.d*.72);g.strokeStyle=b.d>2?"#8b5a31":"#7b4b2b";g.lineWidth=w;
  g.beginPath();g.moveTo(p.x,p.y);g.lineTo(p.x2,p.y2);g.stroke()
 }
 for(let i of tips){let p=P[i];if(p.q>=1){let r=2.6+Math.sin(t*.005+i)*.7;g.fillStyle=i%3?"#8fd16a":"#e8a2b0";g.beginPath();g.arc(p.x2,p.y2,r,0,7);g.fill()}}
 N.textContent=cnt;
 if(complete){hold||(hold=t);if(t-hold>1500)make()}else hold=0;
 requestAnimationFrame(draw)
}
make();requestAnimationFrame(draw);
</script></body></html>
Results at a glance— every model in this round with score, response time and status.

Who wrote what

ModelBlind scoreLatencyStatus
qwen3:14b 42.2 sOK
mistral-small:24b 149.4 sOK
qwen3.5:9b 62.6 sOK
qwen3-coder:30b 31.0 sOK
deepseek-r1:14b 32.2 sOK
llama3.1:8b 112.6 sOK
gemma4:26b harness
qwen3:8b harness
command-r:35b DNF
deepseek-r1:32b 54.8 sOK
qwq:32b DNF