Methodology

No black boxes. Here's exactly what the engine does — and what it refuses to do.

Data sources

Play-by-play and roster data come from nflverse, used under CC-BY-4.0 with attribution (see our footer on every page). Injury information comes from publicly reported team sources. We do not use data sources that prohibit commercial use.

How a comparison is computed

  1. Score under your rules. Every play is converted to fantasy points using a versioned scoring rule (e.g. ppr_v1), so PPR, half-PPR, and standard leagues each get correct math.
  2. Baseline first. The starting projection for each player is their average fantasy points over the last four played weeks. Simple, checkable, hard to game.
  3. Adjust for availability. Reported injuries and role changes adjust the baseline; each adjustment carries a reason code.
  4. Compare, don't decorate. The engine outputs which player projects higher, the reason codes, and the data each reason came from. The language model only turns computed conclusions into plain English — it never invents numbers.

When data is insufficient, we say so

If a player has too few recent appearances to compare reliably, the result is insufficient_data — not a confident-sounding guess. A comparison you can't trust is worse than no comparison.

How we measure ourselves

We judge the engine on three metrics, published with sample sizes and failure cases:

Rules we hold ourselves to: only data available before the game counts; every pre-game recommendation is stored as an immutable snapshot and never overwritten after results; we compare against a simple recent-average baseline; we publish misses alongside hits. Our public track record starts the day we launch — we don't backfill pretty history.

What we don't do