Contact Rules and Penalties as Strategy

Why the same grab costs five yards before the throw and forty after it, why linemen hold, and how a yellow flag rewrites a series

Show the Python (shared drawing helpers for this chapter)
import os
import logging
import textwrap

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle, FancyBboxPatch, FancyArrowPatch, Polygon, Circle, Ellipse
from matplotlib.lines import Line2D
from matplotlib.patches import Patch
from IPython.display import Markdown

from gridiron import Play, Player, Field, offense, defense, routes as r, show_animation, style, draw_marker

logging.getLogger("matplotlib.font_manager").setLevel(logging.ERROR)
style.apply()
PDF = os.environ.get("RTG_FORMAT", "").lower() in ("pdf", "typst", "print")

LEGAL = "#0f7a55"       # dark green: legal contact
LEGAL_T = "#d7efe4"
FOUL = "#b8321f"        # dark red: a foul
FOUL_T = "#fbe1da"
FLAG_Y = "#f2c200"      # the yellow flag
FIELD_W = 160 / 3


def P_(fld, p, d, w):
    x, y = fld.xy(*p.to_abs(d, w))
    return float(x), float(y)


def no_numbers(ax):
    """Remove gridiron's painted yard-line numbers (they sit where receivers stand)."""
    for t in list(ax.texts):
        if t.get_alpha() == 0.55:
            t.remove()


def say(fld, p, d, w, text, color=style.INK, fs=6.8, ha="center", weight="normal", box=True, style_="normal"):
    """A short on-field label at (d, w), on a pale backing so lines under it stay out of the way."""
    x, y = P_(fld, p, d, w)
    kw = dict(bbox=dict(boxstyle="round,pad=0.2", fc=style.SURFACE, ec="none", alpha=0.93)) if box else {}
    fld.ax.text(x, y, text, fontsize=fs, color=color, ha=ha, va="center", zorder=12, fontweight=weight,
                linespacing=1.12, style=style_, **kw)


def band(fld, p, d0, d1, color, alpha=1.0, w0=-26.7, w1=26.7, z=0.6):
    """Shade the strip of field between depths d0 and d1."""
    (xa, ya), (xb, yb) = P_(fld, p, d0, w0), P_(fld, p, d1, w1)
    fld.ax.add_patch(Rectangle((min(xa, xb), min(ya, yb)), abs(xb - xa), abs(yb - ya), fc=color,
                               alpha=alpha, ec="none", zorder=z))


def line_across(fld, p, d, color, lw=1.4, ls=(0, (4, 2)), w0=-26.7, w1=26.7, z=2.5):
    (xa, ya), (xb, yb) = P_(fld, p, d, w0), P_(fld, p, d, w1)
    fld.ax.plot([xa, xb], [ya, yb], color=color, lw=lw, ls=ls, zorder=z)


def star(fld, p, d, w, color, ms=12):
    """Where the contact happens."""
    x, y = P_(fld, p, d, w)
    fld.ax.plot([x], [y], marker="*", ms=ms, color=color, mec="white", mew=0.7, zorder=13)


def flag(fld, p, d, w, s=1.0):
    """A small yellow penalty flag planted at (d, w); drawn in plot yards, so it stands upright in either view."""
    x, y = P_(fld, p, d, w)
    ax = fld.ax
    ax.plot([x, x], [y, y + 1.9 * s], color=style.INK, lw=0.9, zorder=14, solid_capstyle="round")
    ax.add_patch(Polygon([(x, y + 1.9 * s), (x + 1.5 * s, y + 1.5 * s), (x, y + 1.05 * s)], closed=True,
                         fc=FLAG_Y, ec=style.INK, lw=0.5, zorder=14))


def ball(fld, p, d, w, z=13):
    x, y = P_(fld, p, d, w)
    fld.ax.add_patch(Ellipse((x, y), 1.3, 0.8, fc=style.BALL, ec="white", lw=0.7, zorder=z))


def arrow(fld, p, frm, to, color, lw=1.6, z=5, ls="-", ms=10, rad=0.0):
    fld.ax.add_patch(FancyArrowPatch(P_(fld, p, *frm), P_(fld, p, *to), arrowstyle="-|>", mutation_scale=ms,
                                     color=color, lw=lw, ls=ls, zorder=z, shrinkA=0, shrinkB=0,
                                     connectionstyle=f"arc3,rad={rad}"))


def trail(fld, p, pts, color, lw=1.1, ls=(0, (1, 1.6)), alpha=0.9, z=3):
    xs, ys = zip(*[P_(fld, p, d, w) for d, w in pts])
    fld.ax.plot(xs, ys, color=color, lw=lw, ls=ls, alpha=alpha, zorder=z)


def panel_title(ax, text, fs=8.5):
    ax.set_title(text, fontsize=fs, color=style.INK, loc="left", fontweight="bold")


def O_(key, pos, d, w, label=None):
    return Player(key, pos, "off", d, w, label=label)


def D_(key, pos, d, w, label=None):
    return Player(key, pos, "def", d, w, label=label)


def line5():
    """Five offensive linemen on the ball (gridiron's spacing), labels off."""
    return [O_(k, k, -0.7, w, "C" if k == "C" else "") for k, w in
            (("LT", -3.2), ("LG", -1.6), ("C", 0.0), ("RG", 1.6), ("RT", 3.2))]


# ------------------------------------------------- the print version of an animation
def snapshot(play, t, ax, lateral, window, notes=(), flags=(), stars=()):
    """Everyone where he is at time t, with faint trails of where the skill players have been."""
    pos = {k: play.position(k, t) for k in play.players}
    moved = [pl.moved(d=float(pos[k][0]), w=float(pos[k][1])) for k, pl in play.players.items()]
    q = Play([m for m in moved if m.side == "off"], [m for m in moved if m.side == "def"],
             los=play.los, ball_y=play.ball_y, to_go=play.to_go)
    q.highlights = dict(play.highlights)
    fld = q.draw(ax=ax, lateral=lateral, window=window, title=False)
    no_numbers(fld.ax)
    ppy = fld.pts_per_yard()
    t0 = play._compile()[1]
    for k, pl in play.players.items():
        if pl.side == "off" and pl.pos not in ("WR", "TE", "RB"):
            continue
        if pl.side == "def" and pl.pos in ("DE", "DT", "NT"):
            continue
        pts = np.array([play.position(k, tt) for tt in np.linspace(t0, t, 40)])
        if np.ptp(pts[:, 0]) + np.ptp(pts[:, 1]) < 0.3:
            continue
        xs, ys = fld.xy(*play.to_abs(pts[:, 0], pts[:, 1]))
        ax.plot(xs, ys, color=style.OFFENSE if pl.side == "off" else style.DEFENSE, lw=1.0, alpha=0.5, zorder=3)
    bx, by = fld.xy(*play.to_abs(*play.ball_position(t)))
    for kind, _, t_rel in play.ball_events:
        if kind == "pass" and t > t_rel:
            sx, sy = fld.xy(*play.to_abs(*play.ball_position(t_rel)))
            ax.add_patch(FancyArrowPatch((float(sx), float(sy)), (float(bx), float(by)), arrowstyle="-|>",
                                         mutation_scale=8, color=style.BALL, lw=1.3, ls=(0, (2, 1.5)), zorder=9))
    draw_marker(ax, float(bx), float(by), "ball", "", ppy)
    for d, w in flags:
        flag(fld, q, d, w)
    for d, w, c in stars:
        star(fld, q, d, w, c)
    for n in notes:
        d, w, text = n[:3]
        kw = n[3] if len(n) > 3 else {}
        say(fld, q, d, w, text, **kw)
    for txt in ax.texts:                       # labels of players outside the window stay out of sight
        txt.set_clip_on(True)
    return fld


def strip(play, times, labels, lateral, window, per_panel=None, width_in=6.5, ncols=2):
    """Panels at chosen moments; per_panel[i] = dict(notes=..., flags=..., stars=...)."""
    n = len(times)
    nrows = int(np.ceil(n / ncols))
    pw = width_in / ncols
    h = nrows * (pw * (window[1] - window[0]) / abs(lateral[1] - lateral[0]) + 0.34)
    fig, axes = plt.subplots(nrows, ncols, figsize=(width_in, h), squeeze=False)
    for ax in axes.flat[n:]:
        ax.axis("off")
    for i, (ax, t, lab) in enumerate(zip(axes.flat, times, labels)):
        extra = (per_panel or {}).get(i, {})
        snapshot(play, t, ax, lateral, window, **extra)
        panel_title(ax, lab, fs=8.3)
    fig.tight_layout(h_pad=0.7, w_pad=0.5)
    return fig
Show the Python (nflverse penalties, 2015-2025, used by the numbers in this chapter)
from gridiron.data import pbp

COLS = ["season", "season_type", "week", "game_id", "play_id", "play_type", "desc", "posteam", "defteam",
        "penalty", "penalty_type", "penalty_team", "penalty_yards", "first_down_penalty", "epa", "down",
        "ydstogo", "yardline_100", "pass", "rush", "pass_attempt", "pass_length", "sack", "complete_pass",
        "interception", "first_down", "touchdown"]
PB = pbp(range(2015, 2026), columns=COLS)
REG = PB[PB.season_type == "REG"].copy()
REG["declined"] = REG.desc.str.contains("declined", case=False, na=False)
GAMES = REG.groupby("season").game_id.nunique()

# Flags as nflverse files them: one penalty type per play (the play's main foul), accepted or declined,
# on every kind of play (kicks included).
FLAG = REG[REG.penalty == 1]
RATES = FLAG.groupby(["season", "penalty_type"]).size().unstack(fill_value=0).div(GAMES, axis=0)
ALL_FLAGS = REG.desc.str.count("PENALTY on").groupby(REG.season).sum().div(GAMES)   # every foul named

# Accepted fouls on scrimmage downs, 2021-2025: what each kind of flag is worth in expected points.
KICKS = ["kickoff", "punt", "field_goal", "extra_point"]
REC = FLAG[(FLAG.season >= 2021) & ~FLAG.declined & FLAG.down.notna() & ~FLAG.play_type.isin(KICKS)].copy()
REC["by_off"] = REC.penalty_team == REC.posteam
EPA_T = REC.groupby("penalty_type").agg(n=("epa", "size"), epa=("epa", "mean"), yds=("penalty_yards", "mean"),
                                        fd=("first_down_penalty", "mean"), by_off=("by_off", "mean"))
EPA_S = REC.groupby(["penalty_type", "by_off"]).agg(n=("epa", "size"), epa=("epa", "mean"),
                                                 yds=("penalty_yards", "mean"))   # split by the side that fouled

# Defensive pass interference: how far, how often, short throws against deep ones (15+ air yards).
DPI = REC[REC.penalty_type == "Defensive Pass Interference"].copy()
DPI["depth"] = np.select([DPI.desc.str.contains(r"pass (?:incomplete |complete )?deep", regex=True),
                          DPI.desc.str.contains(r"pass (?:incomplete |complete )?short", regex=True)],
                         ["deep", "short"], "")
THROWS = REG[(REG.season >= 2021) & (REG.pass_attempt == 1) & (REG.sack != 1) & (REG.play_type == "pass")
             & REG.pass_length.notna()]
N_THROW = THROWS.pass_length.value_counts()
N_DPI = DPI.depth.value_counts()
DPI_RATE = {k: 100 * N_DPI.get(k, 0) / (N_THROW[k] + N_DPI.get(k, 0)) for k in ("short", "deep")}
DPI_YDS = DPI.groupby("depth").penalty_yards.mean()
DEEP_EPA = THROWS[THROWS.pass_length == "deep"].epa.mean()
DEEP_EPA_DPI = pd.concat([THROWS[THROWS.pass_length == "deep"].epa, DPI[DPI.depth == "deep"].epa]).mean()
OVER15 = (DPI.penalty_yards > 15).mean()
OVER30 = (DPI.penalty_yards >= 30).mean()
COMP_EPA = THROWS[THROWS.complete_pass == 1].epa.mean()
SACK_EPA = REG[(REG.season >= 2021) & (REG.sack == 1) & REG.down.notna()].epa.mean()

# The same five-yard defensive fouls, down by down.
BYDOWN = (REC[REC.penalty_type.isin(["Defensive Holding", "Illegal Contact"])]
          .groupby("down").agg(n=("epa", "size"), togo=("ydstogo", "mean"), epa=("epa", "mean")))

# Third-and-long: how often a third down with 16-20 to go is converted (first down or touchdown).
SCRIM = REG[(REG.season >= 2021) & REG.play_type.isin(["pass", "run"]) & REG.down.notna()]
T3L = SCRIM[(SCRIM.down == 3) & SCRIM.ydstogo.between(16, 20)]
CONV_3L = ((T3L.first_down == 1) | (T3L.touchdown == 1)).mean()
T38 = SCRIM[(SCRIM.down == 3) & (SCRIM.ydstogo == 8)]
CONV_38 = ((T38.first_down == 1) | (T38.touchdown == 1)).mean()

HIP = FLAG[FLAG.penalty_type == "Hip Drop Tackle"].groupby("season").size()


def md_table(df):
    rows = [list(df.columns), ["---:" if i else ":---" for i in range(len(df.columns))]] + df.astype(str).values.tolist()
    return Markdown("\n".join("| " + " | ".join(map(str, r_)) + " |" for r_ in rows))

Third-and-9, a minute left in the half. The quarterback takes a deep drop and heaves the ball 45 yards down the left sideline toward a receiver who is not open. The cornerback is with him stride for stride, the ball comes down a yard out of reach, and the crowd groans. Then a yellow flag lands on the grass. The corner had grabbed the receiver’s arm a split second before the ball arrived. Pass interference: first down, at the spot of the foul. A throw that was going nowhere has just gained 41 yards, and the rules analyst in the booth says the offense “knew exactly what it was doing.” Two questions hide in that sentence. Why would a coach call a throw he expects to be incomplete? And why is the same grab worth five yards if it happens one second earlier, before the ball is in the air? This chapter reads the rule book the way coaches do: as a list of prices.

You’ll be able to…

NoteYou’ll need

This chapter leans on a few earlier ones. One line each:

  • Press and the five-yard rule (Coverage Fundamentals): a press corner lines up in the receiver’s face to jam him at the snap; defenders may touch receivers only in the first five yards, a limit dating to the 1978 “Mel Blount rule.” Man coverage gives each defender a receiver; zone coverage gives each an area.
  • Pass protection (Pass Protection): five linemen (and sometimes backs and tight ends) block four or more rushers so the quarterback can throw from the pocket, the protected area behind the line. A sack is the quarterback tackled behind the line.
  • The one-yard rule for linemen (Run-Pass Options): on a pass, an ineligible lineman may not be more than a yard downfield before the ball is thrown, the foul called illegal man downfield. It is why NFL RPOs look the way they do.
  • Rub routes (Dropback Concepts): a rub route (also pick route) crosses receivers so a defender chasing one runs into traffic.
  • Cut blocks (Zone Running): a cut block is a block at a defender’s thighs or below, from the front, to put him on the ground. Two words from The Language of the Run Game come back here: a 3-technique is a defensive tackle lined up on a guard’s outside shoulder, and the backside is the side away from where the run is going.
  • Pre-snap fouls (The Pre-Snap Phase): a false start or encroachment stops the play before it starts; offside lets it run. A foul that lets the play run is a live-ball foul, and the ball’s spot before the snap is the previous spot.
  • Expected points (Downs, Distance, and Field Position): expected points price a down, distance and yard line; EPA is the change in that price over one play. The line to gain is “the sticks.”

Reading the diagrams: offense is blue circles (X, Y, Z, H receivers; Q quarterback; R running back; C center; unlabelled circles are linemen). Defense is outlined squares (C a cornerback, $ the nickel back, FS the free safety, E and T linemen, M and W linebackers). Players with a green ring are the ones to watch. The darker blue line is the line of scrimmage and the faint lines are 5 yards apart. In this chapter a star marks a moment of contact (green: legal; red: a foul) and a yellow flag marks where an official would throw one.

The rule book as a price list

Every sport has rules about contact. Football has more of them than most, because almost every player on almost every snap is allowed to hit somebody. The rules don’t try to stop contact. They decide who may touch whom, where, and when, and they attach a price to each violation: five yards, ten, fifteen, a first down, the spot of the foul, a safety, an ejection.

Prices change behaviour. A cornerback knows that grabbing a receiver before the throw costs five yards and an automatic first down. On third-and-20 that price is ruinous: the defense was one incompletion away from a punt, and the grab hands the offense a fresh set of downs. On first-and-10, with the receiver running past him for a touchdown, the same grab is a bargain. An offensive lineman beaten by a pass rusher will often hold rather than let his quarterback be sacked, because ten yards cost less than a sack plus the chance of a fumble. A play-caller who knows that pass interference is enforced at the spot will throw deep into coverage, because the flag is one of the throw’s possible outcomes. None of this is cheating; it’s arithmetic. Coaches teach it, and the NFL’s competition committee, which proposes the rule changes the owners vote on each spring, adjusts the prices when it doesn’t like how teams respond.

This chapter takes the rules in four groups:

  1. Contact on receivers, the rules that shape pass coverage and route design: illegal contact, defensive holding, and pass interference in both directions.
  2. Blocking rules, which shape what linemen and receivers may do: holding, hands to the face, blocks in the back, cut and chop blocks, and the lineman’s one-yard limit on passes.
  3. Player-safety rules, mostly written in the last twenty years to protect heads, knees and quarterbacks.
  4. Enforcement, the mechanics that turn a flag into a new down and distance: accepting and declining, free plays, where the yards are walked off, and half the distance.

