
The ZeroChalk O-Line Score (beta): Week 4 Outlook
We built our own grading model from free, public data instead of renting someone else's grades. It does not beat a coin flip on every metric yet, and we are telling you that up front. Here is what it says about all 32 lines heading into Week 4.
The ZeroChalk O-Line Score (beta): Week 4 Outlook
Every O-line report we have run so far borrowed someone else's grades and added color. This week we
stop borrowing. The ZeroChalk O-Line Score is our own model, built end to end on free, public
nflverse data: play by play, PFR's advanced weekly stats, FTN's charting, snap counts, and official
injury designations. No PFF, no scraped Pro Football Reference, nothing behind a paywall. The method
is a weighted ridge regression, the same tool a sabermetrician would reach for to separate a hitter's
true talent from the pitchers he happened to face, run here on 32 offenses against 32 defenses at
once so a good line and a soft schedule stop looking identical.
We are calling it beta, and we mean it. Full disclosure lives in the box below. Read it before you
read the table.
Beta, plainly. This model is brand new. Its confidence is low this early in the season, and it
stays low for a while: the shrinkage constants that anchor every score were fit for weeks with
400 to 500 dropbacks of history behind them, and Week 4 offers each team somewhere between 86 and
147. On a pre-registered backtest against the 2025 season, the model was the single best predictor
of a team's next game on aggregate, but it did not clear the bar we set for it: beating three
simple baselines, including last week's raw rate, by a wide enough margin on every metric to call
the added complexity proven. It lost outright to the plain season-to-date rate on sack rate
specifically. We are publishing it anyway, labeled beta, because nothing simpler beat it either.
It gets re-tested the same way, pre-registered, after this season ends, and the label comes off
only if it earns that.
How to read the table
Two grades publish here, not one: pass protection and run blocking. They are separate because they
drive different fantasy calls. A quarterback and his receivers live or die on pass protection; a
running back lives or dies on run blocking. We do not average them into a single number and call it
a grade. A sort key exists underneath the table, a weighted blend of both scores plus a continuity
and health term, and its only job is to put the 32 teams in an order. It is never itself a published
grade, and it should never be quoted as one.

