Is Particle Life's condensation transition first-order? The ?world=hysteresis screen sweeps the mean-interaction shift μ up through condensation and back down and reports the loop width Δμ = μ_c↑ − μ_c↓ — but is the loop it shows real hysteresis (state memory), an artifact of the sweep schedule or the ½-crossing estimator, and how much of it is just finite sweep rate?
▶ Run this simulationRead how it works
Particle Life condensation hysteresis — hysteresis is memory, made operational: a MEMORYLESS variant of the module's own μ-sweep (identical seed, matrix, grid, instrument — the configuration merely re-prepared at every point) has loop width and loop area EXACTLY zero, bit for bit, on the module grid and on a perturbed schedule (the exact null; Ewing's definition), while the module's carry-over protocol — everything identical except the state is carried — opens a reproducible loop across 12 iid initial layouts of the SAME seed-7 matrix: area 0.0284 ± 0.0020 (14 SE > 0, all 12 positive) and Δμ = μ_c↑ − μ_c↓ = 0.0446 ± 0.0038 (11.7 SE — the condensate survives ~0.045 in μ below where it formed, the screen's Δμ ≈ 0.04), with the module's own single-run stream read on two certified clocks — sim-time mirror Δμ = 0.031 (z −1.05), engine-protocol certified screen Δμ = 0.058 (z +1.02) — both sitting inside that ensemble; slowing the sweep 8× (settle 2.5 s → 20 s, paired by layout) shrinks the area to 0.52× (4.9 SE, paired over 4 layouts) — the loop at the module's rate is substantially KINETIC (rate-dependent hysteresis), so a first-order classification is NOT claimed: whether a nonzero quasi-static loop survives stays open; the zero-coupling rival (attract ≡ 0, memory intact) never condenses — bound frozen at 0.481, no ½-crossing, loop area exactly 0 (separation unbounded): the hysteresis lives in the coupled system's carried state, not in the protocol, the settle smear, or the union-find ruler
Oracle mirrors the module's state machine headlessly (generator = ParticleLifeModule + ClusterMetricsModule + ParticleLifeHysteresisModule transcribed verbatim — the same instrument transcription the condense oracle calibrates on Gilbert's exact random-geometric-graph laws): μ grid [−0.6 … 0.35] up with carry-over, down from the second-from-top, settle 11/5 s, measure 3 s at ~2 Hz-equivalent sampling. The EXACT NULL re-prepares the configuration identically at every μ point, making both branches the same deterministic computation — loop ≡ 0 bit-exactly (known value 0, no statistical tolerance spent), and stays exactly 0 under a different grid and settle (schedule-independence). Against it: 12 iid layout replicas of the same seed-7 matrix (independent mulberry32 layout streams, matrix held fixed) give loop area and Δμ with SE; the module's own seed-7 stream is gated as one draw of that ensemble; sweep-rate dependence is a paired comparison (4 layouts × settle 2.5 s vs 20 s); rival = attract ≡ 0 with memory intact. Loop area (trapezoid over the 8 shared μ points) is the primary observable — it stays conditioned where the ½-crossing interpolation is not (flat branches near ½ blow up the crossing estimator; measured cross-seed sign flips at single-run noise).
Ewing's operational definition of hysteresis (1885): history-dependence of the response — with the state re-prepared at each control value, ascending and descending curves coincide; any loop must be carried by state memory. The exact null is deterministic by construction (that triviality is DISCLOSED — its force is the contrast: the identical machinery with only memory restored opens a ≥ 6 SE loop, and with only couplings deleted reads none, so schedule/estimator/instrument explanations are dead). The rate dependence reduces to kinetic hysteresis (Rao–Krishnamurthy–Pandit 1990: loop area varies with sweep rate in driven transitions); a persistent quasi-static loop would be Binder-1987 first-order metastability, and that classification is deliberately not claimed. Non-circular: no loop law, no crossing prediction and no known value appear in the generation path — the generator is the modules' code, the known value 0 is loaded only to score the null, and every carry-over number is measured with uncertainty.
HONEST-MODULE RUNG (refiner): module file untouched (sha d44ce792 pinned); the certificate machinery reuses the condense cert's harness on the same certified substrate + instrument, adding the hysteresis driver — the second substrate-MUTATING driver certified (setAttract edits at 17 pinned up/down state-machine transitions incl. the descend-from-second-from-top reversal). Tamper self-tests all exit 1 with clean tables, reference restored byte-identical: sha ⇒ gate L only; rulepl (pair-symmetric repulsion −1 → −0.9) ⇒ lockstep call 3 (px@0) with ALL 9 physics gates green (#155 4th confirmation — and the tampered screen Δμ 0.046 still sits at z 0.10 in the ensemble: the bit-pins do the catching, not the bracket); rulecm (MIN_SIZE 4 → 3) ⇒ QUADRUPLE catch (statics pin, lockstep call 1 cmLatest, display, closure); rulehy (descend from apex) ⇒ lockstep at exactly the predicted branch-reversal commit call 9369 (attract@0); known 0 → ±0.01 ⇒ the two null gates only, both directions. DISCLOSURES: (1) clock — the live browser's render cadence is wall-clock rAF (~60 fps), NOT deterministic; the pinnable screen is the engine protocol (render every call), whose Δμ 0.0581 differs from the 0.5 s sim-time mirror's 0.0307 by the gated #156 systematic; the browser value sits between the two certified clocks, and all of them are single draws of the ensemble whose mean 0.0446 ± 0.0038 is the finding. (2) A disclosed misfeature executed faithfully (#162 class, same as the condense sweep): the driver sets _lastT = −1 at each measure-window open, so the window's FIRST consumed cluster sample can be one ≤ 0.25 s-old settle-period reading (the code comment claims each reading counts once per window intent); certified bug-for-bug, candidate for a future module patch outside this cert. (3) The status-band constants 0.03/0.08 in render() are display classification only — token-scanned out of the measurement path (fixedUpdate → _cross → _deltaMu), and the L-gate digit scan confirms no finding value appears in the shipped code. (4) #157 prose fix: the worldCatalog 'against' line claimed 'Δμ>0 ⇒ first-order', contradicting this finding's own kinetic-loop result — now states that only a loop persisting at vanishing sweep rate would mean first-order (shared-file edit ⇒ smoke:all 108/108 green). Disclosed limits unchanged: per-matrix loop (crossing-based Δμ flips sign at seeds 8/9/13 — the seed-8 cert twin executes exactly that flip), quasi-static limit unmeasured — that plus a finite-size sweep is the natural next rung.
npm run derisk -- hysteresis (scripts/hysteresis-derisk.mjs — 14 gates. The 9 physics gates: exact null (bit-exact 0), null schedule-independence (bit-exact 0 on alt grid/settle), replica loop area ≥ 6 SE (measured 14), replica Δμ ≥ 6 SE in [0, 0.08] (measured 11.7), screen mirror within 3 replica-SD, kinetic narrowing ratio ≤ 0.8 at ≥ 3 SE paired, rival no-loop (|area| ≤ 0.01, no crossing; measured exactly 0), separation ≥ 4× (unbounded), determinism pin (rel 1e-12). The module-certificate gates L–P: shipped ParticleLifeModule + ClusterMetricsModule + ParticleLifeHysteresisModule sha-pinned, mechanically type-stripped, executed headlessly — answer-freedom census (both drivers frozen-init, instrument genome-blind, setAttract the driver's only mutation channel, no loop digits, no listeners), executed seed-7 default boot bit== an independent replica, 17280-call fl(1/120) engine-protocol lockstep (state + live-mutated matrix + sweep machine + instrument + panels bit-exact every call; 17 measure windows opened/committed at pinned executed fl-sum crossings incl. the branch reversal; the replica's instrument IS the oracle's own measureSample, so the lockstep doubles as a live closure on all 576 dynamically generated configs), display reconciliation (certified final screen 'done · Δμ +0.058 · narrow loop · grid-limited' + seed-8 sign-flip motion twin), shipped _deltaMu executed on the oracle's mirror points Object.is== the oracle's own cross(), #156 protocol-clock systematic measured + gated, dt twins (budget-3 clamp + overflow reset live). ~2 min (25 sweep loops + 2×17280-call lockstep runs). npm run derisk -- hysteresis)scripts/oracles/hysteresis.reference.jsonJ. A. Ewing, Phil. Trans. R. Soc. 176, 523 (1885) — hysteresis defined as history-lag. K. Binder, Rep. Prog. Phys. 50, 783 (1987) — first-order transitions, metastability, quasi-static hysteresis. M. Rao, H. R. Krishnamurthy & R. Pandit, Phys. Rev. B 42, 856 (1990) — rate-dependent hysteresis loop area in driven model systems. Instrument calibration: the condense oracle (Gilbert 1961). The Δμ ≈ 0.04 the screen documents is this lab's own open measurement, here given an uncertainty (0.0446 ± 0.0038 for the seed-7 matrix) and a rate-dependence caveat.