Then we price them with data: how often each foul is called, and what it does to expected points. (Officials, replay review and the rules of the ball itself, what counts as a catch or a fumble, are the next chapter, Officiating, Replay, and the Rules of the Ball.)

ImportantWhy it exists

Football’s contact rules exist to keep two contests fair at once. One is between the offense and the defense: without limits, defenders would tackle receivers before every pass and linemen would tackle pass rushers, and the passing game would die. The other is between the players and the damage they can do to each other. Most rule changes of the last half-century have pushed one or both of those two ways: toward offense (1978, 2004) and toward safety (2005 onward). Read any rule change by asking which contest it was protecting.

The receiver’s first five yards: illegal contact and defensive holding

A pass play is a race. The receiver needs to reach a spot on the field at a set time, and the quarterback needs to throw it there before the rush arrives. A defender’s best weapon in that race is his hands: knock the receiver off his line, slow him, turn him, and the timing of the whole play breaks. The NFL rules allow exactly a little of that.

Here are the rules, as the NFL writes them for 2026:1

  • Within five yards of the line of scrimmage, a defender may chuck (jam, push, re-route) a receiver who is in front of him. That is what a press corner is doing at the snap.
  • Beyond five yards, while the quarterback is still in the pocket with the ball, a defender may not initiate contact with the receiver. He may use his hands only to protect himself, and contact that started inside the five yards has to end as the two of them leave the zone: he may not shove, hook or ride him past it. The foul is illegal contact: five yards and an automatic first down.
  • Anywhere on the field, before the pass is thrown, a defender may not grab, hook or tackle a receiver, or otherwise restrict him: defensive holding, also five yards and an automatic first down. Holding can happen inside the five yards too. A jam with open hands is legal; a fistful of jersey is not.
  • Once the ball is thrown, both of those rules hand over to the pass-interference rules, below.
  • The illegal-contact restriction lifts when the quarterback leaves the pocket, so on a scramble a defender may chuck a receiver beyond five yards. Holding is still holding, and once the ball is in the air pass interference applies again. “The pocket” here has an exact meaning: the rule book’s pocket area runs between where the two tackles lined up, from the line back to the offense’s end line, and the quarterback has left it once any part of him or the ball is outside it. Officiating, Replay, and the Rules of the Ball draws it as the tackle box.2

Defensive holding isn’t only about receivers. The rule bans a defender holding any offensive player other than the ball carrier, and the version you’ll see flagged most at the line is a defensive lineman grabbing a blocker on a stunt (a pass-rush game in which rushers cross), pinning a guard so the looping teammate can come free (The Pass Rush). Same price: five yards and an automatic first down.

Show the Python
fig, axes = plt.subplots(1, 2, figsize=(6.6, 4.5))
LAT, WIN = (-21, 5), (-8.2, 27)

# before the throw
off = line5() + [O_("QB", "QB", -5.0, 0.0, "Q"), O_("X", "WR", -0.7, -15.0, "X")]
dfn = [D_("CB", "CB", 1.0, -14.5, "C")]
p1 = Play(off, dfn, los=40, to_go=None)
p1.route("X", r.go(24))
p1.highlight("X", "CB")
f = p1.draw(ax=axes[0], lateral=LAT, window=WIN, title=False)
no_numbers(f.ax)
band(f, p1, 0, 5, LEGAL_T)
band(f, p1, 5, 27, FOUL_T, alpha=0.55)
say(f, p1, 4.1, -3.0, "first 5 yards: jam allowed", color=LEGAL, fs=6.5, style_="italic")
say(f, p1, 24.8, -6.0, "past 5 yards: hands off\nuntil the ball is thrown", color=FOUL, fs=6.5, style_="italic")
trail(f, p1, [(1.0, -14.5), (2.0, -14.4), (9.0, -14.3), (15.0, -14.3)], style.DEFENSE)
star(f, p1, 2.0, -14.9, LEGAL)
say(f, p1, 1.9, -7.8, "jam inside 5 yards:\nlegal", color=LEGAL, fs=6.4)
star(f, p1, 9.0, -15.0, FOUL)
say(f, p1, 9.3, -7.0, "shoves him at 9 yards:\nillegal contact,\n5 yd + 1st down", color=FOUL, fs=6.4)
star(f, p1, 15.5, -15.0, FOUL)
say(f, p1, 16.2, -7.0, "grabs his jersey:\ndefensive holding,\n5 yd + 1st down", color=FOUL, fs=6.4)
panel_title(axes[0], "1. Before the throw")

# after the throw
off = line5() + [O_("QB", "QB", -6.0, 0.0, "Q"), O_("X", "WR", 23.0, -15.2, "X")]
dfn = [D_("CB", "CB", 21.6, -14.2, "C")]
p2 = Play(off, dfn, los=40, to_go=None)
p2.highlight("X", "CB")
f = p2.draw(ax=axes[1], lateral=LAT, window=WIN, title=False)
no_numbers(f.ax)
trail(f, p2, [(-0.7, -15.0), (10, -15.1), (23.0, -15.2)], style.OFFENSE)
trail(f, p2, [(1.0, -14.5), (10, -14.4), (21.6, -14.2)], style.DEFENSE)
arrow(f, p2, (-6.0, 0.0), (24.6, -15.4), style.BALL, lw=1.3, ls=(0, (2, 2)), rad=-0.08)
star(f, p2, 22.3, -14.7, FOUL)
flag(f, p2, 20.0, -11.6)
say(f, p2, 15.8, -5.4, "ball in the air; the corner\ngrabs his arm before it\narrives: pass interference,\nfirst down at the spot", color=FOUL, fs=6.4)
panel_title(axes[1], "2. After the throw")
fig.tight_layout(w_pad=0.8)
plt.show()
Figure 48.1: The receiver’s rules by depth and by moment, on one go route. Left, before the throw: inside the first five yards (green) the corner (C) may jam X; past five yards, while the quarterback is in the pocket with the ball, contact that impedes him is illegal contact, and grabbing or restricting him anywhere is defensive holding. Both cost five yards and an automatic first down. Right, after the throw: the pass-interference rules take over. Contact more than a yard past the line that significantly hinders the receiver’s chance to catch a catchable ball is defensive pass interference, enforced at the spot. Had the corner turned and played the ball instead, the same collision would have been legal.

Two prices, five yards and a first down, look small next to pass interference, and they are meant to. The automatic first down is the expensive part. On first-and-10 a five-yard foul gives the offense first-and-5, a nice gain. On third-and-12 it erases the down: the defense had the offense behind the sticks and needed one stop, and now it starts the series over. (The numbers on this, down by down, are in What penalties cost, below.)

Why five yards, and the year it started to bite

Coverage Fundamentals told the origin: the five-yard zone dates from the 1978 “Mel Blount rule,” the same package that let offensive linemen extend their arms and open their hands in pass protection, and both halves pointed toward passing.3 (The 1978 Liberation tells that story in full.) What matters here is what came next. The rule sat on the books for 25 years without being enforced very hard. Defensive backs learned what officials would tolerate (a hand on the hip at eight yards, a tug at the top of the route), and by the early 2000s the best press teams were playing the 1977 game with 1978 rules. This film room is the game that ended that.

NoteFilm room: Patriots vs. Colts, 2003 AFC Championship (Jan. 18, 2004)

In the AFC Championship Game after the 2003 season, Bill Belichick’s Patriots beat Peyton Manning’s Colts 24–14 in Foxborough. Manning, that season’s co-MVP, threw four interceptions, three of them to cornerback Ty Law.4 On the film, New England’s defensive backs jam, ride and bump Indianapolis’s receivers well past five yards, all game, and few flags fly.

The Colts’ president, Bill Polian, sat on the competition committee. That off-season the committee made illegal contact and defensive holding beyond five yards a “point of emphasis”: officials were told to call the rule as written. Patriots fans call it the “Ty Law rule.” The flags came at once: by one count illegal-contact fouls rose from 79 in the 2003 regular season to 191 in 2004 (nflverse’s play-by-play, which records only one foul per play, has 49 and 123), and teams averaged about 225 passing yards a game in 2004, up from 214.5 Manning threw 49 touchdown passes in 2004, breaking Dan Marino’s single-season record.6

What to notice: the rule didn’t change; its price did. A rule that is called is a different rule from one that isn’t, which is why “points of emphasis” announced each summer are worth reading. On a broadcast, watch a press corner’s hands after the receiver’s fifth step. If they stay on him, the next flag is coming.

What the five-yard zone does to schemes

Coverage Fundamentals covered what the zone does to press (all of the jam has to land in about the first second, so pressed corners want a safety behind them) and to releases (stacks, bunches and motion that dodge the jam). Three more effects:

  • Zone defenders have to pass receivers off, not re-route them. A linebacker in a hook zone may not shove a crossing receiver at eight yards, so zone defense is about positioning, not collision. The jam that survives is the Cover 2 corner’s, which happens inside the five yards (Cover 2 and Tampa 2).
  • A scramble changes the rules. When the quarterback leaves the pocket, defenders may chuck receivers downfield again. Part of why the scramble drill (Quarterback Play) is hard to defend is that coverage gets messy; part of why it is not easier is that defenders get their hands back.
  • Smart fouls. A corner beaten off the line on a go route can grab the receiver before the throw and give up five yards and a first down rather than a touchdown. Nobody coaches it out loud, but everybody knows the price.

Pass interference, both ways

Once the ball is thrown, the question changes from “may he touch the receiver?” to “is he playing the ball?” Defensive pass interference (DPI) is contact by a defender, after the ball is thrown and more than one yard past the line of scrimmage, that significantly hinders an eligible receiver’s chance to catch the ball. The rule lists the usual acts: grabbing an arm or the jersey, cutting in front of the receiver without looking for the ball, hooking him, putting an arm across his body, tackling him early. And it lists what is not interference:7

  • contact when both players are making a genuine attempt to catch or bat the ball;
  • incidental contact, such as feet tangling, that doesn’t materially affect the receiver;
  • contact on a pass that is clearly uncatchable;
  • contact before the throw, which is illegal contact or holding instead (five yards), not DPI.

Offensive pass interference (OPI) is the mirror image, with one big difference: the offense’s restrictions start at the snap, not the throw. From the snap until the pass is touched, an offensive player more than a yard past the line may not initiate contact that hinders a defender. The two everyday versions are the push-off (a receiver extends his arm to create separation at the top of a route or at the catch point) and the illegal pick (a receiver blocks a defender downfield before the ball is thrown, to free a teammate). OPI costs ten yards from the previous spot, and the down is replayed.

CautionCommon misconception

“He grabbed the receiver, so it’s pass interference.” Only if the ball was in the air. The same grab a second before the throw is defensive holding (five yards and a first down); a hard shove at eight yards before the throw is illegal contact (same price). The difference matters enormously, because DPI is enforced at the spot. When a flag flies on a pass, look at whether the ball had left the quarterback’s hand at the moment of the foul, and you’ll know which of the three it is.

The one-yard strip, and who started the contact

Dropback Concepts introduced rub routes and warned that they can become illegal picks. Here is the rule that draws the line. Pass interference by either side can only happen more than one yard past the line of scrimmage.8 Two tests follow from that, one about where and one about who:

  • Inside the first yard, even a deliberate pick is legal. A receiver may release straight into the defender covering a teammate, and if the bump happens within a yard of the line there is no interference (a grab there can still be holding).
  • Beyond the first yard, the question is who initiated the contact. OPI needs the offensive player to do something: push off, or block or obstruct a defender before the ball is touched. A receiver who keeps running his route while a defender chasing someone else has to go around him, or runs into him, hasn’t fouled at any depth. That is the natural rub, and it is how mesh and other crossing concepts free receivers 5 or 6 yards downfield every week. If the receiver stops, turns his shoulders to the defender or extends his arms, he has started a block, and it’s OPI.
Show the Python
fig, axes = plt.subplots(1, 3, figsize=(6.6, 2.75))
LAT, WIN = (2.0, 19.5), (-3.0, 10.0)
for i, ax in enumerate(axes):
    off = [O_("RT", "RT", -0.7, 3.2, ""), O_("H", "WR", -1.0, 9.0, "H"), O_("Z", "WR", -0.7, 14.0, "Z")]
    dfn = [D_("NB", "NB", 0.8, 9.3, "$"), D_("CB", "CB", 2.0, 15.0, "C")]
    p = Play(off, dfn, los=40, to_go=None)
    if i == 0:                                  # deliberate pick inside the first yard
        p.route("Z", r.path((1.2, -3.6), (4.6, -9.4)))
        p.route("H", r.path((1.4, 2.4), (2.0, 7.0)))
    elif i == 1:                                # natural rub: Z just runs his crosser
        p.route("Z", r.path((3.8, -1.2), (4.3, -10.0)))
        p.route("H", r.path((5.0, 0.0), (5.3, 6.0)))
    else:                                       # Z stops and blocks at three yards
        p.route("Z", r.path((3.0, -0.5), (3.3, -2.7)))
        p.route("H", r.path((1.4, 2.4), (2.0, 7.0)))
    p.highlight("Z", "NB")
    f = p.draw(ax=ax, lateral=LAT, window=WIN, title=False)
    no_numbers(f.ax)
    band(f, p, 0, 1, LEGAL_T)
    line_across(f, p, 1.0, LEGAL, lw=0.9, ls=(0, (3, 2)))
    if i == 0:
        say(f, p, -1.9, 5.6, "1 yard", color=LEGAL, fs=5.8, style_="italic", box=False)
        arrow(f, p, (-1.4, 5.6), (0.85, 5.6), LEGAL, lw=0.8, ms=6)
        trail(f, p, [(0.8, 9.3), (0.55, 10.25)], style.DEFENSE, lw=1.6, ls=(0, (2, 1.2)))
        trail(f, p, [(2.0, 15.0), (2.6, 12.8), (3.8, 9.6)], style.DEFENSE, lw=1.6, ls=(0, (2, 1.2)))
        star(f, p, 0.5, 10.75, LEGAL, ms=10)
        say(f, p, 7.0, 10.8, "they meet half a yard\npast the line:\nlegal, even on purpose", color=LEGAL, fs=5.8)
        panel_title(ax, "1. Pick inside 1 yard: legal", fs=7.8)
    elif i == 1:
        trail(f, p, [(0.8, 9.3), (3.0, 9.5), (3.45, 10.2)], style.DEFENSE, lw=1.6, ls=(0, (2, 1.2)))
        star(f, p, 3.55, 10.6, LEGAL, ms=10)
        say(f, p, 7.5, 9.6, "Z keeps running; the\nnickel runs into him:\nlegal at any depth", color=LEGAL, fs=5.8)
        panel_title(ax, "2. Natural rub: legal", fs=7.8)
    else:
        trail(f, p, [(0.8, 9.3), (1.7, 10.0), (2.45, 10.6)], style.DEFENSE, lw=1.6, ls=(0, (2, 1.2)))
        trail(f, p, [(2.0, 15.0), (2.9, 14.2)], style.DEFENSE, lw=1.6, ls=(0, (2, 1.2)))
        star(f, p, 2.75, 11.15, FOUL, ms=10)
        flag(f, p, 4.4, 13.6)
        say(f, p, 7.3, 9.4, "Z stops and blocks him\n3 yards downfield\nbefore the throw: OPI", color=FOUL, fs=5.8)
        panel_title(ax, "3. Block at 3 yards: OPI", fs=7.8)
fig.tight_layout(w_pad=0.6)
plt.show()
Figure 48.2: Two tests for a pick: where the contact happens and who starts it. In each panel the nickel ($) is in man coverage on the slot receiver H, and the outside receiver Z crosses his path. 1: Z’s slant crosses the nickel half a yard past the line, inside the one-yard strip (green), so even a deliberate bump is legal; the nickel is stuck, the corner (C) has followed Z inside, and H is alone in the flat. 2: Z runs a shallow cross and keeps running; the nickel, chasing H, runs into him about 3.5 yards downfield. Z didn’t start the contact, so this natural rub is legal at any depth. 3: Z runs 3 yards upfield, stops, squares up and blocks the nickel before the throw: offensive pass interference, ten yards from the previous spot.

Offenses coach the legal versions: make the contact happen at the line, or keep running the route and let the defender run into you. Officials, judging at full speed, look for the giveaways of a block (a receiver who stops, turns his shoulders or extends his arms). Stacks and bunches (Spread Formations) put receivers’ paths across defenders in the first step or two, where the strip makes it legal.

Defenses answer in three ways. They play zone against bunches, because a zone defender isn’t chasing anyone through traffic. They switch (or banjo) in man coverage, trading receivers by agreement so nobody has to chase through the cross (Man Coverage). And they align deeper: a defender who lines up four or five yards off the ball can’t be picked inside the first yard, because he’s not there yet, and has room to go over or under a crosser. When the officials do see a pick, it is OPI: ten yards from the previous spot, the down replayed, and any completion wiped out.

The spot foul: why DPI is football’s most expensive flag

Most fouls are enforced from the previous spot, where the ball was snapped. Defensive pass interference is different. In the NFL it is a spot foul: the offense gets an automatic first down at the spot where the foul happened, however far downfield that is. A foul 40 yards past the line is a 40-yard penalty. If the foul happens in the end zone, the ball goes to the 1-yard line, first and goal.9

College football does it differently. Under the NCAA rule, defensive pass interference is 15 yards from the previous spot and an automatic first down; only when the foul happens less than 15 yards downfield is it enforced at the spot.10 The high-school rule is also 15 yards. The NFL is the outlier, and it is the reason the most consequential judgment call in football carries no cap.

Show the Python
NEW_SPOT = style.SERIES[6]    # one colour for "the ball goes here" in both panels


