Milestones and Acceptance Tests¶
One milestone per session. Plan → write tests → implement → write docs.
M0 — Scaffold¶
Cargo workspace (ligase-core, ligase-py), maturin, python/ligase, CI running fmt, clippy, ruff, mypy, cargo test, pytest.
Done when: pip install -e . works and import ligase succeeds in CI.
M1 — Types and dimensions¶
Done when:
- HXB2 FASTA and a sample BAM are loaded with dimensions inferred from headers.
- A BAM aligned to a different reference fails check() with a clear DimensionError.
- A chr1 vs 1 mismatch raises a distinct error.
M2 — Graph¶
Done when: the golden example builds a graph without executing anything, and ligase check reports all type errors in one pass.
M3 — Execution and cache¶
Done when:
- The demo runs end to end on 3–4 runs from PRJNA517147.
- A second run completes entirely from cache.
- Changing min_freq reruns only call and resistance.
- Adding one sample processes only that sample.
M4 — Semantic hashing and early cutoff¶
Done when: rerunning alignment with a different thread count produces the same canonical hash and downstream steps are skipped.
M5 — Provenance¶
Done when: ligase methods outputs a methods paragraph with tool versions, parameters, reference accession and citations, plus a bundle that reproduces the results on a clean machine.
M6 — Validation¶
Done when: resistance calls match published results for PRJNA517147 and the Sanger ground truth for PRJNA1218827, with discrepancies explained.
Done. The calls are checked against the published Stanford HIVdb reports for PRJNA1218827: 81 of 81 drug calls agree exactly at the 15% and 5% thresholds, and the nine that differ at 2% each carry a cause. The scoring engine separately reproduces 3,348 published expectations.
PRJNA517147 could not serve as a source of expected answers: its per-sample calls are published only as colour in a heatmap, reverse transcriptase only. It remains the demo'''s default dataset. See validation.