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.

20
Models killed
10
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 · 20

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 not opened. (Attempt 3 was later spent on the 2026 thesis — see below.)

NFL-BACKTEST-V2.md
NFL

Something in NFL betting beats the closing line — attempt 3 of 3, the 2026 thesis

546 ideas searched on 2006–2022; three frozen and tested once on sealed 2023–2025 seasons against a bar set in advance. None cleared it. All three were positive there (blowout reversal +6.1% on 48 bets, Wong teasers +3.7% on 99 tickets at −120 but −1.5% at −135, wind unders +4.3% on 108 bets) with every 95% interval spanning a loss. Each shrank by half or more from where it was found.

What we did: No NFL betting formula is published as a winner. The sealed seasons have had their last look; only new seasons, graded at prices we recorded, can promote a survivor.

NFL-2026-THESIS.md · reports/nfl-thesis-2026/referee.jsonSee the working
NFL

THE LINE’s published plays make money if you bet them

62–59–1, −9.4u (−8.4%, 95% CI −14 to −2) on 112 plays at an average −117, weeks 1–5 of 2026. Every game carried both sides at the better book, so a pair only profits on a middle: 1 of 60 landed, against about 8% needed.

What we did: The plays stay what they were built as — execution notes on where the better number is — and are not presented as a betting record.

reports/nfl-thesis-2026/live.md §Q1See the working
NFL

Our forward NFL game model (epa63-v0) forecasts better than the market

Brier 0.356 against the market’s 0.246 over 372 captured prices; its confident calls (≥70% at −150 or better) went 14–21, and its closing-line value was negative.

What we did: It stays admin-only and behind no public number.

reports/nfl-thesis-2026/live.md §Q2See the working
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: −9.1% over 271 legs once hit prices were read correctly. We once reported that the same market lighter than −160 made +39% (n=231). That number was a pricing bug: 218 of those 231 legs were priced off the singles market before 2026-06-03 (see the hits-pricing receipt). With correct prices, only 18 hits ever came in lighter than −160 — too few to say anything.

What we did: A date-aware −160 cap on single hit plays. It still stands, because heavy hits lose either way, but the "+39% light band" is withdrawn as evidence for anything.

src/lib/parlay/build-legs.ts · MLB-2026-SEASON-THESIS.md §3
MLB

Our anytime-hit plays made +27% ROI

They did not. Before 2026-06-03 our odds feed read the price of a "singles" bet (pays only on a single) as the price of an anytime hit, then graded the bet as an anytime hit — Bobby Witt Jr. at −118 when the real price was −270. Hit plays published under the bug: +90.7 units, +33% (n=272). After the fix: −22.2 units, −7.7% (n=289). Two slates, 5/16 and 5/17, account for +70.3 of the season board’s +71.4 units.

What we did: Every hits result before 2026-06-03 is void as evidence. The classifier was fixed on 2026-06-03 (commit 118f84b), and from June onward hit plays returned almost exactly what their prices implied.

MLB-2026-SEASON-THESIS.md §3 · reports/season-2026/hitters.md · reports/season-2026/redteam.md
MLB

SALCI found a betting formula that makes money in 2026

Six independent searches covered about 1,000 slices of June–August. The nine best formulas were frozen and tested once on September–October data none of them had seen, against a pass bar written before the test. All nine failed. The Daily Card, our published product from late June, finished −26.4 units. As a strikeout forecast, the market line beat SALCI: average miss 1.78 Ks against our 1.86.

What we did: No MLB pick is sold or presented as an edge. For 2027 the projection must beat the market line on held-out starts before it may disagree with one, and every test is registered before opening day.

MLB-2026-SEASON-THESIS.md · reports/season-2026/referee_run.txt
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

Ten week-1 total plays on THE LINE were published off a data error

From late August FanDuel posted a 60-rung ladder of ALTERNATE totals (23.5 to 82.5) alongside each game's real total, and our archive read every rung as if it were the total. Five week-1 plays were published at FanDuel lines that were never its real total (the worst: under 70.5 on a game whose total was 40.5), and five more were published at DraftKings because its real line looked better than one of those fake rungs. As graded, the ten went 6–4.

What we did: All ten are VOIDED — both halves, because neither claim was true, and removing only the losers would have flattered the record. They stay on the ledger, marked void, with their original prices. The archive now keeps only a book's real total (chosen by price, closest to even), and every surface that reads totals reduces the history to it first. Every other week-1 total play was checked against the book's real total at the moment it was published; all 22 matched. An audit on 2026-09-26 found two more errors in how the ledger was scored, and both were corrected in place. First, the voided plays were still counted in the headline figures: line value read +2.6 points a play instead of +1.0, and beat-the-close read 30 of 60 instead of 25 of 50. Second, four ARI@LAC spread plays had their closing line read from the wrong side of the market (+9.5 instead of −9.5), which gave them closing-line values of about ±20 points instead of +2, −1, +1 and 0. No play's result changed.

src/lib/nfl/total-ladder.ts · src/lib/nfl/plays-read.ts · src/app/api/cron/nfl-settle-plays · npm run nfl:plays-selftestSee the working
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 · 10

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 — and most of it was not ours. A random fifth of every strikeout line we priced, picked by a random number generator, earned +0.55pp: strikeout lines drift toward the over whoever picks them. What the model adds beyond that drift is about +0.5pp on its top over picks (it held on September–October data it had never seen), against a bookmaker margin of 4.4–6.1%. Beating the close did not mean making money: our K-over picks beat the close every month of 2026 and still lost.

What we did: We stopped selling picks and made the model a benchmark you compete against instead. CLV is now quoted only after subtracting what the same lane drifted for everyone. The number is on the site either way, including in the months it goes the wrong way.

reports/clv-drift.json · MLB-2026-SEASON-THESIS.md §4–5See the working
NFL

The fantasy Trade Lab’s rest-of-season points-per-game projection

Off by 3.18 pts a game on average across 5,539 player-cuts in 2023–25, seasons it never saw — against 3.79 for “season to date” and 3.68 for “last season”. Fitted on 2019–22; the fitted weight on last season (4 games’ worth) is the one the Copilot already used. Starters went on to miss 18–21% of their team’s remaining games.

What we did: The Trade Lab values every trade on this rate, and shows its error beside every figure. The miss rate is the only thing that makes a bench player worth anything in a trade. No win probability and no “chance they accept” is shown — neither has a calibration curve.

scripts/nfl-ros-backtest.ts · src/data/nfl-ros-projection.json
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.