def dpi_panel(ax, college):
    off = line5() + [O_("QB", "QB", -5.0, 0.0, "Q"), O_("X", "WR", -0.7, -15.0, "X")]
    dfn = [D_("CB", "CB", 1.0, -14.4, "C")]
    p = Play(off, dfn, los=40, to_go=10)
    p.route("X", r.go(37.3))
    p.highlight("X", "CB")
    f = p.draw(ax=ax, orient="horizontal", lateral=(-21.5, 9.0), window=(-7, 47), title=False)
    no_numbers(ax)
    for yl, dd in ((30, 0.0), (40, 10.0), (50, 20.0), (40, 30.0), (30, 40.0)):
        say(f, p, dd, 7.2, str(yl), color=style.MUTED, fs=8, weight="bold")
    trail(f, p, [(1.0, -14.4), (20, -14.3), (36.5, -14.0)], style.DEFENSE, lw=1.2, ls=(0, (3, 2)))
    arrow(f, p, (-5.0, 0.0), (38.4, -15.0), style.BALL, lw=1.2, ls=(0, (2, 2)), rad=0.06)
    xg, yg = P_(f, p, 36.3, -13.9)                       # the corner at the moment of the grab
    ax.add_patch(Rectangle((xg - 0.75, yg - 0.75), 1.5, 1.5, fc="none", ec=style.DEFENSE_DARK, lw=0.9,
                           ls=(0, (2, 1.2)), zorder=7))
    star(f, p, 37.6, -14.4, FOUL)
    flag(f, p, 35.0, -10.8, s=1.3)
    new_d = 15.0 if college else 38.0
    line_across(f, p, new_d, NEW_SPOT, lw=2.4, ls="-", w0=-26.7, w1=26.7, z=6)
    say(f, p, new_d, -21.0 + 2.6, "new spot", color=NEW_SPOT, fs=6.4, weight="bold")
    ball(f, p, new_d, 0.0)
    arrow(f, p, (0.0, 4.9), (new_d, 4.9), style.INK, lw=1.4, ms=9, z=7)
    if college:
        say(f, p, new_d + 7.0, 2.0, "college: 15 yards from\nthe previous spot,\n1st-and-10 at own 45", fs=6.6, weight="bold")
    else:
        say(f, p, new_d - 9.5, 2.0, "NFL: first down at the\nspot of the foul,\n1st-and-10 at opp. 32", fs=6.6, weight="bold")
    say(f, p, 30.0, -19.4, "foul: 38 yards downfield", color=FOUL, fs=6.6)
    panel_title(ax, "College and high school: 15-yard cap" if college else "NFL: spot foul")


fig, axes = plt.subplots(2, 1, figsize=(6.5, 7.0))
dpi_panel(axes[0], False)
dpi_panel(axes[1], True)
fig.tight_layout(h_pad=0.8)
plt.show()
Figure 48.3: One foul, two rulebooks. Second-and-10 from the offense’s own 30 (offense moving right). X runs a go route, the ball is thrown deep, and the corner (C) grabs him at the catch point (dashed outline), 38 yards downfield, at the opponent’s 32. The purple line is where the ball is spotted afterwards. Top, NFL: a spot foul, so it is first-and-10 at the opponent’s 32, a 38-yard penalty. Bottom, college: 15 yards from the previous spot and an automatic first down, so first-and-10 at the offense’s own 45. The same grab is worth 23 more yards in the NFL.
ImportantWhy it exists: the spot foul

What it solves. The NFL’s logic is that a penalty should give back what the foul took away. A defender beaten deep who tackles the receiver before the ball arrives has prevented, quite possibly, a 40-yard completion. Cap the penalty at 15 yards and every beaten defender would happily pay it. With no cap, there’s nothing to gain by tackling a receiver who has beaten you; you have to play the ball.

What it costs. The penalty is huge and the call is a judgment. “Significantly hinders” is decided at full speed by an official who may be 20 yards away, and the difference between a legal, hand-fighting 50-50 ball and a 45-yard flag is sometimes a single tug. That combination makes DPI the call most likely to decide a game, and it is why fans and coaches keep proposing either the college cap or replay review for it. (The NFL tried replay once; see the film room below.)

What the spot foul does to offenses: throw deep, into coverage

Put the two rules together and an NFL offense has a reason to throw deep that a college offense doesn’t. Each deep pass has four kinds of outcome: a completion, an incompletion, an interception, and a defensive pass interference flag, which is, in effect, a long completion that also stops the clock. In the 2021–2025 regular seasons, throws travelling 15 or more yards in the air drew a DPI flag about 4.1 times per 100 throws, against about 0.9 for shorter ones, and those deep flags averaged 23 yards. Counting them in raises the expected points of an average deep throw from +0.38 to +0.45 per attempt.11

Show the Python
fig, (a1, a2) = plt.subplots(1, 2, figsize=(6.5, 2.9), gridspec_kw=dict(width_ratios=[1, 2.1]))
vals = [DPI_RATE["short"], DPI_RATE["deep"]]
bars = a1.bar(["Short\n(<15 air yd)", "Deep\n(15+ air yd)"], vals, color=[style.SERIES[0], style.SERIES[1]], width=0.62)
for b, v in zip(bars, vals):
    a1.text(b.get_x() + b.get_width() / 2, v + 0.12, f"{v:.1f}", ha="center", va="bottom", fontsize=8.5, color=style.INK)
a1.set_ylim(0, max(vals) * 1.3)
a1.set_ylabel("DPI flags per 100 throws", fontsize=8)
a1.grid(axis="x", visible=False)
a1.tick_params(labelsize=7.5)
a1.set_title("How often", fontsize=9)
bins = np.arange(0, DPI.penalty_yards.max() + 3, 3)
a2.hist(DPI.penalty_yards, bins=bins, color=style.SERIES[1], edgecolor=style.SURFACE, lw=0.6)
a2.axvline(15, color=style.INK, lw=1.2, ls=(0, (4, 2)))
ymax = a2.get_ylim()[1]
a2.text(21.0, ymax * 0.93, f"college cap: 15 yards\n{OVER15:.0%} of NFL flags were longer;\n{OVER30:.0%} were 30 yards or more",
        fontsize=7.5, color=style.INK, va="top")
a2.set_xlabel("Yards gained on the penalty", fontsize=8)
a2.set_ylabel("Flags", fontsize=8)
a2.grid(axis="x", visible=False)
a2.tick_params(labelsize=7.5)
a2.set_title("How far", fontsize=9)
fig.tight_layout(w_pad=1.2)
plt.show()
Figure 48.4: Why NFL offenses throw deep into tight coverage. Left: defensive pass interference flags per 100 throws, short (under 15 air yards) and deep (15 or more), 2021-2025 regular seasons; a deep throw is several times as likely to draw one. Right: how long each accepted DPI was. The dashed line is the college cap of 15 yards; every flag to its right would have been worth less under college rules. Source: nflverse play-by-play, accepted DPI flags on scrimmage downs.

That’s why you see things that look like bad decisions: a quarterback throwing up a 50-50 ball to a receiver who is covered, or a back-shoulder throw (a ball thrown behind a receiver’s outside shoulder, so he turns back for it while the defender is still running) into a corner who has his back turned. Two of the outcomes (a catch or a flag) are big gains, one (an incompletion) costs a down, and only the interception is a disaster. Big, physical receivers are worth more in the NFL partly because they win those balls or draw the flag, and defensive backs are taught to turn and find the ball, because a defender who never looks back isn’t “playing the ball” and any contact gets flagged (Man Coverage).

NoteFilm room: Rams at Saints, 2018 NFC Championship (Jan. 20, 2019)

Late in the fourth quarter, the score tied at 20, New Orleans had third-and-10 at the Rams’ 13 with about 1:49 to play. Drew Brees threw to Tommylee Lewis near the right sideline, and Rams cornerback Nickell Robey-Coleman, who later said he had been beaten, hit Lewis well before the ball arrived, helmet to helmet. No flag. A flag would have meant a first down inside the 10, and with the Rams down to one timeout the Saints could have run the clock to about ten seconds before kicking. Instead they kicked a field goal on fourth down with 1:41 left, the Rams tied it, and they won 26–23 in overtime.12

The league admitted the call was missed. Two months later the owners approved a one-year experiment: pass interference, called or not, became reviewable by replay, by coach’s challenge or, in the last two minutes and overtime, by booth review. It was a mess. Replay officials, reluctant to re-referee a judgment call, overturned very few calls or no-calls, coaches stopped challenging, and the rule was allowed to lapse after the 2019 season.13

What to notice: the NFL’s experience is why “just review it” isn’t simple. Replay works for facts (was his foot down? where was the ball?) and struggles with degree (did he significantly hinder him?). Since 2025 replay assist may help on a short list of fouls, but pass interference is not among them; Officiating, Replay, and the Rules of the Ball covers what replay can and can’t do now.

Blocking rules: holding, hands to the face, and where a block may land

Offensive holding is, in most seasons, the most-called foul in the NFL (false starts edged it in 2020 and 2023), and also the one that, by common agreement, officials could call on nearly every snap. Blocking means leverage and hands. The line between blocking a defender and holding him is about where the hands are and what they do.

Offensive holding is a blocker grabbing, hooking or tackling a defender, or restricting him with hands or arms outside his body’s frame. The rule’s working idea is the frame: the body of the defender below the neck that faces the blocker, in practice the chest plate between his shoulders. A blocker may put his hands inside the frame and push, steer and lock on, and the rule tells him to work his hands there. What he may not do is use his hands or arms to materially restrict the defender: grab and turn him, hook him, wrap him up, take him to the ground. The test is the effect, not the hand position (a grab inside the frame that jerks a rusher off his path is still holding), but most flagged holds are a hand outside the frame (cloth at the shoulder, the side of the jersey, an arm). Officials also look at where it happened: a hold away from the point of attack, or on a double team the defender didn’t split, is generally not called, because a defender who was never going to reach the play hasn’t been robbed of anything. The rule is aimed at holds that change the play. Holding costs ten yards: from the previous spot on a pass, and on a run usually from the spot of the foul (the enforcement section below explains why). If an offensive player holds in his own end zone, it is a safety (two points and the ball to the other team): the spot the ten yards would be walked from is behind his own goal line, and the rules don’t move the ball around inside an end zone, they award the points.14

Illegal hands to the face is the foul for pushing, punching or grabbing an opponent’s face mask, helmet or neck area with the hands. The rule’s test is forcible contact, direct or prolonged: a hand that slides up to the chin and comes straight back down isn’t called, while a palm that snaps a head back, or stays locked under a face mask, is. That line decides whether an edge rusher’s long-arm move becomes a flag. It goes both ways: a lineman who snaps a pass rusher’s head back with a palm to the face mask, or a pass rusher who does the same to a blocker. The stat sheet files it as illegal use of hands, and the price depends on who did it: ten yards against the offense, five yards and an automatic first down against the defense.

Show the Python
fig, ax = plt.subplots(figsize=(6.4, 3.9))
ax.set_xlim(-10, 10); ax.set_ylim(-1.2, 11.2); ax.set_aspect("equal"); ax.axis("off")
# body: legs, torso, shoulder pads, arms, helmet
for x0 in (-1.9, 0.3):
    ax.add_patch(FancyBboxPatch((x0, -1.0), 1.6, 3.2, boxstyle="round,pad=0.05,rounding_size=0.5",
                                fc=style.GRID, ec=style.BASELINE, lw=1.0, zorder=1))
ax.add_patch(FancyBboxPatch((-3.3, 1.8), 6.6, 5.4, boxstyle="round,pad=0.05,rounding_size=0.9",
                            fc=FOUL_T, ec=style.BASELINE, lw=1.0, zorder=2))
for x0 in (-4.9, 3.4):
    ax.add_patch(FancyBboxPatch((x0, 1.6), 1.5, 4.8, boxstyle="round,pad=0.05,rounding_size=0.6", fc=FOUL_T,
                                ec=style.BASELINE, lw=1.0, zorder=1.5))
ax.add_patch(FancyBboxPatch((-4.4, 6.0), 8.8, 1.6, boxstyle="round,pad=0.05,rounding_size=0.7",
                            fc=FOUL_T, ec=style.BASELINE, lw=1.0, zorder=2.5))
ax.add_patch(FancyBboxPatch((-2.0, 2.4), 4.0, 3.9, boxstyle="round,pad=0.05,rounding_size=0.5",
                            fc=LEGAL_T, ec=LEGAL, lw=1.4, zorder=3))
ax.add_patch(Rectangle((-0.6, 7.4), 1.2, 0.7, fc="#f3c9bf", ec=style.BASELINE, lw=0.8, zorder=3))
ax.add_patch(Circle((0, 9.2), 1.45, fc="#f3c9bf", ec=FOUL, lw=1.4, zorder=4))
for yy in (8.7, 9.2):
    ax.plot([-0.9, 0.9], [yy, yy], color=FOUL, lw=1.2, zorder=5)
ax.plot([0, 0], [8.4, 9.6], color=FOUL, lw=1.2, zorder=5)
ax.text(0, 4.35, "THE FRAME\nhands here:\nlegal", ha="center", va="center", fontsize=8, color=LEGAL, fontweight="bold", zorder=6)
# callouts
def callout(txt, xy, xytext, color):
    ax.annotate(txt, xy=xy, xytext=xytext, fontsize=7.6, color=color, ha="center", va="center", zorder=8,
                arrowprops=dict(arrowstyle="-|>", color=style.INK_2, lw=0.9, shrinkB=2),
                bbox=dict(boxstyle="round,pad=0.3", fc=style.SURFACE, ec=style.BASELINE, lw=0.6))
callout("helmet, face mask, neck:\nillegal hands to the face\n(10 yd offense; 5 yd + 1st down defense)", (1.2, 9.6), (6.6, 9.6), FOUL)
callout("shoulder pads, sleeves:\ngrab and turn him = holding", (-3.9, 6.6), (-7.0, 8.8), FOUL)
callout("side or back of the jersey:\ngrab and pull = holding", (2.9, 3.0), (6.9, 3.6), FOUL)
callout("arms around him, or a\ntakedown: always holding", (-4.1, 3.4), (-7.2, 1.6), FOUL)
plt.show()
Figure 48.5: Where a blocker’s hands may go, seen from the blocker’s side. Inside the frame (the chest plate, between the shoulders), hands may push, steer and lock on: legal. Grabbing outside the frame (shoulder pads, sleeves, the sides and back of the jersey) to turn or restrict him is holding, ten yards against the offense. (Strictly, the test is whether the defender is materially restricted, wherever the hands are; outside the frame is where that usually happens.) Hands to the face mask, helmet or neck are illegal hands to the face for either side. The same rules govern a defender’s hands on a receiver before the throw, where the holding foul is five yards and a first down.

Why linemen hold, and why most holds aren’t called

Pass protection is a losing fight by design. A pass rusher has to beat one man for a moment; a blocker has to stay in front of him for two and a half seconds or more (Pass Protection). When a rusher wins the edge, the tackle’s last resort is his hands, and a grab at the back of the jersey as the rusher turns the corner is the hold you’ll see flagged most often. From the lineman’s side the trade is sometimes worth it: a sack loses yards, a down and sometimes the ball, while a hold costs ten yards and replays the down.

Officials could find a technical hold on most snaps, so the working standard is narrower: a grab that materially restricts a defender, at or near the point of attack, especially one that turns him, pulls him down or keeps him from the ball. That makes holding unusually sensitive to instructions. In 2020 the league’s officiating department told crews to call only “clear and obvious” fouls rather than “ticky-tack stuff,” and offensive holding flags fell from about 2.8 a game in 2019 to 1.8; they drifted back to about 2.5 by 2024 (the chart below shows it).15

NoteMadden vs. real life

In a video game, holding is a slider: turn it up and the game calls more of it. In the NFL, holding happens on most plays, in small ways, and the question is whether an official sees one that matters. That makes holding calls lumpy: they cluster on edge rushers who win, on run plays at the point of attack, and on crews and seasons with different standards. When the flag comes out, it is usually because a defender was turned, pulled down or had a clear path to the ball taken away by a hand outside the frame, not because a lineman touched a jersey.

Blocks that may not happen: in the back, low, and in pairs

Three more blocking rules shape how plays are drawn:

  • Block in the back. A block from behind, above the waist, on a player who is not the ball carrier. The NFL’s name for it is an illegal block above the waist, and it costs ten yards, enforced from the spot of the foul. The same block below the waist is clipping, fifteen yards. It is the classic foul on kick returns and on screens, where blockers are running toward defenders who have already passed them. It is why return men and screen blockers are coached to “see the numbers, don’t block them”: if you can read the defender’s jersey number on his back, let him go. One exception: in close-line play, the area around the line (roughly tackle to tackle, and up to three yards on the defense’s side), a lineman may block a defender from behind above the waist. That’s why a guard who catches a slanting tackle from behind on a down block isn’t flagged.
  • Cut blocks, with limits. A cut block (at the thighs or below, from the front) is legal on a scrimmage down only near the ball: inside the tight end box, an area that runs from two yards outside each tackle and five yards either side of the line of scrimmage. Outside the box, low blocks are illegal (except against the ball carrier or a player trying to catch a pass), and so is any low block after a change of possession or on a kick. Even inside the box, a low block from behind or from the side while the blocker is moving back toward his own goal line (a peel-back block) has been illegal since 2013.16 The box rule doesn’t care whether the play is a run or a pass, so cuts aren’t only a zone-running tool: a running back may cut a blitzing linebacker inside the box to protect his quarterback, and some quick-game protections have linemen cut the rushers in front of them so the passer can see and throw over them.
  • Chop block. Two blockers on the same defender, one high and one low at the thigh or below, together or in quick succession. The defender is held up by one and his legs taken out by the other, which is how knees get destroyed. The NFL narrowed the chop for years and banned it in every situation in 2016; it costs fifteen yards.
