protocell-genesis: verification report (Stage C, gate 6)

Generated 2026-09-28T01:36:46.095Z, commit 658bc4604ce19e827f78de6d95a69228448c5767 (the working tree was not clean at generation time: these artifacts were generated before the commit that contains them; the commit shown is the last real one, not the one that packages this file), run a5939a30-86e4-444b-9b93-8d4224b4005b (the same identifier is stamped on gates.json and kappa-measurement.json; a mismatch would mean the artifacts come from different runs).

gatevaluecorridorrankverdictwhere the number comes fromsourceconditions
Area per lipid
area-per-lipid
1.2004 sigma^2 1.1 – 1.5 sigma^2 A passed measured by this run (verify/run.ts) Cooke & Deserno 2005, arXiv:cond-mat/0509218 kT/eps = 1.1, w_c = 1.6 sigma, zero tension
Bilayer thickness
bilayer-thickness
4.4545 sigma 4 – 6 sigma A passed measured by this run (verify/run.ts) Cooke & Deserno 2005, arXiv:cond-mat/0509218 from the maxima of the head-bead density
Bending modulus
bending-modulus
— 5 – 50 kT A unproven measured by this run (verify/run.ts) Cooke & Deserno 2005, arXiv:cond-mat/0509218 from the undulation spectrum; the fit window in q is chosen from the data (it grows from the smallest |q| shell while the log-log slope stays within ±1 of -4, with at least 4 independent shells), not by a fixed cap of 8 modes; in this run the window came out at 4 shells up to q_max ≈ 0.18
Area per lipid in explicit water
area-per-lipid-water
1.1734 sigma^2 1.1 – 1.5 sigma^2 C passed verify/out/water-bilayer-area-move.json (tests/water-bilayer-area-move.test.ts, measured 2026-08-23T09:42:01.057Z): 400 lipids + 4500 water beads at 0.8 sigma^-3, N=5700, settled=true, 300 samples, ln A drift -2.722e-6 (t=-0.71) corridor: Cooke & Deserno 2005, arXiv:cond-mat/0509218 (the same corridor as the solvent-free gate); medium: pair-depth ratios derived from martini_v2.1.itp (Marrink et al., The MARTINI Force Field, J. Phys. Chem. B 2007, 111, 7812), task 'hydrophobic-asymmetry', remeasured by task 'final-campaign' §3 A new result of this campaign: the same quantity as the area-per-lipid gate, but measured in liquid explicit water at 0.8 sigma^-3 (4500 beads) around a patch of 400 lipids with 2-bead tails, seed 31, kT from data/params.json, with an area move at zero tension (Metropolis, 10 attempts per 500 MD steps, a window of 150 samples, a settling criterion based on the drift of block means of ln A). The area here is measured, not set by construction: before task 'hydrophobic-asymmetry' it was an assumed 1.3 sigma^2 in water, and the patch then gave 12.2-12.4 sigma against a corridor of 4-6 (broth-composition-report.md §4, water-calibration-report.md). Rank C, not A: the corridor is from the literature (rank A), but the number itself is obtained in a medium whose pair-depth ratios are taken from another force field and are not calibrated on this tree (rank C), and the multiplier epsilonScale=1.0 carries rank D.
Bilayer thickness in explicit water
bilayer-thickness-water
4.4689 sigma 4 – 6 sigma C passed verify/out/water-bilayer-area-move.json (tests/water-bilayer-area-move.test.ts, measured 2026-08-23T09:42:01.057Z): 400 lipids + 4500 water beads at 0.8 sigma^-3, N=5700, settled=true, 300 samples, ln A drift -2.722e-6 (t=-0.71) corridor: Cooke & Deserno 2005, arXiv:cond-mat/0509218; medium: martini_v2.1.itp (Marrink et al., J. Phys. Chem. B 2007, 111, 7812); task 'hydrophobic-asymmetry', remeasured by task 'final-campaign' §3 from the maxima of the head-bead density, in the same run as area-per-lipid-water (the same 400 lipids, the same water at 0.8 sigma^-3, the same area move). Diagnostics of the same run are published alongside: the fraction of buried heads and the number of water beads in the core; it was these, not the thickness, that showed the mechanism of the earlier failure (head burial 0.40-0.49 with no lateral cohesion of the leaflet). Rank C for the same reason as area-per-lipid-water.
Closure: encapsulated water against the threshold
vesicle-closure-water
0.0000 fraction of threshold > 1 fraction of threshold B failed verify/out/gates-campaign-trace.json (tests/continuous-run-audit.test.ts, off-GPU from the campaign checkpoints, measured 2026-08-20T23:38:12.000Z), step 148200: 0 water beads encapsulated against a threshold of 315.409 (bulk water density 0.8505 sigma^-3 x minimum closed volume 370.8656 sigma^3), closed=false; checkpoints with a reliable centre: 25 of 27 wet ones, and on each of them 0 were encapsulated criterion: a closed vesicle must hold solvent that the bulk cannot reach from outside; periodic flood fill from outside, soup/src/water-closure.ts (method checked by task 'periodic-measurement'). The threshold is computed on the same checkpoint: the minimum closed volume 370.8656 sigma^3 (this same closure gate, derived from the measured bilayer thickness, gate bilayer-thickness, rank A) multiplied by the bulk water number density measured on the same checkpoint. final-campaign-report.md §7.1 Published as the ratio of the measured number of encapsulated water beads to the threshold, because the threshold itself is recomputed on every checkpoint from the live bulk density (measured at 317.1-320.9 beads over the campaign), so this file cannot hold a fixed number for it. Rank B (computed): the threshold is derived from a rank-A gate through geometry, not imported. This gate fails, and this is the project's main negative result: encapsulated water is exactly zero on every campaign checkpoint where the periodic centre of the aggregate is reliable, closed=false everywhere. Separately, and stated plainly: on 9 of 15 wet checkpoints water-closure.ts refuses to answer (the centre is unreliable when the extent of the object is comparable to the box); the refusal itself is an independent indicator of the same fact that the aggregate-percolation gate measures.
Largest aggregate is a finite object, not a network across the whole box
aggregate-percolation
3.0000 axes of 3 < 0 axes of 3 B failed verify/out/gates-percolation.json (tests/percolation-check.test.ts, off-GPU from the campaign checkpoints, measured 2026-08-20T23:38:12.000Z): 23 campaign checkpoints, wrapping axes 3/3/3/3/3/3/3/3/3/3/3/3/3/3/3/3/3/3/3/3/3/3/3, slabs touched 27/27/27/27 at step 41100; controls (objects the project calls finite): dec54-step41400.json=0, dec54-step174400.json=0, swB54-step144400.json=3 the standard wrapping-cluster criterion: the aggregate is replicated once along an axis at +L with that axis made open, pairs are connected by the same connectivity radius as everywhere else in the project, and the question is whether a particle falls into one component with its own image. No threshold is introduced: a finite object has 0 such axes by definition. tests/percolation-check.test.ts, final-campaign-report.md §6 Rank B (computed from the project's own quantities, with no imported constant). This gate fails, and this is the binding constraint the project found: the object wraps the box along 3 axes of 3 and touches all 19 of 19 slabs of connectivity-radius width along each axis, on all 5 wet checkpoints covering 135000 settled steps. An object stretched across a periodic box has neither an "inside" nor an "outside": it cannot enclose anything, however large it is. The tool discriminates: on three independent systems that the project calls finite rods (the decisive run at steps 41400 and 174400, arm A) it gives 0 axes of 3, and its own internal control (a deliberately compact one-slab subset) does not wrap on any checkpoint.
Project outcome: a self-assembled closed vesicle
vesicle-verdict
0.0000 aggregates > 1 aggregates A failed verify/out/gates-campaign-trace.json (measured 2026-08-20T23:38:12.000Z): 29 checkpoints, hasVesicleAggregate=false on all of them; last wet checkpoint: step 148200, 4 aggregates, largest 4512 amphiphiles, radial head shells 2, cavity 139.25 sigma^3 against a threshold of 370.8656 sigma^3 measured by the project's own stage recogniser (soup/src/aggregates.ts hasVesicleAggregate: closure by encapsulated water and two radial head shells and a cavity of at least 370.8656 sigma^3) on every checkpoint of every campaign; the last and largest: box 54 sigma, N=191778, 176400 steps, liquid water 0.79999 sigma^-3, one drying event. final-campaign-report.md §0, §7, §8 Failed: not a single vesicular aggregate on any checkpoint of any campaign. The binding constraint is named, and it is not what stopped the earlier runs: supply (2.10x over the threshold) and aggregate size (2087.2 against a threshold of 1004, that is 2.08x above it, for the first time in the project) are ruled out by measurement, and the edge energy at this size is ruled out too (0.583 kT per molecule against a competitiveness threshold of ~1 kT). What stops it is connectivity, the aggregate-percolation gate: the object wraps the box along all three axes. Everything else is downstream: 1 radial head shell instead of 2 (that is, there is no bilayer wall at all), a cavity of 50.5 +- 1.6 sigma^3 against 370.8656 (7.3 times smaller), flatness 0.65-0.81 against <= 0.35 for a lamellar object.
Chain-length distribution: agreement with ASF (gate 2 of the specification)
chain-length-asf
0.1594 - no corridor (accepted only through other gates) D unproven verify/out/gates-campaign-trace.json (measured 2026-08-20T23:38:12.000Z), step 148200: alpha_ev=0.7477, ASF mean 1/(1-alpha_ev)=3.964, measured mean per tail=3.419, alpha recovered from the histogram=0.7648 (r^2=0.918) the Anderson-Schulz-Flory framework for chain growth on a catalyst: van der Laan & Beenackers, Kinetics and selectivity of the Fischer-Tropsch synthesis: a literature review, Catal. Rev. Sci. Eng. 41 (1999) 255-318; specification section 8, gate 2. Implementation: soup/src/equilibrium.ts (asfPrediction, recoverAlphaFromChainLengths) The published number is the relative deviation of the ASF mean 1/(1-alpha_ev), computed from the event ratio alpha_ev = cc_bond/(cc_bond+co_bond) with not a single fitted parameter, from the measured mean number of beads per tail. Both alphas are published alongside: the event one and the one recovered from the length histogram itself (recoverAlphaFromChainLengths), together with the r^2 of its log-linear fit: two independent estimates of one quantity. Unproven, and the reason is stated directly: the specification phrases the criterion of this gate as "histogram mismatch" without giving a numeric corridor, and no independent literature corridor exists for the alpha of this particular system, so the gate carries rank D and, by rule 1 of verify/gates.ts, comes out unproven at any value. The shape of the distribution is nevertheless geometric, which is the signature of ASF.
Mean number of beads per tail
mean-tail-length
3.4190 beads 2 – 3 beads D unproven verify/out/gates-campaign-trace.json (measured 2026-08-20T23:38:12.000Z), step 148200: alpha_ev=0.7477, ASF mean 1/(1-alpha_ev)=3.964, measured mean per tail=3.419, alpha recovered from the histogram=0.7648 (r^2=0.918) our mapping "number of carbon atoms -> number of beads" (specification section 4: C8 -> 2, C12 -> 3, C16 -> 4), so the window of 2-3 beads corresponds to the range C8-C12; the mapping gate itself is chain-to-bead-mapping, rank D Rank D and therefore unproven by rule 1 of verify/gates.ts, exactly like the chain-to-bead-mapping gate, through which alone this mapping is accepted (through the area and thickness gates, not directly). The number is published because it is measured, and because it is more honest to show it with the window than to hide it: if this mapping carried an independent corridor, a value above 3 would read as a failure. In the campaign the tail length grows over the course of the run at fixed composition (measured 2.845 -> 3.490 over 135000 steps), so this is a trend rather than a single figure, and in this model "second tail" and "tail length" cannot be separated by composition: the head here is the chain terminator.
Closed cavity
closure
1284.8750 sigma^3 > 370.8656 sigma^3 D unproven measured by this run (verify/run.ts) the outside flood-fill detector is checked on a synthetic test shell (a ball of beads built by hand in verify/run.ts); the engine has not yet shown a self-assembled closed vesicle; specification section 7 grid 0.5 sigma, bead radius 0.6 sigma. Corrected (was min:1): 1 read as "there is at least one unfilled grid cell", a technical check of the flood fill itself, not a physical vesicle criterion. A live run (36000 steps, standard broth, 548 recognised amphiphiles) gave enclosedVolume=1.1250; at cell=0.5σ that is exactly 9 cells (1.125/0.5³=9), a pocket between a few beads, not the interior of a membrane, and the old threshold of 1 declared it a vesicle. The new threshold is the volume of a ball whose radius exceeds the bilayer thickness t≈4.457σ measured in this same code tree (verify/out/gates.json, gate bilayer-thickness, Cooke & Deserno 2005 calibration, see also data/soup.json's startBasis): a cavity smaller than such a ball physically cannot be the interior of a vesicle, because the membrane that must wrap around it is itself thicker than that cavity. min = (4/3)·π·t³ = (4/3)·π·4.457³ ≈ 370.8656 σ³, about 330 times more than the nine cells the old threshold took for a vesicle. data/soup.json's stageThresholds.enclosedVolume (the stage ladder) must use the same threshold; soup/src/stages.ts's loadStageThresholds() reads this value from this file and throws if the numbers differ, rather than relying on two manually synchronised copies. Rank D is kept: this is a physically justified threshold of the detector itself, not a measured property of a self-assembled vesicle (see verify/gates.ts's rule 1).
Correspondence between the number of carbon atoms and the number of beads
chain-to-bead-mapping
3.0000 - no corridor (accepted only through other gates) D unproven measured by this run (verify/run.ts) our assumption, specification section 7 accepted only through the area and thickness gates

Bending modulus κ: why "unproven"

The bending mode relaxes at a rate of order q⁻³…q⁻⁴, so the fit needs precisely the slowest, least converged q shells. The shells that the fit window requires show a spread of 5.5–35.1% between modes that lattice symmetry requires to coincide: direct, reference-free evidence that these shells have not converged yet.

slope of the log-log fit-0.6882
number of modes in the fit window20
number of shells in the fit window4
q_max of the window0.1803
window validno
q, σ⁻¹degeneracy⟨|h_q|²⟩spread between degenerate modesin fit window
0.080643.020e-235.1%yes
0.114041.172e-25.5%yes
0.161241.038e-214.4%yes
0.180381.681e-243.5%no
0.228043.969e-326.0%no
0.241841.901e-325.1%no
0.254984.456e-380.3%no
0.290781.810e-333.0%no
0.322541.414e-315.0%no
0.332486.026e-438.2%no
0.342041.865e-314.0%no
0.360587.062e-430.2%no
0.4031124.718e-427.9%no
0.411184.049e-46.8%no
0.434183.842e-430.6%no
0.456042.484e-432.9%no
0.470182.507e-414.5%no
0.483743.091e-42.4%no
0.490482.107e-427.5%no
0.509881.857e-422.5%no
0.516282.003e-424.7%no
0.540881.549e-49.1%no
0.564341.623e-412.4%no
0.5700121.284e-414.8%no
0.581381.458e-422.3%no
0.586981.237e-49.0%no
0.613981.233e-420.0%no
0.629681.347e-411.6%no
0.644949.211e-53.0%no

On the closed-cavity number: cavity volume of the detector's synthetic test shell (radius 8σ, thickness 1.5σ, 40000 beads, seed 2026) = 1284.875 σ³: this is a property of the detector's own synthetic flood-fill test layout, not a measured volume of the membrane's inner cavity.

Performance

steps per second1970.6
beads in the system3600
neighbour grid rebuild time, ms (separate measurement)1.400
scenariolipids=1200 (3600 beads), box=[28,28,28], layout=bilayer, 20000 steps

Caveats