v0.14.0 — ### Added
- **T-105** M-BURST 2-minute burst alignment. `analysis/burst.py::burst_alignment_for_report` defines shared **burst windows** from raid-buff cast events (merging overlapping inte…
- T-105 M-BURST 2-minute burst alignment.
analysis/burst.py::burst_alignment_for_reportdefines shared burst windows from raid-buff cast events (merging overlapping intervals at a fixed 20s default — XIVAPI doesn't expose buff durations cleanly; wiki scrape would refine) and counts per-player how many personal CD activations fired in-window vs. drifted. Action-labeled CDs use cast events; status-labeled CDs use applybuff events targeting the CD owner (split viapartition_by_kind). GET /api/reports/{code}/burstreturns{raid_buff_ids, personal_buff_ids, window_ms, fights: [{burst_windows, players: [{in_window, drift, in_window_pct, …}]}]}.- React:
PullDetailnow shows a Burst alignment table per pull (color-coded: green ≥80%, grey ≥50%, red <50%). - 9 unit tests (
tests/test_burst.py) + 2 API smoke (tests/test_burst_api.py). 129 tests total. - Live AC on M5S kill pull #11 (483s): 9 burst windows detected (one every ~2 min — matches the cycle), Bard Raging Strikes 100% aligned (120s CD), Paladin Fight or Flight 50% (60s CD fires twice per cycle), Dragoon Lance Charge + Power Surge 40% — numbers match game-mechanics expectations.
Changed
- T-108 classifier picked up two quality fixes uncovered while wiring T-105: (1) personal_buff with
self-only hintbumped from 0.8 to 0.9 so it crosses the auto-high threshold; (2)relabel_all()now runs a name-matching post-pass — a status whose name matches an action labeledraid_buff/mit_party/mit_boss_debuffadopts the same label (Divination status was being mislabeled personal_buff because the status description "Damage dealt is increased." is too terse). Net result: raid_buff coverage 6 → 13, mit_party 9 → 17, personal_buff 17 → 4 (the 13 reassigned were status duplicates of raid buffs that shouldn't have been personal).