Rustinaresearch programme2026-08-19

Closing the Loop

The search factor is finished and the benchmark did not move. What is left is the potential — and every number we had for it was measured on poses some other function chose. P0 has now run. The fitted field, docked unmodified, is 21% physically valid; repaired, it is the first learned field in this repo to reach parity with the empirical term as a generator.

Branch
feat/equifield-dock @ c4dc75d
Corpora
SPINDR 225 · DEV2 158 · g0c 8,237 guarded
Revision
rev 4 · P0.4 landed
§0

What P0 measured

The programme opened with one cheap, pre-registered experiment and a stated kill criterion. It ran. Everything below is downstream of what it found.

Arm, 225 SPINDR targetstop-1top-5ceilingPB-validmedian
xt_off_ce — empirical baseline1091391462191.44 s
cp2_ce — fitted CP field, as exported73110126483.47 s
cp8w_ce — guarded refit, wall restored1131431542081.63 s
cp8c_ce — as above, short range clamped1211461532011.61 s

The baseline reproduces the archive exactly — 109 / 139 / 146 / 219 — so the control is faithful and the new binary is not what moved anything.

The fitted field, docked unmodified, is unusable as a generator. 73/225 against 109, and 48/225 PoseBusters-valid against 219. The prediction was right and its stated mechanism was wrong: the ligand is not expelled — poses beyond 8 Å are fewer than the baseline's (17 vs 21 on the paired set). It is driven into the protein:

PoseBusters failure, top-1baselineCP as exported
minimum_distance_to_protein1 / 200159 / 200
volume_overlap_with_protein0 / 20059 / 200

And the repair works. With the protein-homology guard applied, the fixed physics carried as a per-pose offset in the fit, the receptor vocabulary matched to the engine's, and the repulsion wall restored, the same low-rank field docks at 113 / 143 / 154 — the first learned field in this repository to reach the empirical term's level as a generator rather than as a re-ranker.

Read the sizes honestly

Paired exact McNemar against the baseline, all 225 targets:

top-1top-5ceilingPB-valid
cp8w_ce +4 (+26 −22) p = 0.67+4 (+20 −16) p = 0.62 +8 (+24 −16) p = 0.27−11 (+1 −12) p = 0.003
cp8c_ce +12 (+32 −20) p = 0.13+7 (+26 −19) p = 0.37 +7 (+26 −19) p = 0.37−18 (+0 −18) p < 0.0001

No accuracy effect is significant. The correct claim is parity, not victory: what moved from catastrophic to indistinguishable is the repair, and that is the result. The two numbers that are significant are both regressions in physical validity.

And the clamp's kill criterion fired. P0.3 predicted that if the surviving clashes were the unsupported sub-2.5 Å knots, flattening them would recover validity. It did the opposite — minimum_distance_to_protein went 1 → 12 → 18 across baseline, wall, wall+clamp, while top-1 rose. So the missing repulsion is not below 2.5 Å, where there is no data; it is in the 2.5–3.5 Å contact region, where Vina's repulsion and gauss terms are steep and a 0.5 Å hat basis is too shallow to reproduce them. Clamping removed the little the fit had learned there and made contact softer still.

The failures are mild rather than gross: of the 24 PoseBusters-invalid cp8c_ce poses, 9 are still within 2 Å of native — correct placements sitting a little too close, not interpenetrating decoys. That is a different and much smaller defect than cp2_ce's 159, and it points at the steric term rather than at the fit.

§1

What the first draft got wrong

An external review found seven defects. Six are upheld and fixed; the seventh was already known. Two further blockers the review did not name were found while acting on it.

C1

The training population was not guarded

upheld fixed

scratch/g0c-ranker-v4-selection.json is a protein-identity and sequence-homology guard written by scripts/build_protein_guard.py: it excludes any corpus pool with a chain at ≥ 0.90 identity to an evaluation chain. Nothing consumed it. Exactly 3,097 of 15,204 cached pools sit outside it, as the review states.

My own check — zero exact PDB-code overlap between the g0c cache and the SPINDR test split — was not a substitute and I should not have offered it as reassurance. The guard is about homology, which no identifier comparison can see. --selection now applies it and the cache is rebuilt: 12,107 targets, 8,237 rankable.

