Dynasty Twitter says sell your 27-year-old WR1 before the cliff. The cliff's a mirage.
Hold your elite-target-share WR through age 27, 28, and 29. At the same workload, receivers in the "27-29 sell window" produced within half a point of their 24-26 peers this cohort, a gap smaller than the discount the engine already bakes in. Spend your sell-high energy on name-recognition WRs whose price outruns their target share, not on Jefferson, Lamb, or Brown because a calendar says so.
What the consensus says
Justin Jefferson turns 27 this year, and the dynasty press has an answer ready: sell now. FantasyLife's buy-sell-hold breakdown and Dynasty League Football's reality check both frame the pre-30 window as the moment to move him, because "dynasty WR trade value often peaks before production declines." PlayerProfiler's 2026 buy-sell primer generalizes it across the position. Footballguys' age-decline research puts a number on it: "when wide receivers show signs of decline at age 29-plus, it's usually wise to believe them." Apex Fantasy Leagues pins the elite window at 23-29 and treats the back half of that range as a warning light.
The mechanism is coherent. Trade value is a market price, and markets front-run bad news. If everyone waits for the actual decline to show up in the box score, you're selling into a league that already knows. Sell before the evidence exists, not after.
The claim, in plain English
Strip the market-timing logic out and the testable part is simple: at the same opportunity, do 27-to-29-year-old WRs actually score less than 24-to-26-year-olds in the following season?
def predicate(row: pd.Series) -> bool:
return 27 <= row["age_y1"] <= 29
The comparison group is age 24-26 at the same Y0 target share, not the whole league. Target share is the control: if the age gap survives inside bands of equal opportunity, it's a real aging effect. If it doesn't, "sell before 30" is pricing a decline the data can't find yet.
How I beat on it
Y0-to-Y+1 pairs, 2015-2023 seasons, WRs with 6+ games and 40+ Y0 targets, Dynasdeez 10-team superflex Half-PPR scoring. 434 pairs split into age-27-29 entering Y+1 (n=197) against age-24-26 (n=237); ages 23-and-under and 30-plus are separate, already-tested buckets, excluded here to keep the comparison clean. Framework: the two-gate spec from Session 97.
What the data actually said
First swing, no controls: the 27-29 group averaged 0.16 ppg less than the 24-26 group in Y+1. Because aggregates lie, here's the target-share breakdown:
| Y0 target-share band | Age 27-29 Y+1 ppg | Age 24-26 Y+1 ppg | Delta |
|---|---|---|---|
| ts >= 0.30 (elite, n_out=4, underpowered) | 15.44 (n=11) | 12.05 (n=4) | +3.39 |
| 0.28-0.30 | 12.29 (n=10) | 14.02 (n=12) | -1.73 |
| 0.25-0.28 | 11.62 (n=19) | 11.82 (n=26) | -0.19 |
| 0.20-0.25 | 10.81 (n=58) | 11.13 (n=55) | -0.32 |
| 0.15-0.20 | 8.01 (n=54) | 9.22 (n=74) | -1.21 |
| under 0.15 | 6.57 (n=45) | 7.11 (n=66) | -0.54 |
Only one band, the thin 0.28-0.30 slice, clears the 1.5 ppg bar, and the truly elite band (ts >= 0.30, where Jefferson and Lamb actually live) points the other way -- though with only four 24-26 comparisons, that number isn't trustworthy either. Pool the five reliable bands and the gap is -0.48 ppg. That's real receivers, not averages: A.J. Brown put up 14.1 ppg at age 27 on a 0.343 target share, then 12.1 ppg at 28 on a lighter 0.261 share -- a smaller drop than his volume drop alone would predict. DK Metcalf scored 10.55 ppg at 27 and 10.51 ppg at 28, dead flat. CeeDee Lamb went from 14.1 ppg at 25 to 12.6 at 26, a step down, but well short of a cliff. Half a point a game is a rounding error against a 17-week season, not the falling-knife the sell-now case needs.
What the engine already figured out
SignalTuned's WR age curve doesn't ignore this window. age_curves.wr runs 1.0 at 26 (peak), down to 0.957 at 27, 0.927 at 28, 0.885 at 29 -- a real, built-in 5.7% relative discount for age 27-29 versus 24-26, applied to every WR in the model before anything else happens. The cohort's actual gap, -0.16 to -0.48 ppg on a roughly 9-11 ppg base, is in the same range as or smaller than that already-encoded discount. The engine isn't under-pricing the fear the takesmiths are selling. It's already about as cautious as the data supports, maybe more.
What to do about it
The "sell before 30" argument isn't wrong about markets, it's wrong about production. Trade value might front-run a decline. The decline itself, at equal opportunity, isn't showing up yet at 27, 28, or 29. If your league mate is offering a discount on an elite-target-share WR because he's "getting old," that discount is bigger than the data justifies, and SignalTuned's own age curve already prices in the modest real one. Buy that discount. Don't create it by selling Jefferson, Lamb, or Brown into a cliff this cohort can't find.