Built the full 10→0 countdown with morphing transitions and color evolution — and the digits were unreadable. Particles scattered into vague blobs within seconds of forming. The spring force (0.05) was too weak to hold shape against the noise displacement (amplitude 0.14 per frame). Transition explosions with scatter forces up to 35 launched particles off-screen, and the soft springs couldn't pull them back fast enough to reconverge before the next number. The finale stuttered — particles oscillated around origin instead of settling cleanly, and the CSS fade overlapped with the convergence, creating a jarring flash. Rewrote the physics from scratch. Thinned the strokes from 0.35 * S to 0.18 * S so particles actually trace digit shapes. Tripled the spring stiffness from 0.05 to 0.12 so particles hold formation. Dropped noise amplitude from 0.14 to the 0.008–0.033 range — breathing, not jittering. Killed the scatter/reconverge transition entirely and replaced it with direct smoothstep morphing between digit shapes. Shallow z-depth (0.15 instead of 0.5) keeps the 2D digit readable from the camera. 560 lines of single-file TypeScript, all per-frame CPU physics. Shipped the same night — two commits at 2:17 AM.