puntgm

Method, and what we got wrong

Fantasy tools publish rankings. Almost none publish what happens when you draft from them, and none we have found publish their own mistakes. Both are here, because a number you cannot check is worth nothing.

What this board is

Per-game production measured from 2025-26 game logs over the top 156 players by minutes per game. Compounded to a week over the league's scheduled games per week, each played with an expected-availability probability projected as of 2026-08-24 — a beta-binomial rate shrunk toward the pool, not last season's realized games. No count of the games this player actually went on to play enters the rank. Category rates are measured, not projected forward.

In plain terms: per-game production is measured from last season's box scores. It is not projected forward. The only forward model on this page is expected games — a beta-binomial rate shrunk toward the league pool, so a player with one unlucky season is not condemned by it, and a rookie gets the pool rate rather than a silent 82.

We have a forward projection model for category rates. It is not on this page, because the test that decides whether it beats simply carrying last season forward has not been run yet. When it passes, it ships. If it fails, we will say so here.

Two errors we found in our own numbers

1. The board was quietly reading the future

Forward boards were built by adding up weekly totals over the weeks a player actually appeared. That sounds harmless and is not: it silently keeps each player's realized games per week, which is a fact about the season being graded. The board correlated +0.60 with how many games players turned out to play, and ~0.00 with the availability projection it had been given.

Fixed by construction rather than by argument. A week is now built as a scheduled number of games, each played with a projected probability, so availability can only enter through that probability. Correlation afterwards: +0.07.

2. Rotating draft seats does not control for draft position

Two strategies seated next to each other rotate together, so they stay adjacent in a fixed order, and over an odd number of rounds a snake hands the lower-seated one the earlier pick more often. We assumed rotation handled it. Drafting a board against itself, the artifact reached +9.5pp — the size of effects we had been reporting.

Every table on this site now carries a null arm: the same strategy in both seats. Without one, an artifact and a finding look identical.

What we are not claiming

Reproduce it

The engine, the replay harness and this board are one open-source Python package. The board on the front page is the same function call the replay grades — not a rendering of it, the same object. github.com/teebszet/puntgm