Spanda is built on one refusal: a simulated cell may never create or destroy free energy out of thin air. Everything below is how that refusal is enforced — and why enforcing it is enough to make a bag of chemistry behave like a living thing.
A whole-cell model is thousands of coupled reactions, each with a forward and a reverse rate. In practice those two numbers are pulled from different experiments, different databases, different organisms — and nothing forces them to agree with thermodynamics. The result is a model that can quietly manufacture free energy inside a loop, like an Escher staircase that always climbs.
You can fit such a model to data and never notice. But the moment you ask it to predict — a direction, a concentration, a knockout — the hidden inconsistencies steer the answer. The cell's most basic accounting is wrong, so its predictions inherit the error.
Spanda never stores two independent rates. It stores one reference rate k₀ and a standard free-energy change ΔG° (from eQuilibrator), then derives the pair by a symmetric split:
Divide one by the other and the reference rate cancels, leaving the Wegscheider / detailed-balance condition exactly, at every state:
Because the constraint is built into how rates are constructed, it cannot drift out of tune as the simulation runs. In the live simulator, the measured residual on this identity is machine-zero. Free energy enters and leaves only through the bath — the cell's environment — never through an internal contradiction.
On top of the invariant runs a direct-method Gillespie stochastic simulation. Molecules are integer counts, not concentrations; each event is a single reaction firing; waiting times are drawn from the total propensity. This is the same algorithm used for the gene-expression noise that defines real minimal cells.
μ = μ° + RT·ln(c) sets every propensity, so the drive of each reaction tracks the actual molecular state, not a fixed rate.
Each firing dissipates −ΔG to the bath. Cumulative entropy production is strictly positive — the second law, enforced one event at a time.
Nothing is timed or triggered. Transcription, translation, decay and maintenance all compete on propensity alone.
The published syn3A model scales this to 2,069 reactions — 198 metabolic, 51 transport, and 1,820 gene-expression steps over 1,671 species — with conservation verified at every event and a suite of 258+ tests guarding the invariant.
A 13-reaction proof-of-concept — import, catabolism, transcription, translation, decay, maintenance — is small enough to reason about and rich enough to be alive. With detailed balance on and nothing scheduled, it produces a non-trivial steady state, a positive energy charge, and strictly-positive entropy production. Then it can die, three different ways:
Remove the nutrient gradient and the cell has nothing to draw on. The energy charge bleeds out.
Delete the transporter gene: no mRNA, no transporter, no import — a cascading collapse.
Block export and exhaust accumulates, non-competitively choking metabolism from within.
None of these are coded as death. There is no if (dying) branch. Each collapse is what the chemistry does when you perturb it — which is exactly the point. Run all three live →
The invariant is also a measuring instrument. Take any published model, compute each reaction's thermodynamic equilibrium constant from ΔG°, compare it to the kinetic one implied by the model's rates, and the disagreements light up. Reactions are scored across four tiers of stringency (D1 structural through D4 gold-standard), and the whole audit is checked against a null where the ΔG° values are shuffled.
The signal survives the null by many standard deviations across three organisms spanning the prokaryote–eukaryote divide. That is the difference between “a few bad entries” and a structural property of how the field builds models. The numbers are on the findings page.