Show the Python
LATS = [(-8.5, 3.5), (-2.0, 7.5), (-2.5, 16.5)]
WIN = (-6.8, 6.8)
fig, axes = plt.subplots(1, 3, figsize=(6.6, 2.75),
                         gridspec_kw=dict(width_ratios=[abs(b_ - a_) for a_, b_ in LATS]))
GHOST = dict(fc="none", ec=style.INK_2, lw=0.8, ls=(0, (2, 1.5)), zorder=7)

# 1. legal cut (the run goes to the right, out of the picture)
off = [O_("LT", "LT", -0.7, -3.2, "LT"), O_("LG", "LG", -0.7, -1.6, ""), O_("C", "C", -0.7, 0.0, "C"),
       O_("RG", "RG", -0.7, 1.6, ""), O_("QB", "QB", -1.6, 0.0, "Q"), O_("RB", "RB", -5.0, 0.0, "R")]
dfn = [D_("T1", "DT", 1.6, -2.6, "T"), D_("E1", "DE", 1.4, -5.4, "E"), D_("T2", "DT", 1.4, 1.2, "T")]
p = Play(off, dfn, los=40, to_go=None)
p.block("LG", pts=[(0.4, 1.4)]); p.block("C", pts=[(0.6, 1.1)]); p.block("RG", pts=[(0.6, 1.0)])
p.run("RB", [(1.0, 3.0)])
p.highlight("T1")
f = p.draw(ax=axes[0], lateral=LATS[0], window=WIN, title=False)
no_numbers(f.ax)
band(f, p, -5, 5, LEGAL_T, alpha=0.7, w0=-5.2, w1=5.2)
arrow(f, p, (0.05, -3.25), (0.85, -2.85), LEGAL, lw=2.0, ms=9, ls=(0, (2, 1.0)), z=9)
say(f, p, -2.6, -5.6, "LT dives at\nhis knees", color=LEGAL, fs=5.6, weight="bold")
f.ax.plot(*zip(P_(f, p, -1.6, -4.6), P_(f, p, 0.3, -3.2)), color=style.INK_2, lw=0.6, zorder=8)
say(f, p, 4.6, -2.4, "a cut from the front,\ninside the box: legal", color=LEGAL, fs=5.8)
say(f, p, -4.9, -2.9, "tight end box", color=LEGAL, fs=5.6, style_="italic", box=False)
panel_title(axes[0], "1. Legal cut", fs=8.0)

# 2. chop block
off = [O_("C", "C", -0.7, 0.0, "C"), O_("RG", "RG", -0.7, 1.6, "RG"), O_("RT", "RT", -0.7, 3.2, "RT")]
dfn = [D_("T1", "DT", 1.6, 2.4, "T"), D_("T2", "DT", 1.4, -0.4, "T")]
p = Play(off, dfn, los=40, to_go=None)
p.highlight("T1")
f = p.draw(ax=axes[1], lateral=LATS[1], window=WIN, title=False)
no_numbers(f.ax)
arrow(f, p, (0.05, 1.75), (0.75, 2.05), style.OFFENSE_DARK, lw=2.0, ms=9, z=9)
arrow(f, p, (0.05, 3.2), (0.85, 2.85), FOUL, lw=2.0, ms=9, ls=(0, (2, 1.0)), z=9)
say(f, p, 4.4, 0.6, "RG: high", color=style.OFFENSE_DARK, fs=5.8, weight="bold")
f.ax.plot(*zip(P_(f, p, 3.8, 0.9), P_(f, p, 2.4, 2.0)), color=style.INK_2, lw=0.6, zorder=8)
say(f, p, 4.4, 4.6, "RT: low", color=FOUL, fs=5.8, weight="bold")
f.ax.plot(*zip(P_(f, p, 3.8, 4.3), P_(f, p, 0.8, 3.1)), color=style.INK_2, lw=0.6, zorder=8)
say(f, p, -4.2, 2.6, "high + low on\none man: chop\nblock, 15 yd", color=FOUL, fs=5.8)
flag(f, p, -2.9, 5.0)
panel_title(axes[1], "2. Chop block", fs=8.0)

# 3. block in the back, after the catch
off = [O_("QB", "QB", -4.8, 2.0, "Q"), O_("H", "WR", 1.2, 7.4, "H"), O_("Z", "WR", 4.7, 11.9, "Z")]
dfn = [D_("CB", "CB", 3.4, 10.5, "C")]
p = Play(off, dfn, los=40, to_go=None)
p.highlight("Z", "CB")
f = p.draw(ax=axes[2], lateral=LATS[2], window=WIN, title=False)
no_numbers(f.ax)
xg, yg = P_(f, p, -1.6, 7.0)
f.ax.add_patch(Circle((xg, yg), 0.75, **GHOST))                       # where H caught it
arrow(f, p, (-4.4, 2.4), (-1.9, 6.6), style.BALL, lw=1.2, ls=(0, (2, 1.5)), ms=7)
arrow(f, p, (-0.8, 7.1), (0.35, 7.3), style.OFFENSE, lw=1.4, ms=7)
arrow(f, p, (2.65, 9.75), (1.95, 8.45), style.DEFENSE, lw=1.6, ms=8, z=9)       # C chasing H
trail(f, p, [(-0.7, 14.6), (4.3, 13.6)], style.OFFENSE, lw=1.1)
arrow(f, p, (4.3, 13.6), (4.65, 12.85), style.OFFENSE, lw=1.1, ms=6)
star(f, p, 4.05, 11.2, FOUL, ms=10)
flag(f, p, 0.2, 12.4)
say(f, p, -4.0, 9.8, "screen caught\nbehind the line", fs=5.6, color=style.INK_2)
say(f, p, 3.7, 2.6, "C slipped Z's block;\nZ shoves him from\nbehind: 10 yd", color=FOUL, fs=5.8)
panel_title(axes[2], "3. Block in the back", fs=8.0)
fig.tight_layout(w_pad=0.4)
plt.show()
Figure 48.6: Three blocking rules on the field. 1, a legal cut: on an outside-zone run to the right, the backside left tackle (LT) dives at the knees of the 3-technique tackle (T) from the front, inside the tight end box (shaded: two yards outside each tackle, five yards either side of the line). The backside end (E) is left unblocked, as outside zone often does. 2, a chop block: the right guard (RG) engages the defensive tackle high (solid arrow) while the right tackle (RT) cuts the same man low (dashed arrow): fifteen yards. 3, a block in the back: H has caught a screen behind the line and turned upfield. The cornerback (C) slipped inside Z’s block and is chasing him; Z, now behind C in the direction C is running, shoves him in the back above the waist: ten yards, from the spot of the foul. Because the catch came first, Z’s block is not pass interference.

The lineman’s one-yard limit, enforced

The last blocking rule belongs to Run-Pass Options, which explains it in full: on a pass, an ineligible lineman whose entire body is more than a yard past the line when the ball is thrown is illegal man downfield, unless he got there while still blocking a defender he engaged at the line. Its price is five yards from the previous spot, with no loss of down, and a completed pass is wiped out. Note how that interacts with OPI. A lineman who goes downfield and blocks a defender before the pass can be flagged for pass interference instead (ten yards), and a receiver who blocks downfield before the throw is OPI too. That is why NFL RPOs keep everyone’s downfield blocking honest until the ball is out.

So how do screens work? On a bubble or tunnel screen (Play-Action, Bootlegs, and Screens) receivers block cornerbacks and linemen lead the runner downfield, and it isn’t a foul, because of timing. In the NFL both rules apply to every forward pass, even one caught behind the line, and both are about what happens before the throw. The OPI rule bans blocking more than a yard downfield “clearly prior to a pass being thrown,” so screen receivers are coached to get in the defender’s way without touching him and to start the block as the ball comes out. Linemen on a screen engage a rusher at the line, let him go, and then slide sideways (or wait) until the throw: the rule lets an ineligible player who made contact at the line drift past one yard as long as he moves sideways or back, not upfield, until the ball is thrown. Then everyone turns upfield, and the blocks that follow the catch are ordinary blocks, which is the situation in panel 3 of the figure above.17 (College is looser: its pass-interference rules cover only passes that cross the neutral zone, and its linemen get three yards rather than one.)

In the data, ineligible-downfield flags rose as RPOs spread through the league, from about 0.06 a game in 2015–2018 to 0.15–0.3 a game in most seasons since 2019 (2020, a light year for flags of every kind, was the exception). The timing fits, though the data can’t prove the RPO was the cause.

Player safety: protecting the passer and the defenseless

The rules in this section are newer, mostly 21st century, and they exist for a different reason: not to balance offense against defense but to keep players from being badly hurt, especially in the head, neck and knees. They also cost the most. Almost all of them are personal fouls, the rule book’s category (Rule 12, Section 2) for contact that is dangerous or has no football purpose. A personal foul costs 15 yards, with an automatic first down when the defense commits it, and the worst can bring an ejection, a fine or, from 2026, a suspension. An ejection (the rule book says disqualification) is for a flagrant foul, which the rules define as one that is “extremely objectionable, conspicuous, unnecessary, avoidable, or gratuitous”; the on-field officials make that call, and since 2026 league officiating staff may consult on it from New York.18

Roughing the passer

A quarterback in the act of throwing can’t protect himself. His eyes are downfield, his arm is cocked, his front leg is planted. Roughing the passer protects him in that posture and just after. The main ways to commit it:19

  • Late. Hitting him after the ball is clearly gone, once the defender has had a reasonable chance to stop (officials think in terms of a step or so).
  • High. Forcible contact to his head or neck with the helmet, shoulder or forearm, even if the rusher was wrapping him up.
  • Low. Forcible contact at or below the knees, unless the rusher was blocked into him. This is the “Brady rule,” tightened in 2009 after Tom Brady tore knee ligaments on a low hit in the 2008 season opener.
  • Heavy. Landing on him with all or most of the defender’s body weight, or driving him into the ground after the throw. It got a major emphasis in 2018, after Aaron Rodgers broke his collarbone when he was driven into the turf in 2017.
  • Stuffing him. Picking him up and slamming him, or wrestling him down after the throw.

The price is 15 yards and an automatic first down; if the pass is completed, the 15 yards are walked off from the previous spot or the end of the play, whichever helps the offense more, so a completion usually keeps its yards and gets the 15 on top. That makes roughing one of the most expensive defensive fouls (see the chart in What penalties cost), and also one of the most argued, because it asks an official to judge a 270-pound man’s momentum in half a second. Two roughing calls on consecutive days in October 2022, on Atlanta’s Grady Jarrett for his sack of Tom Brady and on Kansas City’s Chris Jones for a strip-sack of Derek Carr, set off a week of debate about whether the rule had gone too far.20

The protection shrinks when the quarterback leaves the pocket. If he keeps moving or throws on the run, he loses the one-step “late hit” protection and the protection against low hits, though the head-and-neck and body-weight rules still apply. If he stops and sets up to throw again, he gets all of it back.

Show the Python
fig, ax = plt.subplots(figsize=(6.4, 4.4))
ax.set_xlim(-11, 11); ax.set_ylim(-0.6, 15.2); ax.set_aspect("equal"); ax.axis("off")
# bands behind the figure
ax.add_patch(Rectangle((-3.6, 10.3), 7.2, 4.4, fc=FOUL_T, ec="none", zorder=0))
ax.add_patch(Rectangle((-3.6, 3.6), 7.2, 6.7, fc=LEGAL_T, ec="none", zorder=0))
ax.add_patch(Rectangle((-3.6, -0.4), 7.2, 4.0, fc=FOUL_T, ec="none", zorder=0))
# figure: legs, torso, throwing arm, head
body = dict(fc=style.SURFACE, ec=style.INK_2, lw=1.2, zorder=2)
ax.add_patch(FancyBboxPatch((-1.8, 0.0), 1.3, 5.2, boxstyle="round,pad=0.05,rounding_size=0.5", **body))
ax.add_patch(FancyBboxPatch((0.5, 0.0), 1.3, 5.2, boxstyle="round,pad=0.05,rounding_size=0.5", **body))
ax.add_patch(FancyBboxPatch((-2.2, 5.0), 4.4, 5.0, boxstyle="round,pad=0.05,rounding_size=0.8", **body))
ax.add_patch(FancyBboxPatch((-2.6, 9.0), 5.2, 1.4, boxstyle="round,pad=0.05,rounding_size=0.6", **body))
ax.add_patch(Polygon([(2.2, 9.6), (3.6, 11.6), (3.0, 13.4), (2.5, 13.3), (2.9, 11.7), (1.8, 10.0)], closed=True, **body))
ax.add_patch(Ellipse((3.0, 13.9), 1.2, 0.75, fc=style.BALL, ec="white", lw=0.7, zorder=3))
ax.add_patch(Polygon([(-2.2, 9.6), (-3.2, 8.0), (-2.6, 7.8), (-1.8, 9.0)], closed=True, **body))
ax.add_patch(Rectangle((-0.45, 10.3), 0.9, 0.8, **body))
ax.add_patch(Circle((0, 12.2), 1.3, **body))
ax.plot([-3.6, 3.6], [10.3, 10.3], color=FOUL, lw=1.0, ls=(0, (3, 2)), zorder=1)
ax.plot([-3.6, 3.6], [3.6, 3.6], color=FOUL, lw=1.0, ls=(0, (3, 2)), zorder=1)
kw = dict(fontsize=7.7, va="center", zorder=6, bbox=dict(boxstyle="round,pad=0.3", fc=style.SURFACE, ec=style.BASELINE, lw=0.6))
ax.text(-4.2, 12.5, "HEAD AND NECK\nno forcible contact with\nhelmet, shoulder or forearm", ha="right", color=FOUL, **kw)
ax.text(-4.2, 7.0, "LEGAL TARGET\nwrap him up; but no landing\nwith full body weight, no\ndriving him into the ground", ha="right", color=LEGAL, **kw)
ax.text(-4.2, 1.6, "KNEES AND BELOW\nno forcible low hits\n(unless blocked into him)", ha="right", color=FOUL, **kw)
ax.text(4.4, 8.4, "TIMING\nonce the ball is clearly\ngone, a hit is late:\nabout one step to stop", ha="left", color=style.INK, **kw)
ax.text(4.4, 2.8, "PRICE\n15 yards + automatic\nfirst down; usually added\nto a completed pass", ha="left", color=style.INK, **kw)
plt.show()
Figure 48.7: The passer’s protected zones, as the rules describe them. Head and neck: no forcible contact with the helmet, face mask, shoulder or forearm, even on a sack. Knees and below: no forcible low hits unless the rusher has been blocked into him (the 2009 ‘Brady rule’). Between them is the legal target, but a rusher may not land on him with most of his body weight or drive him into the ground, and any hit once the ball is clearly gone is late. Each foul is 15 yards and an automatic first down.

The sliding quarterback and the defenseless player

When a quarterback runs, he becomes a runner and can be tackled like one, with one exception. If he slides feet first, he is giving himself up: the ball is dead the instant he touches the ground with anything but his hands or feet, and defenders must treat him like a runner already down by contact (down because an opponent touched him, the subject of the next chapter) and pull up. “Pull up” has a limit that decides most late-slide arguments on a broadcast: a defender who had already committed to the tackle before the slide began isn’t flagged for contact he couldn’t avoid, unless he hits the quarterback in the head or neck with his helmet, shoulder or forearm, or does something else needlessly rough. The rule also puts the burden on the quarterback: slide early, before a hit is imminent, or lose the protection. A quarterback who fakes a slide is treated as having slid (the ball is dead when he begins the fake), so he can’t use it to freeze a defender and keep running. The current rule treats a dive, feet or head first, the same way as a slide.21

The defenseless player rule generalises the idea. The rule book lists players who can’t protect themselves: a passer in the act of throwing or just after; a receiver trying to catch a pass (and until he has had time to protect himself after the catch); a runner already held up with his forward progress stopped (his advance halted, so the play is effectively over); a kicker or punter during the kick; a kick returner fielding the ball; a quarterback after a change of possession; a player on the ground; a player hit by an illegal blindside block (a block thrown while the blocker is moving toward or parallel to his own end line, with forcible contact from the helmet, forearm or shoulder; itself 15 yards); a receiver running his route when the defender comes from the side or behind; and a few others. Against them a defender may not make forcible contact to the head or neck with the helmet, face mask, shoulder or forearm, and may not launch (leave his feet and spring upward and forward into the player). The foul is unnecessary roughness, the catch-all personal foul that also covers late hits after the whistle and hits on players out of bounds: 15 yards, with an automatic first down when the defense commits it.22

The defenseless-player rule is why you see safeties aiming low, at a receiver’s thighs, on a pass over the middle instead of “lighting him up” high. It is a rule that changed how a position is played.

The 2018 helmet rule

In 2018 the NFL went further with the use of the helmet (2018 rule): it is a foul for any player, anywhere on the field, to lower his head to initiate and make contact with his helmet against an opponent. Unlike the defenseless-player rules, it covers runners and blockers as well as tacklers, and it applies to everyone on every play, not just to hits on certain players. The penalty is 15 yards, and a flagrant violation can be an ejection.23

Tackles that are banned: the horse-collar and the hip-drop

