SignalTuned SignalTuned

Rankings tuned to the signal, not the noise.

Need help?Sign in
RB2026-05-29

The pass-catching RB "floor" is mostly noise. The three-down bell-cow edge is +3 a game.

What the consensus says

The receiving-back drum has been the loudest one in the RB room all month. FantasyPros ran a whole "RB3s with RB1 Potential" piece built on the idea that pass-catching work is the floor that turns a depth back into a starter, and their dynasty sleeper and trade-target lists keep flagging "receiving ability" as the tell. RotoBaller's RB sleeper column leans the same way. PFF's rookie-RB fits piece sells Jeremiyah Love largely on a 79.2 receiving grade and a "safe floor as a receiver." Footballguys' value-risers list and Justin Boone's Yahoo dynasty update both treat catches as ballast. Five-plus independent voices, one claim: receiving work is what gives a running back a durable fantasy floor.

Falsifiable. So I tested it.

The claim, in plain English

def predicate(row) -> bool:
    """In-cohort = receiving role: >=25% of touch opportunity is targets."""
    return row["rec_share"] >= 0.25   # targets / (carries + targets)

A back is "in cohort" if at least a quarter of his touch opportunity comes through the air. That 25% line is not arbitrary: it's the exact cutoff the engine already uses to call a guy a receiving back. The trick is the control. A pass-catcher scores more in half-PPR by definition, so a naked comparison is rigged. The honest question is whether the receiving role still pays at the same total workload. Total touches is the whole game here.

How I beat on it

scripts/h43_rb_pass_catch_efficiency.py builds Y to Y+1 pairs from player_stats_season.csv (REG only, RB, 2015-2024 Y0, Y+1 reaches 2025, at least 6 games and 80 total touches). I band every pair by Y0 total touches (carries plus targets), then inside each band compare next-year ppg for the receiving-role backs against the ground-bound ones. Scored under half-PPR. Full framework: Session 97 two-gate spec. n = 438 pairs, a third of them receiving-role.

What the data actually said

First swing, straight up: receiving-role backs averaged 0.22 ppg less in Y+1 than everyone else. Negative. The exact opposite of the floor story.

Because aggregates lie. Pass-catching backs pile up at the bottom of the workload chart, the third-down specialists and committee change-of-pace guys who never sniff 200 touches. Lump them together and their low-volume roles drag the average down. Split by total workload and the picture flips hard:

Y0 total touches n_in in ppg n_out out ppg delta
300+ workhorse 13 15.44 63 13.85 +1.59
250-300 12 14.69 56 11.55 +3.13
200-250 28 10.76 71 10.46 +0.30
150-200 33 10.36 49 9.15 +1.22
100-150 40 9.02 37 8.29 +0.73
80-100 20 8.12 16 8.32 -0.20

Positive in five of six bands, and the two that clear the bar are the two that matter most: the bell-cow tiers. At 250 to 300 touches, the back who catches passes beats the pure grinder by 3.13 ppg the following year. At 300-plus, 1.59. Same workload, very different next season. The pure early-down hammer at the top of your backfield is the one who regresses. The three-down back at the same load holds his line. The receiving floor is not a floor at all. It is a ceiling that only shows up once the volume is already big.

What the engine already figured out

Half-right, and in a specific way. SignalTuned already knows what a receiving back is. It uses the identical 25% cutoff to stamp the receiving_back archetype, and it rewards it with a post_peak_modifier of 1.15, meaning those backs decline more gently once they're past their peak. Route-running ages better than burst. The engine has believed that for a while.

What the engine does NOT have is a forward bonus for the peak years. The 1.15 modifier only bends the decline slope after the peak window closes. A 24-year-old bell-cow catching 60 balls gets no Y0-to-Y+1 lift from his receiving role in the ranking math, even though the cohort says that's exactly where the edge lives. That gap is the "adds information" verdict: a real forward-projection signal, inside the high-volume bands, that the engine isn't currently using as an input.

What to do about it

At the top of a backfield, prize the three-down back over the early-down thumper even when their total touch counts match. The catches are not a consolation floor for low-volume backs. They are a regression hedge for high-volume ones. A 250-touch back who also catches is the safer bet than a 250-touch back who only runs, by about 3 points a week.

Engine-side, this stages an experimental_features.rb_pass_catch_forward_lift block at weight 0 with warm-loop watch, so the A/B harness can sample it without touching live rankings. It is NOT auto-merged: a weight-0 staging makes no ranking change, so it can't earn the clean-SHIP walk-forward verdict our auto-merge gate demands. This one goes to Ryan with the diff in docs/agent_proposals/. No live ranking change today.

Receipts


Back to all posts