Ten teams, 15 rounds, snake. One keeper each, optional. A synthetic league — every manager and every number here is generated.
Keepers occupy real picks, so those slots are gone before anyone sits down.
Pick minus ADP only measures how far down the board a player is being taken, so anything kept late scores well whether or not he's good. This ranks on how many more points a keeper returns than the best player still available at that same pick, each measured against replacement at his own position.
| # | Keeper | Manager | Costs | Proj | Edge | Best alternative there |
|---|
Your ruling: the limit follows the team. A player who runs out his two years with one manager is fresh again for anybody else.
| Player | Manager | Kept | Status | 2027 cost |
|---|
Every pick gets measured against the best player still available when it came up; each team is scored on how much of that it captured. Run ./grade.py once the draft is done.
The whole system, in two lines
Rule 5 isn't separate math. Charging two rounds earlier on a second straight year is the same as applying rule 3 twice — year one already moved him a round.
On the real league this reproduces 21 of 22 keepers on record; the one exception was a call made under an earlier wording of rule 4.
The case that forces the question
Two years max follows the manager, not the player. If one manager keeps someone in 2024 and another keeps him in 2025 and 2026, those are two separate runs — only the second manager's clock has expired.
A player another manager burned through is a clean slate for you.
Settled Aug 2026; rule 4 rewritten
How a player reached your roster is irrelevant. Only whether anyone drafted him that year. Waivers, free agency, a trade — if he was drafted, his cost comes off that round.
The old wording read as though any waiver pickup paid a flat R7, which priced backwards: it made a late-round wire find more expensive.
Read the standings
No manual tiebreak. Sleeper ranks tied records on total points for, so a finishing position is read off the standings page.
A season can easily finish with half the league tied. Points for separates them without anyone ruling on anything — and a 40-point gap between 6th and 7th is worth four wheel spots.
Live until the draft · timing unwritten
Swap an injured keeper for another player on your roster. The replacement is costed against his own history and must clear rule 2, so a swap can cost more than what it replaces.
The injured player accrues no year; the replacement starts his own year 1.
And the deadline binds only those who want one
One player or none. No penalty for passing, and a team with no keeper simply drafts a full board. Roughly a third of the league opts out in a normal year.
47 spots across ten teams. Odds below are 200,000 simulated sequential draws.
Spots → probability → average pick
Both look like flaws until you check the bracket
The cliff sits on the playoff line. The jump from 1 spot to 5 falls between 6th and 7th — and the field is the top 6 of 10. Nobody drops a place on purpose: it trades a playoff berth and a live shot at the prize money to move first-pick odds from 2.1% to about 10.6%.
The penalty only covers facts. Empty slot, IR, OUT, BYE — readable straight off the box score. It says nothing about lineup quality, because intent is unknowable and a low-projection start may be a sincere sleeper call.
The real league tracks who has paid on a page that stores its record server-side behind a login. Figures are omitted here.
Three failures this tooling exists to find, each one taken from a real league.
Or at least incomplete
Leagues write rules in chat and then apply them by feel. Modelling them and replaying against every historical keeper shows where text and practice diverge — and which of the two everyone actually believes.
On the real league this reduced nine written clauses to two lines reproducing 21 of 22 keepers, and identified the single outlier from transaction logs.
is_keeper is not the whole truth
When a commissioner enters a keeper by drafting the player manually, the pick carries no keeper flag. Anything counting keepers off that flag undercounts — and every two-year clock downstream is wrong by one.
The fix is an override layer the audit and the ledger both read.
The pre-draft check
Keeper flags survive between seasons, and survive a manager leaving. A flag with no matching board pick pulls that player out of the draft pool entirely — he ends up belonging to nobody.
Running the stranded-flag check before the draft turns a post-draft mess into a two-minute fix.