Two tackles are illegal by name:

  • Horse-collar tackle (banned in 2005). Grabbing the inside back or side collar of a runner’s shoulder pads or jersey and pulling him down, usually from behind. The runner’s legs fold under him as he falls backward, which breaks ankles and tears knee ligaments. The ban followed the 2004 season, in which Dallas safety Roy Williams’s horse-collar tackles injured several players, among them Philadelphia’s Terrell Owens.24 15 yards and an automatic first down.
  • Hip-drop tackle (banned in 2024). The tackler wraps the runner from behind or the side, swings his hips and legs off the ground, and drops his weight onto the runner’s legs at or below the knee. The league’s injury data showed the technique injuring runners at a far higher rate than ordinary tackles, and the owners banned it in March 2024, unanimously and over the objections of the players’ union, with a 15-yard penalty and an automatic first down.25

Discipline beyond the flag: the 2026 three-strike policy

A flag is only one price. Players are also fined, and the worst hits bring suspensions. For the 2026 season the league and the players’ union agreed on a three-strike policy for five listed fouls (hip-drop tackles, horse-collar tackles, launching, hits on a defenseless player, and blindside blocks): three violations bring a one-game suspension, and the strikes carry over into later seasons. Everyone started the 2026 regular season with a clean slate. Reports differ on one detail: the Associated Press describes three violations across the categories, while ProFootballTalk reads the policy as three violations of the same rule. Strikes come from the league’s discipline after review, not only from flags.26 The point is to reach the habits that flags and fines hadn’t changed, especially for the hip-drop, which is rarely flagged (below).

Table 48.1: The main player-safety rules and when they arrived. Personal fouls by the defense carry an automatic first down; flagrant ones can bring an ejection. Sources in the footnotes to this section.
Rule Since What it bans Price on the field Why it was written
Horse-collar tackle 2005 Pulling a runner down by the back or side collar 15 yd + 1st down Leg and ankle injuries from runners folded backward
Low hit on the passer (“Brady rule”) 2009 Forcible hits at or below a passer’s knees 15 yd + 1st down Knee injuries to quarterbacks
Chop block (all situations) 2016 High-low double blocks 15 yd Knee injuries to linemen
Use of the helmet 2018 Lowering the head to initiate helmet contact, anyone, anywhere 15 yd, possible ejection Head and neck injuries to both players
Roughing: body weight emphasis 2018 Landing on the passer with most of the body weight 15 yd + 1st down Shoulder and collarbone injuries to quarterbacks
Hip-drop tackle 2024 Swinging the hips onto a runner’s legs 15 yd + 1st down Lower-leg injuries to runners
Three-strike policy 2026 Repeat violations of five listed safety rules One-game suspension after three Repeat offenders flags didn’t deter
ImportantWhy it exists: safety rules with a scheme side effect

What they solve. Head, neck and knee injuries that a career, or a life, can’t recover from. What they change. Defensive backs tackle lower and play the ball instead of the man; rushers learn to hit the quarterback’s torso and roll off him; offenses gain yards on every borderline call, and a quarterback who slides gets a free end to his run. Each rule also creates a judgment call, and judgment calls on 15-yard fouls swing games. That tension, between protecting players and leaving the officials too much to decide, runs through every live rules debate.

How a flag becomes yards: enforcement

Now the mechanics. When a flag flies during a play, the officials answer a fixed sequence of questions. Learn them and you can usually announce the result before the referee does.

Accept or decline

Most fouls happen during a live play, and the play keeps going until it ends normally. Then the team that was fouled gets a choice: accept or decline. Accept, and the result of the play is usually wiped out and the penalty enforced. Decline, and the play stands as though no foul happened.27 In practice the head coach decides, quickly, with the referee explaining the options to the team captain or the coach on the sideline.

The choice is usually obvious (nobody declines a 40-yard DPI) but not always:

  • Third down, incomplete pass, offensive holding. Accept, and it’s third-and-18 from ten yards back. Decline, and it’s fourth-and-8: the offense will probably punt. Most defenses decline, because a stop now beats a long third down later. In 2021–2025 offenses converted third-and-16 to third-and-20 about 10% of the time; a declined penalty that forces the punt takes even that chance away.
  • Defensive offside on a touchdown pass. The offense declines and keeps the touchdown. A defensive personal foul on a touchdown isn’t lost, though: the rules carry it over to the try, so the offense can kick the extra point from closer or go for two from the 1. (A personal foul on a successful extra-point kick can be carried to the kickoff instead.)
  • A sack and a hold. If the offense held and the quarterback was sacked anyway for 9 yards, the defense can take the sack (and the down) or the 10 yards (and replay the down), whichever leaves the offense worse off.
  • Two fouls by the same team on one play don’t add up. The fouled team picks the one it wants enforced, and the other is dropped.
  • Fouls by both teams on the same play usually offset: the penalties cancel and the down is replayed.

Some fouls aren’t part of the choice in the usual way. Fouls after the play is over (a late hit, a taunt, a fight) are dead-ball fouls: the play’s result stands and the yardage is added on, from where the play ended. That’s how a 20-yard completion plus a late hit becomes 35 yards.28

Free plays

Free play is the accept-or-decline option seen from the other end, and The Pre-Snap Phase showed it in action. When a defender is offside at the snap, the play goes on with the flag already down. The offense can’t lose: if the play works, it declines the penalty and keeps the result; if it fails (incomplete, sacked, even intercepted), it takes the five yards. So quarterbacks are taught to snap fast and take a shot downfield.

The catch is that not every jump gives a free play. If a defender’s jump makes a nearby blocker flinch, or leaves him with an unblocked path to the quarterback, the officials blow the whistle at once: a neutral zone infraction, five yards, no play (encroachment if he touches someone). The free play happens when the jumper draws no reaction and isn’t running free, typically a wide end who jumps and is picked up by his tackle, or a twelfth defender still running off the field at the snap (What a Play Really Is). That’s also why the quarterback snaps it fast on a jump: the play has to start before anybody reacts.29

Show the Python
def free_play():
    off = offense("gun_2x2")
    dfn = defense("nickel", "single_high", off, press=True)
    dfn = [q.moved(label="C") if q.pos == "CB" else q for q in dfn]
    dfn = [q.moved(d=13.5, w=0.0) if q.key == "FS" else q.moved(d=2.5, w=-9.2) if q.key == "SS" else q for q in dfn]
    p = Play(off, dfn, los=40, to_go=10)
    p.motion("WDE", to=(-0.2, -4.7), speed=2.4)                 # the jump: into the neutral zone
    p.route("X", r.go(32)); p.route("H", r.hitch(6)); p.route("Y", r.hitch(6)); p.route("Z", r.curl(12))
    p.dropback(2.5)
    p.pass_to("X", t=1.7)
    for k in ("LT", "LG", "C", "RG", "RT"):
        p.block(k, pts=[(-1.0, 0.0)])
    for k in ("SDE", "SDT", "WDT"):
        p.rush(k, pts=[(-1.6, 0.0)], speed=2.0)
    p.rush("WDE", pts=[(-1.6, 0.4)], speed=2.0)
    p.man("LCB", "X"); p.man("NB", "Y"); p.man("RCB", "Z"); p.man("SS", "H")
    p.drop("FS", (20.0, -6.0), speed=6.0)
    p.drop("MIKE", (6.0, 1.0)); p.drop("WILL", (6.0, -4.0))
    p.highlight("WDE", "X")
    return p


fp = free_play()
FP_T = [-1.2, 0.0, 1.7, 3.4]
FP_LAB = ["Set", "Snap \u00b7 E offside", "+1.7 s \u00b7 the shot", "+3.4 s \u00b7 free play"]
if PDF:
    VIEWS = [((-13, 6.5), (-7, 8.5)), ((-13, 6.5), (-7, 8.5)), ((-21, 5), (-9.5, 31)), ((-21, 5), (-9.5, 31))]
    fig, axes = plt.subplots(1, 4, figsize=(6.6, 2.75))
    per = {0: dict(notes=[(5.9, -8.4, "E set outside\nthe tackle", dict(fs=5.4))]),
           1: dict(flags=[(-4.4, -9.6)],
                   notes=[(5.5, -8.4, "jumps into the\nneutral zone: flag,\nplay goes on", dict(fs=5.4, color=FOUL))]),
           2: dict(flags=[(-6.2, -11.0)]),
           3: dict(flags=[(-6.2, -11.0)],
                   notes=[(24.0, -6.4, "caught: decline\nthe flag. Missed\nor picked: take\n5 yards", dict(fs=5.4))])}
    for i, (ax, t, lab, (lat, win)) in enumerate(zip(axes, FP_T, FP_LAB, VIEWS)):
        fld = snapshot(fp, t, ax, lat, win, **per.get(i, {}))
        if i >= 1:                                              # where the end was set
            x0, y0 = P_(fld, fp, 1.0, -5.0)
            ax.add_patch(Rectangle((x0 - 0.75, y0 - 0.75), 1.5, 1.5, fc="none", ec=style.DEFENSE_DARK,
                                   lw=0.8, ls=(0, (2, 1.2)), zorder=7))
        if i == 1:
            arrow(fld, fp, (1.55, -5.75), (0.35, -5.75), FOUL, lw=1.1, ms=7, z=9)
        panel_title(ax, lab, fs=8.0)
    fig.tight_layout(w_pad=0.5)
    plt.show()
else:
    show_animation(fp, times=FP_T)
Figure 48.8: A free play, simulated (BDB-format tracking generated by gridiron). Set: the left defensive end (E) is in his stance outside the left tackle. Snap: he has jumped into the neutral zone (dashed outline: where he was), but nobody flinched and the tackle is in front of him, so there is no whistle; the center snaps the ball before he can get back, he is offside, and the flag comes out while the play runs. The quarterback, knowing the offense can take five yards if this goes badly, throws deep to X against the press corner, a throw he would rarely risk on a normal second down. If X catches it, the offense declines the flag; if it falls incomplete or is intercepted, the offense accepts it and replays the down five yards closer. Had the tackle flinched, or had the end been running free at the quarterback, the officials would have blown it dead before the snap: a neutral zone infraction.

From which spot, and how far

If the penalty is accepted, the officials need a starting point and a distance:

  • The previous spot (where the ball was snapped) is the default for most fouls, including all pre-snap fouls, every foul during a pass play (offensive holding, offensive pass interference, defensive holding, illegal contact), and every offensive foul behind the line of scrimmage.
  • The spot of the foul is used for defensive pass interference (the spot foul) and for many offensive fouls on running plays and returns: a block in the back 20 yards upfield on a punt return is walked off from where it happened.
  • The end of the play is used for dead-ball fouls after the whistle, and is an option for a defensive personal foul such as roughing the passer on a completed pass (the offense gets whichever of the previous spot and the end of the play helps it more).

The middle bullet is the one fans get wrong, and it has a logic. On a run, the officials compare the foul with the end of the run. A hold that happens behind that point, but past the line, is walked off from the spot of the foul: the offense keeps the yards it gained up to the hold, which came before the foul could help, and loses everything after it plus ten yards. A hold beyond where the run ended couldn’t have helped the runner, so it is walked off from the end of the run, and the offense keeps the whole gain before paying ten yards. A hold behind the line of scrimmage goes back to the previous spot, as on a pass.30 The NFL calls this the three-and-one method; you only need the picture.

Show the Python
def yard_strip(ax, lo, hi, prev, half=6.75, num_w=-4.9):
    """A horizontal strip of field from yard line lo to hi (offense's own territory, moving right)."""
    los = 10 + prev
    f = Field(ax=ax, orient="horizontal", los=los, window=(10 + lo - los, 10 + hi - los),
              lateral=(FIELD_W / 2 - half, FIELD_W / 2 + half), to_go=None, numbers=False)
    p = Play([O_("Q", "QB", 0.0, 0.0, "")], [], los=los, ball_y=FIELD_W / 2, to_go=None)
    for yl in range(lo - lo % 10 + 10, hi, 10):
        say(f, p, yl - prev, num_w, str(yl) if yl else "G", color=style.MUTED, fs=7.5, weight="bold")
    return f, p


def run_row(ax, foul, end, new_spot, tag, note, from_spot):
    f, p = yard_strip(ax, 8, 56, 30, half=5.4, num_w=-3.8)
    line_across(f, p, 0.0, style.OFFENSE_DARK, lw=1.6, ls="-", w0=-5.4, w1=5.4)
    line_across(f, p, 10.0, style.LINE_TO_GAIN, lw=1.6, ls="-", w0=-5.4, w1=5.4)
    arrow(f, p, (0.0, 0.2), (end - 30, 0.2), style.OFFENSE, lw=1.6, ms=8)          # the run
    ball(f, p, end - 30, 0.2)
    star(f, p, foul - 30, -1.5, FOUL, ms=11)
    say(f, p, foul - 30 + 1.4, -1.5, note, fs=6.2, color=FOUL, ha="left", box=False)
    arrow(f, p, (from_spot - 30, 2.0), (new_spot - 30, 2.0), FOUL, lw=1.6, ms=8)
    x0, y0 = P_(f, p, new_spot - 30, 0.0)
    ax.plot([x0, x0], [y0 - 2.8, y0 + 2.8], color=FOUL, lw=1.8, zorder=6)
    say(f, p, (from_spot + new_spot) / 2 - 30, 3.7, tag, fs=6.6, color=FOUL, weight="bold")
    return f


fig, axes = plt.subplots(3, 1, figsize=(6.5, 4.5))
run_row(axes[0], 38, 42, 28, "from the spot of the foul: 1st-and-12", "hold", 38)
run_row(axes[1], 46, 42, 32, "from the end of the run: 1st-and-8", "hold", 42)
run_row(axes[2], 28, 42, 20, "from the previous spot: 1st-and-20", "hold", 30)
for ax, t in zip(axes, ["1. Hold behind the end of the run, past the line",
                        "2. Hold beyond the end of the run",
                        "3. Hold behind the line of scrimmage"]):
    panel_title(ax, t, fs=8.2)
fig.tight_layout(h_pad=0.6)
plt.show()
Figure 48.9: Offensive holding on a run, three ways (offense moving right). First-and-10 at the offense’s own 30; the back runs to the 42. Top: a receiver holds a corner at the 38, past the line but behind where the run ended, so ten yards come off from the spot of the foul: first-and-12 at the 28. Middle: the hold is at the 46, beyond where the run ended; it couldn’t have helped the runner, so the ten yards come off the end of the run: first-and-8 at the 32. Bottom: a lineman holds behind the line, at the 28, so the penalty goes back to the previous spot: first-and-20 at the 20.

Then how far: five, ten or fifteen yards, or the spot. And then two adjustments near the goal lines:

  • Half the distance. A penalty may not move the ball more than halfway to the offending team’s goal line. Holding by the offense on its own 8 moves the ball to the 4, not to the end zone. A defensive personal foul with the ball on the opponent’s 6 moves it to the 3. Without the rule, a penalty could score points; with it, the ball keeps creeping toward the goal line but never gets there.31
  • Fouls in the end zone. Offensive holding in the offense’s own end zone is a safety: the spot the penalty would be walked from is already behind the goal line, so instead of moving the ball the rules give the defense two points. DPI in the end zone puts the ball on the 1, not in the end zone. The rule book awards a touchdown for a foul only in the rare case of a palpably unfair act (a player coming off the bench to tackle a runner headed for the end zone, say), and pass interference, however blatant, isn’t one.32
Show the Python
def strip_row(ax, prev, new_spot, tag):
    f, p = yard_strip(ax, -9, 42, prev)
    say(f, p, -5 - prev, -4.9, "end zone", color=style.INK_2, fs=6.8, style_="italic", box=False)
    line_across(f, p, 0.0, style.OFFENSE_DARK, lw=1.6, ls="-", w0=-6.7, w1=6.7)
    ball(f, p, 0.0, 0.0)
    arrow(f, p, (0.0, 2.6), (new_spot - prev, 2.6), FOUL, lw=1.6, ms=9)
    ball(f, p, new_spot - prev, 0.0)
    x0, y0 = P_(f, p, new_spot - prev, 0.0)
    ax.plot([x0, x0], [y0 - 3.4, y0 + 3.4], color=FOUL, lw=1.6, zorder=6)
    say(f, p, (new_spot - prev) / 2, 4.6, tag, fs=7.0, color=FOUL, weight="bold")
    return f


fig, axes = plt.subplots(3, 1, figsize=(6.5, 4.6))
strip_row(axes[0], 35, 25, "10 yd")
strip_row(axes[1], 8, 4, "4 yd")
f, p = yard_strip(axes[2], -9, 42, 2)
say(f, p, -7.0, -4.9, "end zone", color=style.INK_2, fs=6.8, style_="italic", box=False)
line_across(f, p, 0.0, style.OFFENSE_DARK, lw=1.6, ls="-", w0=-6.7, w1=6.7)
ball(f, p, 0.0, 0.0)
arrow(f, p, (-0.3, 0.0), (-5.3, 0.0), style.OFFENSE, lw=1.3, ms=7)
draw_marker(axes[2], *P_(f, p, -6.0, 0.0), "off", "Q", f.pts_per_yard())
star(f, p, -6.0, 2.0, FOUL, ms=11)
flag(f, p, -3.4, 3.4, s=1.1)
say(f, p, 9.5, 2.6, "hold in his own end zone: safety", fs=7.0, color=FOUL, weight="bold")
for ax, t in zip(axes, ["1. Holding with the ball on the 35: the full 10 yards, to the 25",
                        "2. Holding on the 8: half the distance to the goal line, to the 4",
                        "3. Snap from the 2, hold in his own end zone: a safety"]):
    panel_title(ax, t, fs=8.2)
fig.tight_layout(h_pad=0.6)
plt.show()
Figure 48.10: The same offensive holding call, ten yards, at three spots near the offense’s own goal line (offense moving right). Top: from the 35 the full 10 yards apply, so the next snap is at the 25. Middle: from the 8, ten yards would carry the ball into the end zone, so it moves half the distance to the goal line, to the 4. Bottom: the ball is snapped from the 2 and the quarterback drops back into his own end zone; a hold there, four yards deep, is a safety: two points to the defense, and the offense must free-kick.