C2

The fixed wall is an offset in the loss, not a subtraction from the target

upheld fixed

Worse than the review put it. The pools carry fixed_repulsion as a per-pose array, and ranker_v2.py:456 scores learned + fixed_repulsion + intra_delta. So the archived exporter's fixed_repulsion: false shipped a residual as though it were the whole intermolecular term. That is the 48/225 in §0, and it is a defect in the export path, not a property of low-rank fields.

The offset now enters the pool softmax per pose — it varies within a pool, so it does not cancel — and the export flag is derived from whether the cache carries one, never set as a constant.

C3

"No training pose below 2.5 Å" was false

upheld

Correct, and my own measurement said so before the review arrived. Over 400 pools (1,957,167 pairs): 12 pairs in [1.0, 1.5) Å, 1,293 in [1.5, 2.0), 6,197 in [2.0, 2.5) — 0.001 %, 0.066 %, 0.317 %. Sparse, not absent. Meanwhile 73 % of all pairs sit beyond 4.5 Å.

The mechanism survives the correction — 12 pairs in two million is ridge shrinkage, not chemistry — but the sentence as written was wrong and is replaced by the numbers.

C4

The likelihood algebra dropped a β, and clamping does not stop divergence

upheld

With F = −β⁻¹ log Z the loss is β(F_N − F_total) and the gradient carries the same β. The draft omitted it.

The substantive point is the one that matters: replacing a native point with a positive-measure set does not prevent divergence. Separable data still drives P(N) → 1 as the energy scale grows, because scaling θ sharpens the distribution without bound. β must be fixed, not fitted, and the parameters explicitly regularised or norm-constrained. This is now stated as a constraint on P1.3 rather than discovered during it.

C5

"Exact over the full pose space" was overstated

upheld

The soft recursion is exact over a precisely smaller object than the draft claimed, and the difference is not cosmetic — P1 would otherwise train a different objective from the engine it is meant to improve. What is exact:

  • the intermolecular term only, as a sum of unary node terms;
  • over the retained discrete torsions — those below TorsionPlan::within_budget's cut are frozen at their input values and are not in the space at all;
  • with cross-branch intramolecular pairs dropped or bounded, never summed exactly (§3.3);
  • with no ring or conformer states in the outer sum.

Within that object it is exact, and that is worth having. Outside it, it is a surrogate, and the production engine returns a refined argmin rather than a Boltzmann draw — so the whole construction is a Boltzmann surrogate for what the engine does, which the draft should have said.

C6

The near-native numerator does not factor through the tree

upheld fixed exactly

The sharpest of the seven. RMSD ≤ 1 Å is a global geometric constraint on the assembled pose; it does not decompose over the torsion tree, so the same recursion that gives the denominator exactly does not give Z_N at all. "Sums over a small restricted set" was hand-waving.

Repaired — and the repair turned out to be exact, not approximate. Built as src/near_native.rs. With native y_i, conformer x_i, u_i = R·x_i and m = mean(u_i − y_i), the cross term completes the square:

RMSD²(R,T) = mean |u_i + T - y_i|²
           = ( mean |u_i - y_i|² - |m|² )  +  |T + m|²
             \_______ floor(R) ________/     \___ ball ___/

So for each rotation the near-native set is exactly the ball |T + m| ≤ √(c² − floor(R)), centred on the translation that best superposes that rotation, and empty when floor(R) > c². Translation and rotation are the outer sums, so a per-rotation ball in translation is precisely the shape the factorisation carries: restrict the lattice sum, leave the torsion sum untouched, and the numerator costs the same recursion as the denominator. Membership is an O(1) squared-distance compare, not an O(atoms) RMSD evaluation.

Verified against direct RMSD at 8,000 translations × 3 rotations (worst reconstructed error 2×10⁻³); the native rotation's floor is 0 and its centre is the native translation; the floor is unbeatable over 4,096 probe translations; an out-of-reach rotation returns an empty ball rather than a tiny one.

Three limits, stated. For a rigid conformer this is the near-native set. With torsions free it is a superset — inclusion direction known and fixed, gap size a property of ligand flexibility that must be reported. And the RMSD is index-wise: a symmetry-corrected set is a union of balls, one per graph automorphism, still exactly representable but not computed here.

