v1.5.4 — phase-index alignment between T-103 and cactbot
- New helper `_align_phases(fight_phase_count, cactbot_phase_count)` in [analysis/timeline_diff.py](analysis/timeline_diff.py) maps each fight phase index to a cactbot phase index…
Changed — timeline diff aligns phases proportionally instead of by strict equality
- New helper
_align_phases(fight_phase_count, cactbot_phase_count)in analysis/timeline_diff.py maps each fight phase index to a cactbot phase index by proportional interpolation. 1:1 when counts match; collapse-to-0 when cactbot has one phase; proportional otherwise. - Used in
timeline_diff_for_fightto look up cactbot entries per fight phase. Previously the lookup was a strict equality onphase_index— when T-103 detected 2 phases on a pull but cactbot only had 1 (M9S-style), fight phase 1 silently received zero cactbot entries. - After alignment, any cactbot phase that didn't get mapped to (case where fight has fewer phases than cactbot) is folded into the nearest aligned fight phase, so no cactbot entry is dropped from the diff.
- 4 new tests: end-to-end "1 cactbot + 2 fight phases" case showing both fight phases get matches, plus 3 unit tests for
_align_phasescovering identity / collapse-to-1 / proportional. 350 tests passing (346 → 350).