Vigil
← All news

v1.5.3 — cactbot variant collapsing

- `timeline_diff_for_fight` now runs a post-match variant-detection pass: any non-firing slot whose expected time is within ±1500 ms of a *firing* slot in the same phase — and whi…

Changed — timeline diff: mutually-exclusive variants no longer counted as misses

  • timeline_diff_for_fight now runs a post-match variant-detection pass: any non-firing slot whose expected time is within ±1500 ms of a firing slot in the same phase — and which either shares a base label (parenthesized suffix stripped, e.g. "Alley-oop Inferno (fire)" vs "Alley-oop Inferno (lightning)") or shares any ability ID with that firing sibling — is now flagged alternate_variant: true. Real examples that triggered cleanly: r10s "Alley-oop Inferno" (B5C0 vs B5C1), DSR "The Bull's Steel" / "Brightblade's Steel" alternates, FRU multi-ID slot collapses.
  • Per-phase summary grows a new entries_alternate counter. The entries_missing count now excludes alternates so it reflects only true unfired mechanics; the cascade-drift median also ignores alternates.
  • React TimelineDiff (in web/src/ReportDetail.jsx) renders alternate rows with grey background + grey "alt variant" tag instead of red "did not fire", and the header shows N fired, M missing, K alt variant when any alternates are present.
  • 4 new tests in tests/test_timeline_diff.py: shared-label collapsing, shared-ID collapsing, both-miss not collapsed (still counted as misses), different-label same-time not collapsed (sequential mechanics like Spirit Taker+Holy Bladedance). 346 tests passing (342 → 346).