Snapcount projects every player's week as a calibrated range — floor, projection, ceiling, and a boom/bust read — then publishes exactly how each call landed. The model beats a recent-form baseline at RB, WR, and TE on walk-forward tests, and where it doesn't win (QB), we say so. Honesty is the product.
Snapcount is the platform. SnapScore is the prediction model underneath everything. You use it through the Board, through SnapCall chat, or through your own AI agent. (SnapSim, the coach-simulation engine, lives in the Lab.)
Walk-forward models built on projected opportunity (targets, carries, snaps) × efficiency. Every projection ships as a floor–ceiling range (~70% coverage) with boom/bust probabilities and a confidence read — never a single false-precision number.
The week's slate, ranked per position on a TD-free score, with likely ranges, boom/bust flags, and an honest side-by-side of where our read differs from the market benchmark.
Projections, start/sit calls, sleepers, and the why behind every number — grounded in the board, never invented. File your own thesis against a projection and get scored by what actually happens.
An MCP server (snapcount-board) exposes the same projections, ranges, and boom/bust reads as tools — so your own assistant can ask the board, run start/sit, and pull player cards directly.
Every stage is re-runnable. Every stage refuses to start if the upstream stage failed. The validator hard-fails the pipeline before bad data reaches modeling.
Pull 27 nflverse sources for 2016 → current NFL season. Auto-derives season range from today's date so a 2026 ingest just works.
Schema drift (added/removed/dtype-changed cols), coverage invariants (per-season weeks, dual-schema integrity), in-season currency. Hard-fails on regression.
Predicate-based filtering carves out validation (2024 wks 9+) and holdout (2025 entire). Two anti-leak invariants enforced. Stale parquets unlinked.
Identifiers, lagged player-game form, EPA/CPOE, NGS, game context, player attributes and draft capital, injury signal. Every layer is lagged — only pregame information. Anti-leakage gate at build time.
Predict at (S, W) using only data with (season < S) OR (season == S AND week < W). Imputer + scaler fit per fold. 17 boundary tests pin the contract.
Same harness, plug-in models. Ridge and XGBoost baselines, then the production lever: project a player's volume (targets, carries, snaps) and multiply by shrunk efficiency. Promotions require paired significance tests, not eyeballed averages.
The metric that decides start/sit calls is weekly ordering: rank the week's players per position, score the ordering against what actually happened. We grade on a TD-free score (yards + receptions) so a lucky touchdown can't flatter the model, and we benchmark against a recent-form baseline and against the market leader — honestly.
The model beats the naive "recent form" baseline at RB, WR, and TE — the ordering edge that actually changes lineup decisions. Against RotoWire, the market leader, we sit at parity-to-slightly-below (within a few hundredths) using only our own free, pregame signals. We do not claim to beat the market, and at QB we don't yet clear our own bar — so we say so instead of shipping it quietly.
| Position | Snapcount | RotoWire (benchmark) | Gap | vs recency baseline |
|---|---|---|---|---|
| RB | .700 | .741 | −.041 | Beats it |
| WR | .680 | .690 | −.010 | Beats it |
| TE | .623 | .637 | −.014 | Beats it |
| QB | below our own bar | — | Not claimed | |
Every model fit and every walk-forward fold during development saw only 2016–2024. The 2025 season was physically separated from day one. After the season ended, we ran the frozen model over it exactly once and published every number — the full week-by-week scorecard, hits and misses alike.
Belt + suspenders: the baseline runner drops season == 2025 from the input frame before the harness even sees it; the harness's walk_forward_splits filters again; holdout_seasons is honored by every split shape. Three independent gates, enforced by tests that run on every commit.
The early build chased raw point accuracy (the MAE era — archived at metrics) until the honest conclusion arrived: what decides lineups is weekly ordering plus calibrated ranges, and that is where the model broke through. Everything since is receipts and product.
The walk-forward harness invokes the leakage validator BEFORE the first fit. Any feature pipeline that references a participation column, a post-game PBP outcome, or measured weather/officials hard-fails when live=true. 16 tests pin the block list against the actual participation.parquet schema.
Every ingest writes a baseline schema. Future ingests diff against it: removed columns, dtype changes, missing seasons, missing weeks per season, depth-charts dual-schema invariants. In-season runs additionally check 14 live-critical sources for currency.
Predict at (season S, week W) reads ONLY rows where (season < S) OR (season == S AND week < W). Imputer + scaler fit on each fold's train rows separately — no global statistics leak across folds. 17 boundary tests prevent regressions.
Before a claim ships, an independent reviewer is instructed to break it. That discipline has retracted our own headline numbers more than once — inflated hit rates, floor-gamed metrics, too-lenient acceptance tests — and the honest number always wins. The modeling lane doesn't self-approve.
A research experiment, not the product: simulated coordinators call one illustrative drive, play by play, with parameters you can adjust. The projections above never depend on it. Want the full experiment? Run the Week 5 simulation slate →
Waitlist signups open at launch (August 2026). We don't store emails server-side yet — to make sure you're counted, send us a note and we'll reach out when the board opens.