The support gate is built. measure_support counts what a given quadrature and lattice actually reach, so a training run publishes the fraction of targets it dropped rather than regularising an infinite loss in silence. That support falls monotonically as the quadrature coarsens is asserted, not assumed.

C7

The test protocol was adaptive

upheld partly fixed

"Once per milestone" does permit cumulative tuning when five items all read the same 225 targets. Fixed where it was cheap: CV folds are now grouped by protein entry rather than by target (the corpus holds several pools per PDB code, and splitting them across train and test leaks a binding site into both), 3 fold draws replace 1, and both ridge grids were extended past the edges they had been peaking on.

Not fixed, and stated as an open debt: SPINDR train and val exist as raw structures (35,373 and 68 systems) but only test has prepared inputs, so there is no dev split to gate on without running the prep pipeline. Until there is, every arm in §0 and §3 is a touch of the evaluation split, and the honest accounting is that P0 spent four.

C8

Two blockers the review did not name

found and fixed

18 % of the receptor atoms the field was fitted on do not exist at inference. g0c's region_types is AUTODOCK_TYPES, in which HD falls through to OTHER — and receptor OTHER is 17.7 % of region atoms, every one of them a polar hydrogen (region_labels == -1, region_numbers == 0). parse.rs discards hydrogens, so the engine's receptor has none of them. The fit was also blind to donor status while the engine emits OA+ / N+ / NA+, sending exactly the polar atoms to the ? sentinel. Both fixed: hydrogens dropped, receptor classes taken from the donor-aware region_labels, ligand donor variants expanded on export.

The published PoseBusters warning is stale — the review is right and the first draft was wrong. scripts/evaluate_pure_equifield.py does call posebusters_top1; only CLAUDE.md's record of it is out of date.

§2

Where the programme stands

Everything measured in this repository, stated as verdicts.

FactorVerdictEvidence
Translation, rotationEXACTFFT over the lattice, SO(3) quadrature; quantisation only
Acyclic torsionEXACTresolve_exact matched brute force 125/125, median 12 assignments
Torsion grid (K)NOT THE LIMITK = 3 → 9 at matched coverage is flat-to-negative at 1.5–2.8× cost
5-/6-ringsCONTRACTEDworst bond drift 0.0001 Å, 103/103 targets; 4 and 10 conformers to 0.25 Å
MacrocyclesB&B REFUTEDbound admissible (0/167) and prunes nothing; loses to random sampling 10/10
Basin measure as a selection ruleREFUTEDno interior optimum in θ; argmin 19/225 against a 72/225 pool oracle
Additivity of the fieldNOT BINDING158/158 in-sample, 0 of 6,162 ranking constraints violated
Torsion free energy over ΩnEXACT, ALREADY BUILTdescend_soft; now asserted against enumeration and against the kT → 0 limit
The field as an exported potentialWAS BROKENguard unapplied, wall omitted, 18 % of receptor atoms nonexistent at inference
The field as a generator, repairedAT PARITY113 and 121 top-1 against 109; best p = 0.13, so parity not victory
Physical validity of the repaired fieldREGRESSEDPB 219 → 208 → 201, p = 0.003 and p < 0.0001
Clamping the unsupported short rangeREFUTEDmade validity worse; the defect is the contact region, not the empty knots

The result that still organises everything: a provably optimal torsion search moved SPINDR top-1 by +0 (109/225 both arms, p = 1.00). The search sub-problem is solved and the benchmark is indifferent. §0 is the first evidence that the potential is where the movement is — and the first honest measurement of how far a re-ranking win transfers to generation, which is most of the way, once the export is correct.

P0

Finish the repair

One significant regression remains, it has a named cause, and the experiment that isolates it is already specified.

P0.3

Clamp the unsupported short range

refuted

Arm cp8c_ce: identical to cp8w_ce but with every channel flat-extended below 2.5 Å, from the first knot at or above it. This is not smoothing. The corpus places 0.001 % of its pairs below 1.5 Å and 0.4 % below 2.5 Å, so a flat extension is the only extrapolation the data licenses, and the engine's restored wall supplies the physics the fit cannot.

