v0.16.0 — ### Added
- **T-106** M-PARSE per-phase damage trajectory. `analysis/parse_trajectory.py::parse_per_phase_for_fight(session, fight_id)` consumes T-103 phase boundaries and aggregates per-pl…
- T-106 M-PARSE per-phase damage trajectory.
analysis/parse_trajectory.py::parse_per_phase_for_fight(session, fight_id)consumes T-103 phase boundaries and aggregates per-playerdamageevents within each phase, normalized to phase-duration seconds for DPS. Mode-1 metric (raw DPS) — true aDPS (FFLogs raid-buff-shared credit) is M-PARSE mode-2 work, deferred until the damage-attribution model is needed for M-GATE (T-207). GET /api/fights/{id}/parsereturns{phases: [{phase_index, start_offset_ms, end_offset_ms, duration_ms, players: [{player_id, name, job, damage_total, dps}]}]}, players sorted by damage desc within each phase.- React
ParseTablecomponent inPullDetail— per-player rows × per-phase columns matrix, DPS values formatted as27.3k; players ordered by total damage across the fight. - 6 unit + 2 API tests. 145 tests total.
- Live AC on FRU kill #163: P0 Fatebreaker top SAM 28.6k DPS; P2 Adds intermission spikes to 35.7k (cleave); P5 Fatebound peaks at 33.3k (burst CDs popping). Per-phase DPS curve matches real FRU optimization expectations — adds phases have visible damage spikes, final phase shows the burst climax.