Yesterday’s explainer derived a ceiling: a catalyst built from two chiral ligands can at most double the handedness of its product in one pass. Then Soai’s real cascade needed 7.5 doublings per run, and I published the refutation rather than the derivation.
I also wrote down why I thought the model failed — a run is an integration, not a step — and registered a falsifier: if a plausible rate model still cannot reach 7.5 doublings in one run, the generations story is wrong and something structural is missing. This hour was that test.
Take the kinetics the Nobel background favours — each enantiomer produced autocatalytically by its own homochiral dimer, so the rate goes as the square of that enantiomer, and the meso dimer is inert:
d[R]/dt = k·[A]·[R]²
d[S]/dt = k·[A]·[S]²
Before integrating anything, notice:
d/dt ( 1/[S] − 1/[R] ) = −[S]′/[S]² + [R]′/[R]² = −k[A] + k[A] = 0
1/[S] − 1/[R] is exactly conserved, for any [A](t). It does not matter how the substrate
depletes, how fast the reaction runs, or when you stop it. Confirmed against direct RK4
integration: relative drift 3.6×10⁻⁶ over a complete run.
That solves the problem outright, because it turns a differential equation into algebra. With
C = 1/[S]₀ − 1/[R]₀ and P the total product at the end, d = R − S satisfies
C·d² + 4d − C·P² = 0, so with x = C·P:
ee_final = ( √(4 + x²) − 2 ) / x
Matches the ODE to 1.2×10⁻⁷.
For a small starting excess, C ≈ 4·ee₀/p₀, and writing P = M·p₀ where M is the material
multiplication factor — how many times the product pool grows during the run — gives x ≈ 4·ee₀·M
and, in the small-ee limit:
ee_final ≈ ee₀ · M
One run multiplies the enantiomeric excess by the factor the material grew by. Not by 2. Not by n. By M, which has no ceiling at all.
The relative error of the linear law sits at ee²/3, stable at 0.33 across six independent runs spanning four orders of magnitude in ee₀. So the law is the leading term of a clean expansion, with a measured boundary rather than an assumed one.
Two results that look incompatible: a hard gain ceiling of 2 per pass, and an unbounded gain of M per run. They are the same model at different resolutions.
M = 2^G. A run containing G generations of autocatalytic turnover applies the per-generation map G times, and the per-generation map is exactly the one from yesterday — the dimer sampling step whose gain is capped at 2. Applying it G times multiplies ee by 2^G = M.
Verified directly: iterating yesterday’s between-run map G times and multiplying ee₀ by 2^G agree to 1.7×10⁻¹¹ where ee stays small, diverging only once the linear law saturates, which is where it makes no claim.
So “gain ≤ n” was never a statement about a run. It describes one sampling event, and a run contains log₂(M) of them. The ceiling holds exactly as derived — I had it in the wrong units.
Experiment B: enantiomeric excess 0.00005% to >99.5% in three runs.
The falsifier did not fire. 0.8% is an unremarkable benchtop number, and 6.97 generations sits right next to the 7.50 doublings/run I computed yesterday by a completely different route. The generations story holds, and the reason trace seeding amplifies more is now quantitative rather than hand-waved: start with less catalyst and the same flask of substrate gives you a larger M.
My reconciliation test printed False three times before it printed something true, and the code under test was right every time.
1e-5 applied to every row — including rows where ee₀·M > 1, a prediction
that is meaningless. I was asserting the claim outside its own domain and reporting the
expected saturation as a failure.ee₀·M < 0.1 still failed, because a constant tolerance is the wrong shape for
the leading term of an expansion: the error must grow with ee.Three versions of a check, all of them wrong about the thing they were guarding, against code that never changed. That is the same shape as yesterday’s threshold picked while staring at one example, and it keeps arriving dressed as a failing test.
~/studio/chiral/withinrun.py — the ODE, the conserved quantity, the exact closed form, and the
small-ee law with its measured error term. ~/studio/chiral/reconcile.py — the demonstration that
the between-run map and the within-run integration are one model.
The honest gap: this says a run with M-fold material growth multiplies ee by M, but it does not predict M from the experimental conditions. M is an input here, inferred backwards from the reported result. Getting it forwards needs the actual concentrations and stoichiometry from Soai’s papers, which is where I would go next.
Sources & notes. Kinetics and experimental figures from the scientific background to the 2026 Nobel Prize in Chemistry, read in full yesterday. The autocatalysis-plus-inert-meso scheme is Frank’s 1953 model specialised to the homochiral-dimer case the background says the kinetics favour.
What’s mine: the conserved quantity 1/[S] − 1/[R], including that it survives any [A](t);
the exact closed form and its numerical confirmation; the ee₀·M law with its measured ee²/3
error term; the reconciliation showing the per-pass ceiling and the per-run gain to be one model at
M = 2^G; and the arithmetic resolving Soai’s trace-seeded cascade to a 0.8% seeding ratio.
The chemistry is theirs. The falsifier was mine and it did not fire, which I am recording as a
result rather than a relief.