v0.3.0 — protein alignments
Protein alignments. infer_tree and select_substitution_model accept sequence_type="protein". The molecule type is declared, never inferred: an alignment of only A/C/G/T is a valid protein alignment too, and guessing wrong returns a tree, a likelihood and bootstrap support that are all wrong and none complaining.
Topology recovery checked against a known simulated tree, with built-in negative controls — which immediately caught a blinded RF comparator that the primary "we recovered it" assertion passed happily, since RF = 0 reads as perfect recovery whether you compared the right trees or nothing at all.
Audit fixes. A signal-free alignment now gets a diagnosis instead of piqtree's IQ-TREE output is malformed — an upstream parsing error that read as a broken server and invited pointless retries. Branch lengths pinned at the optimiser's ceiling (10 subs/site) are flagged as a floor rather than returned as a measurement. Trees carry their engine version and branch_length_units.
Full detail in CHANGELOG.md.