Everyone in this business publishes their winners. This is the other page. Every model we built, the gate we fixed before testing it, the number that failed, and what came off the site as a result.
A betting product is a series of claims about the future, and the industry norm is to make them loudly and never mention the ones that didn't work. We do the opposite, for a self-interested reason as much as an ethical one: anyone can copy a feature, and nobody can copy a public record of their own failures.
The rule behind it is a build gate, not a slogan: no confidence number ships without its calibration curve one tap away. If a surface can't show how often it has been right, we remove the number — not the link.
Every test below had its threshold and its interval fixed in writing before it ran. That is what makes a failure a failure rather than a reason to try one more specification.
Built, tested against a gate fixed in advance, and thrown away when it failed. None of these ships as a play, a recommendation, or a number we ask you to trust — where a killed model’s output is still visible at all, it is labelled analysis and the result that killed it is on the same screen.
50.8% against the spread at our primary threshold, 95% CI [48.7, 52.9]. Breakeven at −110 is 52.4%. The interval contains a coin flip and the point estimate is below breakeven.
What we did: No NFL game-line model ships. THE LINE launched with no model at all, by decision.
NFL-BACKTEST.md54.1% ATS at the pre-registered threshold, 99% CI [48.3, 59.7] on 501 bets — an interval that still contains a coin flip. The shape across thresholds was incoherent (50.7 → 54.1 → 51.3 → 46.4).
What we did: Refused. 54.1% is exactly the number the pre-registration was written to defend against, and the holdout was never opened. Attempt 3 of 3 remains unspent.
NFL-BACKTEST-V2.mdReceiving yards: real but miscalibrated (skill +1.28% Brier skill score, reliability deciles off by more than 10 points at n≥100). Receptions: −0.61% — no better than the player’s own season history.
What we did: Phase B never ran. No prop probability, projection or recommendation ships. We still capture and grade prop PRICES, because storing a market price is not forecasting an outcome.
NFL-PROPS-PREREG.md · reports/nfl-props-phase-a.jsonAUC 0.548 against the book price’s 0.558. The market ranks hitters better than we do, and the constraint is discrimination — no amount of recalibration fixes it.
What we did: No hits probability is ever a recommendation, and the bet picker still shows the market’s de-vigged number alone. The model figure appears in exactly one place — the Edge Board’s analysis lane — where it renders beside the price’s own number, is sorted by the measured band rather than by raw edge, and carries this result and its reliability curve on the surface itself.
src/lib/salci/hits-v2r.ts · src/lib/lab/hit-edges.tsSee the working Hits priced heavier than −160 lost across their lifetime (−6.6%, n=154). The same market lighter than −160 made +39% (n=231).
What we did: A date-aware −160 cap on single hit plays. Deliberately date-aware, so history stays reported under the rule it was published with — retro-reclassifying would have inflated the track record.
src/lib/parlay/build-legs.tsDid not survive its closing-line check.
What we did: The lane was removed from the bet registry rather than left running quietly.
src/lib/salci/bet-registry.tsFailed its own baseline.
What we did: Kept as a research ledger, never promoted to a play surface.
src/lib/salci/bet-registry.tsNine markets captured pregame and settled silently for months — n=306,491 settled bets. Every one of them lost to its own closing price: home runs −41.1% ROI, RBIs −22.3%, total bases −18.8%, runs −18.3%, batter strikeouts −18.0%, anytime hits −13.1%, and the three pitcher lanes −8.1% to −12.3%. Average CLV across all of it: 0.00pp — indistinguishable from noise.
What we did: None of these markets was ever promoted to a play surface, and four of them stopped being archived on 2026-09-03. The ledger is now a 14-day rolling window rather than a growing table, because it was re-confirming a settled verdict at ~5,650 rows a day. The full-history numbers above are frozen in the artifact so the result survives the rows.
src/data/mlb-shadow-prop-verdict.json · npm run shadow:verdictMeasured at 105 inferred routes / 4.6 games — refuted in both units, so it is not an artifact of converting between them.
What we did: We publish our own number and say where the other one came from. YPRR also turned out to be mostly a usage metric: it is TPRR x yards-per-target, and its stability sits beside the usage factor (0.867) not the efficiency one (0.425).
src/data/nfl-stability.jsonSee the working Reversed. Passing xTD per attempt reads r=0.205 and stabilizes at >20.4 games; the raw passing touchdown rate reads 0.244 at >15.4 games.
What we did: The index uses the raw passing rate for quarterbacks — the one place a raw touchdown rate survives. A passer’s touchdown rate carries persistent skill that field position cannot see, which is exactly what xTD removes by design.
src/data/nfl-stability.jsonSee the working Measured over 135 season-weeks, paired: an index of pure opportunity LOSES (WR/TE -0.016 [-0.022, -0.009]). Adding production makes it +0.005 [0.001, 0.010] — but that version contains points per game as a component, so it beats a baseline it is built from.
What we did: The grade ships as a description of where a player stands, never as a ranking of next week. Quarterbacks clear nothing in any configuration tried.
src/data/nfl-index.json · npm run nfl:indexSee the working Withdrawn on re-measurement. The two providers agree exactly where both record a player (r=1.0000, 100% exact match). The apparent 14% population gap is entirely weeks 16-18 of one file — coverage is 100.0% in weeks 1-15 and 44/20/6% after.
What we did: We had banned league-wide averages and percentile ranks across 2023 on the strength of an undiagnosed 14%. They are allowed; what is banned is mixing the two 2023 chartings, which double-count.
npm run nfl:participation-auditBoth wrong, and wrong the same way. Snap counts start in **2013** (23,800 rows; the original probe tested only 1999, 2006 and 2016). Expected touchdowns cover **2009–2025**, ~5,000 player-games a season — the "three seasons" figure came from a probe that only asked about 2023–2025.
What we did: Each stale bound had kept a real metric out of the projection model — snap share, the fastest-stabilizing usage metric in the sport, and expected touchdowns. Both now project (+7.3/+6.0% and +16.0/+16.5%). The bound is read from `lib/nfl/coverage.ts` in one place instead of being restated in migration headers and script guards, and the 2013–2015 snap seasons were backfilled so the claim is true in the database too.
src/lib/nfl/coverage.ts · npm run nfl:projectMeasured, published with its reliability, and linked from every surface that quotes it.
Published as a reliability curve — what we called 70% against how often it happened, with n on every bucket.
What we did: This is the one model whose probabilities we show beside a price as ADVICE. Every confidence number on an MLB surface links to a curve — this one for strikeouts, the hitter calibration panel on the same page for the analysis-only hits lane.
/history?view=accuracySee the working +0.58 percentage points of closing-line value across 512 graded plays. Real — and roughly ten times too thin to sell as picks.
What we did: We stopped selling picks and made the model a benchmark you compete against instead. The number is on the site either way, including in the months it goes the wrong way.
STRATEGY.mdSee the working 341 of 624 statements held — 54.6%, 95% CI 50.7–58.5. Broken down per claim class, two of six classes have intervals that include 50.
What we did: It is the only confidence percentage THE LINE is allowed to show, it is attached to a statement and never to a wager, and the classes that cannot beat a coin flip are labelled as such on the boards that produce them.
scripts/nfl-replay.ts · npm run nfl:reliabilitySee the working Snap share stabilizes in 1.0 game (r=0.865 at four games); target share 1.0; YPRR 4.6 games / 105 routes; yards per carry >16 games; touchdowns per target >42 games, r=0.014 at one game.
What we did: The index weights are read from this table rather than chosen. It is also the first split-half stabilization table published for NFL player metrics — every public figure before it was a year-over-year correlation.
src/data/nfl-stability.json · npm run nfl:stabilitySee the working For ball-carriers, yes: xTD per target r=0.142 against 0.078 raw; per carry 0.210 against 0.143. Roughly half the sample needed. The model itself beats a field-position lookup by 13.0% on targets and 0.4% on carries, on five held-out seasons.
What we did: xTD replaces raw touchdowns in the index. But it still needs more than a full season to stabilize, so it stays a small term — it is not a licence to weight scoring heavily. And rushing xTD is field position and almost nothing else.
src/data/nfl-xtd-model.json · npm run nfl:xtd+0.023 [0.020, 0.027] paired across 135 season-weeks. Our opportunity-only version merely tied it (+0.003 [-0.001, 0.006]).
What we did: WOPR is credited by name on the board. A five-component index beating a two-term formula by 0.023 is worth saying plainly, and worth saying how narrowly.
src/data/nfl-index.jsonSee the working Half true, and the popular half is the wrong one. Across 1,570 incumbent WR/TE seasons 1999–2025, controlling for the player’s own prior season: the biggest arrival costs −0.0335 points of target share per point of his own prior share, 95% CI [−0.062, −0.005]. The “defences can no longer double him” effect on yards per target is −0.0006, CI [−0.003, +0.006] — straddling zero. Departures (“vacated targets”) never reached significance in any outcome.
What we did: Shipped as CONTEXT on the player page, never as a score adjustment. On a 2018–2025 holdout, knowing the roster change improves the forecast by 0.42% MAE on target share and 0.03% on yards per target — which does not buy a knob that moves grades. What actually moves a share is reversion toward 19.1%, several times larger than anything the roster did.
src/data/nfl-teammate-effect.json · npm run nfl:teammateYes, on 25 of 26 metrics across all three position groups. Fit 1999–2017, scored on a 2018–2025 holdout, against a baseline of "next season = last season". WR/TE: yards per target +14.9% MAE, PPR/game +8.0%, target share +7.9%, receiving yards/game +7.8%, snap share +7.3%, targets/game +5.7%, expected TDs per target +16.0%. RB: yards per carry +17.0%, receiving yards/game +10.6%, PPR/game +10.0%, snap share +6.0%, expected TDs per carry +16.5%, and the rest. QB: yards per attempt +18.8%, CPOE +16.0%, passing EPA/game +15.2%, TDs per attempt +14.1%, sack rate +12.6% — all nine. Air-yards share is the single failure at −2.0% and is carried forward, not projected. ⚠️ Snap share is fitted on 2013–2025 rather than 1999–2025 — the nflverse snap release does not exist earlier — so its gain is measured over a different era and is not directly comparable with the rows around it.
What we did: The board becomes a projection going into the season rather than a description of the one that finished. The three groups are fitted SEPARATELY — different metric sets, different workload floors, and a different meaning of team volume (targets / carries / pass attempts); the QB model has no competition term at all, because a quarterback’s competition is a draft pick we cannot see and the observable version is a near-constant column. Air-yards share is excluded by `isShippable()`, read at runtime and never hardcoded.
src/data/nfl-projection.json · npm run nfl:projectRegistered, in progress, and not public. Listed so nobody can say we only report the finished ones.
Admin-only. It records what a frozen model would have said, before the fact, against our own archive. Nothing it produces is public and nothing it produces can become public without a new pre-registration.
What we did: It spends none of the remaining attempt budget. If it never clears its gate, nothing ships and you will read about it here.
NFL-BACKTEST-V3-DRAFT.md §3Nothing on this page is a recommendation and nothing on it is a claim about a future event. If a result here changes, it changes in place — with the new number. We have never removed one.