It targets the exact failure that survived P0.2: the 12 remaining minimum_distance_to_protein failures. Because the clamp acts on the expanded tensor it is not rank-preserving, so the arm ships a dense potential — which under a linear head is the same object at inference (§3.8), at 1,815 parameters instead of 296.

Fired

The criterion was that validity must recover toward 219. It fell — 208 → 201, with minimum_distance_to_protein 12 → 18 — so the residual clashes are not the short-range knots. The next suspect, as pre-registered, is the steric term itself: the restored Vinardo wall plus a 0.5 Å hat basis is softer at contact than Vina's repulsion and gauss terms. The follow-on is to fit the field against the engine's own steric term rather than beside it, or to refine the knot spacing over 2.5–3.5 Å where the data does exist (1.0 % and 3.2 % of pairs) and the potential is steep.

P0.4

Re-read the rank curve on a corpus that is now different

landed

Every published low-rank number was computed on a corpus that has since changed in four ways: the homology guard removes 3,097 pools, the receptor vocabulary gained donor status and lost polar hydrogens, the loss gained a per-pose offset, and the folds are grouped by protein. The corrected sweep has now run — 8,237 rankable targets over 4,395 protein groups, 5-fold CV × 3 fold draws, both ridge grids extended past the edges each arm had been peaking on. Incumbent on this denominator: 6,178 / 8,237 = 75.0 %.

parameterisationparamsridgeCV top-1fold-draw range
CP rank 1340.0175.9 %6244–6255
CP rank 2680.0179.5 %6506–6582
CP rank 41360.0181.1 %6678–6684
CP rank 82720.0181.1 %6669–6689
CP rank 165440.00181.0 %6667–6677
free tensor14520.00180.3 %6596–6629

The margin survives at +0.8 points, down from +2.2. Across the three stages it reads +9.7 (158 targets) → +2.2 (9,766, unguarded, ungrouped) → +0.8 (8,237, guarded, grouped folds). And the peak flattened into a plateau: ranks 4, 8 and 16 sit within 0.1 points of one another, where §3.8 had reported a unimodal peak at 8. The shipped rank-8 export is inside the plateau and needs no refit — but rank 4 is the same number at half the parameters.

Did not fire

