Every Cannon Fight Lab verdict is the sum of small probability shifts — each one a measurable, named factor with a published track record. No black box, no proprietary secret sauce. Every number on this page is recomputable from the public data and the open-source edges.js module that runs in your browser.
The May 16 Allen vs Costa card was the worst single result in the model's track record: 2 of 10 committed picks. We audited the verdict logic the next day. The finding was uncomfortable but clear.
Of the ten edge factors, seven sat at 52–57% per-fire accuracy — close enough to a coin flip that they were behaving like correlated noise in the Bayesian combiner. A 53% factor doesn't add information; it adds confidence theatre. When several stacked on the wrong side of an upset, they outvoted the genuinely predictive signals (Record, Cardio, Takedown Defense — all 60%+ per-fire).
The verdict now combines only those three. We tested every subset of the ten factors against 8,533 historical fights (research/subset-test.js):
Calibration improved alongside accuracy. The 70–75% confidence band hit 82.9% accuracy before the change and 92.7% after. About 20% of fights now show "no edge" rather than a confident pick — those are genuine toss-ups where the prior model was gambling and losing.
Every pick committed before May 17 reflects the older ten-edge model. We don't retroactively re-grade — the track record is the track record. Cards from May 17 onward use the new three-edge model.
An edge is a single piece of statistical evidence that nudges the verdict toward one fighter or the other. Each factor outputs three things: who it favors, by how much (a percentage between 50% and 78%), and a one-line reason that you can read on the fight card.
Most fights have 3–5 factors firing. Fewer than 2 is rare; more than 6 is rare. If no factor fires, the verdict explicitly says "even matchup" rather than guessing — the model refuses to predict where it has no signal.
Every factor below is implemented in the public edges.js file. Active factors drive the current verdict. Retired factors are kept documented for transparency — they were dropped May 17, 2026 after the subset audit showed they were diluting the verdict more than informing it.
| Factor | Triggers when | Range | Status |
|---|---|---|---|
| Record Pro W-L gap (Laplace-smoothed) |
Adjusted win-rate gap of at least 8 percentage points between the two fighters | 60–72% | Active |
| Cardio Late-round output sustain |
Cardio tier gap of 3+ (e.g. Tireless vs Fades). See cardio methodology. | 54–58% | Active |
| TD defense Takedown defense % |
10+ percentage-point gap in takedown defense, when grappling is in play | 52–56% | Active |
| Age Years younger |
1+ year age gap. Newcomer-discounted at gap < 9 when either fighter has <5 UFC fights. | 52–70% | Retired May 17 |
| Win streak Current consecutive wins |
One fighter on a 2+ win streak that's longer than the opponent's | 53–63% | Retired May 17 |
| Loss streak Opponent on a skid |
One fighter on a 2+ loss streak — fades the colder fighter | 53–60% | Retired May 17 |
| Post-loss Layoff after a loss |
Asymmetric post-loss state with 6+ months of rust | 52–58% | Retired May 17 |
| Stance + reach Striking geometry |
Mixed stances (southpaw vs orthodox) and/or 2"+ reach gap, when striking is in play | 52–57% | Retired May 17 |
| Strikes/min SLpM differential |
1.0+ strikes/min gap, when at least one fighter strikes meaningfully | 52–55% | Retired May 17 |
| TD accuracy Takedown finish % |
15+ percentage-point gap in takedown accuracy, when grappling is in play | 52–56% | Retired May 17 |
Each firing factor pushes the prior probability up or down using a Bayesian odds update. A single 60% edge raises the prior from 50% to 60%; two independent 60% edges raise it to roughly 69%, not 70%, because the second update is anchored to an already-shifted prior.
Then a hard cap is applied: the verdict can never exceed the strongest single factor by more than 6 percentage points, and is bounded at 78% on top. This prevents stacked-edges runaway — ten weak edges shouldn't claim 95% confidence in a UFC fight where the floor of randomness is roughly 25%.
The validation script in research/validate.js simulates every edge.js verdict against every decided UFC fight in the database. Headline numbers from the most recent run (post May 17 rebuild):
Calibration check: in a well-calibrated model, predictions at confidence X% should win X% of the time. Here's what the most recent validation found:
| Predicted confidence | Actual win rate | Fights in band |
|---|---|---|
| 50–55% | 55.9% | 1,952 |
| 55–60% | 64.7% | 1,614 |
| 60–65% | 72.7% | 1,676 |
| 65–70% | 81.6% | 1,008 |
| 70–75% | 92.7% | 399 |
| 75%+ | 100.0% | 6 |
Every confidence band lands inside or above its predicted range. High-confidence verdicts (70%+) are under-stated — when the model says it's confident, history says listen.
The age factor used to assign 55.9% to fighters with a 3–4 year age advantage. We extended the validation script to compute the actual historical win rate at every integer age gap among veteran fighters (5+ UFC fights on both sides), where the data is cleanest. The result:
We shipped new tiers that match the measured rates. The newcomer discount used to apply uniformly; it now only fires at gap < 9 years because the data shows newcomer fights with 9+ year age gaps actually have higher win rates for the younger fighter, not lower. The age edge function is open in edges.js — every line of the recalibration is reviewable.
This is what "open methodology" means in practice. Factors aren't tuned to vibes; they're tuned to the database, the tuning process is documented in code, and the validation rerun confirms the change improved calibration.
When we score the model against a 2018 fight, we use the fighters' current career averages — not their stats as they existed in 2018. That introduces a measurable hindsight bias. Year-over-year accuracy in the validation report drifts higher for recent years, confirming the effect. Real fair-replay accuracy is lower than the 66% headline. We flag this prominently in research/results.md.
The win-streak / loss-streak / post-loss factors are listed in edges.js, but a data-shape mismatch meant they returned null on every fight in production until we found it. We fixed the bug and ran validation again. We mention this because "we found and fixed it" is the right framing for a working methodology, not "our model is flawless."
Roughly a quarter of UFC fights are won by the statistical underdog. No model — ours, the betting market's, or anyone else's — will ever predict more than ~75% of fights correctly. Anything claiming 90%+ accuracy on a meaningful sample is wrong or overfit.
Calibration on 8,000+ historical fights tells you the model's confidence numbers are honest. It does not tell you any individual upcoming fight will go the way the model predicts. Read the verdict alongside the matchup story. Stats for entertainment purposes only. 1-800-GAMBLER.