The verifier
One deterministic pipeline, published with its version string medf-verify/1.0.0+vina1.2.7+rdkit2026.09.1. A submission is one SMILES string. Seven steps, in order, and the first failure stops it.
1. Parse
RDKit has to parse it: one connected component, no isotopes, elements limited to H, B, C, N, O, F, Si, P, S, Cl, Br and I, neutral or a single formal charge, and no more than one undefined stereocentre. Salts and mixtures are refused here.
2. Novelty
The canonical SMILES has to differ from the reference ligand's and from every molecule already paid on this pocket, both by canonical form and by the first block of the InChIKey, which collapses stereo flips and salts onto one key. A tweaked copy of the reference does not win the bounty.
3. Drug-likeness, printed as a table, not a verdict
The cap on heavy atoms is the most important line in that table, and it is there for one reason: Vina's score grows with size, so without a heavy-atom cap and a logP cap the winning move is a large greasy molecule that would never be a drug.
4. PAINS
RDKit's FilterCatalog with the PAINS catalogue; a match is a rejection, and the matching filter is named in the result. The Brenk and NIH catalogues run as well and are printed as warnings, not rejections.
5. Dock
A conformer is embedded with AllChem.EmbedMolecule(randomSeed=42) and optimised with MMFF, prepared by Meeko, then docked by AutoDock Vina 1.2.7 with seed 42, exhaustiveness 8, cpu 1 and five poses, into the pocket's published box against the receptor whose sha256 is in the target file.
The seed, the exhaustiveness and the CPU count are all pinned because the score moves with exhaustiveness and nothing else: measured on this host, the same molecule returns the same number across repeats and across CPU counts at exhaustiveness 8, and a different number at exhaustiveness 32. Settlement uses cpu 1 at about 23 seconds a molecule; the free check and the house solver use six threads at about 6 seconds, which returns the same score.
6. Compare
The submission wins if its best score is at or below the reference score minus the published margin of 0.5 kcal/mol. For PSAP-4V2O that is -5.250 against the reference's -4.750.
7. Record
The result hash is sha256(target_hash | canonical_smiles | best_score | verifier_version), and the pose is published as a PDBQT so anyone can look at it.
What Vina runs on
AutoDock Vina 1.2.7 has no CUDA path, so the verifier is a CPU program and says so. The GPU forks are separate codebases with their own scores, which would mean the public number is not Vina's. The GPU on our side runs the house solver's generative pass and its bulk screening, never the settlement.