v1 ship 2026-05-29 — aggregate calibration vs no-vig market anchor +
method-distribution split (ESPN-era backfill vs legacy ufcstats rows).
Replaces ufcstats.com as outcome source after its 2026-04-18 JS bot
challenge made the legacy scraper non-viable.
Variance disclosure. MMA is the lowest-N sport in the
portfolio and the highest single-event variance. A 5-pick sample tells
you nothing. Calibration here is meaningful at N≥100; until then, treat
the lift number as directional and the status pill with low confidence.
Aggregate cohort
Settled-pick Brier on picks where ESPN/ufcstats has the outcome.
Picked-side framing: best_side='home' → win = 1 if winner
matches home_team. Lift = model − market (negative = model beats
market). Status pill mirrors the tennis tripwire:
|lift|<0.005 green, <0.020 yellow, else red.
UFC aggregate cohort calibration versus market.
N picks
Model Brier
Market Brier
Lift
Status
343
0.1782
0.1685
+0.0097
watch
Method distribution by source
Counts of ufc_fight_summaries.method bucketed by where the
row came from. ESPN-era rows are the 2026-04-19 → today backfill via
the public MMA scoreboard (UFC + PFL + Bellator). Legacy rows are the
pre-block ufcstats corpus. PFL fights legitimately produce
method=NULL because ESPN doesn't populate
details[] for PFL — that's structural data absence, not a
parser miss. The OTHER bucket is the parser-gap flag.