The Verification Venue · pointed at the oldest lie in grain physics
Four Contacts at the Jamming Point
Pour fifty soft circles into a box, relax them, count contacts, and you will conclude that jamming is close packing with extra steps. Every one of those small numbers is wrong in kind, not just in noise: it is dominated by boundary particles and by rattlers that carry no force. Grow the system and the scatter collapses onto a sharp onset whose intercept approaches the isostatic value, which for frictionless disks in two dimensions is exactly four.
The address of this page still carries its working title. The number it measures at jamming is four; six is what the planted crystal control shows, and the distance between those two numbers is most of the story below.
This page does not tell you that. It measures it, in your browser, with a compiled engine and a second slow implementation that must agree before anything is shown. The instrument below settles a real packing in the first seconds. The full sweep, when you launch it, relaxes thirty-nine packings across seven system sizes, from 48 grains to 3072, and fits the onset in front of you.
Fifty grains to a hundred thousand, logarithmic. Above a few hundred the settle animation steps aside and the engine alone does the work.
Same size, different randomness. Watch the contact number scatter at small sizes: that scatter is the small-system lie made visible.
Contact number z (rattlers out)
·
frictionless disks, 2d = 4 isostatic
z with rattlers in
·
· rattlers
Packing fraction φ
·
settling…
Engine agreement
·
compiled vs reference
The counting rule is where most published disagreement lives. A contact is any pair with positive overlap. A rattler is a particle with fewer than three contacts: it carries no load, and counting it drags z downward. The page always shows both numbers. The isostatic value itself needs no experiment: N frictionless disks have 2N degrees of freedom, each contact removes one, and mechanical stability therefore requires z ≥ 4, with equality exactly at jamming. Frictional grains have torques as well as forces, and a different count; nothing here says anything about them.
The full sweep · scattered small systems falling onto one curve
idle. 39 packings: seven sizes from 48 to 3072 grains, each compressed through its own ladder and relaxed at every rung.
Why exactly four · delete a contact and watch the packing fail
A jammed frictionless packing sits at the edge of redundancy: contacts exactly match degrees of freedom, so removing a single contact must create a floppy mode, a motion costing no energy. This is a packing at its own jamming point, computed by the reference implementation. Delete a contact and the lowest eigenvalue of the stiffness matrix collapses to zero; the corresponding motion is drawn. Restore it and the packing stiffens again.
Lowest eigenvalue λ
·
·
Contact number z
·
·
Highlighted on the canvas. Most cuts open a floppy mode; a packing slightly above jamming can absorb one.
The drawn motion is the actual eigenvector, oscillating at its own frequency, slowed to stay visible.
The second harder result · soft modes pile up as jamming approaches
The same stiffness matrix, counted at fixed frequency thresholds across the sweep's small systems, shows the excess of low-frequency modes growing as the packing nears its jamming point. A different measurable pointing at the same marginality.
The check · every number recomputed in front of you
Before any headline appears, the compiled engine and a slow, obvious JavaScript reference run the same battery of small packings and must agree bit for bit. The reference recounts contacts by brute force over all pairs and gets its spectrum by Jacobi diagonalisation, a genuinely different route from the engine's inertia counting.
| battery row | engine | reference | agree |
|---|
What none of this rules out: two decompositions agreeing rules out indexing and boundary errors and very little else, and the two implementations deliberately share the relaxation mathematics, so a shared misunderstanding of the protocol would pass every check on this page. That is not hypothetical here. A repair round on this piece found six errors that both implementations held in common and the battery therefore could not see, including a compression ladder that never compressed the box. Every one of them was caught by something that does not read the protocol: a planted lattice whose answer is 6 by construction, a translation that a stiffness matrix must annihilate exactly, and an eigenvalue count arrived at two different ways. The binary's reproducible build is an offline check: node research/six-contacts-at-the-jamming-point/verify-six-contacts-at-the-jamming-point.mjs.
What it cost
Operations (counted)
·
Wall time
·
Workers
·
vs main-thread JS
·
The protocol, exactly, and what is idealised
Exactly true. The isostatic count 2d = 4 for frictionless disks is a theorem of counting degrees of freedom against constraints. The planted configurations are exact: a triangular lattice of equal disks in contact has six contacts per particle by construction, a dilute gas has zero, and the unmodified pipeline must return both.
The protocol, stated. Radii uniform in [0.7, 1.3], rescaled to mean diameter 1. Positions uniform at φ = 0.30. Box shrunk affinely and multiplicatively: factor 1.08 per rung until the first converged rung with a load-bearing contact or until φ reaches 0.70, whichever comes first, then 1.005, capped at φ = 0.90, at most 80 rungs. Conjugate gradient at every rung to maximum per-grain force below 10⁻⁶. Contacts are overlaps; rattlers removed iteratively. Another compression schedule gives another critical fraction; this page's φ_J values belong to this schedule.
Why 10⁻⁶ and not something smaller. The line search decides by comparing two float64 energy sums, and near a minimum the smallest difference it can resolve is about ε·E·√ncontacts. A leftover force f costs only f²/2k of energy, so nothing below roughly √(2ε·E·√nc) is visible to the search at all. Measured on this engine, the residual plateaus near 5·10⁻⁹ at 384 grains and climbs as N3/4. That is the floor, not a choice, and 10⁻⁶ sits clear of it at every size here while remaining four decades below the overlaps a contact count turns on.
Idealised. Harmonic repulsion only. Two dimensions only. Frictionless only: the number 4 dies the moment grains can torque. Finite-size corrections are real and are the subject, not a nuisance. Unconverged rungs are excluded from fits and counted honestly.
Representative, not universal. The measured exponent and intercept carry this page's window, its point count and its scatter. They are measurements, not quotations.