What down is it?

Last question: the down.

  • Fouls by the offense usually replay the down: second-and-10 becomes second-and-20 after a hold. A few also cost a down (an illegal forward pass, intentional grounding; see Officiating, Replay, and the Rules of the Ball).
  • Fouls by the defense come in two kinds. The pre-snap and procedural fouls (offside, encroachment, neutral zone infraction, too many men) replay the down unless the yards reach the line to gain. The contact and safety fouls (defensive holding, illegal contact, DPI, roughing the passer, unnecessary roughness and the other personal fouls, illegal hands to the face) carry an automatic first down, however short the yardage.
  • A half can’t end on an accepted defensive foul during a play. If time runs out on a play with a defensive foul and the offense accepts, it gets one untimed down.
Show the Python
steps = [
    ("1  When?", "Before the snap with a whistle (false start, encroachment, neutral zone infraction: no play)? During the play, including offside at the snap (a live-ball foul: the play runs)? Or after it ended (a dead-ball foul: late hit, taunt; the play stands)?"),
    ("2  Who?", "Offense or defense? If both, the fouls usually offset and the down is replayed."),
    ("3  Accept/decline?", "The fouled team compares the play's result with the penalty's result and keeps the better one."),
    ("4  Where, how far?", "Previous spot (pass plays, pre-snap fouls, offense fouls behind the line), spot of the foul (DPI; offense fouls past the line but behind the end of a run, and on returns), or end of the play (dead-ball fouls; offense fouls beyond the end of a run); 5, 10, 15 yards or the spot; half the distance near a goal line."),
    ("5  What down?", "Offense foul: replay the down (a few cost one). Defense contact or personal foul: automatic first down. Defense procedural foul: replay unless the yards reach the sticks."),
]
wrapped = ["\n".join(textwrap.wrap(body, 66)) for _, body in steps]
heights = [1.9 + 0.95 * (w.count("\n") + 1) for w in wrapped]      # 1 unit = 0.155 in
gap = 0.9
total = sum(heights) + gap * (len(steps) - 1)
fig, ax = plt.subplots(figsize=(6.5, 0.155 * total))
ax.set_xlim(0, 100); ax.set_ylim(0, total); ax.axis("off")
y1 = total
for i, ((head, _), body, h) in enumerate(zip(steps, wrapped, heights)):
    y0 = y1 - h
    ax.add_patch(FancyBboxPatch((1, y0 + 0.15), 98, h - 0.3, boxstyle="round,pad=0.15,rounding_size=0.6",
                                fc=style.SURFACE if i % 2 else style.OFFENSE_TINT, ec=style.BASELINE, lw=0.9))
    ax.text(3.5, (y0 + y1) / 2, head, fontsize=8.6, fontweight="bold", color=style.OFFENSE_DARK, va="center")
    ax.text(32, (y0 + y1) / 2, body, fontsize=7.4, color=style.INK, va="center", linespacing=1.2)
    if i < len(steps) - 1:
        ax.annotate("", xy=(14, y0 - gap + 0.05), xytext=(14, y0 + 0.05),
                    arrowprops=dict(arrowstyle="-|>", color=style.INK_2, lw=1.0))
    y1 = y0 - gap
plt.show()
Figure 48.11: What happens when a flag flies: the officials’ sequence, and yours. Answer the five questions in order and you can announce the result before the referee does.

What penalties cost

Now price them. Every NFL game has about 13 fouls named in the play-by-play (both teams, accepted or declined, in 2025), and a handful of types account for most of them.

Show the Python
SHOW = [("Offensive Holding", "Offensive holding"), ("False Start", "False start"),
        ("Defensive Pass Interference", "Def. pass interference"), ("Defensive Holding", "Defensive holding"),
        ("Unnecessary Roughness", "Unnecessary roughness"), ("Roughing the Passer", "Roughing the passer"),
        ("Illegal Contact", "Illegal contact"), ("Offensive Pass Interference", "Off. pass interference")]
fig, axes = plt.subplots(2, 4, figsize=(6.6, 3.7), sharex=True)
yrs = RATES.index.values
for ax, (col, name) in zip(axes.flat, SHOW):
    v = RATES[col].values
    ax.plot(yrs, v, color=style.SERIES[0], lw=1.8, marker="o", ms=2.6)
    ax.set_ylim(0, max(v) * 1.3)
    ax.set_title(name, fontsize=7.4, loc="left")
    ax.tick_params(labelsize=6.6)
    ax.set_xticks([2015, 2020, 2025])
    ax.grid(axis="x", visible=False)
    ax.text(yrs[-1] + 0.3, v[-1], f"{v[-1]:.2f}", fontsize=6.4, color=style.INK, va="center")
    ax.set_xlim(2014.5, 2027.2)
    if col == "Offensive Holding":
        ax.annotate("2020", xy=(2020, RATES.loc[2020, col]), xytext=(2016.2, RATES.loc[2020, col] * 0.55),
                    fontsize=6.4, color=style.INK_2, arrowprops=dict(arrowstyle="-", color=style.INK_2, lw=0.7))
for ax in axes[:, 0]:
    ax.set_ylabel("flags per game", fontsize=6.8)
fig.tight_layout(h_pad=0.9, w_pad=0.6)
plt.show()
Figure 48.12: Flags per game (both teams) for eight common fouls, 2015-2025 regular seasons. Offensive holding and false starts are the two most common by far. Holding dropped sharply in 2020, when officials were told to call it less, and has since climbed back. Roughing the passer peaked in 2018-2021 after the body-weight emphasis and fell back from 2022. Illegal contact jumps around from year to year, as emphasis changes. Source: nflverse play-by-play, one foul per play (the play’s main foul), accepted or declined, all plays including kicks; each panel has its own scale.

How often a foul is called is half the story. The other half is what each one is worth. Because nflverse computes expected points before and after every snap, a penalty snap gets an EPA like any other: the value of the down, distance and yard line after the flag, minus the value before. (That includes the play the flag wiped out, which is gone; the EPA reflects only where the penalty left the ball.) Averaging by foul type gives a price list in points.

Show the Python
ORDER = ["Roughing the Passer", "Defensive Pass Interference", "Unnecessary Roughness", "Illegal Contact",
         "Defensive Holding", "Face Mask", "Neutral Zone Infraction", "Defensive Offside", "Illegal Use of Hands",
         "False Start", "Ineligible Downfield Pass", "Illegal Block Above the Waist", "Offensive Holding",
         "Offensive Pass Interference"]
NAMES = {"Illegal Use of Hands": "Hands to the face", "Illegal Block Above the Waist": "Block in the back",
         "Ineligible Downfield Pass": "Illegal man downfield", "Defensive Offside": "Offside (defense)",
         "Roughing the Passer": "Roughing the passer", "Defensive Pass Interference": "Defensive pass interference",
         "Unnecessary Roughness": "Unnecessary roughness", "Illegal Contact": "Illegal contact",
         "Defensive Holding": "Defensive holding", "Face Mask": "Face mask", "Neutral Zone Infraction": "Neutral zone infraction",
         "False Start": "False start", "Offensive Holding": "Offensive holding",
         "Offensive Pass Interference": "Offensive pass interference"}
MIXED = {"Illegal Use of Hands", "Face Mask", "Unnecessary Roughness"}
e = EPA_S.reset_index()
e = e[e.penalty_type.isin(ORDER) & (e.n >= 40)]
e = e[e.penalty_type.isin(MIXED) | (e.by_off == (e.penalty_type.map(EPA_T.by_off) > 0.5))].sort_values("epa")
labels = [NAMES[t] + ((" (offense)" if bo else " (defense)") if t in MIXED else "") for t, bo in zip(e.penalty_type, e.by_off)]
fig, ax = plt.subplots(figsize=(6.5, 4.6))
cols = [style.OFFENSE if bo else style.DEFENSE for bo in e.by_off]
ax.barh(labels, e.epa, color=cols, height=0.66)
for i, (ep, yd) in enumerate(zip(e.epa, e.yds)):
    ax.text(ep + (0.04 if ep >= 0 else -0.04), i, f"{ep:+.2f}  ({yd:.0f} yd)", va="center",
            ha="left" if ep >= 0 else "right", fontsize=7.2, color=style.INK)
ax.axvline(0, color=style.BASELINE, lw=1.0)
ax.set_xlim(e.epa.min() - 0.75, e.epa.max() + 0.75)
ax.set_xlabel("Average EPA for the offense when the foul is accepted", fontsize=8)
ax.tick_params(labelsize=7.4)
ax.grid(axis="y", visible=False)
ax.legend(handles=[Patch(color=style.DEFENSE, label="foul by the defense"), Patch(color=style.OFFENSE, label="foul by the offense")],
          loc="lower right", fontsize=7.5)
plt.show()
Figure 48.13: The average swing in expected points (EPA, from the offense’s point of view) when a foul is accepted, 2021-2025 regular seasons, scrimmage downs. Fouls by the defense (orange) help the offense; fouls by the offense (blue) hurt it. The number on each bar is the average penalty yardage. Illegal use of hands, face mask and unnecessary roughness can be committed by either side, so each appears twice, once per side (only cases with at least 40 accepted flags are shown). Source: nflverse play-by-play.

Four things stand out.

  1. The automatic first down is worth more than the yards. Defensive holding and illegal contact are five-yard fouls, the same yardage as a false start, yet they swing about a point toward the offense while a false start costs about two-thirds of one the other way. Splitting the two-sided fouls by team shows the same thing: hands to the face is worth more against the defense (five yards and a first down) than offside is (five yards, no first down).
  2. DPI and roughing the passer cost a defense more than a completed pass usually gains. The average completion in these seasons was worth about +0.80 EPA; a DPI flag averaged +1.74, and roughing +1.76.
  3. Offensive holding is a drive-killer. At about -1.00 EPA, a hold costs a little over half of what a sack does (-1.78 on average), and holds are flagged about two and a half times a game.
  4. The same five-yard foul is worth more on later downs. The table shows it.
Show the Python
t = BYDOWN.reset_index()
t = pd.DataFrame({"Down": t["down"].astype(int).map({1: "1st", 2: "2nd", 3: "3rd", 4: "4th"}),
                  "Flags": t["n"].map(lambda v: f"{v:,}"),
                  "Average yards to go": t["togo"].map(lambda v: f"{v:.1f}"),
                  "Average EPA for the offense": t["epa"].map(lambda v: f"{v:+.2f}")})
md_table(t)
Table 48.2: The same five-yard defensive foul (defensive holding or illegal contact, accepted) by down, 2021-2025 regular seasons. Each carries an automatic first down, so its value rises as the down gets later: on third down it erases a likely punt. Source: nflverse play-by-play.
Down Flags Average yards to go Average EPA for the offense
1st 423 10.0 +0.45
2nd 339 8.2 +0.87
3rd 382 7.2 +1.52
4th 42 5.5 +2.61

On first-and-10 a defensive hold is a modest gain, first-and-5. On third-and-7 it erases a likely punt and hands the offense a fresh set of downs, so it’s worth about three times as much. That’s why defensive coordinators preach discipline on third down above all, and why an offense with a long third down will often throw toward the corner it thinks is most likely to grab.

NoteGo deeper: penalties in EPA work

Analysts don’t agree on how to treat penalty snaps. The usual “EPA per play” leaves out snaps that a penalty wiped out (nflverse marks them play_type == "no_play"), which drops most DPI flags and most holding calls from team numbers. Expected Points and Success Rate shows how much that choice shades run-versus-pass comparisons; the DPI flags alone make passing look a little better once they are counted. For your own work: say which choice you made, and remember that nflverse records one foul per play, so a play with two flags carries only one penalty type.

Labels move, too. The 2018 helmet foul appears in nflverse under its own name, “lowering the head to initiate contact,” at about 0.07 to 0.13 flags a game from 2018 to 2020, then fades in 2021 and vanishes from the labels after that.33 Whether those calls dried up or are now filed under another name (unnecessary roughness is the likely home), the series breaks there. Check a category’s history before you chart it.

The rules keep moving: live debates

Every spring the competition committee and the teams propose rule changes, and the owners vote; a change needs 24 of 32 votes. The rules in this chapter will keep changing, so here are the debates that were live going into the 2026 season. (For how these fit the long history of rule changes, see The 1978 Liberation and Dynasties and Counterpunches; for the timeline, Appendix E.)

  • The tush push. The tush push is a quarterback sneak with teammates shoving the quarterback from behind, the Eagles’ near-automatic short-yardage play (Red Zone, Goal Line, Two-Point Plays, and Short Yardage explains it). Pushing the runner has been legal since the NFL removed its ban in 2005; pulling him (a teammate grabbing his arm or jersey and hauling him forward) is still a foul, ten yards, and it’s the one to watch for in a tush-push pile. In 2025 Green Bay proposed banning it again; the proposal was tabled in the spring and a revised version failed 22–10 on May 21, 2025, two votes short of 24. The league tightened its officiating guidance on false starts and alignment instead. For 2026, no team proposed a ban, and the play is legal this season.34 The argument is about safety (a pile of linemen driving forward), about fairness (is a nearly unstoppable play bad for the game?) and about whether one team’s mastery of a play is a reason to outlaw it. The case study is The Eagles: Trenches, RPOs, and the Tush Push.
  • Is the hip-drop ban being enforced? The tackle was banned in 2024, but on-field flags have been extremely rare: nflverse’s play-by-play records 1 hip-drop flag in the 2024 regular season and 2 in 2025. The technique happens in a blur, from behind, in a pile, which is hard for an official to see live. The league has leaned on fines after the game instead, and the 2026 three-strike policy adds suspensions on top. Whether discipline after the fact changes behaviour as much as flags would is the open question.
  • Replay for judgment calls. After the 2019 pass-interference experiment failed, the NFL moved more carefully. Since 2025 replay assist may help the referee on objective facts and may overturn flags for hits on a defenseless player, face mask (grabbing and twisting or pulling the face mask), horse-collar, tripping (using a leg to trip an opponent) and roughing or running into the kicker (hitting a punter or kicker after the kick). It cannot add a foul that wasn’t called, and roughing the passer and pass interference are not on the list. In 2026 league officials may also be consulted on ejections for flagrant acts.35 Proposals for a full “sky judge” who could call fouls from the booth keep coming back.
  • College versus NFL. The college game caps DPI at 15 yards, gives linemen three yards downfield instead of one, and treats targeting (a forcible hit to the head) with automatic ejections. College offensive pass interference was cut from 15 yards to 10 for 2026.36 Each difference is a live argument for moving the NFL rule toward college, or the reverse; the full side-by-side table is in Appendix E and the history in The College Laboratory.
TipWatch for it on Sunday: the flag predictor

Every time a yellow flag flies, play referee before the referee does. Say your answers out loud, then check them against the announcement.

  • Where did the flag come from? The official’s position is a clue. A flag from deep downfield (the side judges, field judge or back judge) is usually pass interference, illegal contact or defensive holding. A flag from the officials at the line of scrimmage or behind the offense is usually holding, a false start or a foul on the quarterback. A flag thrown late, after the play, is usually a personal foul. (Who stands where is in Officiating, Replay, and the Rules of the Ball.)
  • Was the ball in the air? If a receiver was grabbed before the throw, guess holding or illegal contact (five yards, first down). After the throw, guess DPI and estimate the spot.
  • Accept or decline? Ask what the fouled team gave up on the play, and whether the next down (a punt down, say) already punishes the offense more than the yards would.
  • Enforce it. Which spot, how far, half the distance near a goal line, and what down. Say the new down and distance.
  • Free play? If a defender jumped and the ball was snapped anyway, watch the quarterback take his shot.
  • Keep score. By the end of a game you’ll be calling most flags right. For a running tally, log the penalties’ expected-points cost from the chart in What penalties cost: which team gave away more points in flags?

Predict the play

TipPredict the play 1: backed up, and a flag
Show the Python
off = offense("i_form")
dfn = defense("4-3_over", "single_high", off)
dfn = [q.moved(d=11.0) if q.key == "FS" else q for q in dfn]
p = Play(off, dfn, los=14, to_go=10)
p.run("RB", [(3.0, -4.2), (6.4, -7.0), (13.0, -8.2)])
p.handoff("RB", t=0.8)
for k, pts in (("LT", [(0.8, -1.0)]), ("LG", [(0.8, -1.0)]), ("C", [(0.8, -1.0)]), ("RG", [(0.8, -1.0)]),
               ("Y", [(0.6, -0.8)]), ("FB", [(3.6, -4.4)])):
    p.block(k, pts=pts)
p.path("SDE", [(-2.5, -1.7)])
p.block("RT", pts=[(-0.7, -0.5)])
p.highlight("RT", "SDE")
f = p.draw(lateral=(-17, 17), window=(-9.5, 14), width_in=5.4)
no_numbers(f.ax)
star(f, p, -1.75, 2.35, FOUL, ms=12)
flag(f, p, -3.4, 6.8, s=1.1)
say(f, p, -5.8, 10.2, "RT holds the end about\na yard behind the line", fs=6.6, color=FOUL)
f.ax.plot(*zip(P_(f, p, -4.9, 8.4), P_(f, p, -2.2, 3.0)), color=style.INK_2, lw=0.6, zorder=8)
say(f, p, 8.6, -11.8, "tackled at the 10", fs=6.6)
say(f, p, -7.4, -9.5, "own end zone", fs=6.6, style_="italic", color=style.INK_2)
plt.show()
Figure 48.14: First-and-10 at the offense’s own 4. The back runs left and is tackled at the 10, a 6-yard gain. On the backside, the defensive end beat the right tackle inside, and the tackle grabbed him a yard behind the line of scrimmage (the star): flag, offensive holding.

