pub fn normalize(cassette: &Cassette) -> RunExpand description
Normalize a captured cassette into the canonical Run the aligner consumes.
Each Exchange becomes one step, in capture order, as a linear chain (no parent_idx, no
explicit edges — a boundary recording observes sequence, not causality). The run carries no
outcome: a verdict is user-supplied and never derived from a recording, exactly as on the
passive path.