The criterion was that the margin vanish once both grids reached their interior optima. It did not: the three fold-draw ranges do not overlap (CP rank 4 min 6,678 against the free tensor's max 6,629), so +0.8 is consistent rather than noise. The decay is monotone, though, and one more step of it lands inside the noise — quote the low-rank result at this size, not at §3.8's. One caveat is uncleared: the free tensor's optimum still sits at the lowest ridge swept, so that arm is still not proven interior. The curve is flat there (80.31 / 80.29 / 80.09), which bounds another decade at ≈0.1 points — a bound by extrapolation, not a measurement.

What the fit wins is ranking, not generating. 81.1 % against the engine's 75.0 % is +6.1 points on this denominator, and it does not transfer: docked, the same field reaches parity. That gap is the campaign's central open result.

P1

The normaliser

Re-scoped. The semiring substitution the first draft proposed already exists and is now proven exact; what is missing is the reducer, the messages, and the sampler.

P1.1

The free energy over Ωn is exact — proven, not proposed

done

torsion_field.rs already evaluates, elementwise over the whole translation window,

A_g(T) = C_g(T) + sum over children c of  combine over tau_c of  A_c(T)

with combine = min at zero temperature and combine = -kT log sum exp(-./kT) when with_temperature is set — which the archive already passes. The min-plus semiring becomes the log-sum-exp-plus semiring, and because a product of sums over disjoint sibling subtrees is the sum over the product space, A_root is the exact free energy of the entire discrete torsion space at every lattice point, at unchanged O(n·K) cost.

Now asserted rather than assumed, three ways: against brute-force enumeration of the whole product space at three temperatures; as a monotone limit rising onto the hard minimum as kT falls (the draft named resolve_coupled as the limit, which is wrong — it carries different intramolecular coupling; the limit is the hard torsion field); and pointwise against the field at every third lattice node.

Exactness domain: exactly the object named in C5, no larger.

P1.2

The missing pieces: reducer, messages, sampler

~1 week

What the draft claimed as the build, minus what already existed:

  • The rotation/translation reducer. analyze_landscape sums Z over lattice and quadrature already, but nothing on a docking path calls it — landscape.rs is reachable only from features.rs. Wire it, and add the N-restricted partner from C6.
  • Stored messages. descend_soft discards its per-child messages. Exact ancestral sampling needs them retained.
  • The sampler. Inverse-CDF over the tabulated exp(−β·A_root) for (rotation, translation), then ancestral sampling down the tree. i.i.d. draws, no Markov chain, no burn-in, no contrastive-divergence bias — because the architecture enumerates its own state space.
  • Gradients. ψ occupancies at the sampled poses, chained through the CP factors.
Kill

Sampler correctness is directly testable: on a small tree and a coarse lattice the histogram of 106 draws must match the exactly enumerated exp(−βE)/Z within sampling error.

P1.3

Maximum-likelihood training, with the corrections applied

~1 week + nights
L(theta) = -log P(N) = beta * ( F_N(theta) - F_total(theta) )

grad L   = beta * ( <psi>_clamped-to-N  -  <psi>_model )

with N the factorable neighbourhood of C6, β fixed and the parameters norm-constrained per C4, and a published support fraction for targets whose N is empty at the training quadrature.

Why it is still worth doing after §0. The repaired field reaches parity by fixing an export defect; nothing about it was ever trained against poses it would itself generate. A ranking loss constrains the potential only on the support of a pool it did not produce — which is precisely why its short range was free to be wrong. Maximum likelihood constrains it where a generator's argmin actually goes. §0 is evidence the transfer is possible; it is not evidence the transfer is complete.

It is a Boltzmann surrogate. The production engine returns a refined argmin, not a draw from pθ. Training the Boltzmann model is a tractable proxy for making that argmin right, and the gap between them is a stated assumption, not a claim.

Kill

If a properly normalised field does not beat cp8w_ce's 113, the ceiling is the additive searchable model class itself, and the honest conclusion is that Rustina's accuracy limit is a model-class limit. That is publishable and it retires a line of work.

P1.4

Confidence, corrected

~2 days

The draft offered P(pose ∈ N) as an inference-time confidence. It cannot be: N is defined by the crystal pose, which is exactly what inference does not have. The review is right and the item is rewritten to the two quantities that are observable — Boltzmann mass in a neighbourhood of the predicted pose, calibrated against measured accuracy on a held-out split, and landscape entropy −Σp log p.

This also carries §3.9's own stated limit: its refutation used a translational measure within one orientation's field, while the model's pk was over translation and rotation. The reducer removes that limit for free. Report it; do not resurrect the selection rule.

P2

Physics the field cannot currently see

Independent of P0 and P1. The first item is built and running; the rest are gated behind a training signal that can identify them.

P2.1

Receptor-side hydrogen-bond directionality

built refuted, both conventions

Vina's h-bond term is a function of surface distance alone. A hydrogen bond is not. On the receptor side the angle is free: the donor's X–H direction is fixed when the grid is filled, so the weight folds into the map and the search, the correlation and the torsion recursion are all untouched. Built as grid::HbondDirectionality, weighting the h-bond term by max(cos γ, 0)p, maximised over the donor's hydrogens because an –NH₂ donates along either bond.

The blocker was real and is removed. parse.rs derived is_donor from a bonded HD and then discarded the hydrogen — the direction was parsed and thrown away. parse::donor_hydrogen_directions now recovers it under the same bonding rule, so the two cannot disagree about which hydrogen belongs to which heavy atom.

Four properties are asserted rather than argued: the correction is written hbond_term · (w − 1) so off is arithmetically nothing, and the maps are bit-identical; hbond_term is exactly the h-bond addend of evaluate_pair, checked across both scoring functions, all sixteen donor/acceptor combinations and 900 distances; the weight is a continuous cosine power, 1 along the bond and 0 perpendicular and behind; and turning it on moves only maps for ligand types that can accept, and only ever upward — it can remove attraction, never add it.

Bit-identity when off is proven end-to-end: xt_off_ce returns exactly 109 / 139 / 146 / 219 on four different binaries, including the one with directionality compiled in.

Measured, and it is negative — for an arithmetic reason, not a physical one.

exponent ptop-1top-5ceilingPB
0 — isotropic baseline109139146219
2 — hd2_ce107132140219
4 — hd4_ce101132139220

Paired at p = 2: top-1 −2 (+12 −14) p = 0.85, ceiling −6 (+9 −15) p = 0.31. Individually insignificant, but monotone in the exponent, and it is a real intervention — 220 of 225 top-1 poses change.

The cause is a missing normalisation, and it is analytic. The solid-angle mean of max(cos γ, 0)p is 1/(2(p+1)), so an unnormalised weight cuts the h-bond term to 1/6 of its strength at p = 2 and 1/10 at p = 4 — and Vina's weights.hbond was fitted against the isotropic term, so nothing restores it. Those arms measured a weakened hydrogen bond, not a directional one, and the monotone decline tracks the attenuation rather than the angular shape. That is my error in the experiment design, not a result about chemistry.

HbondDirectionality::normalise multiplies by 2(p+1) so the sphere average is 1 — asserted to within 2 % by a 200,000-point spiral quadrature at p = 1, 2, 4, 6 — letting the weight exceed 1 along the bond, which is the point: it moves h-bond strength from off-axis to on-axis at constant total. That is the fair test, and it fails much harder:

exponent punnormalisednormalised
0 — baseline109109
210775
410164

hdn2_ce against baseline: −34 (+12 −46), exact McNemar p = 8.2×10⁻⁶ — the only large, unambiguously significant effect in the whole campaign, and it is negative.

The thread closes, and the shape of the failure is informative. Weakening the h-bond loses real signal; concentrating it on-axis at constant total is catastrophic. Neither works because Vina's weights.hbond and the term's isotropic shape were co-fitted — changing the shape invalidates the magnitude — and because concentrating reward into a narrow cone creates sharp attractive wells that an exhaustive argmin walks straight into. That is §3.9.1's knife-edge-basin failure mode arriving from a new direction, on an engine that has no restart budget to protect it.

The machinery stays — bit-identical when off, fully tested — because a refit of the whole function is exactly what P1.3 does. What is refuted is the cheap way of using it: the angle must enter inside a refit, never as a multiplicative correction on top of one.

A silent no-op, found and now refused. hd2cp_ce — the field and the angular weight — returned bit-identical results to cp8w_ce on 225/225 targets. build_learned replaces every receptor map, so the correction to Vina's h-bond term is overwritten before it is ever read. That reads as "the feature does nothing" when it was never applied; the engine now refuses the combination rather than producing a misleading null. Directional h-bonds for a learned field must be inside the potential's own fit.

The training-free prior remains: median per-target near-native/decoy AUC 0.589 → 0.662, 84 win / 62 lose / 8 tie, sign test p = 0.082 — magnitude meaningful, consistency borderline.

One hard constraint, already measured: a hard angular cutoff never converges — 38.5 % error at l_max 8, which is Gibbs — so every angular factor must be C⁰ in the angle. A cosine power is the right family; a step function is not, even here where no expansion is involved. The ligand side is the expensive half: its angle depends on the pose, so it needs (l_max+1)² channels per polar class and correlate_channels, which is built and unwired.

Kill

Fired. The criterion was that a solid-angle-normalised weight still flat or negative closes the thread. It is strongly negative at p = 8.2×10⁻⁶. The angle carries discriminative signal that a multiplicative reweight of a fitted isotropic term cannot convert into accuracy; the ligand-side spherical-harmonic expansion is not worth 16–49 channels on this evidence, and receptor-side directionality returns only as part of a full refit.

P2.2

Class-vocabulary audit

done — it found C8

Run, and it produced the most consequential finding of the session. Over 400 pools:

  • Receptor OTHER is 17.7 % of region atoms and is entirely polar hydrogen — invisible to the engine's receptor. This is C8.
  • No METAL class appears at all, on either side. Every metal coordination in the corpus is absent, so a field fitted here has nothing to say about metalloproteins and should not be claimed to.
  • 24 of 77 populated pair-class cells carry fewer than 1,000 contacts, the halogen and sulfur cells worst: SA–NA has 6, BR–NA 7, SA–SA 20. Those are class labels attached to noise.
  • Radial support is extreme: 73 % of all pairs sit beyond 4.5 Å while the three shortest knots hold 0.4 % between them.

Per-class contact counts are now emitted with every cache build, so a fit can no longer quietly claim coverage it does not have.

P2.3

Enclosure and desolvation

deferred

hydration.rs exists and is unwired. A buried polar atom with no partner should be penalised and is not; burial is a receptor-side quantity, so it deposits as a grid channel and costs the search nothing.

Gate

Do not start until P1.3 produces a training signal that can identify the term. Adding capacity before identifiability is the mistake §3.8 diagnosed once already — and P2.2 has just shown the existing basis contains cells fitted on six contacts.

P3

Algorithms with a claim outstanding

P3.1

Re-run the nonlinear head on the corrected corpus

~1 day

The MLP-over-pooled-channels arm topped out at exactly the linear number (92/158 = 58.2 %) on 158 targets. The negative is a statement about corpus size, and the corpus is now 8,237 guarded targets with corrected features. If the head wins, monotone_head.rs stops being a proved theorem and becomes load-bearing: its A* heuristic reuses the DP's own completion messages, was verified against brute force on 40 random trees, and expands 0.03 % of a 59,049-point product space at 10 nodes.

The monotonicity check is necessary, not sufficient — the review is right, and is_monotone_on documents itself as a sample test. A shipping head must be monotone by construction (non-negative pass-through weights), with is_monotone_on as a regression guard rather than as the guarantee. Cooperativity — the third h-bond worth more than the first — is the concave case, and is what the guarantee costs.

P3.2

Macrocycle bound, second attempt

lowest priority

The refutation named its own cause: a driver cell bounds the drivers, while the closers move by whatever the implicit function theorem forces, and that amplification saturates the π cap until the half-width is under π/16 — leaving 2.8 Å of residual atom motion at π/8, over which an eroded Vina map is near its global minimum.

The repair acts on what the cell actually controls: bound the ring atoms' positions with a box per atom, so Σ min Φ over boxes is admissible and the amplification is gone by construction because atom motion is the box width. Feasibility is classical distance geometry — interval bounds from the boxes, intersected with rigid 1-2 and 1-3 distances, then Crippen–Havel triangle smoothing. Analytic loop closure (Coutsias–Seok) removes the measured 38.7 % cell-integrity defect outright.

Priority is honestly low. The covering-number wall stands regardless (~2×10⁷ conformers at dimension 9, on an underestimated exponent) and SPINDR carries few macrocycles — the refutation rests on 10 pairs across 5 targets.

§3

Revised order of work

Reordered as the review proposed: guarded data, then fitting semantics, then P0, then the P1 numerator and support gate, then the missing normaliser pieces.

StepStateNote
Rebuild the guarded g0c cacheDONE3,097 pools excluded; hydrogens dropped; donor-aware receptor classes
Repair the fitting semanticsDONEper-pose offset in the softmax; grouped folds; ridge grids extended
Run P0DONE73 → 113 across the repair; PB 48 → 208; §0
P0.3 short-range clampREFUTEDvalidity fell 208 → 201; the missing repulsion is at contact, not below 2.5 Å
P0.4 corrected rank sweepDONEmargin +2.2 → +0.8; the rank-8 peak is a rank-4-to-16 plateau; kill did not fire
P2.1 directionality, unnormalisedMIS-DESIGNEDmeasured a 6× weaker h-bond, not a directional one; 109 → 107 → 101
P2.1 directionality, normalisedREFUTED109 → 75 → 64; −34 at p = 8.2×10⁻⁶, the campaign's only large significant effect
Specify and gate the P1 numeratorDONEC6: exactly a per-rotation ball; support gate built and asserted
P1.2 reducer, messages, samplerTHENthe genuinely missing machinery
P1.3 ML trainingTHENfixed β, norm constraint, Boltzmann surrogate
Prepare a dev splitDEBTC7: raw train/val exist, prepared inputs do not
§4

What would refute the programme

Stated in advance, so the answer is not negotiable afterwards. One of the three in the first draft has already been settled.


The standing rule. Every gate states its kill criterion before it runs, quotes fold spread rather than a mean, and reports effect sizes with their p-values rather than their signs. §0's +4 is not a win and is not written as one. The one number in this document that is significant is a regression, and it is in the headline table.