27:18Gemini 4 Hydrogen: Cheaper Tokens, More Expensive Answers?
Nov 13, 2026 · YouTube
18:40ERNIE 5.5 Flash Preview vs GLM 5.3 Flash: Baidu's new model is very impressive!
Nov 11, 2026 · YouTube
36:22Fable 5.2 robbing me blind, plus: Nex AGI's N2.6 vs GLM 5.3 Flash
Nov 11, 2026 · YouTube
14:03Gemini 4 Carbon: Can it handle my challenges? (First look with one-shot coding tests)
Nov 10, 2026 · YouTube
47:51Ranking major U.S. Open-Weights Models. (Where does Ripple 65B fit in?)
Nov 6, 2026 · YouTube
10:57"Crouton Alpha": the latest super-efficient coding model by Meta?
Nov 3, 2026 · YouTube
38:58Testing Particle-1: a post-trained DeepSeek V4.1 Flash specializing in coding and efficiency
Oct 28, 2026 · YouTube
22:14GPT-6.1 Terra Pro vs Terra: How Much Better Is Pro?
Oct 27, 2026 · YouTube
29:55Kimi K3.1 Pro Looked Incredible. Then I Kept Testing.
Oct 26, 2026 · YouTube
31:28Is this company reselling GPT Sol 6.1 at a loss (for non-agentic/text-only)?🤔 Is this sustainable?
Oct 20, 2026 · YouTube
17:58Nemotron 3.5 Super VL vs Opus 5.5: Testing NVIDIA’s new coding juggernaut
Oct 15, 2026 · YouTube
16:04Testing a *massive* new open-weights model 🤯: Muse Spark Open (vs. Nemotron, Opus 5.5, and more)
Oct 15, 2026 · YouTube
16:43Gemini 4 Argon: Great 🐈 Animation, but a broken escalator. (Coding challenge vs Opus 5.5, Sol 6.1)
Oct 13, 2026 · YouTube
16:37Meta's new "Muse Wonder" AI is impressive... but can it compete with Anthropic's models?
Oct 12, 2026 · YouTube
11:12WOW... Haiku 5.5 is very impressive. RIP OpenAI?
Oct 7, 2026 · YouTube
22:47Mistral Large 4 Is Cheap. But Is It Good Enough to Compete?
Oct 6, 2026 · YouTube
22:02Is Pareto 26.10 Preview Just Routing to GPT Sol? I Tested It Against Sol 6.1 Pro
Oct 1, 2026 · YouTube
11:22I Tested Sonnet 5.5 Against Opus 5.5. Is It Actually Cheaper?
Sep 28, 2026 · YouTube
You write simulations where the interesting behavior is supposed to come out of the dice rather than be animated by hand.
Build me a single HTML page: a Starbucks-style coffee shop running a bizarre promotion, simulated live.
data: URIs are fine.localStorage, sessionStorage, cookies or indexedDB — sandboxed frame, they throw.html block.One paragraph, before the file. Given your own timings — how long a customer stays inside holding a drink, how fast the counter serves — roughly how many customers should pass through between catastrophes? Show the working, not just the number.
The single fenced html block.
Having written it, what does the page do in its first few minutes? Name anything you tuned, special-cased or nudged. Say what it does badly — I am going to leave it running and watch the counters.
The counter serves one drink every 2 simulated seconds, and a customer stays inside holding it for 12 seconds, so a busy shop has six drink-holders at once. With (p=1/6), a normal-to-catastrophic crossing requires the new drink to be neon while exactly two of the preceding five are neon: (p\binom52p^2(1-p)^3 \approx 0.0268), or one crossing per 37 sales in an uninterrupted stream. Clearing the room after each catastrophe changes that estimate: the waiting-time recurrence (E(s)=1+(5/6)E(s0)+(1/6)E(s1)), retaining only the last five results and treating a third overlapping neon as terminal, gives about 50 customers between catastrophes from an empty room. That is roughly 100 simulated seconds of trading, plus the spectacle and rebuild. This is an average, not a deadline; long droughts and quick repeat disasters are both legitimate.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Starbuckle — The Unicorn Liability Simulator</title>
<style>
:root{color-scheme:dark;--bg:#071a17;--panel:#102923;--line:#29463c;--ink:#e9f5e9;--muted:#9db6a8;--lime:#d6ff80;--pink:#ff79d5}
*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--ink);font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}
main{max-width:1240px;margin:auto;padding:30px 24px 24px}
header{display:flex;justify-content:space-between;align-items:center;gap:20px;margin-bottom:24px}
.brand{display:flex;align-items:center;gap:15px}
.seal{width:58px;height:58px;border:2px solid var(--lime);border-radius:50%;display:grid;place-items:center;font-size:30px;color:var(--lime);outline:1px solid #456b4f;outline-offset:5px}
h1{margin:0;font-size:27px;letter-spacing:-1px}
.eyebrow{font-size:10px;letter-spacing:2.5px;font-weight:800;color:var(--lime);margin-bottom:5px}
.subtitle{margin-top:5px;color:var(--muted);font-size:12px}
.live{font-size:11px;border:1px solid var(--line);border-radius:30px;padding:10px 14px;white-space:nowrap;color:var(--muted)}
.live i{display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--lime);margin-right:8px;box-shadow:0 0 12px var(--lime)}
.stats{display:grid;grid-template-columns:repeat(5,1fr);gap:10px;margin-bottom:14px}
.stat{border:1px solid var(--line);background:var(--panel);padding:15px 17px;border-radius:12px}
.label{color:var(--muted);font-size:10px;text-transform:uppercase;letter-spacing:1.4px}
.value{font-size:29px;font-weight:750;font-variant-numeric:tabular-nums;letter-spacing:-1px;margin:5px 0 2px}
.small{font-size:11px;color:var(--muted)}
.pink{color:var(--pink)}.lime{color:var(--lime)}
.stage{position:relative;border:1px solid var(--line);border-radius:16px;overflow:hidden;background:#0b211d}
canvas{display:block;width:100%;aspect-ratio:1100/610}
.statusbar{display:flex;justify-content:space-between;gap:14px;align-items:center;padding:13px 18px;border-top:1px solid var(--line);font-size:12px;background:#102820;min-height:48px}
#status{color:var(--lime)}#occupancy{color:var(--muted);white-space:nowrap}
.controls{display:flex;gap:24px;align-items:center;flex-wrap:wrap;padding:18px 0}
button{background:var(--lime);color:#142519;border:0;border-radius:8px;padding:10px 17px;font-weight:800;cursor:pointer;min-width:100px}
button:hover{filter:brightness(1.1)}button:focus-visible,input:focus-visible{outline:3px solid var(--pink);outline-offset:4px}
.speed{display:flex;align-items:center;gap:14px;font-size:12px;flex:1;min-width:250px}
input{accent-color:var(--lime);width:min(280px,45vw)}
#speedText{font-weight:800;color:var(--lime);min-width:35px}
.micro{color:var(--muted);font-size:11px}
.bottom{display:grid;grid-template-columns:1.25fr 1fr;gap:15px}
.card{border:1px solid var(--line);border-radius:12px;padding:17px 19px;background:#0c221d}
h2{font-size:11px;letter-spacing:1.7px;text-transform:uppercase;margin:0 0 12px;color:var(--muted)}
#log{list-style:none;padding:0;margin:0;font:12px/1.85 ui-monospace,SFMono-Regular,Consolas,monospace;min-height:90px}
#log li{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#log li:first-child{color:var(--lime)}
.rules{font-size:12px;line-height:1.7;color:var(--muted)}
.rules b{color:var(--ink);font-weight:600}
footer{font-size:10px;color:#719082;display:flex;justify-content:space-between;gap:20px;margin-top:18px;line-height:1.6}
@media(max-width:750px){main{padding:20px 12px}header{align-items:flex-start}.live{display:none}h1{font-size:23px}.stats{grid-template-columns:repeat(3,1fr)}.stat{padding:11px}.value{font-size:24px}.bottom{grid-template-columns:1fr}.statusbar{font-size:10px;padding:10px;align-items:flex-start}.controls{gap:12px}footer{display:block}}
</style>
</head>
<body>
<main>
<header>
<div class="brand"><div class="seal" aria-hidden="true">✦</div><div>
<div class="eyebrow">A MONTE CARLO COFFEE EXPERIENCE</div>
<h1>STARBUCKLE</h1>
<div class="subtitle">Premium coffee. Uninsurable consequences.</div>
</div></div>
<div class="live"><i></i>LIVE · NO DISASTER SCHEDULE</div>
</header>
<section class="stats" aria-label="Live statistics">
<div class="stat"><div class="label">Drinks served</div><div class="value" id="served">0</div><div class="small">Everyone orders a Frappuccino.</div></div>
<div class="stat"><div class="label">Neon unicorns</div><div class="value pink" id="neons">0</div><div class="small">Rolled fresh at the counter.</div></div>
<div class="stat"><div class="label">Observed rate</div><div class="value" id="rate">—</div><div class="small">True rate: 1 / 6 = 16.67%</div></div>
<div class="stat"><div class="label">Catastrophes</div><div class="value pink" id="events">0</div><div class="small" id="average">No actuarial data yet.</div></div>
<div class="stat"><div class="label">Neon inside now</div><div class="value lime" id="holding">0 / 3</div><div class="small" id="risk">The premises are mostly normal.</div></div>
</section>
<div class="stage">
<canvas id="world" role="img" aria-label="Live geometric coffee shop simulation. Customers queue, buy drinks, and sometimes summon a dancing neon unicorn."></canvas>
<div class="statusbar"><span id="status">OPEN · Please do not combine the promotions.</span><span id="occupancy">Inside 0 / 8</span></div>
</div>
<div class="controls">
<button id="pause" type="button" aria-pressed="false">Ⅱ Pause</button>
<label class="speed" for="speed">Trading speed <input id="speed" type="range" min="0" max="6" value="1" step="1"><output id="speedText" for="speed">1×</output></label>
<div class="micro">Spectacles capped at 1.5×. Your liability deserves screen time.</div>
</div>
<div class="bottom">
<section class="card"><h2>The incident ledger</h2><ul id="log"></ul></section>
<section class="card"><h2>Promotion fine print</h2><div class="rules">
<b>One fair six-sided roll per drink.</b> A 6 makes neon. No pity system, hidden ramp, or scheduled apocalypse.<br>
<b>8 people maximum.</b> Counter: 2s/drink. Drink retention: 12s inside. Endless demand keeps the queue stocked.<br>
<b>1 neon:</b> aesthetic concern. <b>2:</b> structural concern. <b>3:</b> mythical zoning violation.
</div></section>
</div>
<footer><span id="extra">Trading time 0:00 · Evacuated 0 · Longest ordinary streak 0</span><span>Fictional brand. Actual probability. No storage, libraries, or network.</span></footer>
</main>
<script>
'use strict';
const canvas=document.getElementById('world'), ctx=canvas.getContext('2d');
const W=1100,H=610,STEP=1/60,SERVICE=120,HOLD=720;
const $=id=>document.getElementById(id);
const speeds=[.5,1,2,5,10,20,40];
let speed=1,paused=false,acc=0,last=performance.now(),visual=0;
let tick=0,nextSale=SERVICE,phase='open',eventAge=0,inside=[],queue=[];
let serial=0,served=0,neons=0,events=0,evacuated=0,ordinary=0,longest=0;
let lastEventSale=0,completedSales=0,lastRoll=null,rollAge=99,peak=0;
let shards=[],sparks=[],ledger=[],neonNow=0,uiClock=0,eventHue=300,eventNumber=0;
const seats=[[425,360],[525,360],[625,360],[725,360],[425,433],[525,433],[625,433],[725,433]];
const palette=['#d3dec2','#d2a47c','#8dc7ba','#a9acd8','#e3c985','#c78eac'];
const rand=(a,b)=>a+Math.random()*(b-a);
const mix=(a,b,t)=>a+(b-a)*t;
const clamp=(x,a,b)=>Math.max(a,Math.min(b,x));
const hue=(h,a=1)=>`hsla(${h},100%,65%,${a})`;
// Separate, unbiased integer dice. Cosmetics never touch this buffer.
// 2^32 is not divisible by 6; reject its final four integer values.
const diceBuffer=new Uint32Array(256);
let diceIndex=diceBuffer.length;
function d6(){
let n;
do{
if(diceIndex===diceBuffer.length){
crypto.getRandomValues(diceBuffer);
diceIndex=0;
}
n=diceBuffer[diceIndex++];
}while(n>=4294967292);
return 1+n%6;
}
function clock(){
const s=Math.floor(tick/60);
return Math.floor(s/60)+':'+String(s%60).padStart(2,'0');
}
function note(text){
ledger.unshift({time:clock(),text});
ledger=ledger.slice(0,4);
$('log').replaceChildren(...ledger.map(v=>{
const li=document.createElement('li');li.textContent=v.time+' '+v.text;return li;
}));
}
function person(){
return {id:++serial,x:25,y:540,color:palette[Math.floor(Math.random()*palette.length)],
born:0,servedAt:null,neon:false,seat:0,wiggle:rand(0,6.28)};
}
function queueSpot(i){return [285-(i%6)*43,410+Math.floor(i/6)*37];}
function stock(){
while(queue.length<18)queue.push(person());
}
function admit(){
while(inside.length<8){
const p=queue.shift();
p.x=337;p.y=411;p.born=tick;
inside.push(p);stock();
}
}
stock();
queue.forEach((p,i)=>{[p.x,p.y]=queueSpot(i);});
admit();
note('Doors open. Corporate has approved the dice.');
function catastrophe(){
// This is the only call site that can start a catastrophe:
// updateShop invokes it after counting actual, inside neon holders.
phase='event';eventAge=0;events++;eventNumber=events;
completedSales+=served-lastEventSale;
const interval=served-lastEventSale;lastEventSale=served;
eventHue=(events*67+260)%360;
evacuated+=inside.length;
for(const p of inside){
sparks.push({x:p.x,y:p.y,vx:rand(-280,280),vy:rand(-290,-80),
r:7,color:p.color,life:rand(1.2,2)});
}
inside=[];neonNow=0;
shards=[];
for(let i=0;i<85;i++){
const a=rand(-Math.PI,0),v=rand(90,480);
shards.push({x:rand(335,915),y:rand(152,470),vx:Math.cos(a)*v,vy:Math.sin(a)*v,
size:rand(8,27),spin:rand(-6,6),angle:rand(0,6),
color:i%4===0?hue(rand(0,360)):['#377858','#ded3a4','#204735'][i%3]});
}
note('EVENT #'+events+' · '+interval+' sales since last rebuild.');
}
function updateShop(){
tick++;
rollAge+=STEP;
// Expire drinks BEFORE serving on a shared boundary.
// Thus a 12s tenure / 2s cadence gives six holders, not seven.
inside=inside.filter(p=>p.servedAt===null||tick-p.servedAt<HOLD);
admit();
if(tick>=nextSale){
const p=inside.find(p=>p.servedAt===null);
if(p){
const used=new Set(inside.filter(q=>q.servedAt!==null).map(q=>q.seat));
p.seat=seats.findIndex((_,i)=>!used.has(i));
p.servedAt=tick;p.x=802;p.y=305;
lastRoll=d6();rollAge=0;
p.neon=lastRoll===6;
served++;
if(p.neon){neons++;ordinary=0;}else{ordinary++;longest=Math.max(longest,ordinary);}
}
nextSale=tick+SERVICE;
}
neonNow=inside.filter(p=>p.servedAt!==null&&p.neon).length;
peak=Math.max(peak,neonNow);
if(neonNow>=3){catastrophe();return;}
let waitingIndex=0;
for(const p of inside){
let tx,ty;
if(p.servedAt===null){
tx=802-waitingIndex*37;ty=305;waitingIndex++;
}else{
const age=tick-p.servedAt;
[tx,ty]=seats[p.seat];
if(age>HOLD-80){
const f=(age-(HOLD-80))/80;
tx=mix(tx,332,f);ty=mix(ty,411,f);
}
}
const f=1-Math.exp(-8*STEP);
p.x=mix(p.x,tx,f);p.y=mix(p.y,ty,f);
}
queue.forEach((p,i)=>{
const [x,y]=queueSpot(i);
p.x=mix(p.x,x,.055);p.y=mix(p.y,y,.055);
});
}
function rebuild(){
phase='open';eventAge=0;shards=[];sparks=[];
nextSale=tick+SERVICE;lastRoll=null;rollAge=99;
admit();
note(['Rebuilt. The waiver now has a waiver.',
'Reopened. “This was a limited-time feature.”',
'New roof. Same promotion. Excellent margins.',
'Insurance has left the group chat.'][events%4]);
}
function fit(){
const r=canvas.getBoundingClientRect(),d=Math.min(devicePixelRatio||1,2);
canvas.width=Math.round(r.width*d);canvas.height=Math.round(r.width*d*H/W);
}
window.addEventListener('resize',fit);fit();
function rect(x,y,w,h,c){ctx.fillStyle=c;ctx.fillRect(x,y,w,h);}
function round(x,y,w,h,r,c){
ctx.fillStyle=c;ctx.beginPath();ctx.roundRect(x,y,w,h,r);ctx.fill();
}
function circle(x,y,r,c){ctx.fillStyle=c;ctx.beginPath();ctx.arc(x,y,r,0,Math.PI*2);ctx.fill();}
function line(x1,y1,x2,y2,c,w=1){
ctx.strokeStyle=c;ctx.lineWidth=w;ctx.beginPath();ctx.moveTo(x1,y1);ctx.lineTo(x2,y2);ctx.stroke();
}
function text(s,x,y,size=12,c='#e6eedc',align='left',weight=500){
ctx.fillStyle=c;ctx.font=`${weight} ${size}px system-ui,sans-serif`;ctx.textAlign=align;ctx.fillText(s,x,y);
}
function poly(points,c){
ctx.fillStyle=c;ctx.beginPath();points.forEach((p,i)=>i?ctx.lineTo(...p):ctx.moveTo(...p));ctx.closePath();ctx.fill();
}
function cup(x,y,neon,scale=1){
ctx.save();ctx.translate(x,y);ctx.scale(scale,scale);
if(neon){ctx.shadowBlur=17;ctx.shadowColor=hue(visual*160);}
poly([[-5,-5],[5,-5],[3,6],[-3,6]],neon?hue(visual*140):'#e9dcbe');
rect(-6,-7,12,3,neon?'#fff5ff':'#d2b78a');
line(1,-7,3,-12,neon?'#ff73e1':'#396a50',2);
circle(0,0,2,neon?'#fff':'#276a4c');ctx.restore();
}
function drawPerson(p,outside=false){
const bob=Math.sin(visual*4+p.wiggle)*1.1;
circle(p.x,p.y+9,10,'#0004');
if(p.neon){
ctx.save();ctx.shadowBlur=22;ctx.shadowColor=hue(visual*100+p.id*31);
circle(p.x,p.y+bob,12,hue(visual*100+p.id*31,.5));ctx.restore();
}
circle(p.x,p.y+bob,8,p.color);
circle(p.x+2,p.y-2+bob,2,'#f4ffe6aa');
if(!outside&&p.servedAt!==null)cup(p.x+12,p.y+2+bob,p.neon);
}
function background(){
rect(0,0,W,H,'#0b211d');
// A restrained architectural grid.
for(let x=0;x<W;x+=40)line(x,0,x,H,'#244c331b');
for(let y=10;y<H;y+=40)line(0,y,W,y,'#244c331b');
text('THE PROMOTION',35,48,11,'#91ac94','left',800);
text('Buy a Frappuccino.',35,77,23,'#edf1dd','left',750);
text('Possibly breach reality.',35,102,18,'#a6beaa');
round(35,129,246,89,10,'#17372b');
text('⅙',54,179,39,'#d6ff80','left',700);
text('CHANCE PER DRINK',108,155,10,'#d6ff80','left',800);
text('Not per minute.',108,178,12,'#b3c9b5');
text('Not when it feels dramatic.',108,197,11,'#b3c9b5');
text('QUEUE / PERMANENT DEMAND',35,363,10,'#839f8c','left',700);
line(35,378,298,378,'#36513f');
for(let row=0;row<3;row++)line(65,424+row*37,300,424+row*37,'#223e30',2);
queue.forEach(p=>drawPerson(p,true));
text('UNLIMITED REFILLS OF POOR JUDGMENT',35,570,10,'#647e6c','left',600);
// Decorative trees: geometry only.
for(const [x,y] of [[994,209],[995,426]]){
rect(x-4,y,8,33,'#446247');circle(x,y-15,30,'#173f2c');circle(x-9,y-23,19,'#235638');
}
text('EXIT →',938,501,10,'#789f83','left',700);
}
function shop(){
const n=neonNow;
ctx.save();
if(n===2){
ctx.translate(Math.sin(visual*48)*2.8,Math.cos(visual*39)*1.8);
}
if(n){
ctx.shadowColor=hue(visual*(n===2?190:45));
ctx.shadowBlur=n===2?35+15*Math.sin(visual*13):15;
}
round(320,130,610,367,17,n===2?hue(visual*100,.23):'#183b2d');
ctx.shadowBlur=0;
round(331,143,588,339,8,'#b8c3a0');
rect(342,238,566,233,'#263e30');
for(let x=344;x<910;x+=48)line(x,240,x,470,'#47604755');
for(let y=242;y<480;y+=46)line(344,y,908,y,'#47604755');
round(341,150,568,76,6,'#075a3b');
circle(386,188,27,'#e0e8c9');
circle(386,188,23,'#075a3b');
text('✦',386,198,30,'#e0e8c9','center');
text('STARBUCKLE',430,183,25,'#eff3d8','left',850);
text('THE NEON UNICORN PROMOTION',432,207,10,'#c9e8b0','left',650);
text('OPEN*',870,190,13,n===2?hue(visual*300):'#d6ff80','right',800);
rect(753,247,136,39,'#9a7651');
rect(749,245,144,10,'#ddc7a0');
round(765,256,24,18,3,'#153d2c');
circle(825,263,9,'#6cae86');
text('BARISTA',823,239,9,'#e3e7c9','center',700);
text('1 ROLL / SALE',823,280,8,'#fff1d2','center',700);
// Service die, visible precisely where the roll happens.
round(944,258,122,111,9,'#13362b');
text('COUNTER DIE',1005,280,9,'#9cb7a2','center',700);
const neonRoll=lastRoll===6;
round(985,290,40,40,7,neonRoll?'#ff9ce3':'#e3e8cf');
if(lastRoll!==null){
const patterns={1:[[0,0]],2:[[-1,-1],[1,1]],3:[[-1,-1],[0,0],[1,1]],
4:[[-1,-1],[1,-1],[-1,1],[1,1]],
5:[[-1,-1],[1,-1],[-1,1],[1,1],[0,0]],
6:[[-1,-1],[1,-1],[-1,0],[1,0],[-1,1],[1,1]]};
for(const [x,y] of patterns[lastRoll])circle(1005+x*10,310+y*11,3,'#163c2e');
}else text('?',1005,319,25,'#163c2e','center',800);
text(lastRoll===null?'AWAITING SALE':neonRoll?'OH. SPARKLY.':'ORDINARY. GOOD.',1005,351,9,neonRoll?'#ff9ce3':'#a9c4ae','center',700);
// Tables behind seated customers.
for(const [x,y] of seats){
circle(x,y+8,20,'#0003');
circle(x,y,19,'#8d8d5e');circle(x,y,16,'#9a9969');
rect(x-11,y-1,8,3,'#ced0a5');
}
text('SIP · LINGER · QUESTION THE COLORS',620,465,8,'#9eaf8e','center',650);
// Front wall and the left-hand door.
rect(328,234,9,147,'#a9b890');rect(328,442,9,38,'#a9b890');
line(330,382,305,365,'#99cbae',4);
text('IN / OUT',311,458,8,'#b6c3a0','right');
inside.slice().sort((a,b)=>a.y-b.y).forEach(p=>drawPerson(p));
if(n){
ctx.globalCompositeOperation='screen';
rect(342,238,566,233,hue(visual*(n===2?120:30),n===2?.075+.05*Math.sin(visual*12):.03));
for(let i=0;i<n*9;i++){
const x=355+(i*61.7+visual*(i%2?18:-13)+10000)%535;
const y=260+(i*31.1+Math.sin(visual*2+i)*25+1000)%187;
circle(x,y,1.5+Math.sin(visual*4+i),hue(i*47+visual*80,.7));
}
ctx.globalCompositeOperation='source-over';
}
ctx.restore();
text('CAPACITY 8',915,119,10,'#9db8a0','right',700);
round(346,501,568,38,8,n===2?'#4d2948':n===1?'#253b38':'#143126');
const captions=['REALITY INTEGRITY: NOMINAL',
'1 NEON INSIDE · THE WALLS TASTE LIKE JAZZ',
'2 NEON INSIDE · THE BUILDING HAS DEVELOPED A PULSE'];
text(captions[n],630,525,11,n?'#ffb8ec':'#9cb797','center',700);
if(rollAge<.65){
const a=1-rollAge/.65;
text(lastRoll===6?'NEON!':'SALE +1',804,300-rollAge*45,13,lastRoll===6?hue(visual*200,a):`rgba(225,244,203,${a})`,'center',850);
}
}
function unicorn(t){
const bounce=Math.sin(t*9)*17;
ctx.save();ctx.translate(625,330+bounce);ctx.rotate(Math.sin(t*4)*.10);
const h=eventHue+t*95;
ctx.shadowColor=hue(h);ctx.shadowBlur=28;
// Tail: a fan of entirely unreasonable noodles.
for(let i=0;i<7;i++){
ctx.strokeStyle=hue(h+i*39);ctx.lineWidth=12;
ctx.beginPath();ctx.moveTo(-87,14);
ctx.bezierCurveTo(-145,-40+i*9,-125,80+Math.sin(t*7+i)*30,-190,40+i*9);
ctx.stroke();
}
// Four high-kicking legs.
for(let i=0;i<4;i++){
const x=-63+i*39,kick=Math.sin(t*9+i*Math.PI/1.5);
ctx.strokeStyle=hue(h+i*65);ctx.lineWidth=19;ctx.lineCap='round';
ctx.beginPath();ctx.moveTo(x,30);ctx.lineTo(x+kick*20,74);ctx.lineTo(x+kick*43,108-Math.abs(kick)*24);ctx.stroke();
circle(x+kick*43,108-Math.abs(kick)*24,12,'#f9fff0');
}
ctx.fillStyle=hue(h+35);ctx.beginPath();ctx.ellipse(0,8,102,53,0,0,Math.PI*2);ctx.fill();
poly([[40,0],[66,-102],[110,-93],[107,25]],hue(h+85));
for(let i=0;i<7;i++)poly([[65,-107+i*16],[39-Math.sin(t*8+i)*15,-97+i*17],[64,-80+i*15]],hue(h+i*50));
ctx.save();ctx.translate(94,-98);ctx.rotate(Math.sin(t*8)*.14);
round(-24,-28,87,49,20,hue(h+135));
poly([[-12,-20],[-15,-64],[11,-25]],hue(h+80));
poly([[17,-25],[39,-115],[37,-22]],'#fff5b0');
for(let i=0;i<5;i++)line(23+i*2,-38-i*12,38,-43-i*12,hue(h+i*70),3);
circle(21,-8,10,'#143429');circle(24,-11,3,'#fff');
// Sunglasses: catastrophe, but make it premium.
rect(0,-18,43,12,'#182c31');line(-6,-15,52,-15,'#eafffa',3);
line(43,9,54,7,'#46375b',3);
ctx.restore();
text('✦',-15,23,48,'#fff5dd','center',800);
ctx.restore();
ctx.lineCap='butt';
}
function eventScene(){
const t=eventAge;
const rebuilding=t>4.9;
// Former location of shop.
round(328,145,594,337,12,'#142c26');
for(let i=0;i<24;i++){
const a=i*Math.PI/12+t*.25;
ctx.save();ctx.translate(625,335);ctx.rotate(a);
poly([[0,0],[750,-30],[750,30]],hue(eventHue+i*23+t*65,.12+.06*Math.sin(t*9+i)));
ctx.restore();
}
for(let j=0;j<5;j++){
const r=((t*180+j*95)%650);
ctx.strokeStyle=hue(eventHue+j*55+t*90,(1-r/650)*.65);ctx.lineWidth=4;
ctx.beginPath();ctx.arc(625,333,r,0,Math.PI*2);ctx.stroke();
}
for(const s of shards){
const a=Math.min(t,3),x=s.x+s.vx*a,y=s.y+s.vy*a+170*a*a;
ctx.save();ctx.translate(x,Math.min(530,y));ctx.rotate(s.angle+s.spin*Math.min(a,2));
rect(-s.size/2,-s.size/2,s.size,s.size*.6,s.color);ctx.restore();
}
for(const s of sparks){
const a=Math.min(t,s.life);
circle(s.x+s.vx*a,Math.min(540,s.y+s.vy*a+180*a*a),s.r,s.color);
}
for(let i=0;i<100;i++){
const x=(i*83.71+t*(i%2?75:-55)+11000)%W;
const y=(i*41.37+t*(55+i%9*8))%H;
ctx.save();ctx.translate(x,y);ctx.rotate(t*3+i);
rect(-2,-5,4,10,hue(i*31+t*110));ctx.restore();
}
const scale=clamp(t/.5,0,1)*(rebuilding?clamp((6.2-t)/1.3,0,1):1);
ctx.save();ctx.translate(625,335);ctx.scale(scale,scale);ctx.translate(-625,-335);unicorn(t);ctx.restore();
if(t<.24)rect(0,0,W,H,`rgba(255,240,255,${(1-t/.24)*.8})`);
round(300,40,640,76,12,'#10172be8');
text('NEON Unicorn EVENT',620,73,31,hue(eventHue+t*130),'center',900);
text('3 NEON DRINKS. ZERO ADULT SUPERVISION.',620,99,11,'#fff0f5','center',800);
round(332,492,588,57,9,'#111e27ef');
const phrases=['THE CREATURE WOULD LIKE TO SPEAK TO YOUR MANAGER.',
'THE FLOOR IS LAVA. THE LAVA IS SEASONAL.',
'A NEW BEVERAGE SIZE HAS BEEN DISCOVERED: COSMIC.',
'CORPORATE DESCRIBES THIS AS “STRONG ENGAGEMENT.”'];
text(rebuilding?'REBUILDING WITH THE SAME FUNDAMENTAL DESIGN FLAW.':phrases[(eventNumber-1)%4],626,516,11,'#fff0ec','center',750);
if(rebuilding){
rect(368,530,516,5,'#35443f');
rect(368,530,516*clamp((t-4.9)/1.3,0,1),5,'#d6ff80');
}else text('Everyone evacuated. Drinks non-refundable.',626,536,11,'#fbb9e6','center');
}
function render(){
ctx.setTransform(canvas.width/W,0,0,canvas.height/H,0,0);
ctx.clearRect(0,0,W,H);
background();
if(phase==='open')shop();else eventScene();
if(paused){
round(438,552,225,34,8,'#061b16ee');
text('PAUSED · EVEN THE DICE WAIT',550,574,11,'#d6ff80','center',750);
}
}
function updateUI(){
$('served').textContent=served.toLocaleString();
$('neons').textContent=neons.toLocaleString();
$('rate').textContent=served?(100*neons/served).toFixed(2)+'%':'—';
$('events').textContent=events.toLocaleString();
$('average').textContent=events?(completedSales/events).toFixed(1)+' sales / completed cycle':'No actuarial data yet.';
$('holding').textContent=neonNow+' / 3';
$('risk').textContent=phase==='event'?'Room evacuated. Physics unavailable.':
['The premises are mostly normal.','A small, fragrant impossibility.','One more could void the lease.'][neonNow];
$('occupancy').textContent='Inside '+inside.length+' / 8 · Queue '+queue.length;
$('status').textContent=phase==='event'?'CLOSED · Mythical tenant in possession.':
['OPEN · Please do not combine the promotions.','OPEN · The wallpaper is quietly improvising.',
'OPEN?! · Two neon holders. This is not a drill.'][neonNow];
$('extra').textContent='Trading time '+clock()+' · Evacuated '+evacuated.toLocaleString()+
' · Longest ordinary streak '+longest+' · Sales since event '+(served-lastEventSale);
}
$('speed').addEventListener('input',e=>{
speed=speeds[+e.target.value];$('speedText').textContent=speed+'×';
});
$('pause').addEventListener('click',()=>{
paused=!paused;$('pause').textContent=paused?'▶ Resume':'Ⅱ Pause';
$('pause').setAttribute('aria-pressed',String(paused));
});
document.addEventListener('visibilitychange',()=>{
// No hidden-tab catch-up avalanche.
last=performance.now();acc=0;
});
function frame(now){
const dt=Math.min((now-last)/1000,.1);last=now;
if(!paused&&!document.hidden){
visual+=dt;
if(phase==='open'){
acc+=dt*speed;
while(acc>=STEP){
acc-=STEP;updateShop();
if(phase==='event'){acc=0;break;}
}
}else{
eventAge+=dt*Math.min(speed,1.5);
if(eventAge>=6.2)rebuild();
}
}
render();uiClock+=dt;
if(uiClock>.1){updateUI();uiClock=0;}
requestAnimationFrame(frame);
}
updateUI();requestAnimationFrame(frame);
</script>
</body>
</html>
The shop starts full, with no drinks yet. It makes its first sale after two simulated seconds and reaches its normal six-drink overlap after twelve. Ordinary customers linger just as long as neon customers. One neon adds a colorful wrongness; two shake the shop. A third overlapping neon immediately evacuates everyone, throws the building into debris, and produces a giant rainbow unicorn doing questionable choreography.
Tuned deliberately: permanent demand, a two-second service cadence, and twelve-second drink retention make overlap reasonably common. The die itself is untouched: independent cryptographic six-sided rolls, with rejection sampling to avoid modulo bias. There are no forced early events or drought corrections.
At 1×, expect roughly a catastrophe every couple of minutes on average, but the first few minutes may contain none or several. Faster trading shortens the wait; spectacle speed is capped so disasters remain watchable. Trading pauses during evacuation and rebuilding.
Limitations: movement is schematic, customers can overlap, the outside queue is automatically replenished rather than an arrival model, and rebuilding is an overlay followed by a fresh shop—not structural physics. Background tabs pause instead of catching up. The displayed sales-per-cycle average excludes the unfinished cycle, so it can look optimistic during a long current drought. The observed neon rate should tend toward 16.67%, not sit neatly on it.