"It needs more detail" was not a pixel problem. A molecule was a set of
atoms at whatever angles the storm left them — three circles near each
other, never a thing — and the room was a vacuum with objects in it.
VSEPR. Bond springs only ever fixed bond LENGTH. Angular springs now splay
the bonds around each atom as far apart as they can go, which is what
produces the famous silhouettes: water bent at 104.5, CO2 a straight bar,
methane a caltrop, a closed carbon ring a hexagon. Two bonds is where lone
pairs matter, so O/N/S carry an explicit `bend`; three or more is just even
angular spacing, which lands trigonal at 120 and the caltrop at 90 for free.
The springs are deliberately weak (ANGLE_SPRING is ~15% of BOND_SPRING) so
geometry loses to the storm, to a blast and to Molly's hands. A rigid
molecule that ignores being hit reads as fake instantly.
They also needed DAMPING, which was the real bug. Undamped, the mean angle
measured correct while water actually swung through a 61 degree range —
a broken hinge, not a molecule. Damping the tangential relative velocity
(as bondSprings already does radially) cuts the spread from sd 16.5 to 1.3.
Two measurement traps worth recording, since both nearly sent me the wrong
way: a single-frame angle reading is meaningless in a Brownian storm and
showed water at 58 degrees when its mean was 105; and starting a two-arm
molecule at exactly 180 degrees is a degenerate equilibrium where the cross
product vanishes and it cannot pick a side to fold toward, which looked
exactly like a systematic bias.
THE SOLVENT. 600 motes advected by the Coulomb field the sim already
computes. Deliberately NOT particles: no charge, no valence, no collisions,
nothing can touch them, so 600 cost 0.16ms where 116 real atoms cost ~5ms.
They carry what the atoms cannot — you see the field move before anything
charged does. Drawn under everything and never additive, because 600
additive motes would stack into a wash that eats the element hues and the
radicals' white.
13 new tests in test/geometry.test.mjs; 81 passing.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>