← Articles
The ZeroChalk O-Line Score (beta): Week 4 Outlook
Photo: Kenneth C. Zirkel, CC BY 4.0, via Wikimedia Commons
FreeSeptember 30, 2026

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.

A quarterback set in the pocket before releasing a pass
Photo: Caleb Lamb / Pexels (Pexels License, free for commercial use)

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

#TeamPass ProtectionRun BlockingSort keyWk 4 oppMatchup (pass)Matchup (run)Model sack rate, Wk 4Season sack rate, thru Wk 3 (raw)Confidence
1Buffalo+0.48+1.90+1.02NE-0.34+0.345.0%5.9%low
2San Francisco+1.48+0.54+1.00DEN-1.56-0.334.3%0.0%low
3LA Rams+0.26+1.53+0.79PHI+0.85+0.473.6%4.2%low
4Atlanta+0.79+0.69+0.74NO+0.07+0.424.3%6.6%low
5Dallas+0.88+0.51+0.72HOU-0.33-0.294.0%0.0%low
6Denver+1.20+0.01+0.68SF+0.51+0.323.8%4.0%low
7Tampa Bay+1.05-0.11+0.58GB+0.00-0.204.9%6.6%low
8Kansas City+0.32+0.67+0.52LV-0.92-0.374.6%3.7%low
9Chicago+0.38+1.21+0.46NYJ+1.23+0.114.1%5.3%low
10Indianapolis+0.03+0.36+0.29WAS+0.25-0.333.9%5.6%low
11Cincinnati-0.32+0.73+0.26JAX-0.02+0.134.6%4.4%low
12Jacksonville+0.12+0.02+0.21CIN+0.05+0.084.6%4.7%low
13Washington+0.62+0.13+0.20IND+0.47+0.254.4%2.6%low
14Seattle+0.69-0.49+0.12LAC-0.57-0.054.1%3.0%low
15Baltimore-0.12+1.04+0.11TEN+0.33-0.335.6%5.7%low
16Philadelphia+0.69-0.76+0.02LAR+0.10+0.493.9%2.8%low
17Carolina-0.48+0.12-0.03DET-0.55+0.515.4%5.3%low
18New Orleans+0.57-0.51-0.05ATL-0.15-0.544.9%5.4%low
19Pittsburgh+0.69-0.03-0.18CLE-0.26-0.144.4%5.6%low
20Miami-0.13-0.90-0.23MIN-2.73-0.806.7%4.7%low
21NY Giants-1.01+0.16-0.25ARI+0.98+0.215.1%5.4%low
22Arizona-0.21-0.44-0.27NYG+1.34+0.574.4%4.1%low
23NY Jets-0.69-0.39-0.30CHI+0.02+0.546.5%7.5%low
24Tennessee-0.36-0.04-0.31BAL+0.11-0.114.7%2.0%low
25Houston+0.12-1.43-0.47DAL+0.24+0.644.4%7.5%low
26Minnesota-1.37-0.22-0.55MIA+0.98-0.215.6%9.0%low
27Green Bay-0.74-0.27-0.65TB+0.89-0.494.3%3.8%low
28New England-0.23-0.75-0.66BUF-0.76+0.175.7%8.5%low
29Detroit-0.78+0.28-0.89CAR+0.76+0.364.7%2.5%low
30LA Chargers-1.74-0.26-1.01SEA-0.83-0.946.2%7.7%low
31Cleveland-1.39-1.61-1.05PIT-0.66-0.205.2%5.8%low
32Las Vegas-0.66-2.55-1.05KC+0.63-0.334.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.

More articlesCreate free account