Rustinaresearch programme2026-08-19
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.
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 targets | top-1 | top-5 | ceiling | PB-valid | median |
|---|---|---|---|---|---|
xt_off_ce — empirical baseline | 109 | 139 | 146 | 219 | 1.44 s |
cp2_ce — fitted CP field, as exported | 73 | 110 | 126 | 48 | 3.47 s |
cp8w_ce — guarded refit, wall restored | 113 | 143 | 154 | 208 | 1.63 s |
cp8c_ce — as above, short range clamped | 121 | 146 | 153 | 201 | 1.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-1 | baseline | CP as exported |
|---|---|---|
minimum_distance_to_protein | 1 / 200 | 159 / 200 |
volume_overlap_with_protein | 0 / 200 | 59 / 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-1 | top-5 | ceiling | PB-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.
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.
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.
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.
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.
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.
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:
TorsionPlan::within_budget's cut are frozen at their input values and are not
in the space at all;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.
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.
"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.
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.
Everything measured in this repository, stated as verdicts.
| Factor | Verdict | Evidence |
|---|---|---|
| Translation, rotation | EXACT | FFT over the lattice, SO(3) quadrature; quantisation only |
| Acyclic torsion | EXACT | resolve_exact matched brute force 125/125, median 12 assignments |
| Torsion grid (K) | NOT THE LIMIT | K = 3 → 9 at matched coverage is flat-to-negative at 1.5–2.8× cost |
| 5-/6-rings | CONTRACTED | worst bond drift 0.0001 Å, 103/103 targets; 4 and 10 conformers to 0.25 Å |
| Macrocycles | B&B REFUTED | bound admissible (0/167) and prunes nothing; loses to random sampling 10/10 |
| Basin measure as a selection rule | REFUTED | no interior optimum in θ; argmin 19/225 against a 72/225 pool oracle |
| Additivity of the field | NOT BINDING | 158/158 in-sample, 0 of 6,162 ranking constraints violated |
| Torsion free energy over Ωn | EXACT, ALREADY BUILT | descend_soft; now asserted against enumeration and against the kT → 0 limit |
| The field as an exported potential | WAS BROKEN | guard unapplied, wall omitted, 18 % of receptor atoms nonexistent at inference |
| The field as a generator, repaired | AT PARITY | 113 and 121 top-1 against 109; best p = 0.13, so parity not victory |
| Physical validity of the repaired field | REGRESSED | PB 219 → 208 → 201, p = 0.003 and p < 0.0001 |
| Clamping the unsupported short range | REFUTED | made 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.
One significant regression remains, it has a named cause, and the experiment that isolates it is already specified.
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.
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.
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 %.
| parameterisation | params | ridge | CV top-1 | fold-draw range |
|---|---|---|---|---|
| CP rank 1 | 34 | 0.01 | 75.9 % | 6244–6255 |
| CP rank 2 | 68 | 0.01 | 79.5 % | 6506–6582 |
| CP rank 4 | 136 | 0.01 | 81.1 % | 6678–6684 |
| CP rank 8 | 272 | 0.01 | 81.1 % | 6669–6689 |
| CP rank 16 | 544 | 0.001 | 81.0 % | 6667–6677 |
| free tensor | 1452 | 0.001 | 80.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.
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.
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.
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.
What the draft claimed as the build, minus what already existed:
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.descend_soft discards its per-child
messages. Exact ancestral sampling needs them retained.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.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.
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.
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.
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.
Independent of P0 and P1. The first item is built and running; the rest are gated behind a training signal that can identify them.
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 p | top-1 | top-5 | ceiling | PB |
|---|---|---|---|---|
| 0 — isotropic baseline | 109 | 139 | 146 | 219 |
2 — hd2_ce | 107 | 132 | 140 | 219 |
4 — hd4_ce | 101 | 132 | 139 | 220 |
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 p | unnormalised | normalised |
|---|---|---|
| 0 — baseline | 109 | 109 |
| 2 | 107 | 75 |
| 4 | 101 | 64 |
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.
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.
Run, and it produced the most consequential finding of the session. Over 400 pools:
OTHER is 17.7 % of region atoms and is entirely polar
hydrogen — invisible to the engine's receptor. This is C8.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.Per-class contact counts are now emitted with every cache build, so a fit can no longer quietly claim coverage it does not have.
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.
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.
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.
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.
Reordered as the review proposed: guarded data, then fitting semantics, then P0, then the P1 numerator and support gate, then the missing normaliser pieces.
| Step | State | Note |
|---|---|---|
| Rebuild the guarded g0c cache | DONE | 3,097 pools excluded; hydrogens dropped; donor-aware receptor classes |
| Repair the fitting semantics | DONE | per-pose offset in the softmax; grouped folds; ridge grids extended |
| Run P0 | DONE | 73 → 113 across the repair; PB 48 → 208; §0 |
| P0.3 short-range clamp | REFUTED | validity fell 208 → 201; the missing repulsion is at contact, not below 2.5 Å |
| P0.4 corrected rank sweep | DONE | margin +2.2 → +0.8; the rank-8 peak is a rank-4-to-16 plateau; kill did not fire |
| P2.1 directionality, unnormalised | MIS-DESIGNED | measured a 6× weaker h-bond, not a directional one; 109 → 107 → 101 |
| P2.1 directionality, normalised | REFUTED | 109 → 75 → 64; −34 at p = 8.2×10⁻⁶, the campaign's only large significant effect |
| Specify and gate the P1 numerator | DONE | C6: exactly a per-rotation ball; support gate built and asserted |
| P1.2 reducer, messages, sampler | THEN | the genuinely missing machinery |
| P1.3 ML training | THEN | fixed β, norm constraint, Boltzmann surrogate |
| Prepare a dev split | DEBT | C7: raw train/val exist, prepared inputs do not |
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.