Flesh out the Modal app into a runnable Phase-1 positive-control test and
reconcile it with the plan:
- cofold() GPU fn: build Boltz-2 YAML (protein+ligand+affinity), run
`boltz predict --use_msa_server --cache /weights/boltz`, parse affinity
JSON + predicted pose; weights persist via Volume.
- Local helpers (CPU, import-tested against our PDBs): binding_chain_sequence
(gemmi -- correctly picks the binding chain, e.g. alpha-globin for 5E83),
pubchem_smiles, build_boltz_yaml, fetch_pdb (RCSB).
- main(): fan out cofold.starmap over 3 targets x (known binder + 2
negatives); tabulate; PASS if known binder has top P(binder) for its target.
Alignment fixes:
- Rank by P(binder) (higher=better), NOT raw affinity_pred_value whose sign
(~log IC50) is version-dependent -- avoids a backwards positive-control test.
- gpu_plan.md Phase 1 updated to affinity/P(binder) ranking; pose-RMSD noted
as a later refinement (needs receptor superposition).
Local half verified (sequence/SMILES/YAML); cofold() needs a live `modal run`
(account + `modal token new`) to validate end-to-end.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>