Both scores are z-scores: zero is league average, positive is better than average, negative is worse,
and the scale is standard deviations, so a team at plus-one is a clear step above the pack and a team
at minus-two is an outlier in the other direction. Under the hood, each is a shrunk, opponent-adjusted
rate built from six underlying stats: for pass protection, the line-attributable sack rate (total
sacks minus the ones FTN's charting flags as the quarterback's fault), the PFR-tracked pressure rate,
and the quarterback-hit rate; for run blocking, the stuff rate allowed, the EPA-positive rush-success
rate, and PFR's yards-before-contact.
Matchup pass and matchup run are a separate number from the season score: the specific contribution
of this week's opponent, in the same z-units. A positive matchup number means a softer front than
average; negative means a tougher one. A team can have an elite season score and still face a rough
Week 4 matchup, or the reverse, and the two numbers say which is which.
One column we are adding on purpose: the model's expected sack rate next to the plain, unadjusted
season rate. On the backtest, this was the one metric where the model did not clearly beat raw
season-to-date sack rate, so we are showing you both rather than picking a winner for you. If they
disagree by a lot, that disagreement is information.
Confidence is low across the board, on every team, this week, marked in the final column. That is
not a hedge, it is the honest output of a model whose stabilization constants require hundreds of
plays before it trusts a team's own numbers over the league prior. Four weeks of football, for most
teams, is not there yet.
Data runs through Week 3. Week 4's slate runs Thursday, October 1 through Monday, October 5; this
model was built and run before any Week 4 snap, including Thursday's Pittsburgh-at-Cleveland opener,
so every number below is a pregame outlook for the full Week 4 slate, not a recap of any game already
played by the time you're reading it. PFR's Week 3 advanced-stat release was not yet published when
this model ran, so pressure rate and yards-before-contact use Weeks 1 and 2 only for every team; the
Week 4 injury report was also not yet in the nflverse file, so the continuity term below is lineup
churn only, with no forward-looking injury penalty applied yet. Both gaps are the model's own known
state, not something smoothed over.
The 32, ranked
| # | Team | Pass Protection | Run Blocking | Sort key | Wk 4 opp | Matchup (pass) | Matchup (run) | Model sack rate, Wk 4 | Season sack rate, thru Wk 3 (raw) | Confidence |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Buffalo | +0.48 | +1.90 | +1.02 | NE | -0.34 | +0.34 | 5.0% | 5.9% | low |
| 2 | San Francisco | +1.48 | +0.54 | +1.00 | DEN | -1.56 | -0.33 | 4.3% | 0.0% | low |
| 3 | LA Rams | +0.26 | +1.53 | +0.79 | PHI | +0.85 | +0.47 | 3.6% | 4.2% | low |
| 4 | Atlanta | +0.79 | +0.69 | +0.74 | NO | +0.07 | +0.42 | 4.3% | 6.6% | low |
| 5 | Dallas | +0.88 | +0.51 | +0.72 | HOU | -0.33 | -0.29 | 4.0% | 0.0% | low |
| 6 | Denver | +1.20 | +0.01 | +0.68 | SF | +0.51 | +0.32 | 3.8% | 4.0% | low |
| 7 | Tampa Bay | +1.05 | -0.11 | +0.58 | GB | +0.00 | -0.20 | 4.9% | 6.6% | low |
| 8 | Kansas City | +0.32 | +0.67 | +0.52 | LV | -0.92 | -0.37 | 4.6% | 3.7% | low |
| 9 | Chicago | +0.38 | +1.21 | +0.46 | NYJ | +1.23 | +0.11 | 4.1% | 5.3% | low |
| 10 | Indianapolis | +0.03 | +0.36 | +0.29 | WAS | +0.25 | -0.33 | 3.9% | 5.6% | low |
| 11 | Cincinnati | -0.32 | +0.73 | +0.26 | JAX | -0.02 | +0.13 | 4.6% | 4.4% | low |
| 12 | Jacksonville | +0.12 | +0.02 | +0.21 | CIN | +0.05 | +0.08 | 4.6% | 4.7% | low |
| 13 | Washington | +0.62 | +0.13 | +0.20 | IND | +0.47 | +0.25 | 4.4% | 2.6% | low |
| 14 | Seattle | +0.69 | -0.49 | +0.12 | LAC | -0.57 | -0.05 | 4.1% | 3.0% | low |
| 15 | Baltimore | -0.12 | +1.04 | +0.11 | TEN | +0.33 | -0.33 | 5.6% | 5.7% | low |
| 16 | Philadelphia | +0.69 | -0.76 | +0.02 | LAR | +0.10 | +0.49 | 3.9% | 2.8% | low |
| 17 | Carolina | -0.48 | +0.12 | -0.03 | DET | -0.55 | +0.51 | 5.4% | 5.3% | low |
| 18 | New Orleans | +0.57 | -0.51 | -0.05 | ATL | -0.15 | -0.54 | 4.9% | 5.4% | low |
| 19 | Pittsburgh | +0.69 | -0.03 | -0.18 | CLE | -0.26 | -0.14 | 4.4% | 5.6% | low |
| 20 | Miami | -0.13 | -0.90 | -0.23 | MIN | -2.73 | -0.80 | 6.7% | 4.7% | low |
| 21 | NY Giants | -1.01 | +0.16 | -0.25 | ARI | +0.98 | +0.21 | 5.1% | 5.4% | low |
| 22 | Arizona | -0.21 | -0.44 | -0.27 | NYG | +1.34 | +0.57 | 4.4% | 4.1% | low |
| 23 | NY Jets | -0.69 | -0.39 | -0.30 | CHI | +0.02 | +0.54 | 6.5% | 7.5% | low |
| 24 | Tennessee | -0.36 | -0.04 | -0.31 | BAL | +0.11 | -0.11 | 4.7% | 2.0% | low |
| 25 | Houston | +0.12 | -1.43 | -0.47 | DAL | +0.24 | +0.64 | 4.4% | 7.5% | low |
| 26 | Minnesota | -1.37 | -0.22 | -0.55 | MIA | +0.98 | -0.21 | 5.6% | 9.0% | low |
| 27 | Green Bay | -0.74 | -0.27 | -0.65 | TB | +0.89 | -0.49 | 4.3% | 3.8% | low |
| 28 | New England | -0.23 | -0.75 | -0.66 | BUF | -0.76 | +0.17 | 5.7% | 8.5% | low |
| 29 | Detroit | -0.78 | +0.28 | -0.89 | CAR | +0.76 | +0.36 | 4.7% | 2.5% | low |
| 30 | LA Chargers | -1.74 | -0.26 | -1.01 | SEA | -0.83 | -0.94 | 6.2% | 7.7% | low |
| 31 | Cleveland | -1.39 | -1.61 | -1.05 | PIT | -0.66 | -0.20 | 5.2% | 5.8% | low |
| 32 | Las Vegas | -0.66 | -2.55 | -1.05 | KC | +0.63 | -0.33 | 4.8% | 2.9% | low |
*Sort key = 0.45(Pass Protection) + 0.35(Run Blocking) + 0.20(Continuity), the model's fitted
weighting. It orders the table; it is not a third grade, and no call below quotes it directly.
Model sack rate is the expected line-attributable rate for the Week 4 game (mu + offense effect +
opponent effect); season sack rate is the same line-attributable stat, unshrunk, summed over each
team's three games so far.*
A note on San Francisco's and Dallas's 0.0% raw sack columns: both offenses have allowed zero
line-attributable sacks through three games. Real, not a rounding artifact, and exactly the kind of
number the model's shrinkage exists to handle, since three sack-free games is a small sample even
before you ask whether the pass rushes they faced were any good.
Eight fronts worth the extra look
The model flags a deep dive by a threshold rule, not an editor's gut: a matchup swing of at least
0.75 z-units on either sub-score, a lineup-churn swing, or a large week-over-week move in a team's
own score. Twelve games tripped that trigger for Week 4, four more than our six-to-eight target,
because the league's spread of offensive-line talent is still narrow in September and the same
matchup z-unit reads as larger than it will by November. We are running the rule as built rather than
hand-tuning it to hit a round number, and cutting to the top eight by trigger size, the honest way to
handle an early-season over-fire.
Miami at Minnesota. The single largest matchup swing on the board, and it runs against Miami both
ways. Miami's own pass-protection score sits a tick below average (-0.13, 20th), nothing alarming on
its own, but the model's opponent term for this specific game is -2.73, by far the worst matchup
number anywhere in Week 4. Minnesota's defensive front, by this model's read, is a legitimately hard
pass-rush environment, hard enough to turn an ordinary Miami pass-protection week into a real problem.
The other direction cuts the opposite way: Minnesota's own line ranks 26th in pass protection, and it
draws a plus matchup (+0.98) against a Miami pass rush the model reads as generous. Two below-average
lines, one facing a real accelerant and one facing relief.
Denver at San Francisco. Two of the league's six best pass-protection units, by this score, share
a field. San Francisco sits second overall (+1.48) but draws Denver's above-average rush as a genuine
stress test, the second-worst matchup number in the league this week (-1.56). Denver sits sixth
(+1.20) and gets the plusher end of the same game (+0.51) against a 49ers defense that reads, in this
model, as more dangerous rushing the passer than stopping the run. When both lines are this good, the
matchup term is doing most of the differentiating work, and here it leans toward Denver's protection
holding up the better of the two.
Arizona at New York Giants. Two lines in the bottom third of the league by their own season
scores, Arizona 22nd in pass protection and the Giants 21st, and both get a plus matchup this week
(+1.34 for Arizona, +0.98 for the Giants). The model reads both defensive fronts as softer than
average against the pass, a rare case where two shaky units both catch a break in the same game. Worth
remembering that Arizona also carries real season-long churn (0.375, the model's decayed count of new
starters) even as this week's matchup number looks kind.
Chicago at New York Jets. Chicago's run-blocking score is a strong +1.21 (9th by sort key), and
its matchup term against the Jets is the best pass-rush matchup on the board apart from Miami's
disaster, at +1.23. That is a plus matchup sitting on top of a line that has itself been shuffled more
than most, a churn value of 0.625 that pulls its continuity term into negative territory even as the
underlying talent score holds up.
LA Chargers at Seattle. The Chargers carry the league's worst pass-protection score outright
(-1.74, 30th) and Week 4 does not offer relief: both matchup terms run negative, -0.83 on the pass and
-0.94 on the run, a rare double-negative matchup stacked on top of an already-poor unit. Seattle's own
line, 14th overall, catches the better matchup, but not by enough to call this anything but the
Chargers' hardest trench week of the four so far.
Kansas City at Las Vegas. Kansas City's pass-protection score is solidly above average, 8th at
+0.32, but the matchup term (-0.92) says Las Vegas's defensive front is tougher than its offensive
line's own dead-last run-blocking score (-2.55) would suggest. The Raiders' offensive front is, by a
wide margin, the worst run-blocking unit in this model, which makes the defensive side of that
same roster worth separating out rather than assuming a bad offensive line means a bad defense too.
Green Bay at Tampa Bay. Green Bay carries the highest churn value of any team in this week's deep
dives, 0.844, which drags its continuity term to -1.14 and its overall sort key to 27th. It also draws
the best pass-rush matchup of the eight, +0.89 against Tampa Bay's front. That is a real tension: a
line the model has the least confidence in, by continuity, getting a matchup number that argues the
other way. Early-season z-units run hot in both directions right now, and this is the clearest example
of it on the board.
LA Rams at Philadelphia. The Rams' run-blocking score is second in the league (+1.53) and draws a
plus matchup on the ground (+0.47) against a Philadelphia front the model does not rate as an imposing
run-stopping unit. Philadelphia's own line still grades out mid-pack overall (16th by sort key) despite
a run-blocking score dragged down to -0.76, the after-effect of the shuffle the Eagles made at guard
and center; its own matchup numbers this week (+0.10 pass, +0.49 run) run favorably against a Rams
defense that, independent of anything this model measures, has not generated pressure at a high rate
this season.
What this model has and has not shown
Said plainly, because the house voice here is receipts, not hype: on a pre-registered 2025 holdout
test, this model was the best single predictor of a team's next game across four different stats,
on aggregate, beating the best of three baselines (last season's rank, the raw season-to-date rate,
and a simpler opponent-adjustment method) by 0.03 Spearman correlation on average. It cleared its own
bar, a 0.05 margin on every stat in both halves of the season, in 9 of 24 cells and missed it in the
other 15, most of those misses by less than 0.03 with the model still ahead. It lost outright, not
narrowly, to the plain raw sack rate on one metric: line-attributable sack rate in the back half of
the season. That is exactly why the raw sack column sits next to the model's own sack column above,
and exactly why every confidence tag on this table reads low.
What moves this off beta: the same pre-registered test, re-run after this season with three years of
holdout data pooled instead of one, a fix for the sack-attribution noise that even a full season of
data cannot fully resolve on its own, and a real injury-report join once the name-matching pipeline is
tightened. None of that happens before next September. Until then, this table is the best free-data
read we have, shown with its actual batting average attached instead of rounded up.
Fantasy analysis only. Not affiliated with the NFL, its teams, or the NFLPA.
Sources and attribution
- Play by play, snap counts, injuries, schedules, depth charts: nflverse-data releases (free, no key),
github.com/nflverse/nflverse-data.
- FTN Data via nflverse (CC-BY-SA 4.0), the charted quarterback-fault sack flag that splits every
sack into line-attributable and quarterback-attributable before it scores anyone.
- PFR advanced weekly stats (pressures, yards before contact) via nflverse's licensed redistribution
release, not scraped from pro-football-reference.com directly.
- Model, calibration, and backtest methodology: built and maintained in-house, a weighted ridge
regression fit on the 2022-2025 seasons and frozen in-season per our pre-registered backtest spec.
Full backtest writeup available on request.