Canonicalize 1v1 vs mvm gap math across live board, API, and backtest
KNOWN ISSUE — audited 2026-07-25. The live board's giant ‘Gap Total’ is NOT a raw team total: 1v1 compares the two individual player scores, while mvm first averages each player's three opponent scores, applies the game-date boost and hinge weight, then compares normalized team scores (sum of rounded player scores / sum of role weights). The format difference is implicit from row shape; computeMatchScores ignores match.format. Three definitions now conflict: live/API use the weighted denominator (normally 4.5 for a 3-player team with one 2.5x hinge), backtest and PROJECT_OVERVIEW divide by player count (3), and the label implies a raw team-total difference. Fixture 698834 proves the impact: live mvm gap 67.11 versus backtest 100.67. Separate display rounding can also show +32 : -36 beside a giant 67, and api.php hard-codes Hybrid 2.1x / hinge 2.5x even when browser controls change. Acceptance: add explicit 1v1 and mvm branches with roster/cardinality validation; choose and name the canonical normalized gap; expose raw team-total gap separately if wanted; use identical math and controls in live, API, backtest, exports, sorting, colors, and docs; round once so the headline reconciles with the displayed side scores; add fixtures covering positive/negative scores, hinge weights, malformed rosters, and slider changes. RESOLVED 2026-07-25 (deployed): canonical gap is Σadj÷Σsumw everywhere — backtest ÷count bug fixed, explicit match.format branch added, headline rounds once so it equals the displayed side-score difference. 1v1/1vmany/mvm gaps byte-identical before/after (0 diff); parity api.php↔index.html↔extract_gap.js = 0 mismatches on 58 fixtures.
known-issuescoringgapparity