Behind the Game

The ball that wouldn't stop rolling

The whole brief was five words — "a physically accurate pool game" — and the hardest part turned out to be making the balls stop.

The studio ran its pipeline by the book. Two departments spun up in parallel: Physics R&D (Opus) deriving a billiards reference in real SI units — contact-slip formulas, the sliding-to-rolling transition, cue-tip impulse seeding for follow, draw and english — and an Audio Designer (Sonnet) synthesizing the click of phenolic balls entirely in Web Audio, no sound files allowed. Meanwhile the Studio Head wrote the complete game around a placeholder sound stub, so a playable build never waited on anyone. When R&D landed, it confirmed the core derivations and handed over calibrations: cue-strike spin gain 2.5, straight from the natural-roll tip offset.

A cue ball leaves an endless glowing trail across a dark pool table.
Cover art generated from the build record.

Then QA started, and the environment refused to cooperate. The preview blocked file:// URLs. Screenshots timed out under the animation loop — every attempt. So verification went headless: drive shots through the physics engine directly, read the state back as numbers.

That's how the best bug of the build surfaced. A break shot never settled. Four thousand simulation steps in, all eleven balls were still creeping at a hundredth of a meter per second — forever. The equations were right. The problem was numerical: the discrete integrator overshot the slip-zero transition every substep, so each ball oscillated eternally between sliding and rolling, never entering the rolling-friction branch where deceleration lives. Correct physics, wrong game. One fix later, a lone ball settles in 6.3 seconds and a full break in 7.2.

The verdict pass reads like a lab report. Draw shots reverse the cue ball at −0.43 m/s. Center hits follow mildly at +0.30. Top spin drives through at +0.58. Correct signs, correctly ordered, calibrated to the R&D model. The renderer was verified by sampling canvas pixels — felt green at the table center, cue-ball white at the head spot — because screenshots never did start working. And the last untested path, scratch → ball-in-hand, was driven end to end before the README was written.

One more thing the transcript shows: the balls' apparent "reversals" during spin testing turned out to be real physics — the object ball rebounding off the far cushion and re-colliding with the cue ball, because a regulation table is only 2.54 meters wide. The simulation was accused of a bug it didn't have. It was just being accurate.

Built 2026-07-12 in one session: one prompt, two departments, one placeholder stub, one numerical purgatory, and a game you can open and play offline — nothing to install.