The defense has the choice. Does it accept or decline? If it accepts, where does the ball go and what are the down and distance? Then two variations: what if the tackle had held the end in the end zone, and what if a receiver had held a defender at the 9, five yards downfield?

Accept. Declining leaves the run standing: second-and-4 at the 10. Accepting is far worse for the offense:

  • Which spot? The hold was behind the line of scrimmage, so it goes back to the previous spot, the 4, even though this was a running play.
  • How far? Ten yards from the 4 would put the ball in the end zone, so it moves half the distance to the goal line: to the 2.
  • What down? An offensive foul replays the down, and the line to gain stays at the 14: first-and-12 from the 2, with the offense now one more mistake from a safety and likely to punt from its own end zone.

Variation 1, the hold in the end zone: an offensive foul behind the offense’s own goal line is a safety if the defense accepts: two points and the ball back on a free kick. The defense takes it.

Variation 2, a receiver’s hold at the 9: that’s past the line but behind where the run ended (the 10), so it is walked off from the spot of the foul, the 9. Ten yards would be more than half the distance, so the ball goes halfway, to the 4½: first-and-9½. The offense keeps the five yards it gained before the hold, which is the logic of the run rule, and the defense would probably still accept, since it beats second-and-4 at the 10.

TipPredict the play 2: the last snap
Show the Python
off = offense("gun_empty")
dfn = [D_("E1", "DE", 1.0, -3.6, "E"), D_("T1", "DT", 1.0, 0.0, "T"), D_("E2", "DE", 1.0, 3.6, "E"),
       D_("LCB", "CB", 9.0, -16.5, "C"), D_("RCB", "CB", 9.0, 16.5, "C"), D_("NB", "NB", 15.0, -9.0, "$"),
       D_("DB", "DB", 15.0, 9.0, "D"), D_("MIKE", "MIKE", 10.0, 0.0, "M"), D_("FS", "FS", 40.5, -6.0, "FS"),
       D_("SS", "SS", 40.5, 6.0, "SS"), D_("DB2", "DB", 44.0, 0.0, "D")]
p = Play(off, dfn, los=68, to_go=None)
p.highlight("FS", "SS", "DB2")
f = p.draw(lateral="full", window=(-6.5, 49.5), width_in=4.6)
no_numbers(f.ax)
say(f, p, 46.0, -14.0, "end zone", fs=6.8, style_="italic")
line_across(f, p, 42.0, style.INK_2, lw=1.4, ls="-", w0=-26.7, w1=26.7, z=2.4)
say(f, p, 42.0, 15.5, "goal line, 42 yards away", fs=6.4)
plt.show()
Figure 48.15: Fourth quarter, 0:04 left, the offense trails by 5 with the ball at the opponent’s 42 and no timeouts. Five receivers spread out; the defense rushes three and drops eight, the deepest three at the goal line and in the end zone.

What will the offense try, where will the ball be thrown, and why there rather than ten yards short, where a receiver might be open?

A Hail Mary into the end zone: a long, high throw to a crowd of receivers, hoping one of them comes down with it. With four seconds left there is time for one play, and only a touchdown wins, so a completion short of the goal line ends the game as soon as the receiver is tackled. That is the main reason to throw into the end zone.

The rules add a bonus, and it comes from this chapter: a half can’t end on an accepted defensive foul. Pass interference anywhere gives the offense an untimed down at the spot, and the deeper the foul, the better that down: interference in the end zone puts the ball on the 1-yard line, a far better chance than any heave. It cuts the other way too. A half can end on an offensive foul, and any score on that play doesn’t count, so a receiver who shoves a defender to get to the ball has just ended the game. That’s why receivers are coached to box out for position, not push.37

That’s why the receivers converge on one spot and fight for position, and why defensive backs are coached to go for the ball (jump and bat it down) rather than for the receiver. Officials are reluctant to call interference in a crowd where everyone is jostling for a jump ball, but a defender who grabs or tackles a receiver before the ball arrives gives the offense its best chance of the day. The eight deep defenders are there to make sure nobody catches it and that nobody has to foul to prevent it.

TipPredict the play 3: bunch on third-and-3
Show the Python
off = offense("gun_bunch")
off = [q.moved(w=9.0) if q.key == "H" else q.moved(d=-1.2, w=7.2) if q.key == "Y" else
       q.moved(d=-1.2, w=10.8) if q.key == "Z" else q for q in off]
dfn = defense("nickel", "single_high", off, press=True)
mv = {"RCB": (1.0, 11.2), "NB": (1.0, 9.0), "SS": (1.0, 7.1), "LCB": (1.0, -16.6), "SDE": (1.0, 4.0)}
dfn = [q.moved(d=mv[q.key][0], w=mv[q.key][1]) if q.key in mv else q for q in dfn]
dfn = [q.moved(d=4.5, w=2.2) if q.key == "MIKE" else q for q in dfn]
dfn = [q.moved(label="C") if q.pos == "CB" else q for q in dfn]
p = Play(off, dfn, los=60, to_go=3)
p.highlight("SS", "NB", "RCB")
f = p.draw(lateral=(-20, 16), window=(-7.5, 16), width_in=5.4)
no_numbers(f.ax)
say(f, p, 8.6, 10.0, "three defenders pressed\non a tight bunch", fs=6.6)
plt.show()
Figure 48.16: Third-and-3 at midfield. The offense lines up in a tight bunch to the right. The defense shows press man coverage on all three bunch receivers (the ringed defenders, each a yard off the ball), with one deep safety.

What kind of route combination should the offense call here? Where must the contact happen for it to be legal? And what could the defense have done differently before the snap?

A rub (pick) concept out of the bunch. Against press man, with three defenders lined up a yard off three receivers standing close together, the receivers’ release paths will cross the defenders’ paths almost at once. A classic call is one receiver releasing inside on a slant or in-breaking route, another breaking out to the flat, and the third pushing vertically to clear the area; one of the defenders chasing his man has to fight through a teammate’s release.

Legal if the contact happens within a yard of the line, or if the receiver just runs his route. Because the defenders are pressed, the crossing happens right at the line, inside the one-yard strip where pass interference can’t occur, so even a deliberate bump is legal there. (The rule says more than one yard, so contact at the line or a step past it is safe; officials judge it by eye at full speed, which is why offenses aim for contact at the line rather than at the edge of the strip.) Deeper than that, a receiver who keeps running his route and lets a defender run into him is still legal; one who runs three yards, stops and steps into a defender’s path has blocked him, and that is offensive pass interference, ten yards.

What the defense could have done: not press all three. Against bunches, defenses usually align at different depths (one defender pressed, the others four or five yards off), so nobody can be picked within the first yard; or they switch/banjo, trading receivers by agreement so no defender chases through the traffic; or they play zone, where nobody is chasing a man at all. Lining up pressed on a tight bunch is inviting the rub.

Takeaways

  • The rule book is a price list, and teams shop. Five yards, ten, fifteen, the spot, a first down, a safety, an ejection: every foul has a price, and coaches decide when it’s worth paying (the beaten corner’s grab, the beaten tackle’s hold, the deep throw hunting a flag).
  • A receiver’s rules change with depth and with the throw. Inside five yards, jam him. Past five, hands off until the ball is in the air (illegal contact, defensive holding: five yards and a first down). After the throw, play the ball (DPI: a spot foul in the NFL, 15 yards in college). The offense’s restrictions start at the snap: deliberate picks are legal only inside the first yard, and beyond it the receiver must not start the contact.
  • The spot foul shapes offense. Because DPI has no cap in the NFL, deep throws into tight coverage carry a hidden bonus, and big receivers who win 50-50 balls or draw flags are worth more.
  • Blocking is about the frame. Hands inside the chest plate that push and steer are legal; grabbing that materially restricts a defender (usually a hand outside the frame), hands to the face, blocks in the back, cuts outside the tight end box and chop blocks are not. Holding is usually the most-called foul and the most sensitive to officiating emphasis.
  • Safety rules are expensive and contested. Roughing the passer, the defenseless player, the 2018 helmet rule, the horse-collar and hip-drop bans are mostly 15-yard personal fouls with an automatic first down; from 2026, repeat violations of five listed rules bring a suspension.
  • Enforce it yourself: accept or decline, which spot (previous spot for passes and anything behind the line; on runs, compare the foul with where the run ended), how far (half the distance near a goal line), what down. The automatic first down, not the yardage, is what makes a five-yard defensive foul worth a point.

Connections

Builds on: Coverage Fundamentals (press and the 1978 five-yard rule); Pass Protection (why linemen hold); Run-Pass Options (the lineman’s one-yard limit); Dropback Concepts (rub routes); Play-Action, Bootlegs, and Screens (screen blocking); The Pass Rush (stunts); Zone Running (cut blocks); and The Pre-Snap Phase (live-ball fouls and offside).

Sets up: Officiating, Replay, and the Rules of the Ball (who throws which flag, replay, catches, fumbles and grounding); Red Zone, Goal Line, Two-Point Plays, and Short Yardage (the tush push, and half-the-distance football at the goal line); Clock and Game Management (untimed downs and penalties in the two-minute drill); and the history chapters The 1978 Liberation and Dynasties and Counterpunches, on how rule changes reshaped offense. Case study: The Eagles: Trenches, RPOs, and the Tush Push. Data: Expected Points and Success Rate (penalty snaps in EPA). Reference: the penalty quick-reference table in Appendix E.

