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
30:00Did Elon Musk's team "train the gay away"... and make Grok 4.7 worse?
Sep 26, 2026 · YouTube
19:21I Tested the Stealth "Space Bunny Alpha" Model Before It Went Offline
Sep 23, 2026 · YouTube
10:58So... how much better is Claude Opus 5.5 vs. GPT-6 Sol, really?
Sep 23, 2026 · YouTube
9:38Claude Opus 5.5... the BEST new model for coding!! 🤩
Sep 22, 2026 · YouTube
29:00Grok 4.7: improved, but GLM 5.3 FlashX beat it anyway (benchmark against Gemini, Sol, etc.)
Sep 22, 2026 · YouTube
You write simulations where the interesting behavior is supposed to emerge rather than be animated by hand.
Build me a single HTML page: a side-view escalator carrying 15 to 20 people. Then the escalator reverses, at high speed.
data: URIs are fine.localStorage, sessionStorage, cookies or indexedDB — sandboxed frame, they throw.html block.One paragraph, before the file: how a person is represented, what makes one lose balance, and what happens when two of them occupy the same place.
The single fenced html block.
Having written it, what does the page do when the escalator reverses? Name anything you special-cased or nudged. Say what it does badly — I am going to press the button and watch.
A person is a dynamic circle with position, velocity, orientation, and a state (standing, falling, down). While standing, the figure is kinematically braced to the moving escalator surface: it rides the step and leans away from acceleration. If the escalator’s acceleration along the incline pushes that lean past a fixed threshold, the figure loses balance and becomes a free-falling circle under gravity. When two figures occupy the same place, their circles resolve overlap by pushing apart along the collision normal and exchanging a damped impulse with friction, so a downed figure acts as a solid obstacle that others slide into or trip over. A downed figure stands up again only when the escalator is slow enough, it has stopped sliding, and no one is crowding its personal space.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Escalator Reversal</title>
<style>
body { margin: 0; background: #0b0c10; color: #c5c6c7; font-family: system-ui, -apple-system, sans-serif; display: flex; flex-direction: column; align-items: center; overflow: hidden; }
#ui { margin: 12px; display: flex; gap: 12px; align-items: center; }
button { padding: 8px 16px; font-size: 14px; cursor: pointer; background: #1f2833; color: #66fcf1; border: 1px solid #45a29e; border-radius: 4px; }
button.active { background: #45a29e; color: #0b0c10; }
canvas { display: block; background: #111; }
.hint { font-size: 12px; color: #888; margin-top: 6px; }
</style>
</head>
<body>
<div id="ui">
<button id="btn">REVERSE</button>
<span id="status">NORMAL</span>
</div>
<canvas id="c"></canvas>
<div class="hint">Click REVERSE to flip the escalator at high speed.</div>
<script>
const canvas = document.getElementById('c');
const ctx = canvas.getContext('2d');
const btn = document.getElementById('btn');
const status = document.getElementById('status');
function resize(){
canvas.width = innerWidth;
canvas.height = innerHeight;
}
window.addEventListener('resize', resize);
resize();
// --- Escalator geometry (continuous inclined surface; steps are drawn on top) ---
let start = { x: 0, y: 0 };
let end = { x: 0, y: 0 };
let T = { x: 1, y: 0 }; // unit vector up the escalator
let N = { x: 0, y: -1 }; // unit normal above the surface
let L = 0;
function updateGeometry(){
start.x = 140;
start.y = canvas.height - 100;
end.x = canvas.width - 140;
end.y = canvas.height - 520;
if(end.y < 100) end.y = 100;
const dx = end.x - start.x;
const dy = end.y - start.y;
L = Math.hypot(dx, dy);
T = { x: dx / L, y: dy / L };
// normal pointing above the surface (up-left in screen space)
N = { x: T.y, y: -T.x };
}
updateGeometry();
// --- Simulation parameters ---
const normalSpeed = 90; // px/s up
const reverseSpeed = -460; // px/s down (fast)
const accelRate = 1200; // px/s^2
const gravity = 1100;
const personRadius = 10;
const stepSpacing = 90;
const maxLean = 0.8;
const leanAccelScale = 0.0009;
let currentSpeed = normalSpeed;
let targetSpeed = normalSpeed;
let reversed = false;
btn.addEventListener('click', () => {
reversed = !reversed;
targetSpeed = reversed ? reverseSpeed : normalSpeed;
status.textContent = reversed ? 'REVERSING' : 'NORMAL';
btn.classList.toggle('active', reversed);
btn.textContent = reversed ? 'RESTORE' : 'REVERSE';
});
// --- People ---
const numPeople = 18;
let people = [];
function newPerson(){
return {
s: 0,
x: 0, y: 0,
vx: 0, vy: 0,
radius: personRadius,
state: 'standing', // standing | falling | down
lean: 0,
leanV: 0,
downTimer: 0,
fallTimer: 0,
color: `hsl(${Math.random()*360}, 75%, 60%)`,
};
}
function spawnPeople(){
people = [];
for(let i = 0; i < numPeople; i++){
const p = newPerson();
p.s = (i + 0.5) * (L / numPeople);
people.push(p);
}
}
spawnPeople();
function worldFromS(s){
const ss = Math.max(0, Math.min(L, s));
return { x: start.x + ss * T.x, y: start.y + ss * T.y };
}
function resolveCircleCircle(p, q){
const dx = q.x - p.x;
const dy = q.y - p.y;
const dist = Math.hypot(dx, dy);
const minDist = p.radius + q.radius;
if(dist < minDist && dist > 0){
const nx = dx / dist;
const ny = dy / dist;
const overlap = minDist - dist;
const move = overlap * 0.5;
p.x -= nx * move;
p.y -= ny * move;
q.x += nx * move;
q.y += ny * move;
const rvx = q.vx - p.vx;
const rvy = q.vy - p.vy;
const velNorm = rvx * nx + rvy * ny;
if(velNorm < 0){
const e = 0.15;
const j = -(1 + e) * velNorm / 2;
p.vx -= j * nx;
p.vy -= j * ny;
q.vx += j * nx;
q.vy += j * ny;
}
const tx = -ny;
const ty = nx;
const velTan = rvx * tx + rvy * ty;
const fric = 0.35;
const jt = -fric * velTan / 2;
p.vx -= jt * tx;
p.vy -= jt * ty;
q.vx += jt * tx;
q.vy += jt * ty;
}
}
const floorY = canvas.height - 40;
function collideSurface(p, dt){
// closest point on segment start->end
const dx = p.x - start.x;
const dy = p.y - start.y;
let t = dx * T.x + dy * T.y;
t = Math.max(0, Math.min(L, t));
const cx = start.x + t * T.x;
const cy = start.y + t * T.y;
const dist = (p.x - cx) * N.x + (p.y - cy) * N.y;
if(dist < p.radius){
const penetration = p.radius - dist;
p.x += N.x * penetration;
p.y += N.y * penetration;
const velNorm = p.vx * N.x + p.vy * N.y;
if(velNorm < 0){
p.vx = p.vx - velNorm * N.x;
p.vy = p.vy - velNorm * N.y;
// slight drag from moving step
p.vx += T.x * currentSpeed * 0.4 * dt;
p.vy += T.y * currentSpeed * 0.4 * dt;
p.vx *= 0.85;
p.vy *= 0.85;
}
return true;
}
return false;
}
let lastTime = performance.now();
function update(){
const now = performance.now();
let dt = (now - lastTime) / 1000;
lastTime = now;
dt = Math.min(dt, 0.05);
// drive escalator speed toward target
const diff = targetSpeed - currentSpeed;
currentSpeed += Math.sign(diff) * Math.min(Math.abs(diff), accelRate * dt);
for(const p of people){
if(p.state === 'standing'){
p.s += currentSpeed * dt;
if(p.s < 0 || p.s > L){
// fell off an end; respawn
p.s = Math.random() * L;
p.lean = 0;
p.leanV = 0;
}
const pos = worldFromS(p.s);
// balance: lean away from acceleration along the incline
const accel = dt > 0 ? diff / dt : 0;
const leanTarget = -Math.sign(accel) * Math.min(Math.abs(accel) * leanAccelScale, 1) * maxLean;
p.lean += (leanTarget - p.lean) * 0.15;
p.leanV += (0 - p.leanV) * 0.15;
if(Math.abs(p.lean) > maxLean * 0.92){
p.state = 'falling';
p.vx = T.x * currentSpeed + (Math.random() - 0.5) * 30;
p.vy = T.y * currentSpeed + (Math.random() - 0.5) * 30;
p.fallTimer = 0;
continue;
}
// snap to surface (braced)
p.x = pos.x + N.x * (p.radius + 2);
p.y = pos.y + N.y * (p.radius + 2);
p.vx = T.x * currentSpeed;
p.vy = T.y * currentSpeed;
}
else if(p.state === 'falling'){
p.vy += gravity * dt;
p.vx *= 0.99;
p.x += p.vx * dt;
p.y += p.vy * dt;
p.lean += p.leanV * dt;
p.leanV *= 0.92;
p.fallTimer += dt;
const onSurf = collideSurface(p, dt);
if(p.y + p.radius > floorY){
p.y = floorY - p.radius;
p.vy *= -0.25;
p.vx *= 0.5;
if(Math.abs(p.vx) < 4 && Math.abs(p.vy) < 4){
p.state = 'down';
p.downTimer = 0;
p.lean = 0;
}
}
else if(onSurf && p.fallTimer > 0.6 && Math.abs(p.vx) < 6 && Math.abs(p.vy) < 6){
p.state = 'down';
p.downTimer = 0;
p.lean = 0;
}
for(const q of people){
if(q === p) continue;
resolveCircleCircle(p, q);
}
}
else if(p.state === 'down'){
p.vx *= 0.92;
p.vy *= 0.92;
p.x += p.vx * dt;
p.y += p.vy * dt;
collideSurface(p, dt);
if(p.y + p.radius > floorY){
p.y = floorY - p.radius;
p.vy = 0;
}
for(const q of people){
if(q === p) continue;
resolveCircleCircle(p, q);
}
p.downTimer += dt;
const stable = Math.abs(currentSpeed) < 60;
let room = true;
for(const q of people){
if(q === p) continue;
const d = Math.hypot(q.x - p.x, q.y - p.y);
if(d < p.radius + q.radius + 22){ room = false; break; }
}
if(p.downTimer > 2.5 && stable && room){
p.state = 'standing';
p.lean = 0;
p.leanV = 0;
p.vx = 0;
p.vy = 0;
const dx = p.x - start.x;
const dy = p.y - start.y;
let ts = dx * T.x + dy * T.y;
ts = Math.max(0, Math.min(L, ts));
p.s = ts;
}
}
}
// light overlap pass so standing figures can't perfectly interpenetrate
for(let i = 0; i < people.length; i++){
for(let j = i + 1; j < people.length; j++){
resolveCircleCircle(people[i], people[j]);
}
}
}
function drawPerson(p, now){
ctx.save();
ctx.translate(p.x, p.y);
ctx.rotate(p.lean);
const r = p.radius;
ctx.fillStyle = p.color;
ctx.beginPath();
ctx.arc(0, 0, r, 0, Math.PI * 2);
ctx.fill();
ctx.strokeStyle = '#000';
ctx.lineWidth = 1.5;
ctx.stroke();
// head
ctx.fillStyle = '#222';
ctx.beginPath();
ctx.arc(0, -r - 7, 7, 0, Math.PI * 2);
ctx.fill();
ctx.strokeStyle = '#000';
ctx.stroke();
if(p.state === 'standing'){
ctx.strokeStyle = p.color;
ctx.lineWidth = 5;
ctx.lineCap = 'round';
ctx.beginPath();
ctx.moveTo(-5, 0); ctx.lineTo(-5, 15);
ctx.moveTo(5, 0); ctx.lineTo(5, 15);
ctx.stroke();
ctx.beginPath();
ctx.moveTo(-9, -3); ctx.lineTo(-16, 5);
ctx.moveTo(9, -3); ctx.lineTo(16, 5);
ctx.stroke();
} else {
const t = now * 0.008;
ctx.strokeStyle = p.color;
ctx.lineWidth = 4;
ctx.lineCap = 'round';
ctx.beginPath();
ctx.moveTo(0, 0); ctx.lineTo(Math.sin(t) * 14, Math.cos(t) * 14);
ctx.moveTo(0, 0); ctx.lineTo(Math.sin(t + 2) * 14, Math.cos(t + 2) * 14);
ctx.moveTo(0, 0); ctx.lineTo(Math.sin(t + 4) * 14, Math.cos(t + 4) * 14);
ctx.moveTo(0, 0); ctx.lineTo(Math.sin(t + 6) * 14, Math.cos(t + 6) * 14);
ctx.stroke();
}
ctx.restore();
}
function draw(){
ctx.clearRect(0, 0, canvas.width, canvas.height);
// side truss
ctx.strokeStyle = '#3a3f45';
ctx.lineWidth = 6;
ctx.beginPath();
ctx.moveTo(start.x, start.y);
ctx.lineTo(end.x, end.y);
ctx.stroke();
// steps (visual only; physics uses the continuous surface)
for(let s = 0; s < L; s += stepSpacing){
const pos = worldFromS(s);
const w = 100;
const h = 26;
ctx.fillStyle = '#5b626e';
ctx.fillRect(pos.x - w / 2, pos.y - h / 2, w, h);
ctx.strokeStyle = '#2a2e34';
ctx.lineWidth = 2;
ctx.beginPath();
ctx.moveTo(pos.x - w / 2, pos.y - h / 2);
ctx.lineTo(pos.x + w / 2, pos.y - h / 2);
ctx.stroke();
ctx.fillStyle = '#3a3f45';
ctx.fillRect(pos.x - w / 2, pos.y - h / 2, 6, h);
}
// floor
ctx.fillStyle = '#16181b';
ctx.fillRect(0, floorY, canvas.width, canvas.height - floorY);
const now = performance.now();
for(const p of people) drawPerson(p, now);
}
function loop(){
update();
draw();
requestAnimationFrame(loop);
}
requestAnimationFrame(loop);
</script>
</body>
</html>
Pressing REVERSE accelerates the escalator from a gentle upward crawl to a fast downward run. The sudden acceleration throws every standing figure past its lean threshold at roughly the same moment, so they tumble almost together—but each one falls because of its own acceleration, not because a timer told it to. Falling figures slide down the incline, collide with one another, and knock over anyone still braced on the steps. Downed figures lie on the surface and become obstacles, so arriving figures pile up against them at the bottom of the run. Pressing REVERSE again restores normal speed; once the escalator is slow enough and a downed figure has room, it stands up and snaps back to the surface.
Special-casing / nudges: the escalator physics uses a single continuous inclined surface while the steps are drawn as decoration on top; standing figures are kinematically snapped to that surface each frame (they are braced, not fully dynamic); figures that travel past the top or bottom end are respawned at a random position so the simulation never empties; and every figure uses the same balance threshold—no individual is scripted to fall.
What it does badly: standing figures are effectively immovable until they lose balance, so a falling person cannot shove a standing person over except through a weak overlap pass; because steps are decorative, falling figures can clip through step geometry visually; respawned figures teleport, which can look abrupt; and pile-ups are just circles stacking, so they sometimes look like a soft blob rather than a tangled crowd.