Proof Center

The main engine's fight calls, with the receipts attached.

Not a highlight reel. This page lists every main-engine fight call in this record — when we posted it, what number we put on it, what the price was, and what happened. Losses sit in the same list as wins, at the same size. The calls we published as each card approached and the fights we re-ran through history afterwards are kept in two separate records that are never added together. How well each individual call's timing can be proved is graded separately, row by row — being in the live feed is not by itself proof that a call beat the first bell.

What is and isn't here. This page reads four things and nothing else: the engine's graded fight calls, its graded money bets, the history replay, and the sealed pre-fight copies. It is not a catalogue of everything Cannon Fight Lab has ever predicted — the fight-duration and prop models run under their own research protocols, with their own records, and none of those rows appear here. Nothing on this page is claimed on their behalf.

Reading the database…

Two records. Never added together.

The single easiest way to make a model look good is to mix what it actually called before a fight with what it "would have" called looking backwards. So we keep them in separate boxes, and the code refuses to total them together.

Why the split is enforced in code, not just in copy. Every total on this page runs through one file, proof-gates.js, which throws an error rather than sum a list containing both kinds. A row whose origin we can't identify is counted as neither. There is a test for it — node tests/proof-gates.test.js.

The live record

The prospective feed only — calls published as the card approached, never re-run, re-priced or tidied up afterwards. That is what this record is; what each row can prove about when it was written is a separate question, graded below.

Loading the live record…

How strongly can we prove when each call was made?

A record is only worth anything if the calls really came first. Rather than assert that, here is what each row can actually support — graded down, not up. A call timestamped on the card's own day is not counted as proof: a card runs for hours, and the date alone can't tell you whether the row landed before the first bell or during the prelims.

Two different claims live here, and mixing them up is how a record starts lying. Sealed means a copy exists in a record the database won't let anyone change — that is about tampering. Dated is about timing. A row only reaches the top grade when both hold: a sealed copy exists, it still matches, and it was taken on an earlier day than the card. If we ever gain a trustworthy per-fight start time to compare against, the same-day rows can be graded up then — we are not going to guess one now.

Did we get a better price than the market ended up at?

The hardest test there is, and the one we care most about. Betting -150 on a fighter the market ends up pricing at -180 means we bought low, whether or not that particular bet won. This page does not answer it, and does not hold the rule for when it may be answered.

The archive

Every row in the two records above — main-engine fight calls and money bets, nothing withheld from either. Filter it, search it, sort it however you like. Losses are not tucked away in a separate list.

Which record
Which list
Result

Swipe the table sideways for the rest of the columns.

Loading the archive…

How we measure ourselves, in plain English

No stats degree required. This is the whole method.

  1. We post a call, and the clock starts
    As a card approaches, the model writes a row: which fighter, what percentage we give them, and — where we flagged a bet — the price on offer at that moment. The row gets a timestamp. What that timestamp can prove varies by row, so we grade it rather than wave at it.
  2. A copy gets frozen where nobody can reach it
    The table holding the calls is an ordinary working table. We could edit it. So for every card we cover, a copy of what we were showing is written into a separate record that the database refuses to change or delete afterwards — for every account, including the one that owns the database. This page then re-compares the working row against that frozen copy in front of you. A pick that aged badly can't quietly become a different pick, because the sealed copy would stop matching and this page would say so.
  3. The fight happens, and we grade it against what actually occurred
    Won, lost, or not settled yet. Nothing gets quietly dropped for being embarrassing — if a pick is missing from the archive it's because it was never posted, and you can check the count against the card.
  4. Money is counted flat: $100 a bet, every time
    Same stake on every bet, no chasing, no doubling up. A win at +150 pays $150; a loss costs $100. That's it. We use the price that was on record when we posted, not a better one we found later.
  5. A number only goes on screen once there's enough of it
    Small samples lie. Each headline number has a written rule for how many calls it takes before we'll show it. The hardest one — whether we beat the market's price — isn't ours at all: it belongs to a separate research protocol, frozen before any of its own results were computed or reviewed, and this page just reads its verdict. Until a rule is met you get "still collecting" instead of a number. We'd rather show you an empty box than a flattering guess.
  6. Rules can improve — but only forwards, and in writing
    We are not going to pretend our methods are frozen forever; a model nobody is allowed to improve is a worse model. What we will not do is rewrite the past. Every change to how something is measured gets a version and a date, and results already scored stay tied to the rules they were scored under. Old numbers are never quietly re-graded under a friendlier rule, and a threshold is never moved after we've seen what it gates.
  7. Simulations stay labelled as simulations
    Re-running the engine over old fights is a useful sanity check and nothing more — the model gets to be smart about a world that already happened. Those rows are marked, boxed off, and never added to the live record.

What this page will not tell you

Being upfront about the limits is part of the point.

  • Whether you'll make money
    A record is a record. A 70% pick still loses 3 times in 10, and a good run of results can happen to a bad model. Nothing here is betting advice.
  • That we're beating the market
    We're not claiming it, and we're not quietly implying it either. The rule for when that question may be answered isn't ours to apply, and it hasn't been met. The market's price is right more often than any model. Any edge lives at the margins.
  • That the simulated numbers predict the live ones
    They routinely don't. That gap is the single most common way a model looks better on paper than in practice, which is exactly why the two records are kept apart here.

Check it yourself

Every claim above, with the thing that backs it. The rows with a live verdict are recomputed in your browser from the rows themselves each time this page loads — if one ever fails, this page says so instead of hiding it. Where a claim would be flattering but false, the row says the unflattering true thing instead.

The claimWhat backs itVerdict

What the labels mean

The first five say how far a number can be trusted. The last four say how well we can prove when a call was made. Every number and every row carries exactly one of each that applies.

Model percentages are statistical estimates, not guarantees. A past record does not predict future results, and a run of wins is not evidence of an edge. Cannon Fight Lab is an analytics publication, not a sportsbook, and nothing on this page is betting advice. 21+ only. Problem gambling? Call 1-800-GAMBLER.