1 · Narratives and Point Adjustments
The Squatch boards are hand-maintained rankings. Hand-maintained rankings are wrong the moment a tendon snaps, a starter is named, or a wide receiver decides he would rather play cornerback. The news layer exists to close that gap: every run it reads the latest headlines and the live depth chart for each player, writes a fresh three-sentence narrative, and — when a headline reports a concrete event that already happened — moves the player on the Squatch boards by a bounded, time-limited number of spots.
This page is the outline of that system as rebuilt in September 2026 ("v2"). If you only read one section, read The event classes and How a delta reaches your recommendations.
Back to the Fantasy Drafting overview · Next: 2 · AI Guru and league value
The pipeline
- Universe. Every player any ranking source ranks, through roughly the top
- The top 200 by best rank ("hot" tier) refresh every other day; the rest refresh monthly.
- Inputs per player. The player's current team and position from Sleeper (authoritative — players move), his standing on the Sleeper depth chart (QB1, RB2, WR3…) with the names ahead of him, the current roster around him, his rank on each source board, and up to six recent headlines from Google News.
- Model. Claude reads those inputs in batches and does two things: writes the three-sentence narrative (role, opportunity, draft take), and decides whether the player's Squatch ranking should move. It is told to default to zero, to move a player only for a concrete, already-happened event, and to return a signed delta for each of the three Squatch boards plus a short reason, a severity class and a horizon.
- Code enforcement. The model's answer is then corrected by rules that do not trust it: the positive ban list, format-specific scaling, the successor rule, depth-chart auto-moves, the free-agent floor, the 30-day positive cap, and clamping to ±40 nominal spots.
- Write. The corrected entries replace the player's row in the adjustments file; a dated copy of every change goes to an append-only history file that drives the Recent Movers view.
- Load. When rankings are loaded, each surviving adjustment is converted from nominal spots to effective spots for the player's tier, weighted for the league type (dynasty or redraft), and applied to the Squatch boards before anything else reads them. Expired entries are dropped at this step.
What an adjustment records
Each player's entry in the adjustments file carries these fields. Names are shown as they appear in the file so a reader can recognise them in the history or the Movers view.
| Field | Meaning |
|---|---|
name, sleeper_id |
Who. The Sleeper id is the dedupe key when present, so "Le'Veon Moss" and "LeVeon Moss" collapse to one entry |
sf_delta, tep_delta, pos_delta |
Nominal spots on the superflex board, the TE-premium board and the player's positional board. Positive = move up. Clamped to ±40 |
reason |
One short line (80 characters or fewer): "torn ACL, season-ending", "depth chart: RB1 -> RB2" |
severity |
The event class: none, sentiment, role, injury, legal, retired, position_change |
horizon |
How long the event matters: week, month, season, career |
applied, expires |
The date the delta was written and the date it stops applying (career never expires) |
off_board |
True for retirements and position changes — the player is sent to the bottom of every Squatch board regardless of the delta |
pre_rank |
The player's base rank on each board when the delta was applied. This is what tier scaling reads |
source |
Who wrote it: ai (the model), depth_chart (automatic demotion/promotion), fa_floor (unsigned free agent), successor (inherits an injured starter's role) |
Older entries written before v2 load with sensible defaults — horizon
season, no expiry, not off-board, source ai — so nothing disappears on
upgrade. A one-off migration stamps them properly by severity (injury and role
become season, sentiment becomes month, retirement reasons become retired
and off-board).
The event classes
The model is no longer asked to pick a number from a wide band. Each kind of event has a fixed magnitude and a fixed horizon. These are the rules the code enforces after the model answers:
| Event | Nominal delta | Horizon | Severity | Notes |
|---|---|---|---|---|
| Day-to-day injury, questionable for a week | -2 | week | injury | Expires after seven days |
| Injury, 2–4 weeks | -6 | month | injury | |
| Injury, 6+ weeks, or IR designated to return | -12 | season | injury | |
| Season-ending injury | -25 | season | injury | Triggers the successor rule |
| Career-threatening injury | -25 | career | injury | Never expires |
| Skill player moved to defense or a non-scoring role | -25 | career | position_change | Off board |
| Retirement | -25 | career | retired | Off board |
| Arrest, exempt list, pending suspension with no ruling | -10 | season | legal | Triggers the successor rule |
| Suspension with a ruling | Priced with the injury bands by games missed | as the band | injury | A four-game ban reads like a month-long injury |
| Signed with a new team, no clear starting role | at most +2 | season | role | |
| Completed trade, signing or release; an explicit starter change | ±3 to 8 | season | role | Must have already happened |
| Named the clear starter / lost the job | ±1 to 2 | season | role | |
| Successor to an injured or suspended starter | at least +4 | same as the trigger | role | Written by code, source successor |
| Depth chart: starter to backup | -5 | month | role | Automatic, source depth_chart |
| Depth chart: backup to starter | +5 | month | role | Automatic, source depth_chart |
| Unsigned free agent | -15 | season | role | The floor, source fa_floor |
Anything speculative — rumors, "could" and "might", trade requests that have not happened, contract talks still open, beat-writer optimism, camp praise, award mentions — is a zero. If the model is not sure an event occurred, it is told to use zero.
The positive ban list
Certain phrases have historically produced positive deltas that were pure
noise: a contract extension does not make a player score more points, and a
touchdown in a preseason game is not a role change. When the reason for a
positive delta contains any of the following as a whole word (case-insensitive,
plural and "-er" forms included, so "rotation" does not trip OTA and
"Campbell" does not trip camp), the delta is forced to zero in code, and the
same list is given to the model as explicit zeros:
extension, contract, touchdown, TD, draft capital, round pick,
elite, contender, Super Bowl, looks great, camp, OTA, minicamp,
award, Pro Bowl, All-Pro.
Format-specific scaling
The three Squatch boards value positions differently, and a delta that is identical on all three is a sign the model did not think about format. Two rules fix the most common cases:
- A quarterback whose superflex delta equals his positional delta has his superflex delta scaled to 1.5×. A starting QB matters more on a board where two of them start.
- A tight end whose TE-premium delta equals his superflex delta has his TE-premium delta scaled to 1.5×. A TE1 matters more on a board that pays a bonus per catch.
Both re-clamp to ±40 afterwards.
Horizons and league type
A delta carries a horizon, and the horizon decides two things: when the entry expires, and how much of it a given league type feels. A dynasty drafter should barely notice a one-week injury; a best-ball drafter in September should feel all of it.
| Horizon | Expires | Redraft weight | Dynasty weight |
|---|---|---|---|
| week | 7 days after applied |
1.00 | 0.00 |
| month | 30 days after applied |
1.00 | 0.15 |
| season | End of the 2026 season (2027-01-10) | 1.00 | 0.50 |
| career | Never | 1.00 | 1.00 |
The advisor detects whether a league is redraft (including best-ball) or dynasty and asks the loader for the matching mode. Both versions of each Squatch board are always available, so a dynasty league and a redraft league drafting the same afternoon see different Squatch boards from the same adjustments file.
Tier-scaled spots: nominal versus effective
The stored delta is nominal, calibrated at rank 50. In v1 a delta was applied literally: -15 at rank 20 knocked a first-round pick into the third round, while -15 at rank 250 moved a player nobody drafts to a slightly deeper place nobody drafts. The same event should mean the same proportion of a player's value.
At load time the nominal delta becomes an effective one:
effective spots = sign × max(3, round(|nominal| × base rank ÷ 50)), then × the horizon weight for the league type, rounded; the re-ranked position never goes above 1.
So a nominal -15 means "about 30% of your rank", with a floor of three spots so a small delta is still visible at the top of the board.
Worked example. Two receivers suffer the same season-ending injury
(nominal -25, horizon season):
| Base rank 20 | Base rank 200 | |
|---|---|---|
| Nominal delta | -25 | -25 |
| Effective spots (before weighting) | 25 × 20 ÷ 50 = -10 | 25 × 200 ÷ 50 = -100 |
| Redraft (weight 1.00) | moves to about rank 30 | moves to about rank 300 |
| Dynasty (weight 0.50) | moves to about rank 25 | moves to about rank 250 |
And a nominal -2 (day-to-day, horizon week) at rank 20 is 2 × 20 ÷ 50 = 0.8,
which the floor lifts to -3 spots in redraft — and to 0 in dynasty,
because a week-long injury has weight zero there.
The successor rule
When Jayden Higgins tore his ACL under v1, nobody in Houston moved up. Under
v2, when a player who held a real NFL role receives a delta of -8 or worse
with severity injury or legal, the code finds the teammate who inherits
that role and lifts him to at least +4 with the same horizon, severity role,
source successor, and the reason "successor:
"Real NFL role" means a team's QB1, RB1 or RB2, WR1 through WR3, or TE1. The test uses the current Sleeper depth chart first, then the previous run's depth snapshot (Sleeper drops a player to the bottom of the chart the moment he lands on injured reserve, so the snapshot remembers where he stood before), and finally a positional-rank proxy (roughly the top 24 QBs, 48 RBs, 72 WRs, 24 TEs on the Squatch board) when neither chart view is available.
Who inherits depends on whether the injured player is still listed as active:
- An active starter hands the role to the next man down on the chart.
- A player already demoted or marked inactive cannot be walked "below", so the code walks the chart from the top and picks the first active teammate who ranks worse than him on the Squatch positional board. A better-ranked teammate inherits nothing. When Higgins (WR56) went down, Nico Collins (WR18) stayed put and Kayshon Boutte (WR83) received the +4.
Teammates who are themselves out this run are skipped for the next one down.
Position changes are decided by data, not the model
Sleeper's primary position is authoritative. When it lists a defensive
position (DB, CB, S, LB, and so on) for a player we rank at QB, RB, WR or TE,
the entry becomes position_change, off board, career horizon, whatever the
model said. Travis Hunter is the case: the model priced his move to full-time
cornerback as a "reduced WR role" worth -2 to -6. Sleeper already listed him as
a DB, so the code overrides it.
The same code-side rules (position change, free-agent floor, depth-chart move) run even when the model returns nothing or its narrative is rejected for naming the wrong team. A player the model never answered for is not counted as processed, so a transient AI failure cannot wipe the adjustments he already had.
Depth-chart auto-moves
The depth chart is the most reliable signal we have and it does not need a headline. Every run persists a snapshot of each processed player's team, position and depth. On the next run:
- a player who was depth 1 and is now depth 2 or lower receives -5,
horizon
month, severityrole, sourcedepth_chart, reason "depth chart: RB1 -> RB2"; - a player who was depth 2 or lower and is now depth 1 receives +5 on the same terms.
These fire only when the model gave the player zero this run. If the model already moved him for the same news, the model's explicit delta wins and the auto-move stays out of the way.
Caps, floors and cleanup
- 30-day positive cap. Positive deltas compound easily — a signing, then a starter announcement, then a good camp report. The writer sums a player's positive superflex deltas from history entries dated within the last 30 days and clamps the new positive delta so the running total stays at or below +12, scaling all three boards by the same factor.
- Free-agent floor. An unsigned free agent sits at -15, horizon
season, sourcefa_floor, until he signs. - Clamp. Every nominal delta is clamped to ±40 after all rules run.
- Expiry. The loader drops any entry whose
expiresdate has passed. An August "questionable for Week 1" note cannot still be moving a player in November. - Off board. A retired player, or a skill player converted to defense, is sent to the bottom of every Squatch board regardless of delta, preserving the relative order of everyone down there.
- Dedupe. When an incoming entry's Sleeper id matches an existing entry filed under a differently normalized name, the old key is deleted.
How a delta reaches your recommendations
The rule is one owner per signal. A given event is meant to move a player through exactly one channel:
- The writer produces the adjustments file.
- The loader applies effective, weighted deltas to the Squatch boards and annotates each moved player with his base rank, the net spots moved, the reason, the horizon and the expiry (that is what the up/down badge shows).
- The composite reads those adjusted Squatch boards. The Squatch bucket holds 30% of whatever share the league-value and chopped boards leave (so about 22% in a typical league, and nothing in a chopped league, where the Squatch boards are switched off), and the delta reaches recommendations through that share. The 100% AI board (a half-weight source) also uses the news, because "what has changed since" is one of its three inputs: a small multiplier on its projection (2% per point of delta, bounded). It reads the adjustments through the same loader as the Squatch boards, with the season-long (redraft) horizon weights because it projects one season, so an expired entry stops moving it just as it stops moving the Squatch boards. We kept the term rather than removing it because without it the board would be a stale usage share that does not know a player tore his ACL. The cost is that a news event reaches the composite through the Squatch bucket and, much more weakly, through this one board, and both follow the same active entry.
- The AI Guru starts from the composite. It no longer adds the adjustment
delta again as a "sentiment" term; that term is gone. Its role-security
signal is also skipped for any player who already carries an active
role,injuryorlegaladjustment this cycle, so a demoted backup is not penalised by the news layer and then penalised a second time for being a backup.
A player's movement can always be traced to one line in the history file with one reason attached; the 100% AI board's multiplier is driven by that same line.
Why v2
An audit of the live adjustments file on 2026-09-05 (392 entries) found:
- 115 entries sat at exactly -15, the free-agent floor. Positive moves were overwhelmingly +1 or +2 (125 of them); the "+6 to +15 for the successor" band had fired once in the file's life. When Jayden Higgins tore his ACL, nobody in Houston moved up.
- 340 of 392 entries had identical superflex, TE-premium and positional deltas. The model was not pricing format at all.
- A backup was hit three times for the same fact: the model's "backup" delta on the Squatch board (which reached the composite), the Guru's role-security penalty, and the Guru's sentiment term (the same delta again).
- Deltas were board spots regardless of rank: -15 at rank 20 was a collapse, at rank 250 it was nothing.
- Nothing expired. An August "questionable Week 1" delta was still live in November.
- One number served dynasty and redraft. The prompt said "dynasty" but redraft best-ball drafts consumed it unchanged.
- Travis Hunter carried +2 for "full-time cornerback role confirmed" — a receiver who no longer plays offense was rewarded for role clarity.
- Duplicate keys existed for the same player under different name normalizations (David Bell, Le'Veon Moss).
Every rule on this page maps to one of those bullets.