pub fn assign_timeline_lanes(starts: &[f64], ends: &[f64]) -> Vec<u32>
Pack (start, end) intervals into non-overlapping lanes via greedy scheduling, returning lanes in input order.
(start, end)