Skip to content

src/bridge: Campaign-1 → Campaign-2 rate-law emitter (API surface only) #3

src/bridge: Campaign-1 → Campaign-2 rate-law emitter (API surface only)

src/bridge: Campaign-1 → Campaign-2 rate-law emitter (API surface only) #3

Workflow file for this run

name: smoke
on:
push:
branches: [main]
paths:
- "src/chem/**"
- "src/md/**"
- "src/dock/**"
- "src/fep/**"
- "src/quantum/**"
- "src/uq/**"
- "src/cache/**"
- "tests/chem/**"
- "tests/cache/**"
- "tests/md/**"
- "tests/dock/**"
- "tests/fep/**"
- "tests/quantum/**"
- "tests/uq/**"
- "benchmarks/chembl/**"
- "benchmarks/md/**"
- "benchmarks/dock/**"
- "benchmarks/fep/**"
- "benchmarks/quantum/**"
- "environment.yml"
- ".github/workflows/smoke.yml"
pull_request:
paths:
- "src/chem/**"
- "src/md/**"
- "src/dock/**"
- "src/fep/**"
- "src/quantum/**"
- "src/uq/**"
- "src/cache/**"
- "tests/chem/**"
- "tests/cache/**"
- "tests/md/**"
- "tests/dock/**"
- "tests/fep/**"
- "tests/quantum/**"
- "tests/uq/**"
- "benchmarks/chembl/**"
- "benchmarks/md/**"
- "benchmarks/dock/**"
- "benchmarks/fep/**"
- "benchmarks/quantum/**"
- "environment.yml"
- ".github/workflows/smoke.yml"
workflow_dispatch:
inputs:
scale_n:
description: "Run the ChEMBL scale test with N compounds (0 = skip)"
required: false
default: "0"
run_sampled_binding_smoke:
description: "Run the opt-in sampled binding smoke (~10 min CPU)"
required: false
default: "false"
type: boolean
jobs:
# One mega-job that runs chem + md-ligand + md-protein smoke gates
# back-to-back under a single conda env. Environment setup (~5 min)
# dominates wall time, so sharing the env across gates is much
# cheaper than splitting them into separate jobs.
smoke:
name: chem + md smoke (full tier, conda)
runs-on: ubuntu-latest
defaults:
run:
shell: bash -el {0}
steps:
- uses: actions/checkout@v4
- name: Set up miniforge + cellsim env
uses: conda-incubator/setup-miniconda@v3
with:
environment-file: environment.yml
activate-environment: cellsim
miniforge-version: latest
use-mamba: true
- name: Env report
run: |
python -c "import rdkit, openff.toolkit, openmm, pdbfixer, \
vina, meeko, posebusters; \
print('rdkit', rdkit.__version__); \
print('openff-toolkit', openff.toolkit.__version__); \
print('openmm', openmm.__version__); \
print('pdbfixer', getattr(pdbfixer, '__version__', '?')); \
print('vina', vina.__version__); \
print('meeko', meeko.__version__); \
print('posebusters', posebusters.__version__)"
which vina
which xtb && xtb --version 2>&1 | head -2 || true
echo "AMBERHOME=$AMBERHOME"
- name: chem smoke_10 (Layer 1.1, full tier ≥ 8/10)
run: python -u tests/chem/test_parametrize_smoke.py
- name: chem ADMET smoke (non-AI descriptors, 10/10)
run: python -u tests/chem/test_admet_smoke.py
- name: chem cache smoke (parametrize AM1-BCC cache speed-up)
run: python -u tests/chem/test_parametrize_cache.py
- name: md ligand smoke (Layer 1.2, 3 drugs × 10 ps, 3/3)
run: python -u tests/md/test_ligand_vacuum.py --max 3 --gate 3
- name: md protein smoke (Layer 1.2, 1UBQ solvate + 1 ps MD)
run: python -u tests/md/test_protein_load.py
- name: dock prep smoke (Layer 1.3, Meeko receptor + ligand)
run: python -u tests/dock/test_prep_smoke.py
- name: dock re-docking gate (Layer 1.3, 1STP biotin)
run: python -u tests/dock/test_redocking.py
- name: dock pocket-detect smoke (Layer 1.3, fpocket on 1STP)
run: python -u tests/dock/test_pocket_detect_smoke.py
- name: dock mini-bench (Layer 1.3, 3-cocrystal re-dock ≥ 2/3)
run: python -u tests/dock/test_mini_bench.py
- name: dock refine smoke (Layer 1.3, post-dock MM minimise)
run: python -u tests/dock/test_refine_smoke.py
- name: dock strain smoke (Layer 1.3, UFF ensemble ratio via PoseBusters)
run: python -u tests/dock/test_strain_smoke.py
- name: dock triage rules smoke (Layer 1.3, batch triage verdicts)
run: python -u tests/dock/test_triage_smoke.py
- name: dock triage-viewer smoke (Layer 1.3, PNG dashboard)
run: python -u tests/dock/test_triage_viewer_smoke.py
- name: dock strain-gate smoke (Layer 1.3, pose promotion logic)
run: python -u tests/dock/test_strain_gate_smoke.py
- name: dock shortlist smoke (Layer 1.3, CSV filter)
run: python -u tests/dock/test_shortlist_smoke.py
- name: dock to-md smoke (Layer 1.3, markdown table)
run: python -u tests/dock/test_to_md_smoke.py
- name: dock kinase-warning smoke (Layer 1.3, receptor heads-up)
run: python -u tests/dock/test_kinase_warning_smoke.py
- name: dock cyp-inhibit strain-downgrade smoke (Layer 1.3, DDI risk rules)
run: python -u tests/dock/test_cyp_strain_downgrade_smoke.py
- name: fep scaffold smoke (Layer 1.3, openmmtools alchemy primitives)
run: python -u tests/fep/test_fep_scaffold_smoke.py
- name: fep hydration scaffold (Layer 1.3, SMILES → alchemical System)
run: python -u tests/fep/test_hydration_scaffold_smoke.py
- name: fep sampling smoke (Layer 1.3, methane vacuum Langevin+MBAR)
run: python -u tests/fep/test_sampling_smoke.py
- name: fep end-to-end smoke (Layer 1.3, methane hydration ΔG pipeline)
run: python -u tests/fep/test_hydration_dg_smoke.py
- name: fep binding scaffold smoke (Layer 1.3 Milestone B, 1ubq + restraint)
run: python -u tests/fep/test_binding_scaffold_smoke.py
- name: fep-report analyser smoke (tarball → PASS/FAIL verdict)
run: python -u tests/fep/test_report_smoke.py
- name: fep-binding validate dry-run (YAML hygiene, <1s)
run: python -u tests/fep/test_validate_smoke.py
- name: cellsim doctor (step 13 = all benchmarks/fep/*.yaml dry-run)
run: ./scripts/cellsim doctor
- name: cellsim bench-all (biologist dashboard regression)
run: python -u tests/fep/test_bench_all_smoke.py
- name: fep-binding bench --resume regression
run: python -u tests/fep/test_bench_resume_smoke.py
- name: bridge — Campaign-1 → Campaign-2 rate-law emitter
run: python -u tests/bridge/test_binding_to_hill_smoke.py
- name: fep sampled binding smoke (opt-in, ~10 min, manual)
if: >
github.event_name == 'workflow_dispatch' &&
github.event.inputs.run_sampled_binding_smoke == 'true'
env:
CELLSIM_RUN_SAMPLED_SMOKE: "1"
run: python -u tests/fep/test_sampled_binding_smoke.py
- name: halogen-parse smoke (Layer 1.3, regress PDBQT Cl/Br parsing)
run: python -u tests/dock/test_halogen_parse_smoke.py
- name: load_smi SDF+smi dispatch smoke (Layer 1.3, wet-lab input)
run: python -u tests/dock/test_load_smi_sdf_smoke.py
- name: receptor PDB-ID resolver smoke (Layer 1.3, wet-lab input)
run: python -u tests/dock/test_receptor_resolve_smoke.py
- name: dock vina cache smoke (cache hit speed-up)
run: python -u tests/dock/test_vina_cache.py
- name: dock pose export smoke (SDF + PDB for PyMOL/ChimeraX)
run: python -u tests/dock/test_export_smoke.py
- name: dock off-target smoke (biotin vs 3 receptors)
run: python -u tests/dock/test_off_target_smoke.py
- name: quantum smoke (Layer 1.4, xTB GFN2 on 10 drugs, 8/10)
run: python -u tests/quantum/test_xtb_smoke.py --gate 8
- name: SoM smoke (Layer 1.4, CYP3A4 BDE on 3 drugs)
run: python -u tests/quantum/test_som_smoke.py
- name: SoM heme-access smoke (Layer 1.4, dock + Fe-distance filter)
run: python -u tests/quantum/test_som_heme_access_smoke.py
- name: DFT smoke (Layer 1.4, PySCF B3LYP/def2-SVP)
run: python -u tests/quantum/test_dft_smoke.py
- name: UQ MC-dock smoke (Layer 1.6, 4 seeds on 1STP biotin)
run: python -u tests/uq/test_mc_dock_smoke.py
- name: UQ conformal smoke (Layer 1.6, synthetic calibration)
run: python -u tests/uq/test_conformal_smoke.py
- name: UQ calibration (Layer 1.7, streptavidin vs K_d)
run: python -u tests/uq/test_calibration_smoke.py
- name: UQ EGFR kinase calibration (Layer 1.7, honest Vina failure)
run: python -u tests/uq/test_egfr_calibration_smoke.py
- name: cache smoke (content-addressed SQLite store)
run: python -u tests/cache/test_cache_smoke.py
scale:
name: scale (workflow_dispatch only)
if: >
github.event_name == 'workflow_dispatch' &&
github.event.inputs.scale_n != '0'
runs-on: ubuntu-latest
defaults:
run:
shell: bash -el {0}
steps:
- uses: actions/checkout@v4
- name: Set up miniforge + cellsim env
uses: conda-incubator/setup-miniconda@v3
with:
environment-file: environment.yml
activate-environment: cellsim
miniforge-version: latest
use-mamba: true
- name: Fetch ChEMBL subset
run: python scripts/fetch_chembl_sample.py --n ${{ github.event.inputs.scale_n }}
- name: Scale parametrise (gate 99 %)
run: |
python -u tests/chem/test_parametrize_scale.py \
--smi data/chembl/chembl_${{ github.event.inputs.scale_n }}.smi \
--workers $(nproc) --charge am1bcc --gate 99.0