NoteGo deeper
  • The NFL’s Official Playing Rules (Rules 8, 12 and 14 cover this chapter) and its video rulebook, with a short clip for each foul, both at NFL Football Operations: operations.nfl.com.
  • Ben Austro’s Football Zebras site: rule changes, officiating mechanics and enforcement puzzles, explained by people who study officials.
  • Mike Pereira and Dean Blandino, former NFL heads of officiating, on rules segments for FOX and elsewhere, for how officials think about judgment calls.
  • For the history, The Games That Changed the Game by Ron Jaworski (2010), on how rules and schemes chased each other, and the Pro Football Hall of Fame’s year-by-year history pages.

  1. NFL, 2026 Official Playing Rules of the National Football League, Rule 8, Section 4 (“Legal and Illegal Contact With Eligible Receivers”): within five yards of the line of scrimmage a defender may chuck an eligible receiver in front of him; beyond that zone, while the player who received the snap remains in the pocket with the ball, a defender may not initiate contact with a receiver and must release one he has been in contact with as they exit the zone (illegal contact: five yards and an automatic first down); the restriction ends when the passer leaves the pocket or the ball is thrown. Defensive holding: Rule 8, Section 4, Article 6 and Rule 12, Section 1, Article 6 (five yards and an automatic first down; still in force when the passer leaves the pocket). https://operations.nfl.com/the-rules/nfl-rulebook/ . A plain-language summary of each foul with video is in NFL Football Operations’ video rulebook: https://operations.nfl.com/the-rules/nfl-video-rulebook/↩︎

  2. NFL, 2026 Official Playing Rules, Rule 3, Section 25 (“The pocket area is the area between the outside edges of the normal tackle positions on each side of the center extending backward to the offensive team’s end line. A player who is in possession of the ball is out of the pocket area … if any part of his body or the ball is outside of the pocket area”) and Rule 8, Section 4, Article 7 (if the quarterback leaves the pocket area with the ball, the illegal-contact restriction ends but defensive holding remains). Defensive holding of any player other than a runner: Rule 12, Section 1, Article 6(a) (“a defensive player tackles or holds any opponent other than a runner”; five yards and an automatic first down): https://operations.nfl.com/the-rules/nfl-rulebook/↩︎

  3. Pro Football Hall of Fame, NFL history, 1978: “Rules changes permitted a defender to maintain contact with a receiver within five yards of the line of scrimmage, but restricted contact beyond that point,” and offensive linemen were allowed to extend their arms and open their hands in pass blocking: https://www.profootballhof.com/football-history/football-history/1960-1979/1978 . On the name and Blount’s own account, Steelers Depot, “Mel Blount explains play that created Mel Blount rule” (Feb. 2024): https://steelersdepot.com/2024/02/mel-blount-explains-play-that-created-mel-blount-rule . The 1974 step (one chuck allowed once a receiver is three yards downfield) and the 1977 step (no second contact after a jam): Boston Globe, “How wide receivers have evolved in the NFL” (Sept. 4, 2013): https://www.bostonglobe.com/sports/2013/09/04/how-wide-receivers-have-evolved-nfl/akAnTGNJaS7OrVnjAbbN6J/story.html↩︎

  4. Pro Football Reference, “AFC Championship - Indianapolis Colts at New England Patriots - January 18th, 2004” (Patriots 24, Colts 14; Manning 4 interceptions): https://www.pro-football-reference.com/boxscores/200401180nwe.htm ; “2003–04 NFL playoffs,” Wikipedia: https://en.wikipedia.org/wiki/2003%E2%80%9304_NFL_playoffs . Manning and Steve McNair shared the 2003 AP MVP award. Law’s three interceptions: Boston Globe, “Picking off a few of Ty Law’s finest moments” (Aug. 1, 2019): https://www.bostonglobe.com/sports/patriots/2019/08/01/picking-off-few-law-finest-moments/IdEhXtf0YSgE1jbJYTPdmK/story.html↩︎

  5. Tom E. Curran / NBC Sports Boston, “They called it the ‘Ty Law Rule’ … and that was OK with him” (Aug. 3, 2019): https://www.nbcsportsboston.com/nfl/new-england-patriots/they-called-it-the-ty-law-rule-and-that-was-ok-with-him/393549/ (Polian, a member of the competition committee, and his complaints after the January 2004 AFC Championship Game; the 2004 emphasis on downfield contact). The 79-to-191 count: Mike Florio, ProFootballTalk, “New point of emphasis results in plenty of flags for illegal contact, defensive holding” (Aug. 8, 2014): https://www.nbcsports.com/nfl/profootballtalk/rumor-mill/news/new-point-of-emphasis-results-in-plenty-of-flags-for-illegal-contact-defensive-holding . Course calculation from nflverse play-by-play, regular seasons: plays whose main foul is “Illegal Contact,” 49 in 2003 and 123 in 2004; passing yards per team game 213.9 in 2003 and 225.3 in 2004.↩︎

  6. Pro Football Reference, Peyton Manning: 49 touchdown passes in 2004, then the single-season record (Dan Marino had 48 in 1984): https://www.pro-football-reference.com/players/M/MannPe00.htm↩︎

  7. NFL, 2026 Official Playing Rules, Rule 8, Section 5 (pass interference): “any act by a player more than one yard beyond the line of scrimmage [that] significantly hinders an eligible player’s opportunity to catch the ball”; the defense’s restrictions begin when the ball is thrown and the offense’s at the snap, both ending when the ball is touched; the rule lists acts that are and are not pass interference, including contact on a pass that is clearly uncatchable and incidental contact when both players are playing the ball. https://operations.nfl.com/the-rules/nfl-rulebook/ . Offensive pass interference, ten yards from the previous spot: NFL video rulebook, “Offensive Pass Interference”: https://operations.nfl.com/the-rules/nfl-video-rulebook/offensive-pass-interference↩︎

  8. NFL, 2026 Official Playing Rules, Rule 8, Section 5, Article 1 (“any act by a player more than one yard beyond the line of scrimmage [that] significantly hinders an eligible player’s opportunity to catch the ball”; “Acts that do not occur more than one yard beyond the line of scrimmage are not pass interference but could be offensive or defensive holding”), Article 2(g) (“Initiating contact with an opponent by shoving or pushing off, thus creating separation”) and Article 4(a) (“Blocking more than one yard beyond the line of scrimmage by an offensive player clearly prior to a pass being thrown”): https://operations.nfl.com/the-rules/nfl-rulebook/ . The rule makes the offensive foul an act by the receiver (a push-off or a block), which is why a receiver who runs his route and is run into has not fouled; NFL Football Operations’ video rulebook entry on offensive pass interference shows the distinction: https://operations.nfl.com/the-rules/nfl-video-rulebook/↩︎

  9. NFL, 2026 Official Playing Rules, Rule 8, Section 5, penalty provisions: defensive pass interference is a first down at the spot of the foul; if the foul occurs in the end zone, first down on the 1-yard line (or halfway to the goal line if the previous spot was inside the 2). https://operations.nfl.com/the-rules/nfl-rulebook/ . See also “Pass interference,” Wikipedia: https://en.wikipedia.org/wiki/Pass_interference↩︎

  10. NCAA, Football Rules and Interpretations, Rule 7, Section 3 (pass interference): defensive pass interference is 15 yards from the previous spot and an automatic first down, or at the spot of the foul if it is less than 15 yards beyond the previous spot; unchanged for 2026 (“defensive pass interference will remain a spot foul, with a maximum of a 15-yard penalty,” National Football Foundation rules summary, reported in the Altoona Mirror, Aug. 11, 2026: https://www.altoonamirror.com/sports/psu/2026/08/cfb-nff-rules-targeting-penalty-changing/ ). “Pass interference,” Wikipedia: https://en.wikipedia.org/wiki/Pass_interference . High school (NFHS): 15 yards from the previous spot, without an automatic first down since 2013: The Columbian, “Prep football primer: Rule changes for 2013 season”: https://blogs.columbian.com/high-school-sports/2013/09/06/prep-football-primer-rule-changes-2013-season↩︎

  11. Course calculation from nflverse play-by-play, 2021–2025 regular seasons. Throws: pass attempts (sacks excluded) with a recorded pass_length, deep meaning 15 or more air yards. DPI flags: accepted “Defensive Pass Interference” on scrimmage downs, classified short or deep from the play description (“pass incomplete deep left…”). The EPA comparison averages deep throws alone, then deep throws plus the deep DPI snaps that the flags wiped out.↩︎

  12. “2018–19 NFL playoffs,” Wikipedia: https://en.wikipedia.org/wiki/2018%E2%80%9319_NFL_playoffs (Rams 26, Saints 23, OT, Jan. 20, 2019; the no-call on Robey-Coleman’s hit on Lewis with 1:49 left); “Nickell Robey-Coleman,” Wikipedia: https://en.wikipedia.org/wiki/Nickell_Robey-Coleman . Pro Football Reference box score: https://www.pro-football-reference.com/boxscores/201901200nor.htm . Third-and-10 at the Rams’ 13 with 1:49 left, tied 20–20; the Rams “only had one timeout remaining,” so a first down would have let New Orleans “run down the clock to 10 seconds or so” before kicking; Wil Lutz’s field goal came with 1:41 left: New Orleans Saints, “Turning point of the game in New Orleans Saints loss to Rams”: https://neworleanssaints.com/news/turning-point-of-the-game-in-new-orleans-saints-loss-to-rams↩︎

  13. “Pass interference,” Wikipedia, section on the 2019 replay rule: https://en.wikipedia.org/wiki/Pass_interference (owners approved a one-year rule in March 2019 making offensive and defensive pass interference, called or not, reviewable, by challenge or, in the last two minutes of each half and in overtime, by the replay official; it was not renewed for 2020).↩︎

  14. NFL, 2026 Official Playing Rules, Rule 12, Section 1 Articles 2, 3 and 7 (the frame is “the body of an opponent below the neck that is presented to the blocker”; holding is using hands or arms to “materially restrict or alter the defender’s path,” “regardless of whether the blocker’s hands are inside or outside the frame,” ten yards; it is not called away from the point of attack or on an unsplit double team; illegal use of hands, when a player “thrusts his hands forward above the frame of an opponent to forcibly contact him on the head or neck in a direct or prolonged manner,” ten yards against the offense (12-1-3(a)) and five yards plus an automatic first down against the defense (12-1-7)) and Rule 14, Section 2, Article 2 (a foul by the offense behind its own goal line is a safety): https://operations.nfl.com/the-rules/nfl-rulebook/ . Most-called foul: course calculation from nflverse play-by-play, offensive holding ahead of false starts in every season 2015–2025 except 2020 (1.79 vs 1.94 a game) and 2023 (2.06 vs 2.27).↩︎

  15. Course calculation from nflverse play-by-play: plays whose main foul is offensive holding, 2.81 a game in 2019 and 1.79 in 2020 (both teams, accepted or declined, all plays). The instruction: Kevin Seifert, ESPN, “How the NFL is manipulating games in 2020: Fewer holding calls, faster games and way more offense” (Sept. 30, 2020), quoting Walt Anderson, then head of officiating training, on calling “clear and obvious” fouls and not “ticky-tack stuff”; holding flags were down 59% from 2019 through the first 48 games: https://www.espn.com/nfl/story/_/id/30003263↩︎

  16. NFL, 2026 Official Playing Rules, Rule 3, Section 33 (the tight end box: “two yards outside the normal tackle positions and five yards on either side of the line of scrimmage”), Rule 12, Section 2, Articles 1, 2, 4 and 5 (clipping, 15 yards; peel-back block, 15 yards; blocks below the waist prohibited outside the tight end box on scrimmage downs, after a change of possession and on kicks, 15 yards; “All chop blocks are illegal,” 15 yards) and Rule 12, Section 1, Article 3(b) (block in the back above the waist: ten yards, “except in close-line play”); close-line play is defined in Rule 3, Section 6 as contact in “the pocket area on the offensive side of the line of scrimmage and [extending] three yards on the defensive side.” Rule 12-2-4(d) bars low blocks outside the tight end box “during a scrimmage down”; it draws no distinction between runs and passes: https://operations.nfl.com/the-rules/nfl-rulebook/ . Peel-back blocks outlawed everywhere in 2013: ProFootballTalk, “NFL bans low blocks from behind” (March 2013): https://nbcsports.com/nfl/profootballtalk/rumor-mill/news/nfl-bans-low-blocks-from-behind . Chop blocks banned in all situations from 2016: “Chop block,” Wikipedia: https://en.wikipedia.org/wiki/Chop_block↩︎

  17. NFL, 2026 Official Playing Rules, Rule 8, Section 5, Article 1 (pass interference can occur on any forward pass thrown from behind the line, “regardless of … whether it crosses the line”), Article 4(a) (blocking more than a yard downfield “clearly prior to a pass being thrown” is offensive pass interference), and Rule 8, Section 3, Article 1, Item 1(b) (an ineligible player who made contact within a yard of the line may, after breaking contact more than a yard downfield, remain “stationary, [move] laterally, or [move] toward his own goal line until a forward pass is thrown”): https://operations.nfl.com/the-rules/nfl-rulebook/ . On screen blockers waiting for the throw: Jimmy Kempski, PhillyVoice, “Lack of discipline, and not just drops, Eagles receivers killing big plays” (Nov. 29, 2016), quoting Rule 8-5-4 and describing Green Bay receivers who “get in the way of the Eagles’ defensive backs without contacting them, and then once the ball is complete, they engage”: https://phillyvoice.com/lack-discipline-and-not-just-drops-eagles-receivers-killing-big-plays . College rules “clearly cover only forward passes that travel beyond the neutral zone”: “Pass interference,” Wikipedia: https://en.wikipedia.org/wiki/Pass_interference ; the three-yard college limit is in the note to the college rule (see the footnote on 2026 college changes below).↩︎

  18. NFL, 2026 Official Playing Rules, preface (“‘Flagrant’ … is meant to indicate that the degree of a violation of the rules—usually a personal foul or unnecessary roughness—is extremely objectionable, conspicuous, unnecessary, avoidable, or gratuitous”), Rule 12, Section 2 (personal fouls, each with “disqualification if flagrant”), and the 2026 change to Rule 19, Section 2 permitting league personnel to consult with on-field officials on disqualifications for flagrant football and non-football acts: https://operations.nfl.com/the-rules/nfl-rulebook/↩︎

  19. NFL, 2026 Official Playing Rules, Rule 12, Section 2, Article 11 (roughing the passer: contact allowed only through the rusher’s first step after the release; forcible contact to the head or neck; forcible contact at or below the knee unless blocked into the passer; landing with all or most of the body weight; 15 yards and an automatic first down) Article 11(f) (a passer who goes outside the pocket area and keeps moving or throws on the run loses the one-step and low-hit protections but keeps the others, and regains all of them if he stops to establish a passing posture), and Rule 8, Section 6, Article 1(d) (a defensive personal foul before a completion is enforced from the previous spot or the dead-ball spot, whichever is more beneficial to the offense): https://operations.nfl.com/the-rules/nfl-rulebook/ . History: “Roughing the passer,” Wikipedia: https://en.wikipedia.org/wiki/Roughing_the_passer (the 2009 low-hit rule after Brady’s September 2008 knee injury; the 2018 body-weight emphasis after Rodgers’s 2017 broken collarbone).↩︎

  20. The Week 5 2022 calls on Grady Jarrett (Falcons at Buccaneers, Sunday Oct. 9, 2022) and Chris Jones (Raiders at Chiefs, Monday Oct. 10, 2022): Fox News, “Chiefs’ Chris Jones called for ‘very questionable’ roughing the passer penalty”: https://www.foxnews.com/sports/chiefs-chris-jones-called-very-questionable-roughing-passer-penalty-nfl-fans-express-displeasure ; AP, “Brady fined $11K for attempted kick of Jarrett” (Oct. 15, 2022): https://news4jax.com/sports/2022/10/15/ap-source-brady-fined-11k-for-attempted-kick-of-jarrett↩︎

  21. NFL, 2026 Official Playing Rules, Rule 7, Section 2, Article 1(d)(2) and Notes: “When a runner slides or dives feet or head first or simulates sliding or diving, the ball is dead the instant he touches the ground with anything other than his hands or his feet, or begins to simulate touching the ground”; defenders “are required to treat a sliding or diving runner as they would a runner who is down by contact” and must pull up when the slide begins, but “if a defender has already committed himself, and the contact is unavoidable, it is not a foul unless the defender makes forcible contact into the head or neck area of the runner with the helmet, shoulder, or forearm, or commits some other act that is unnecessary roughness”; a runner must start his slide “before contact by a defensive player is imminent” (Notes 2 and 3); late hits on him are unnecessary roughness (Rule 12, Section 2, Article 8(d)): https://operations.nfl.com/the-rules/nfl-rulebook/ . On officiating the fake slide, Walt Anderson quoted in Kevin Seifert, ESPN, “NFL continues to grapple with rules on late quarterback hits” (Dec. 31, 2024): https://abc7news.com/post/nfl-continues-grapple-rules-late-quarterback-hits/15732633/↩︎

  22. NFL, 2026 Official Playing Rules, Rule 12, Section 2, Article 7 (blindside block: a block by a player whose “path is toward or parallel to his own end line” with forcible contact by the helmet, forearm or shoulder; 15 yards), Article 9 (the eleven categories of players in a defenseless posture; prohibited contact against them, including launching; 15 yards and an automatic first down) and Article 8 (unnecessary roughness; 15 yards, plus an automatic first down if by the defense): https://operations.nfl.com/the-rules/nfl-rulebook/↩︎

  23. NFL, 2026 Official Playing Rules, Rule 12, Section 2 (use of the helmet: it is a foul if a player lowers his head to initiate and make contact with his helmet against an opponent; 15 yards, and a player may be disqualified): https://operations.nfl.com/the-rules/nfl-rulebook/ . Adopted at the annual meeting in Orlando on March 27, 2018: Sports Illustrated, “NFL Owners Approve Targeting Rule: Lowering Head to Initiate Contact With Helmet is a Penalty”: https://www.si.com/nfl/2018/03/27/annual-league-meeting-targeting-rule-head .↩︎

  24. “Horse-collar tackle,” Wikipedia: https://en.wikipedia.org/wiki/Horse-collar_tackle (banned by the NFL in May 2005 after injuries caused by Roy Williams’s tackles in 2004, including Terrell Owens’s). The owners’ 27–5 vote in May 2005, and Williams’s 2004 horse-collar tackles on Owens (fractured fibula, torn ankle ligaments), Tennessee’s Tyrone Calico and Baltimore’s Musa Smith: New York Sun, “A Tweak to the NFL Rule Book Yields Scant Results”: https://www.nysun.com/article/sports-tweak-to-the-nfl-rule-book-yields-scant-results ; Las Vegas Sun (May 27, 2005): https://m.lasvegassun.com/news/2005/may/27/cowboys-williams-says-he-will-not-use-banned-techn/ . Current rule: 2026 Official Playing Rules, Rule 12, Section 2, Article 16 (15 yards and an automatic first down).↩︎

  25. NFL.com, “NFL owners vote to ban hip-drop tackle at annual league meeting” (March 2024): a 15-yard penalty and an automatic first down: https://www.nfl.com/news/nfl-owners-vote-to-ban-hip-drop-tackle-at-annual-league-meeting . The unanimous vote, the league’s finding of an injury rate 20 to 25 times that of other tackles, and the NFLPA’s objection: CBS Sports, “NFL players seem irate after owners unanimously approve new rule that bans hip-drop tackles” (March 2024): https://www.cbssports.com/nfl/news/nfl-players-seem-irate-after-owners-unanimously-approve-new-rule-that-bans-hip-drop-tackles . Current rule: 2026 Official Playing Rules, Rule 12, Section 2, Article 18.↩︎

  26. Associated Press, “Players will be suspended 1 game if they accumulate 3 penalties in certain categories” (Aug. 26, 2026; the five categories, the one-game suspension, carry-over “into subsequent seasons,” a clean slate for all players, half the fine refunded for a single violation): https://www.adn.com/sports/national-sports/2026/08/26/nfl-players-will-be-suspended-1-game-if-they-accumulate-3-penalties-in-certain-categories/ ; NBC Sports (ProFootballTalk), “NFL’s new three-strike system doesn’t apply until the 2026 regular season” (August 2026; “a one-game suspension happens only if a player violates the same rule three times”): https://www.nbcsports.com/nfl/profootballtalk/rumor-mill/news/nfls-new-three-strike-system-doesnt-apply-until-the-2026-regular-season↩︎

  27. NFL, 2026 Official Playing Rules, Rule 14, Section 1 (“the penalty for any foul may be declined by the offended team and play proceeds as though no foul had been committed”; fouls by both teams offset) and Rule 3 (live-ball and dead-ball fouls): https://operations.nfl.com/the-rules/nfl-rulebook/↩︎

  28. NFL, 2026 Official Playing Rules, Rule 14, Section 2, Article 3 (a personal or unsportsmanlike foul during a touchdown is enforced on the try; on a successful try kick, a foul by the defense may be enforced on the succeeding free kick), Rule 14, Section 1, Article 3 (multiple fouls by one team: “only one penalty may be enforced,” at the offended team’s choice) and Rule 3, Section 13 (a dead-ball foul “occurs in the continuing action after a down ends”): https://operations.nfl.com/the-rules/nfl-rulebook/↩︎

  29. NFL, 2026 Official Playing Rules, Rule 7, Section 4, Article 4 (neutral zone infraction, whistle immediately: a defender in the neutral zone “with an unimpeded path to the quarterback,” or one whose entry causes an offensive player in close proximity “to react (move) immediately”; no foul if there is no reaction and he gets back before the snap) and Article 3 (encroachment: contact before the snap): https://operations.nfl.com/the-rules/nfl-rulebook/↩︎

  30. NFL, 2026 Official Playing Rules, Rule 14, Section 3, Articles 5 and 6 (the basic spot for a running play is where it ended; “If the offense fouls behind the basic spot, enforcement is from the spot of the foul”; an offensive foul in advance of the basic spot is enforced from the basic spot; “Fouls committed by the offense behind the line of scrimmage are enforced from the previous spot”; and an offensive foul behind its own goal line is a safety): https://operations.nfl.com/the-rules/nfl-rulebook/↩︎

  31. NFL, 2026 Official Playing Rules, Rule 14 (a penalty may not move the ball more than half the distance from the enforcement spot to the offending team’s goal line): https://operations.nfl.com/the-rules/nfl-rulebook/↩︎

  32. NFL, 2026 Official Playing Rules, Rule 11, Section 2, Article 1(e) (“The Referee awards a touchdown to a team that has been denied one by a palpably unfair act”) and Rule 12, Section 3, Article 4 (palpably unfair acts); the end-zone DPI enforcement is Rule 8, Section 5 (first down on the 1): https://operations.nfl.com/the-rules/nfl-rulebook/↩︎

  33. Course calculation from nflverse play-by-play, regular seasons: plays whose main foul is labelled “Lowering the Head to Initiate Contact,” 0.07, 0.11 and 0.13 flags a game in 2018–2020, 0.04 in 2021, and none labelled so from 2022.↩︎

  34. Green Bay’s 2025 proposal and the 22–10 vote on May 21, 2025: SI, “Packers’ proposal to ban Eagles’ tush push fails again”: https://www.si.com/nfl/packers/packers-proposal-to-ban-eagles-tush-push-fails-again ; no proposal for 2026: NFL.com, “Competition committee co-chairman Rich McKay doesn’t expect tush push ban proposal in 2026”: https://www.nfl.com/news/competition-committee-co-chairman-rich-mckay-doesn-t-expect-tush-push-ban-proposal-in-2026 , and The Washington Times (Feb. 24, 2026): https://www.washingtontimes.com/news/2026/feb/24/nfl-receives-no-tush-push-ban-proposal-year-effort-last-year-ban/ . The 2005 removal of the ban on pushing the runner (pulling him is still a foul): Boston Globe, “How the tush push became legal” coverage (April 2, 2025), quoting former officiating chief Mike Pereira that pushing was “really too difficult to officiate. Therefore, we just said, ‘OK, it’s legal to push’”: https://www.bostonglobe.com/2025/04/02/sports/nfl-tush-push-rule/ ; current rule, 2026 Official Playing Rules, Rule 12, Section 1, Article 4 (“No offensive player may … pull a runner in any direction at any time”; assisting the runner, ten yards).↩︎

  35. CBS Sports, “Five new NFL rules to know heading into Week 1 of preseason” (2025): https://www.cbssports.com/nfl/news/five-new-nfl-rules-to-know-heading-into-week-1-of-preseason-here-are-the-biggest-changes-for-2025 ; Seahawks.com, “NFL announces approved rule changes for 2026 season”: https://www.seahawks.com/news/nfl-announces-approved-rule-changes-for-2026-season↩︎

  36. National Football Foundation summary of 2026 college rule changes (“The penalty for offensive pass interference is being adjusted from 15 yards to 10 yards”; the first targeting disqualification of a season no longer carries into the next game), reported in the Altoona Mirror, “College football changing target rule penalty” (Aug. 11, 2026): https://www.altoonamirror.com/sports/psu/2026/08/cfb-nff-rules-targeting-penalty-changing/ . College linemen may be up to three yards downfield on a pass that crosses the neutral zone: NCAA Rule 7-3-10, summarised by the San Diego County Football Officials Association: https://www.sdcfoa.org/ncaa/rule-7-snapping-and-passing-the-ball/college-7-3-10↩︎

  37. NFL, 2026 Official Playing Rules, Rule 4, Section 8, Article 2 (a period is extended by an untimed down for an accepted live-ball foul by the defense; “If there is a foul by the offense, there shall be no extension of the period. If the foul occurs on the last play of the half, a score by the offense is not counted”): https://operations.nfl.com/the-rules/nfl-rulebook/↩︎