SALCIStrikeout Analytics
MLBNFL
HomeHittersAnalyticsSALCI HistoryGame DayThe LabPRO
☕
Home
The Lab
Game Day
Hitters
 

SALCI © 2026— For informational and entertainment purposes only. Not financial or betting advice.

21+ only · Gambling problem? Call 1-800-GAMBLER.

Terms·Privacy·Refunds·How it works·Receipts

Not affiliated with, endorsed by, or sponsored by Major League Baseball, MLB Advanced Media, or any MLB club. All team names, logos, and marks are the property of their respective owners and are used here for identification and factual reference only.

@salciMLB on X • #SALCI

☕ Buy me a coffee
RECEIPTS

What we measured, and what we killed

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.

14
Models killed
9
Numbers published
1
Tests running
0
Results deleted

Why this page exists

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.

Killed · 14

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.

NFL

We can beat NFL sides and totals — attempt 1 of 3

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.md
NFL

We can beat NFL sides and totals — attempt 2 of 3

54.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.md
NFL

We can forecast NFL player props — attempt 1 of 3

Receiving 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.json
MLB

Our hit model ranks hitters better than the market does

AUC 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
MLB

Heavily-juiced hit props are still worth taking

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.ts
MLB

Ceiling-side strikeout overs are a lane

Did 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.ts
MLB

First-five runs and moneylines are a lane

Failed its own baseline.

What we did: Kept as a research ledger, never promoted to a play surface.

src/lib/salci/bet-registry.ts
MLB

MLB player props beyond strikeouts and hits are a lane

Nine 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:verdict
NFL

YPRR stabilizes at about 180 routes (the circulating public figure)

Measured 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
NFL

Expected touchdowns beat raw touchdowns for quarterbacks too

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
NFL

The SALCI index ranks next week better than a player’s own points per game

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
NFL

The 2023 charting provider change makes route metrics incomparable across eras

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-audit
NFL

nflverse target share and air-yards share are available back to 1999

They are not. `target_share` has 60 non-null rows in 2003, 168 in 2004, ZERO in 2005, 71 in 2006 and 452 in 2007, against ~16,500 a season either side; `air_yards_share` is absent 2003–2005. Our aggregator fell back to 0, so six seasons of "commanded 0% of his team’s targets" entered a training set as measured data.

What we did: Caught because the air-yards projection came out 14.6% WORSE than doing nothing. Nulling the missing values moved target share from +2.0% to +7.9% and its R² from 0.304 to 0.519. Missing is now null and the row is dropped — never a zero that arithmetic accepts.

scripts/nfl-project.ts
NFL

Snap counts start in 2016, and our expected-touchdown history is three seasons

Both 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:project

On the site · 9

Measured, published with its reliability, and linked from every surface that quotes it.

MLB

The SALCI strikeout model’s probabilities are calibrated

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
MLB

Our published plays beat the closing line

+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
NFL

A matchup note is still true the following week

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
NFL

We measured which NFL statistics are signal, and at what sample size

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
NFL

Year-over-year correlation understates NFL metric reliability

Split-half beats year-over-year on 22 of 22 metrics once projected to season length, by +0.069 to +0.287. Largest for RB yards per carry (+0.287) — the position that changes team, line and role most.

What we did: Yards per carry is half-rehabilitated: the published R²≈0.11 is real, but split-half puts it at 0.500 at season length. Useless weekly, marginal seasonally.

src/data/nfl-stability.jsonSee the working
NFL

Expected touchdowns are more stable than raw touchdowns

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
NFL

The SALCI index ranks receivers better than WOPR, a two-term public formula

+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
NFL

A big offseason arrival meaningfully changes what the incumbent receiver does

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:teammate
NFL

We can project next season better than just carrying this season forward

Yes, 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:project

Running · 1

Registered, in progress, and not public. Listed so nobody can say we only report the finished ones.

NFL

A forward-only game-line experiment, running now

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 §3

Nothing 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.