v0.31.0 — ### Added — T-304 fault disambiguation via mit audit
- `analysis/fault_disambiguation.py::disambiguate_for_fight()` reads existing `fault_scores` (T-302) + the T-303 mit-audit, walks each cascade death whose killing ability is a rai…
analysis/fault_disambiguation.py::disambiguate_for_fight()reads existingfault_scores(T-302) + the T-303 mit-audit, walks each cascade death whose killing ability is a raidwide, looks up which occurrence of that raidwide killed them, and checks if its planned mits were missed. If yes: reclassifycascade→mit_failure.scorerecomputes with mit_failure counted at 1.0 (same as root) instead of 0.1 (cascade).- API:
POST /api/fights/{id}/fault-scores/disambiguate. The PullDetailcomputebutton auto-runs disambiguation right after compute — single click does both passes. - React
FaultScorestable grows amit failcolumn (red when >0). - 4 new tests covering reclassification, no-upgrade-when-mit-fired, missing-rows edge case, and score recomputation. 257 tests total.
- Doesn't try to assign mit_failure to a specific player (role→member resolution is ambiguous without strict roster locking). The M-MIT panel below already surfaces which ability was missed — the human reads it and assigns blame. T-309 polish could add explicit member-locked roles later.