Officiating, Replay, and the Rules of the Ball

Seven officials, three ways into the replay booth, and the handful of rules that decide who has the ball, so you can call it before the referee turns on his microphone.

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

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

from gridiron import Play, Player, Field, offense, defense, routes as r, style, draw_marker, draw_frame
from gridiron.field import FIELD_WIDTH, HASH_NEAR, HASH_FAR, MIDDLE

logging.getLogger("matplotlib.font_manager").setLevel(logging.ERROR)
style.apply()
PDF = os.environ.get("RTG_FORMAT", "").lower() in ("pdf", "typst", "print")
GREEN = "#0f7a55"            # darker step of the aqua highlight: "legal" on the light field
RED = style.SERIES[7]        # "foul"
PURPLE = style.SERIES[6]     # the tackle box
ZEBRA = style.INK            # officials: white disc, black ring
BOX_W = 2 * 1.6 + 0.8        # outside edge of a tackle's normal position, yards from the ball


def O(key, pos, d, w, label=""):
    """An offensive (blue) player at (d, w): d = yards downfield of the line, w = yards to the offense's right."""
    return Player(key, pos, "off", d, w, label=label)


def D(key, pos, d, w, label=""):
    """A defensive (orange) player."""
    return Player(key, pos, "def", d, w, label=label)


def XY(fld, p, d, w):
    """(d, w) in the offense's frame -> plot coordinates on a drawn field."""
    x, y = fld.xy(*p.to_abs(d, w))
    return float(x), float(y)


def say(fld, p, d, w, text, color=style.INK_2, fs=6.8, ha="center", weight="normal", box=True, rot=0):
    """A short on-field label at (d, w), on a light pad so lines underneath don't cut it."""
    x, y = XY(fld, p, d, w)
    kw = dict(boxstyle="round,pad=0.18", fc=style.SURFACE, ec="none", alpha=0.92) if box else None
    fld.ax.text(x, y, text, fontsize=fs, color=color, ha=ha, va="center", zorder=12, fontweight=weight,
                linespacing=1.12, bbox=kw, rotation=rot)


def path_arrow(fld, p, pts, color=style.BALL, lw=1.4, ls=(0, (2.5, 2)), head=9, z=7, rad=0.0):
    """A dashed arrow through (d, w) points: a ball's flight or a loose ball's bounce."""
    xy = [XY(fld, p, *q) for q in pts]
    if len(xy) > 2:
        xs, ys = zip(*xy[:-1])
        fld.ax.plot(xs, ys, color=color, lw=lw, ls=ls, zorder=z)
    fld.ax.add_patch(FancyArrowPatch(xy[-2], xy[-1], arrowstyle="-|>", mutation_scale=head, color=color,
                                     lw=lw, ls=ls, zorder=z, connectionstyle=f"arc3,rad={rad}"))


def xmark(fld, p, d, w, color=style.DEFENSE_DARK, ms=8):
    x, y = XY(fld, p, d, w)
    fld.ax.plot(x, y, marker="x", ms=ms, mew=2.2, color=color, zorder=11)


def ball_at(fld, p, d, w):
    x, y = XY(fld, p, d, w)
    draw_marker(fld.ax, x, y, "ball", "", fld.pts_per_yard())


def no_numbers(ax):
    """Drop the painted yard numbers: on zoomed diagrams they compete with the labels."""
    for t in list(ax.texts):
        if t.get_text().isdigit():
            t.remove()


def official(ax, x, y, label, ppy, r=1.1, alpha=1.0):
    """An official: white disc with a black ring (offense = blue disc, defense = orange square)."""
    ax.add_patch(Circle((x, y), r, fc="white", ec=ZEBRA, lw=1.6, zorder=9, alpha=alpha))
    fs = max(4.6, min(8.5, r * ppy * (1.15 if len(label) == 1 else 0.92)))
    ax.text(x, y, label, ha="center", va="center", fontsize=fs, color=ZEBRA, fontweight="bold", zorder=10,
            alpha=alpha)


def marker_legend(ax, y=-0.01, extra=()):
    h = [Line2D([], [], marker="o", ls="", markerfacecolor=style.OFFENSE, markeredgecolor="white", ms=8,
                label="Offense"),
         Line2D([], [], marker="D", ls="", markerfacecolor=style.DEFENSE_TINT, markeredgecolor=style.DEFENSE,
                ms=7, label="Defense"),
         Line2D([], [], marker="o", ls="", markerfacecolor="white", markeredgecolor=ZEBRA, mew=1.6, ms=9,
                label="Official")] + list(extra)
    ax.legend(handles=h, loc="upper center", bbox_to_anchor=(0.5, y), ncol=len(h), fontsize=7.2,
              frameon=False, handletextpad=0.4, columnspacing=1.2)


def tackle_box(ax, fld, p, back, alpha=0.10):
    """The shaded tackle box (the rulebook's pocket area), from the line back to depth `back`."""
    xy = [XY(fld, p, *q) for q in [(-0.7, -BOX_W), (-0.7, BOX_W), (back, BOX_W), (back, -BOX_W)]]
    ax.add_patch(Polygon(xy, closed=True, fc=PURPLE, alpha=alpha, ec=PURPLE, lw=0.9, ls=(0, (3, 2)),
                         zorder=1.4))


# --- flowchart pieces ---------------------------------------------------------------------------
def fbox(ax, x, y, w, h, title, body="", fc=style.SURFACE, ec=style.BASELINE, tfs=7.8, bfs=6.7, lw=1.0):
    ax.add_patch(FancyBboxPatch((x - w / 2, y - h / 2), w, h, boxstyle="round,pad=0.02,rounding_size=1.1",
                                fc=fc, ec=ec, lw=lw, zorder=3))
    if body:
        ax.text(x, y + h / 2 - 1.6, title, ha="center", va="top", fontsize=tfs, fontweight="bold",
                color=style.INK, zorder=4, linespacing=1.1)
        nl = title.count("\n") + 1
        ax.text(x, y + h / 2 - 1.9 - 2.9 * nl, body, ha="center", va="top", fontsize=bfs, color=style.INK_2,
                zorder=4, linespacing=1.18)
    else:
        ax.text(x, y, title, ha="center", va="center", fontsize=tfs, fontweight="bold", color=style.INK,
                zorder=4, linespacing=1.15)


def farrow(ax, p0, p1, text=None, color=style.INK_2, toff=(0.0, 0.0), ha="center", fs=6.8):
    ax.add_patch(FancyArrowPatch(p0, p1, arrowstyle="-|>", mutation_scale=10, color=color, lw=1.0,
                                 shrinkA=1, shrinkB=1, zorder=2))
    if text:
        ax.text((p0[0] + p1[0]) / 2 + toff[0], (p0[1] + p1[1]) / 2 + toff[1], text, ha=ha, va="center",
                fontsize=fs, color=color, fontweight="bold", zorder=5,
                bbox=dict(boxstyle="round,pad=0.12", fc=style.SURFACE, ec="none"))


def canvas(w_in, h_in, xmax=100, ymax=None):
    fig, ax = plt.subplots(figsize=(w_in, h_in))
    ymax = ymax or xmax * h_in / w_in
    ax.set_xlim(0, xmax); ax.set_ylim(0, ymax); ax.set_axis_off(); ax.grid(False)
    return fig, ax


# --- scenes: simulated tracking plus extra actors (officials), as a video or a frame strip ------
def kf_interp(kf, t):
    kf = np.asarray(kf, dtype=float)
    return np.array([np.interp(t, kf[:, 0], kf[:, 1]), np.interp(t, kf[:, 0], kf[:, 2])])


def draw_scene(ax, play, trk, t, window, lateral, extra=None, decor=None, trails=True, clock=True):
    """One moment of a play on `ax`: players (and ball) from tracking `trk`, extra actors from keyframes."""
    ylo, yhi = sorted((play.ball_y - lateral[1], play.ball_y - lateral[0]))
    fld = Field(ax=ax, orient="vertical", los=play.los, window=window, to_go=play.to_go, lateral=(ylo, yhi))
    no_numbers(ax)
    ppy = fld.pts_per_yard()
    if decor:
        decor(fld, t)
    times = trk.groupby("frameId")["time"].first()
    fid = int((times - t).abs().idxmin())
    cur = trk[trk.frameId == fid]
    hist = trk[trk.frameId <= fid] if trails else None
    draw_frame(fld, cur, hist, ppy)
    for key, (lab, kf) in (extra or {}).items():
        ts = np.linspace(min(np.asarray(kf)[:, 0].min(), 0), t, 30)
        pts = np.array([kf_interp(kf, s) for s in ts])
        xs, ys = zip(*[XY(fld, play, d, w) for d, w in pts])
        if trails:
            ax.plot(xs, ys, color=ZEBRA, lw=0.9, alpha=0.35, zorder=3)
        official(ax, xs[-1], ys[-1], lab, ppy, r=1.15)
    for art in list(ax.patches) + list(ax.texts) + list(ax.lines):
        art.set_clip_on(True)                   # players who ran out of the window don't spill outside it
    if clock:
        ax.set_title("snap" if abs(t) < 1e-6 else f"{t:+.1f} s", fontsize=8.6, color=style.INK_2)
    return fld


def show_scene(play, trk, times, window, lateral, extra=None, decor=None, notes=None, ncols=2, width_in=6.5):
    """HTML: a video of the scene. PDF: a frame strip at `times`, each panel with its note."""
    trk = trk.copy()
    trk["_id"] = trk["displayName"].astype(str)
    if PDF:
        n = len(times)
        nrows = int(np.ceil(n / ncols))
        span_w, span_d = lateral[1] - lateral[0], window[1] - window[0]
        pw = width_in / ncols
        fig, axes = plt.subplots(nrows, ncols, figsize=(width_in, nrows * (pw * span_d / span_w + 0.35)),
                                 squeeze=False)
        for ax in axes.flat[n:]:
            ax.axis("off")
        for i, (ax, t) in enumerate(zip(axes.flat, times)):
            fld = draw_scene(ax, play, trk, t, window, lateral, extra, decor)
            if notes:
                notes(fld, i, t)
        fig.tight_layout(h_pad=1.0, w_pad=0.6)
        plt.show()
        return
    tmax = float(trk["time"].max())
    t0 = float(trk["time"].min())
    ts = np.round(np.arange(max(t0, -0.5), tmax + 1e-9, 0.1), 2)
    span_w, span_d = lateral[1] - lateral[0], window[1] - window[0]
    fig, ax = plt.subplots(figsize=(5.6, 5.6 * span_d / span_w))
    hold = {}

    def update(t):
        ax.clear()
        fld = draw_scene(ax, play, trk, float(t), window, lateral, extra, decor)
        if notes:
            # show the note of the last panel time already passed
            k = max([i for i, tt in enumerate(times) if tt <= t + 1e-6] or [0])
            notes(fld, k, float(t))
        return []

    anim = animation.FuncAnimation(fig, update, frames=ts, interval=100, blit=False)
    if shutil.which("ffmpeg"):
        html = anim.to_html5_video(embed_limit=40).replace("<video ", '<video style="max-width:100%;height:auto" ')
    else:
        html = anim.to_jshtml(default_mode="once")
    plt.close(fig)
    display(HTML(html))


def md_table(rows, header, align):
    lines = ["| " + " | ".join(header) + " |", "|" + "|".join(align) + "|"]
    lines += ["| " + " | ".join(map(str, row)) + " |" for row in rows]
    return Markdown("\n".join(lines))
Show the Python (load officials, penalties and replay reviews from nflverse)
import re
from gridiron.data import nfl, pbp

SEASONS = list(range(2016, 2026))     # 2016-2025, the last ten completed seasons
cols = ["game_id", "old_game_id", "season", "season_type", "penalty", "desc", "replay_or_challenge"]
raw = pbp(SEASONS, columns=cols)
raw["desc"] = raw["desc"].fillna("")
S = {}                                # numbers quoted in the text

# --- accepted penalties per game, by the referee who led the crew -------------------------------
# nflverse play text writes an accepted foul as "PENALTY on ..." and a declined or offsetting one as
# "Penalty on ...", so counting the capitalised form counts accepted fouls (both teams, every play).
raw["accepted"] = raw["desc"].str.count("PENALTY on")
games = raw.groupby(["old_game_id", "season", "season_type"], as_index=False)["accepted"].sum()
offs = nfl().load_officials().to_pandas()
refs = (offs[offs.position == "Referee"][["game_id", "season", "official_name"]]
        .rename(columns={"game_id": "old_game_id", "official_name": "referee"}))
games = games.merge(refs, on=["old_game_id", "season"], how="left")
reg = games[games.season_type == "REG"]
by_season = reg.groupby("season")["accepted"].mean()
crew = (reg[reg.season.isin([2024, 2025])].groupby(["referee", "season"])["accepted"]
        .agg(["mean", "size"]).reset_index())
wide = crew.pivot(index="referee", columns="season", values="mean").dropna().sort_values(2025)
n25 = crew[crew.season == 2025].set_index("referee")["size"].reindex(wide.index)
avg25 = reg[reg.season == 2025]["accepted"].mean()
sd_game = reg[reg.season == 2025]["accepted"].std()
se_crew = sd_game / np.sqrt(n25.mean())
S["pen25"] = f"{avg25:.1f}"
S["pen24"] = f"{by_season[2024]:.1f}"
S["pen_lo"], S["pen_hi"] = f"{by_season.min():.1f}", f"{by_season.max():.1f}"
S["crew_lo"], S["crew_hi"] = f"{wide[2025].min():.1f}", f"{wide[2025].max():.1f}"
S["crew_lo_name"], S["crew_hi_name"] = wide[2025].idxmin(), wide[2025].idxmax()
S["sd_game"] = f"{sd_game:.1f}"
S["se2"] = f"{2 * se_crew:.1f}"
S["ncrew"] = f"{len(wide)}"
S["r2425"] = f"{wide[2024].corr(wide[2025]):.2f}"
yy = []
cc = reg.groupby(["referee", "season"])["accepted"].mean().unstack()
for y in range(2016, 2025):
    d = cc[[y, y + 1]].dropna()
    yy.append(d[y].corr(d[y + 1]))
S["r_lo"], S["r_hi"] = f"{min(yy):.2f}", f"{max(yy):.2f}"
S["r_med"] = f"{np.median(yy):.2f}"
# share of crews whose 2024 rank half (top or bottom eight) held in 2025
top24 = wide[2024] > wide[2024].median()
top25 = wide[2025] > wide[2025].median()
S["same_half"] = f"{(top24 == top25).sum()}"
# the same question for teams: does a team's own accepted-foul rate hold from one season to the next?
regp = raw[raw.season_type == "REG"]
tf = regp.assign(tm=regp["desc"].str.findall(r"PENALTY on ([A-Z]{2,3})-")).explode("tm").dropna(subset=["tm"])
tcount = tf.groupby(["season", "tm"]).size().unstack(0)
team_rate = tcount.apply(lambda c: c / (16 if c.name <= 2020 else 17))     # games per team
tyy = [team_rate[[y, y + 1]].dropna().corr().iloc[0, 1] for y in range(2016, 2025)]
S["team_r_med"] = f"{np.median(tyy):.2f}"

# --- replay reviews written into the play-by-play -----------------------------------------------
rv = raw[raw.replay_or_challenge == 1].copy()
ex = rv["desc"].str.extract(r"(challenged|Replay Official reviewed|Replay Assistant challenged|reviewed) "
                            r"the (.*?) ruling, and the play was (\w+)")
rv["who"] = np.where(ex[0].eq("challenged"), "challenge", np.where(ex[0].notna(), "booth", None))
rv["what"], rv["result"] = ex[1], ex[2].str.lower()
rv = rv[rv.who.notna()]
rv["reversed"] = rv["result"].eq("reversed")
ch = rv[(rv.who == "challenge") & (rv.season_type == "REG")]
ngames = raw[raw.season_type == "REG"].groupby("season")["game_id"].nunique()
S["ch_rate"] = f"{100 * ch.reversed.mean():.0f}%"
S["ch_rate24"] = f"{100 * ch[ch.season == 2024].reversed.mean():.0f}%"
S["ch_rate25"] = f"{100 * ch[ch.season == 2025].reversed.mean():.0f}%"
S["ch_pg25"] = f"{len(ch[ch.season == 2025]) / ngames[2025] / 2:.2f}"
S["ch_n25"] = f"{len(ch[ch.season == 2025])}"
S["g25"] = f"{ngames[2025]}"
recent = rv[rv.season.between(2021, 2025)]
S["rv_n"] = f"{len(recent):,}"
LABELS = {"pass completion": "Ruled a catch", "incomplete pass": "Ruled incomplete",
          "runner broke the plane": "Ruled a touchdown (broke the plane)",
          "short of the line to gain": "Spot: short of the line to gain", "first down": "Spot: ruled a first down",
          "fumble": "Ruled a fumble", "runner was not down by contact": "Ruled not down by contact",
          "interception": "Ruled an interception", "runner was down by contact": "Ruled down by contact",
          "short of the goal line": "Ruled short of the goal line",
          "runner was inbounds": "Ruled in bounds", "runner was out of bounds": "Ruled out of bounds"}
tab = (recent[recent.what.isin(LABELS)].groupby(["what", "who"]).size().unstack(fill_value=0))
tab["n"] = tab.sum(axis=1)
tab["rev"] = recent[recent.what.isin(LABELS)].groupby("what")["reversed"].mean()
tab = tab.sort_values("n")
S["catch_share"] = f"{100 * (tab.loc[['pass completion', 'incomplete pass'], 'n'].sum()) / len(recent):.0f}%"
S["plane_rev"] = f"{100 * tab.loc['runner broke the plane', 'rev']:.0f}%"
S["incomp_rev"] = f"{100 * tab.loc['incomplete pass', 'rev']:.0f}%"
S["catch_rev"] = f"{100 * tab.loc['pass completion', 'rev']:.0f}%"

Fourth quarter, 1:41 left in a one-score game. A receiver dives along the sideline, the ball pinned to his chest, and tumbles out of bounds. The nearest official, a man in a black cap twenty yards downfield, waves both arms across his body: incomplete. The home crowd roars at the stadium screen, which is replaying the catch from a low angle. The losing coach grabs the red flag from his sock, then stops; he isn’t allowed to throw it. Thirty seconds later, with nobody on either sideline having asked, the official in the white cap walks to the middle of the field, clicks on his microphone and says: “After review, the ruling on the field is reversed. The receiver had control of the ball with both feet down in bounds. The pass is complete.” Who decided that? Why couldn’t the coach challenge? And what exactly did “control with both feet down” have to do with it? This chapter is about the people who run the game and the small set of rules that decide, on almost every close play, who has the ball.

You’ll be able to…

Seven officials, seven jobs

An NFL game is run by seven officials on the field, each wearing a number and, on his back, letters that name his job (R, U, DJ, LJ, SJ, FJ, BJ). A seven-person crew sounds like a lot until you count what happens on one snap: 22 players, most of them in contact, spread across 53 yards of width and up to 50 of depth, in about five seconds. So the crew splits the field and the players into pieces. Each official has a starting spot, a few players he is responsible for (his keys), an area to cover once the ball moves, and a short list of fouls that are his to call.

Show the Python
off = offense("singleback")
dfn = defense("4-3_over", "two_high", off)
p = Play(off, dfn, los=40, to_go=10)
fld = p.draw(lateral=(-31.5, 31.5), window=(-16.5, 29.5), title=False)
ax = fld.ax
no_numbers(ax)
ppy = fld.pts_per_yard()
CREW = {  # key: (name, (d, w) of the official, (d, w) of his label)
    "R": ("Referee", (-12.0, 5.5), (-14.4, 5.5)),
    "U": ("Umpire", (-11.0, -5.5), (-13.4, -5.5)),
    "DJ": ("Down judge", (0.0, -28.4), (-2.6, -24.0)),
    "LJ": ("Line judge", (0.0, 28.4), (-2.6, 24.0)),
    "SJ": ("Side judge", (20.0, -23.5), (17.6, -23.5)),
    "FJ": ("Field judge", (20.0, 23.5), (17.6, 23.5)),
    "BJ": ("Back judge", (25.0, 4.0), (27.4, 4.0)),
}
for key, (name, (d, w), (ld, lw)) in CREW.items():
    official(ax, *XY(fld, p, d, w), key, ppy, r=1.25)
    say(fld, p, ld, lw, name, color=style.INK, fs=7.0, weight="bold")
say(fld, p, 10.0, -27.6, "sideline", fs=6.2, box=False, rot=90)
say(fld, p, 10.0, 27.6, "sideline", fs=6.2, box=False, rot=90)
say(fld, p, 1.4, 12.0, "line of scrimmage", color=style.OFFENSE_DARK, fs=6.2)
say(fld, p, 11.4, -2.0, "line to gain", color=style.INK, fs=6.2)
marker_legend(ax)
plt.show()
Figure 49.1: Where the seven officials stand before a snap (white discs; an 11-personnel offense in blue against a 4-3 defense in orange). Two officials work behind the offense: the referee (R), on the side of a right-handed quarterback’s throwing arm, and the umpire (U) opposite him. Two straddle the line of scrimmage at the sidelines, just off the field: the down judge (DJ), on the side with the chain crew, and the line judge (LJ). Three work deep: the side judge (SJ) and field judge (FJ) about 20 yards downfield near each sideline, and the back judge (BJ) about 25 yards deep in the middle. Exact depths vary with the down, the distance and the formation.

Here is what each of them is watching. The table is the short version of the league’s own description of the positions;1 the habits behind it are what let you guess who threw a flag before the referee says.

Table 49.1: The seven officials: where they start, what they watch, and the calls you’ll most often see them make.
Official Starts Watches Typical calls
Referee (R, white cap) Offensive backfield, 10–12 yards deep, on the quarterback’s throwing-arm side The quarterback and the backs; the snap Roughing the passer, intentional grounding, fumble or pass by the quarterback; announces every foul and review
Umpire (U) Offensive backfield, opposite the referee; on the defensive side for field goals and extra points The center, guards and the men across from them Holding (both sides) and false starts inside, illegal hands to the face; spots the ball; checks equipment
Down judge (DJ) On the line of scrimmage at one sideline, with the chain crew The line (who’s on it, who moved), the end and receivers on his side, his sideline Offside, encroachment, false start, illegal formation or motion; forward progress and out of bounds on his side
Line judge (LJ) On the line of scrimmage at the other sideline The same as the down judge, on his side The same, plus whether a pass was thrown from beyond the line
Side judge (SJ) About 20 yards deep near the down judge’s sideline Receivers on his side once they’re downfield Pass interference, illegal contact, catch or no catch, out of bounds
Field judge (FJ) About 20 yards deep near the line judge’s sideline Receivers on his side once they’re downfield The same; under one upright on kicks
Back judge (BJ) About 25 yards deep in the middle The tight end and inside receivers, the deep middle, the end line Deep pass interference, catches in the end zone; under the other upright on kicks

A few things in that table explain a lot of what you see on Sundays.

The wing officials own the line of scrimmage. The down judge and line judge stand exactly on the line at the sidelines so they can look straight down it, the only place from which you can see who is offside and which receivers are on the line (the formation rules need seven). Most pre-snap fouls come from these two. After the snap they drift downfield and mark where a runner’s forward progress stopped: the official you see jog in and point his foot at the spot.

The umpire lives in the trenches, and he moved. For most of football history the umpire, the official responsible for the interior line, stood four or five yards behind the defensive line, in the middle of the linebackers, which is where the holding happens. It was also where umpires kept getting run over. In 2010 the NFL moved him to the offensive backfield, opposite the referee, where he watches the same linemen from behind.2 The trade was visibility for safety: from behind you see a lineman’s hands on a jersey less clearly. (Its side effect was a slower snap, because the umpire also spots the ball after most plays and now had farther to walk; the footnote has the brief exceptions the league tried for hurry-up situations.)

The deep officials are pass officials. The side judge, field judge and back judge are the reason a deep throw can be judged at all. Each takes a share of the receivers, keeps them between himself and the sideline or the end line, and rules on pass interference and illegal contact, catches and out of bounds. The seventh official, the side judge, was added in 1978, the same year the league loosened the rules on pass defense to open up the passing game: more passing meant more eyes downfield.3

Finding them on a wide shot. The letters are too small to read on most camera angles, so use geography. Behind the offense there are two officials: the one in the white cap is the referee, the other is the umpire. On the line at the two sidelines, the one by the chain crew and its sticks is the down judge, the other the line judge. Of the three deep officials, the one in the middle is the back judge; the deep wing on the chain crew’s side is the side judge, and the one on the far side is the field judge.

The referee is the boss, and the voice. The referee wears the white cap and leads the crew. His spot, behind and to the throwing-arm side of the quarterback, lets him watch the one player the rules protect most: he throws most roughing-the-passer flags and decides whether a quarterback who lost the ball was throwing it or fumbling it. Any official can throw a flag; the crew gathers, the one who saw the foul tells the referee, and the referee announces it. A flag “picked up” after that conference usually means another official had a better look.

NoteMadden vs. real life

In a video game a foul is a fact: the code knows a lineman held, and a flag appears. On a real field, a foul exists only if an official in the right spot sees it. A hold on the far side of a run play can be in no official’s view, and a hold on the play side might be seen by two. That is why “they’re letting them play” is sometimes true, and why the same contact draws a flag in front of the line judge and not behind the umpire’s back. Officiating is a sample, not a census.

The crew in motion

Starting spots are only half of it. Watch a wide shot of a deep pass and you’ll see the crew move as a unit: the referee stays with the quarterback; the wing officials read the receivers on their side through the first few yards and then drift downfield, with the line judge usually staying on the line until the ball is thrown so he can judge whether it was thrown from beyond it; and the deep officials backpedal to stay deeper and wider than the receivers they’re judging, so that every catch is seen from the side or facing the receiver, never from behind him.

Show the Python
off = offense("gun_2x2")
dfn = defense("nickel", "two_high", off)
dfn = [q.moved(d=7.5) if q.key in ("LCB", "RCB") else q for q in dfn]
cm = Play(off, dfn, los=35, to_go=10)
cm.dropback(2.5)
cm.route("X", r.go(20)); cm.route("H", r.seam(18)); cm.route("Y", r.seam(18)); cm.route("Z", r.fade(26))
cm.route("RB", r.flat(1.5, 6.0), side=-1)
cm.pass_to("Z", t=2.6)
for k in ("LT", "LG", "C", "RG", "RT"):
    cm.block(k, pts=[(-1.4, 0.0)])
for k in ("SDE", "SDT", "WDT", "WDE"):
    cm.rush(k, pts=[(-1.3, 0.0)])
cm.drop("FS", (19.0, -10.0)); cm.drop("SS", (21.0, 11.5))
cm.drop("MIKE", (8.0, 3.5)); cm.drop("WILL", (7.0, -2.6)); cm.drop("NB", (10.0, 7.5))
cm.path("LCB", [(12.0, -1.5)]); cm.path("RCB", [(10.0, 2.6), (19.0, 2.4)])
trk = cm.to_tracking(t_after=1.6)
trk = trk[trk.time <= 4.8]
OFFICIALS = {
    "R": ("R", [(0, -12.0, 5.5), (1.0, -12.5, 6.5), (3.0, -12.0, 6.5), (4.6, -10.5, 7.5)]),
    "U": ("U", [(0, -11.0, -5.5), (1.0, -9.0, -5.0), (4.6, -8.5, -4.5)]),
    "DJ": ("DJ", [(0, 0.0, -28.4), (0.9, 0.0, -28.4), (2.6, 4.0, -28.4), (4.6, 10.0, -28.4)]),
    "LJ": ("LJ", [(0, 0.0, 28.4), (2.6, 0.0, 28.4), (4.6, 12.0, 28.4)]),
    "SJ": ("SJ", [(0, 20.0, -23.5), (2.0, 23.5, -24.0), (4.6, 25.0, -23.5)]),
    "FJ": ("FJ", [(0, 20.0, 23.5), (1.6, 23.0, 24.0), (3.4, 29.5, 24.5), (4.6, 30.0, 24.0)]),
    "BJ": ("BJ", [(0, 25.0, 4.0), (2.4, 30.0, 4.5), (4.6, 32.0, 6.5)]),
}
NOTES = ["starting spots", "line judge holds the line", "ball thrown: line judge releases",
         "the catch, seen facing the receiver"]


def crew_notes(fld, i, t):
    lab = "snap" if abs(t) < 1e-6 else f"{t:+.1f} s"
    fld.ax.set_title(f"{lab}: {NOTES[i]}", fontsize=8.2 if PDF else 10, color=style.INK, loc="left")


T_CM, CATCH_T = 2.6, 4.7
qb_throw = cm.position("QB", T_CM)
z_catch = cm.position("Z", CATCH_T)


def crew_decor(fld, t):
    zd, zw = cm.position("Z", t)                         # ring the target receiver
    fld.ax.add_patch(Circle(XY(fld, cm, zd, zw), 1.9, fc="none", ec=style.THIRD, lw=2.0, zorder=7.5))
    if t >= T_CM - 1e-6:                                 # the ball's flight, from the throw onward
        path_arrow(fld, cm, [tuple(qb_throw), tuple(z_catch)], color=style.BALL, lw=1.4, head=9, rad=-0.06)


show_scene(cm, trk, [0.0, 1.2, 2.6, 4.7], window=(-16.0, 35.0), lateral=(-33.0, 33.0), extra=OFFICIALS,
           decor=crew_decor, notes=crew_notes)
Figure 49.2: A deep pass seen through the officials (simulated tracking in Big Data Bowl format; an illustrative play, not a real one). The target, the receiver Z on the right, is ringed in green. Snap: the crew in its starting spots. 1.2 s: the quarterback is in his drop and the receivers are climbing; the referee (R) watches the quarterback, the umpire (U) the linemen; the down judge (DJ) has begun to drift downfield with his receivers, while the line judge (LJ) holds the line to judge whether the pass is thrown from behind it. 2.6 s: the ball is thrown (dashed brown line) to Z down the right side; the line judge releases downfield and the field judge (FJ) backpedals to stay wider and deeper than the receiver. 4.7 s: the catch, judged by the field judge facing the receiver from downfield and outside, with the line judge trailing to mark the spot. Faint lines are each person’s path.

Who the officials are

NFL officials are mostly part-time, with other careers, working under a labor agreement with their union, the NFL Referees Association; the league’s full-time experiments of 2017, 2019 and 2020 were each dropped. Every official is graded by the league office on every play, and the grades matter: during the regular season a referee leads the same crew week after week, but in the playoffs the crews are broken up and rebuilt from the best-graded individuals at each position, and crew rosters change between seasons as officials retire or move. In 2026 a contract standoff had the league preparing replacement officials (and a one-year rule giving New York wider powers to fix their mistakes) until a seven-year deal was agreed in May, so the regular officials are working this season.4

Even the referee’s microphone has a history: referees were first wired for sound in 1975, under the league’s supervisor of officials Art McNally, who also oversaw the first replay system in 1986 and in 2022 became the first official in the Pro Football Hall of Fame.5

Replay: three doors into the booth

Officials miss things: they watch a five-second play at full speed from one angle. Replay exists to fix the misses that matter most without stopping the game every few minutes, through three separate doors, each with its own rules about who may open it.

Who is in the booth. Two groups of people watch the video. In every stadium a replay official (with an assistant) sits in a booth upstairs with the broadcast feeds; he is an official, not a team employee. In New York, the league’s officiating command center (named Art McNally GameDay Central) watches every game at once. When a review happens, the final decision belongs to the league’s senior vice president of officiating or a designee in New York, consulting the replay official and the referee, who watches on a field-level monitor (a tablet at the sideline). So: the stadium booth starts most reviews, New York decides them, and the referee announces them.6

Each door was added to fix a problem the last one created:7

  • 1986–1991: the first try. An official in the press box could stop the game to review a play; it was slow, overturned little, and was voted out.
  • 1999: the challenge flag. Replay came back with a twist: the coaches would decide which plays to review, by throwing a red flag, and pay for a failed challenge with a timeout. The booth kept control of the final two minutes of each half. The reason: a review stops the clock for a couple of minutes, and a successful challenge costs nothing, so in a close finish a coach could have used a challenge as a free timeout.
  • 2011 and 2012: automatic reviews of every scoring play and every turnover, so a coach no longer had to spend a challenge on the biggest calls.
  • 2017: New York decides. The final say moved from the referee, who had watched replays under a curtained “hood” on the sideline, to New York, so the same few people judge every review.
  • 2019: pass interference, for one season (the story is in Contact Rules and Penalties). Almost nothing was overturned.
  • 2021: replay assist. The booth began fixing clear-cut objective facts on its own, without a formal stop, and its powers grew in 2024, 2025 and 2026 (below).

Every review uses the same standard: the ruling on the field is changed only on clear and obvious visual evidence. That produces the three outcomes in every announcement. Reversed means the video shows the call was wrong. Confirmed means the video shows it was right. Stands means the video doesn’t show enough either way, so the call on the field survives. For the game, “confirmed” and “stands” are the same: the play counts as called, and a coach who challenged loses his timeout either way. The difference is what the video showed, and that is what you can predict: when the camera can’t see the key moment (a ball at the bottom of a pile, a knee hidden by a body), the answer is almost always “stands”.

Door 1: the coach’s challenge

A coach’s challenge is the head coach asking for a review by throwing a red flag onto the field before the next snap. The rules make it scarce on purpose:8

  • Each team gets two challenges a game. Since 2024 it gets a third if either of the first two succeeds; before that, both had to succeed.
  • A team must have a timeout left to challenge, and it loses that timeout if the challenge fails.
  • A coach may not challenge after the two-minute warning of either half, in overtime, or any play the booth reviews automatically (a score, a turnover). A coach who throws his flag anyway is charged a timeout, or 15 yards if he has none left, but the booth still reviews the play if it would have anyway.
  • Only certain rulings are reviewable: whether a pass was caught, whether a runner was down, in bounds or across the goal line, the spot relative to the line to gain or the goal line, who recovered a loose ball, too many men on the field. Judgment fouls, holding or interference, are not. A flag elsewhere on the play doesn’t block a challenge: a coach can challenge a catch on a play that also had a holding call, and the foul is enforced (or declined) after the ruling is settled.

That third rule has a story. On Thanksgiving 2012, Houston’s Justin Forsett was clearly touched down early in what became an 81-yard touchdown run against Detroit. Lions coach Jim Schwartz, furious, threw his red flag, even though every touchdown was already reviewed by the booth. Under the rule of the time, an illegal challenge drew a 15-yard penalty and cancelled the automatic review, so the touchdown stood unreviewed, and Houston won 34–31 in overtime. The next spring the league changed the penalty to a charged timeout and kept the review.9

Why make challenges expensive? Because a free challenge would be thrown on every close play, and each review costs two or three minutes. The timeout charge turns a challenge into a bet (the chance of winning times what the reversal is worth, against the chance of losing times what a timeout is worth later), which the game-management staff upstairs must make in the few seconds before the next snap. It’s also why an offense that likes the call hurries to the line: once the ball is snapped, the play can’t be challenged (In-Game Adjustments and Tempo).

And it’s why challenges are rarer than you’d guess. In 2025 coaches threw 151 challenges in 272 regular-season games, about 0.28 per team per game, and won 52% of them; over 2016–2025 the success rate was 46%.10 A coach who is right about half the time, and is only betting on plays he’s fairly sure of, is telling you how hard it is to see a play clearly from the sideline in ten seconds.

Door 2: booth review

A booth review is started by the replay official in the stadium (or by New York), not by a coach. It covers:

  • every scoring play (touchdowns, field goals, safeties) and every try;
  • every turnover as ruled on the field (an interception, a fumble recovered by the defense or knocked through its end zone, a muffed kick recovered by the kicking team), and every ruling that the offense came up short on fourth down;
  • every reviewable play after the two-minute warning of each half and in overtime.

Most booth reviews never stop the game: a touchdown is looked at during the celebration, and if the video agrees, the game goes on. If the booth wants a closer look, it buzzes the referee and the game stops. A replay review of either kind ends the same way, with the referee at the middle of the field reading New York’s decision.

A reversal also fixes the clock. The clock is reset to the moment the ball should have been dead and then runs or stops as the correct ruling dictates: an incompletion reversed to a catch in bounds puts the ball where the play should have ended, with the clock running as it would have. After the two-minute warning, a reversal that turns a stopped clock into a running one also brings a 10-second runoff, which either team can avoid only by spending a timeout. Those runoffs, and the end-of-half arithmetic around them, belong to The Clock, the Two-Minute Drill, and Fourth Down.11

Door 3: replay assist

The newest door is the quietest. Replay assist lets the booth tell the crew about a clear-cut objective fact before the next snap, usually with no stoppage you’d notice: the ball was spotted a yard short of the line to gain, the runner’s knee was down before the ball came out, the receiver’s second foot landed out of bounds, two seconds should go back on the clock. It began in 2021 as a way to fix the obvious without a coach gambling a timeout on it.

If the booth can fix a wrong spot for free, why would a coach ever challenge one? Because replay assist acts only when the answer is clear at once, in the few seconds before the next snap. If the booth stays quiet, a coach who thinks a longer look would change the call still has his red flag; the rules say replay assist never takes that away.

Since 2024 it has had a little power over flags, always limited to the objective piece of a foul. In 2024 it could wipe out a roughing-the-passer flag for a hit to the head when the video showed no contact with the head or neck, a grounding flag when the passer was clearly outside the pocket, and a late-hit flag when the runner was clearly still in bounds; the judgment part of roughing (was the hit late?) is still not reviewable. In 2025 it added five more: a hit to a defenseless player’s head or neck, a face mask, a horse-collar tackle, tripping, and roughing or running into the kicker, each only when the video plainly shows the key contact never happened. It cannot add a foul that nobody called. And in 2026 its staff may consult with the crew on ejections for flagrant acts: football acts (a hit during the play so violent it warrants ejection, such as a launch into a defenseless receiver’s head) and non-football acts (a punch away from the play). Some reports describe that as replay ejecting players; the league’s official wording is only that it may consult.12

What the NFL still doesn’t have is a sky judge: an official in the booth with the power to call or wipe out any foul in real time. Spring leagues have used one (the USFL’s sky judge wiped out a wrong face-mask flag in a 2023 playoff game), and the idea has been proposed in the NFL since at least 2019.13 The objections are practical: it would slow the game, and it would make every play (on which, coaches like to say, somebody is holding) a candidate for a flag. So the league has expanded replay one narrow, objective slice at a time.

Show the Python
fig, ax = canvas(6.5, 6.4)
Q, A_B, A_C, A_R, A_N = "#efeee9", style.OFFENSE_TINT, style.DEFENSE_TINT, "#d4efe5", "#f3f2ee"
sx, ox, bx = 21, 60.5, 88.5                    # spine, outcomes column, replay-assist band
fbox(ax, sx, 92, 38, 5.6, "A close call on the field", fc=Q, tfs=8.2)
fbox(ax, sx, 74, 38, 16.5, "Is the ruling reviewable?",
     "catch or no catch, down or not,\nin or out of bounds, the spot at\nthe line to gain or goal line, a\nrecovery, a forward or backward pass",
     fc=Q, tfs=7.6, bfs=6.4)
fbox(ax, sx, 46, 38, 17.0, "Does the booth review it\nautomatically?",
     "a score, a try, a turnover,\nshort on fourth down, or any\nplay after the two-minute\nwarning or in overtime",
     fc=Q, tfs=7.6, bfs=6.4)
fbox(ax, ox, 74, 28, 16.5, "FINAL", "holding, pass interference\nand other judgment calls\ncan't be reviewed (a few\nlisted flags excepted: right)",
     fc=A_N, ec=style.BASELINE, tfs=7.8, bfs=6.3)
fbox(ax, ox, 46, 28, 17.0, "BOOTH REVIEW", "the replay official starts it\nif he wants a closer look;\nNew York decides. A coach's\nflag is illegal (a timeout)",
     fc=A_B, ec=style.OFFENSE, tfs=7.8, bfs=6.3)
fbox(ax, sx, 17.5, 38, 17.0, "COACH'S CHALLENGE", "red flag before the next snap;\nneeds a timeout and loses it if\nit fails; two a game, a third\nif either succeeds",
     fc=A_C, ec=style.DEFENSE, tfs=7.8, bfs=6.3)
farrow(ax, (sx, 89.0), (sx, 82.4))
farrow(ax, (sx + 19.2, 74), (ox - 14.2, 74), "no", toff=(0, 2.4))
farrow(ax, (sx, 65.6), (sx, 54.6), "yes", toff=(3.4, 0))
farrow(ax, (sx + 19.2, 46), (ox - 14.2, 46), "yes", toff=(0, 2.4))
farrow(ax, (sx, 37.4), (sx, 26.1), "no", toff=(3.0, 0))
# replay assist: a band beside every door
fbox(ax, bx, 46, 21, 70, "REPLAY\nASSIST",
     "alongside every door,\non any play, before\nthe next snap:\n\nfixes an objective\nfact that is clear\nat once (the spot,\ncatch, down, out of\nbounds, the clock)\n\nmay wipe out the\nobjective part of a\nlisted flag; never\nadds one\n\nusually no stoppage;\na coach may still\nchallenge",
     fc=A_R, ec=GREEN, tfs=7.8, bfs=6.3)
for y in (74, 46):
    ax.plot([ox + 14.3, bx - 10.7], [y, y], color=GREEN, lw=1.0, ls=(0, (2, 2)), zorder=1)
ax.plot([sx + 19.3, bx - 10.7], [17.5, 17.5], color=GREEN, lw=1.0, ls=(0, (2, 2)), zorder=1)
ax.text(50, 3.0, "2026: New York may also consult with the referee on ejections for flagrant acts.", ha="center",
        va="center", fontsize=6.8, color=style.INK_2,
        bbox=dict(boxstyle="round,pad=0.35", fc=A_N, ec=style.BASELINE, lw=0.8))
plt.show()
Figure 49.3: Who can review a close call, as of the 2026 season. Ask two questions in order. First: is the ruling reviewable at all? Judgment fouls such as holding and pass interference are not, so the call on the field is final. Second, for a reviewable ruling: is it a play the booth reviews automatically (a score, a try, a turnover, short on fourth down, anything after the two-minute warning or in overtime)? If so the booth decides whether to look; if not, only a coach’s challenge can start a review. Replay assist (right) runs alongside every door: on any play, before the next snap, the booth may fix an objective fact that is clear at once, or wipe out the objective part of a short list of flags.

Now the opening play answers itself. With 1:41 left the game was past the two-minute warning, so the coach couldn’t challenge (had he thrown the flag, he’d have lost a timeout for nothing). The replay official in the stadium started the review, someone in New York decided it, and the referee only announced it. And “control with both feet down in bounds” is two of the three gates of the catch rule, which is next.

What actually gets reviewed

Play-by-play data records a review whenever one changes or stops the game, with the ruling that was reviewed and the result, so you can see where replay earns its keep.

Show the Python
fig, ax = plt.subplots(figsize=(6.5, 3.9))
ys = np.arange(len(tab))
ax.barh(ys, tab["challenge"], color=style.DEFENSE, height=0.62, label="Coach's challenge")
ax.barh(ys, tab["booth"], left=tab["challenge"], color=style.OFFENSE, height=0.62, label="Booth review")
for y, (_, row) in zip(ys, tab.iterrows()):
    ax.text(row.n + 6, y, f"{100 * row.rev:.0f}% reversed", va="center", ha="left", fontsize=6.9,
            color=style.INK)
ax.set_yticks(ys, [LABELS[k] for k in tab.index], fontsize=7.2)
ax.set_xlim(0, tab["n"].max() * 1.32)
ax.grid(axis="y", visible=False)
ax.tick_params(axis="x", labelsize=7)
ax.set_xlabel("Reviews, 2021–2025", fontsize=7.6)
ax.legend(loc="lower right", fontsize=7.2)
fig.tight_layout()
plt.show()
Figure 49.4: The twelve rulings reviewed most often, 2021–2025 (regular season and playoffs), split by who asked: a coach’s challenge (orange) or the booth (blue). The label gives the share of those reviews that reversed the call. Catch or no catch is by far the busiest question. Don’t read the reversal rates as ‘officials are usually wrong’: every bar is a selected sample. Coaches challenge only when their staff has seen a replay that looks wrong, and the play-by-play generally records a booth review only when it stopped the game, not the routine quick confirmations of every touchdown, so both kinds of review are weighted toward close calls. Source: nflverse play-by-play (the review text in each play’s description).

Two patterns are worth carrying into a game. Catch-or-no-catch rulings make up about 40% of all the recorded reviews, which is why the next section spends so long on the catch. And rulings of a catch are reviewed more than twice as often as rulings of incomplete (overturned at a similar rate: 54% against 49%), partly because the booth looks at every touchdown catch and partly by design: officials rule the play that keeps the ball alive when in doubt, for a reason the 2008 story below makes plain.

The catch

Nothing in the rulebook has caused more arguments than the definition of a catch, because of the stakes. If it was a catch and the ball then comes loose, it’s a fumble: a live ball anyone can recover. If it wasn’t, it’s an incomplete pass: dead, and the offense keeps it. So the rule has to separate possessing a ball from merely touching it, at full speed, often while someone is hitting the receiver.

Today’s rule, rewritten in 2018, says a player has made a catch when, in bounds, he does three things in order:14

  1. Control. He secures control of the ball in his hands or arms before it touches the ground.
  2. Feet (or a body part) down. He touches the ground in bounds with both feet, or with any part of his body other than his hands (a knee, a hip, an elbow).
  3. Time. After the first two, he makes an act common to the game: tucks the ball away, turns upfield, takes an extra step, reaches the ball toward the line, wards off a defender. Or he keeps control long enough that he could have.

Three clarifications do most of the work on replays.

  • Slight movement isn’t a loss of control, and a bobble he then secures is fine, as long as the ball never touches the ground in between.
  • The ground matters only before gate 3. If he finishes gate 3 on his feet (a third step, a turn, a reach) and then falls and the ball comes out, it was a catch and then a fumble, or simply a catch if he was down by contact. But if he is falling while he catches it, so that he hits the ground before he has had time for any football act, the ground is part of the catch: he must keep control when he lands. If the ball pops loose and touches the ground then, the pass is incomplete.
  • A tie goes to the offense. If an offensive and a defensive player catch the ball at the same moment and both keep it, it’s the offense’s ball. If one had it first and the other wrestled in, it belongs to the first.

An interception is judged by exactly the same three gates.

Show the Python
fig, ax = canvas(6.5, 5.9)
G, YES, NO = "#efeee9", "#d4efe5", "#fbe3e1"
cx, rx = 32, 80
fbox(ax, cx, 86, 46, 6.0, "The pass arrives", fc=G, tfs=8.2)
gates = [
    (71, "1. Control", "secured in his hands or arms before\nthe ball touches the ground? (slight\nmovement or a bobble he secures is fine)"),
    (51, "2. Feet down in bounds", "both feet, or any body part\nother than his hands?"),
    (31, "3. Time", "an act common to the game (tuck, turn\nupfield, extra step, reach, ward off),\nor control long enough to make one?"),
]
farrow(ax, (cx, 82.9), (cx, 78.4))
for i, (y, t, b) in enumerate(gates):
    fbox(ax, cx, y, 46, 13.4, t, b, fc=G, tfs=7.8, bfs=6.5)
    nxt = gates[i + 1][0] + 6.8 if i < 2 else 15.6
    farrow(ax, (cx, y - 6.8), (cx, nxt), "yes", toff=(3.4, 0))
fbox(ax, rx, 71, 30, 10.5, "INCOMPLETE", "he never secured it before\nit hit the ground", fc=NO, ec=RED)
fbox(ax, rx, 51, 30, 10.5, "INCOMPLETE", "out of bounds (in the\nend zone: no touchdown)", fc=NO, ec=RED)
fbox(ax, rx, 31, 30, 12.0, "HIT THE GROUND FIRST", "falling as he caught it, or\nlanding out of bounds: did he\nkeep control through it?", fc="#fdf3d8",
     ec=style.LINE_TO_GAIN, tfs=7.2)
fbox(ax, rx, 11, 30, 8.0, "INCOMPLETE", "the ball came loose", fc=NO, ec=RED)
for y in (71, 51):
    farrow(ax, (cx + 23.2, y), (rx - 15.2, y), "no", toff=(0, 1.9))
farrow(ax, (cx + 23.2, 31), (rx - 15.2, 31), "not yet", toff=(0, 1.9))
farrow(ax, (rx, 24.9), (rx, 15.1), "no", toff=(3.0, 0))
fbox(ax, cx, 9.5, 46, 12.0, "CATCH", "if the ball comes loose now: a fumble\n(live ball). If he's in the end zone,\nor reaches it over the line: touchdown", fc=YES,
     ec=GREEN, tfs=8.6)
farrow(ax, (rx - 15.2, 27.5), (cx + 23.4, 13.5), "yes, kept it", toff=(2.0, 2.2))
plt.show()
Figure 49.5: The catch rule as a replay official applies it (NFL rule since 2018). A pass must pass all three gates in order. Failing gate 1 or 2 means incomplete. At gate 3, a receiver who hasn’t yet had time for a football act when he hits the ground (or lands out of bounds) must keep control through it, or the pass is incomplete. Once gate 3 is passed, losing the ball means a catch and then a fumble. The same test decides an interception.

Why the rule was rewritten

For most of the 2010s the rule had an extra clause that produced some of the most hated rulings in league history. A receiver who went to the ground “in the process of the catch” had to keep control of the ball after hitting the ground, the so-called survive the ground requirement, no matter how many steps he had taken or how obviously he had possessed it. The clause was meant to make the rule objective: instead of asking officials to judge whether a player had possession long enough, it gave them a test they could see on video. The trouble was that the objective test kept ruling against what everyone watching had seen. Three plays made it untenable:15

  • Calvin Johnson, Lions at Bears, September 12, 2010. Trailing 19–14 with 31 seconds left, Johnson caught a pass in the end zone, landed with both feet and his backside, and put the ball down on the turf as he rolled to get up. Ruled incomplete; the booth upheld it. The Lions lost by five, and “the Calvin Johnson rule” entered the vocabulary.
  • Dez Bryant, Cowboys at Packers, divisional playoffs, January 11, 2015. On fourth-and-2 late in the game, Bryant caught a deep ball, took three steps as he fell, reached for the goal line, and the ball moved when it hit the turf at the 1. Ruled a catch, reversed on Green Bay’s challenge; the Packers won (the Film room below walks through it).
  • Jesse James, Patriots at Steelers, December 17, 2017. With 34 seconds left and Pittsburgh down 27–24, James caught a short pass a few yards from the goal line, went to a knee untouched (so he wasn’t down: in the NFL a runner needs contact, as the next section explains), and lunged across the goal line; the ball moved as it hit the turf. Ruled a touchdown, reversed by the booth. The Steelers lost the game and, as it turned out, home-field advantage in the playoffs.

The owners approved a rewrite 32–0 in March 2018. Here is precisely what changed. Under the old rule, a receiver who went to the ground “in the process of the catch” had to survive the ground however many steps or reaches he had made on the way down: falling cancelled them. Under the new rule, a football act made before the ball comes loose (a third step, a reach for the line, or time enough to make one) finishes the catch, even if he is falling, and only a receiver who hits the ground before he has made one must still survive it. (The 2018 announcement said “football move”; the rulebook says “act common to the game”.) The league’s football chiefs said publicly that Bryant’s and James’s catches would now count.16

Would Calvin Johnson’s? Try it with the gates. Control: yes, high in the end zone. Feet: both feet, then his backside. Time: the argument. He went to the ground as he caught it, so he must keep control through the landing unless he had time for a football act first. If you see him land, hold the ball, and only then use it to push himself up, he had the time, and it’s a touchdown today. If you see one continuous fall with the ball coming loose as part of it, it’s still incomplete. The league never ruled on it publicly, and that is the honest answer: it’s a judgment about time.

Name the trade: the old rule was objective and produced absurd results; the new one matches what people see, at the price of a judgment (“was that lunge a football act or part of the fall?”) at its center.

CautionCommon misconception

“The ball touched the ground, so it’s incomplete.” The ball is allowed to touch the ground during a catch, as long as the receiver keeps control of it, with his hands under it or the ball pinned to his body. What it can’t do is help him: a ball trapped against the turf with no hand under it, or one that pops loose when he lands before he has had time for a football act, is incomplete.

Sidelines and end zones

Two places put extra weight on gate 2. At the sideline, a receiver needs both feet (or another body part) down in bounds with control; one foot, as in college football, isn’t enough. Since 2008 there has been no “force-out” ruling either: a receiver pushed out of bounds in the air before getting both feet down has not caught the ball, however sure the official is that he would have landed in bounds (unless he had control and was held up and carried out).17 And because a toe-tap leaves no time for a football act, he must keep control as he falls out; a ball jarred loose when he hits the ground out of bounds is incomplete.

In the end zone, the catch is the touchdown, so the receiver must complete all three gates there; a runner who already has the ball only needs it to touch the plane of the goal line (the end zone is generous that way). A receiver who completes the catch short of the line and then reaches across has scored, which is how Jesse James’s play would be ruled today.

Down, progress and the whistle

Most plays end with a ball carrier going down, and the NFL’s definition differs from college’s. A runner is down by contact when any part of his body other than his hands or feet touches the ground and he has been touched by an opponent. The order of those two can go either way. If nobody touched him, he isn’t down: a running back who slips on wet turf, or a returner who kneels to field a bouncing kick, may get up and keep running. But if a defender touches him while he is on the ground, he is down right there, which is why defenders are coached to “touch him down” rather than assume the play is over. In college football the runner is down as soon as his knee touches, contact or not.18 (A runner who slides feet-first or simply gives himself up is down where he does it; that’s how quarterbacks protect themselves.)

The order of events matters more than anything else on these plays. If the ball comes out before the knee (or elbow, or hip) touches after contact, it’s a fumble: live, and anyone’s. If the knee touches first, the runner was down and the ball coming out afterward doesn’t matter. On television these are separated by a few frames of video, which is why they’re among the most-reviewed rulings in the data above.

Show the Python
fig, ax = canvas(6.5, 2.5, xmax=100, ymax=39)
rows = [
    (31.0, [(10, "contact"), (31, "ball comes out"), (52, "knee down")], "FUMBLE", "live ball: anyone may recover", RED),
    (19.5, [(10, "contact"), (31, "knee down"), (52, "ball comes out")], "DOWN", "dead: ball spotted where it was\nwhen the knee touched", GREEN),
    (8.0, [(10, "slips, untouched"), (31, "knee down"), (52, "gets up, runs on")], "NOT DOWN", "unless touched while on the\nground (college: down)", style.OFFENSE_DARK),
]
ax.text(3, 37.0, "time →", fontsize=7.0, color=style.INK_2, ha="left", va="center")
for y, evs, verdict, sub, col in rows:
    ax.plot([3, 62], [y, y], color=style.BASELINE, lw=1.2, zorder=1)
    for i, (x, lab) in enumerate(evs):
        ax.plot(x, y, marker="o", ms=7, color=col if i == 1 else style.INK_2, zorder=3)
        ax.text(x, y + 2.6, lab, fontsize=6.9, ha="center", va="center", color=style.INK, zorder=4)
    ax.text(66, y + 1.3, verdict, fontsize=8.2, fontweight="bold", color=col, ha="left", va="center")
    ax.text(66, y - 1.4, sub, fontsize=6.5, color=style.INK_2, ha="left", va="top", linespacing=1.1)
plt.show()
Figure 49.6: Down or fumble? It depends on the order of three events: the defender’s contact, the ball coming loose, and the runner’s knee (or any body part other than a hand or foot) touching the ground. Top: the ball comes out first, so it’s a fumble and the ball is live. Middle: the knee touches first, after contact, so he’s down and the play is dead before the ball comes loose. Bottom: nobody touched him, so in the NFL he isn’t down; he can get up and keep running, unless a defender touches him while he’s on the ground (in college he’d be down at once). Either way, the ball is spotted where it was when he went down, not where his knee was.

Forward progress decides where the play ended. You met it in Downs, Distance, and Field Position: the ball is spotted at the farthest point it reached toward the goal line before the runner was stopped, not where he ended up after a pile drove him back. The same idea tells officials when to blow the whistle. A runner wrapped up and held upright, his legs still churning, has had his forward progress stopped even though he hasn’t gone down, and the officials will whistle the play dead rather than let a pile of defenders keep shoving him backward (or strip the ball from a man who has stopped moving forward). It also protects runners at the goal line: a back who gets the ball across the plane and is knocked back has scored. (Only being driven back counts: a quarterback who retreats on his own and is sacked is spotted where he goes down.) And it affects the clock: a runner stopped in bounds and then shoved out of bounds was down in bounds, so the clock keeps running, a detail that matters in the two-minute drill.

The whistle, and the 2008 lesson

The whistle is the one tool officials can’t take back. Once it blows, the play is dead, whatever happens next. (When one is blown by mistake with the ball still live, the team with the ball can usually take it where the whistle killed the play or replay the down; a pass in the air is simply replayed.)19 That used to put replay in an impossible position: if an official ruled a play over and the video showed a fumble, replay could fix the ruling but couldn’t know who would have recovered the ball.

The play that made everyone face this came on September 14, 2008. Denver trailed San Diego 38–31 with 1:17 left, second-and-goal at the 1. Jay Cutler dropped back, and the ball slipped out of his hand as he started to throw; a Charger fell on it. Referee Ed Hochuli ruled it an incomplete pass and blew his whistle. Replay showed a fumble, but because the whistle had already killed the play, the Chargers couldn’t be given the ball. Denver kept it at the 10, where Cutler had lost it, scored on fourth-and-goal with 29 seconds left, went for two, and won 39–38.20 Hochuli, one of the most respected referees of his era, publicly apologized.

Two things changed. In 2009 the owners passed what was quickly nicknamed the “Hochuli rule”: replay may now award the ball to the team that recovered it when the recovery is clear and in the immediate continuing action, even after a whistle.21 And the officials’ habit changed: on a bang-bang fumble, they are taught to hold the whistle, let the players finish the scramble for the ball, and rule a fumble when in doubt, because replay can turn a fumble back into a dead ball cleanly but can’t recreate a recovery that never happened. That is why you now see a defender scoop up a loose ball and run the other way while everyone else has stopped.

Pass or fumble: the quarterback’s arm

A close cousin of down-or-fumble is pass-or-fumble, and it comes up every time a pass rusher hits a quarterback as he throws. The rule is about the arm. Once the quarterback, holding the ball, starts his arm moving forward to throw, anything that comes out is a forward pass, and if it hits the ground it’s incomplete. If he loses the ball before his arm starts forward, or while he is pulling it back down to tuck it after deciding not to throw, it’s a fumble.

The second half of that sentence was not always true. Until 2013 the rulebook had the tuck rule: if the quarterback started forward and then brought the ball back toward his body, it was still a pass until he had tucked it all the way in. It is remembered for the snowy January 2002 playoff in Foxborough, when Tom Brady lost the ball under Charles Woodson’s hit, the Raiders recovered, and replay called it an incomplete pass; New England kept the ball and won in overtime. The league abolished the rule in 2013.22 Today the same play is a fumble.

Who reviews it depends on the call on the field. When the field rules a fumble that the defense recovered, it’s a turnover, so the booth reviews it automatically. When the field rules an incomplete pass, there’s no turnover to trigger the booth, so before the two-minute warning the defense’s coach usually has to throw his red flag (unless replay assist steps in on the possession), which is the moment you see a coach grab it on a strip-sack ruled incomplete. Either way, watch the arm, not the ball: if the arm was coming forward with the ball in the hand, it’s a pass.

A fumble through the end zone

Now the harshest rule in the book. When a fumble goes out of bounds, the general rule is generous to the team that fumbled: it keeps the ball. If the ball went out going backward, it’s spotted where it went out; if it went out going forward, it comes back to the spot of the fumble, so that nobody gains yards by fumbling forward on purpose.

The exception is the opponent’s end zone. A fumble through the end zone, a ball fumbled forward into the end zone that goes out of bounds there, out the side or out the back, is a touchback: the defense gets the ball at its own 20, even though no defender ever touched it.23 A fumble that stays in the end zone is simpler: if the offense falls on it there, it’s a touchdown (on fourth down or late in a half, only the man who fumbled may, as the box below explains); if the defense does, it’s a touchback. And the mirror image works against the offense in its own end zone: a ball it fumbles there that goes out of bounds (or one it fumbles in the field that it sends back into its own end zone and out) is a safety, because the offense supplied the push that put the ball there.

Show the Python
fig, axes = plt.subplots(1, 3, figsize=(6.5, 3.9))
cases = [
    ((-2.0, 18.0), (2.0, 19.2), [(2.0, 19.2), (3.2, 21.4), (4.0, 23.58), (4.3, 24.8)], "offense's ball\nat the 4", (2.0, 12.2), style.OFFENSE_DARK),
    ((-1.5, 18.5), (5.0, 21.0), [(5.0, 21.0), (7.8, 22.4), (11.5, 23.58), (12.2, 24.8)], "touchback:\ndefense's ball\nat its 20", (11.6, 14.2), RED),
    ((-1.0, 16.5), (2.0, 19.5), [(2.0, 19.5), (0.5, 21.6), (-2.0, 23.58), (-2.6, 24.8)], "offense's ball\nat the 8", (-4.6, 15.5), style.OFFENSE_DARK),
]
for ax, (start, fum, ballpath, verdict, vat, col) in zip(axes, cases):
    rb = O("RB", "RB", start[0], start[1], "R")
    q = Play([rb], [D("DB", "DB", fum[0] + 1.0, fum[1] - 2.3, "D")], los=104, ball_y="right", to_go=None)
    q.run("RB", [fum], absolute=True)
    fld = q.draw(ax=ax, lateral=(7.0, 29.5), window=(-6.5, 16.5), title=False)
    no_numbers(ax)
    say(fld, q, 2.0, 26.6, "out of bounds", fs=5.6, box=False, rot=90)
    for dd, lab in ((1.0, "5"), (-4.0, "10")):
        say(fld, q, dd + 0.6, 9.0, lab, fs=5.8, color=style.MUTED, box=False)
    xmark(fld, q, *fum)
    path_arrow(fld, q, ballpath)
    say(fld, q, vat[0], vat[1], verdict, color=col, fs=6.6, weight="bold")
    say(fld, q, 6.0, 12.0, "goal line", fs=5.8, color=style.INK_2)
    say(fld, q, 14.4, 11.0, "end line", fs=5.8, color=style.INK_2)
    say(fld, q, -0.9, 11.8, "line of scrimmage", fs=5.0, color=style.OFFENSE_DARK)
for ax, lab in zip(axes, ["Forward, out at the 2", "Into the end zone, out", "Backward, out at the 8"]):
    ax.set_title(lab, fontsize=7.8, color=style.INK, loc="left", fontweight="bold")
fig.tight_layout(w_pad=0.4)
plt.show()
Figure 49.7: Three fumbles out of bounds near the goal line, offense moving up the page. Left: the ball squirts forward and out at the 2: the offense keeps it, but back at the 4, the spot of the fumble, because a forward fumble can’t gain ground. Middle: knocked loose at the 1, it bounces into the end zone and out the side: a touchback, and the defense takes over at its own 20. Right: the ball goes backward and out at the 8: the offense keeps it where it went out. The X marks the fumble (D is the defender who knocked it loose), the dashed brown line the ball’s path.

Why would the rules punish the offense so hard? The logic is about territory, not possession. The end zone belongs to the defending team, and when a ball goes dead there because of something the other team did (a punt rolls through, a kickoff sails out the back), it’s a touchback, like the touchbacks on punts. A fumble into your end zone and out is treated the same way. The rule is consistent; it just doesn’t feel fair, because the defense did nothing to earn it. It is one of the most criticized rules in the book; the competition committee looked at softening it in 2017 and again in February 2024 and kept it both times, arguing that the ball carrier is responsible for the ball and that nobody had a workable alternative. It is unchanged in the 2026 rulebook.24

The rule shapes technique: it’s why a ball carrier stretching for the pylon is taking a real gamble, and why defenders near the goal line punch at the ball instead of wrapping up.

ImportantWhy it exists: the fourth-down fumble rule

On September 10, 1978, with the Raiders trailing the Chargers in the final seconds, Ken Stabler, about to be sacked, fumbled the ball forward; teammates batted and kicked it toward the goal line, and Dave Casper fell on it in the end zone for the winning touchdown. The “Holy Roller” was legal then. The next season the league made it impossible: on fourth down, and on any down after the two-minute warning, only the player who fumbled may recover and advance the ball. If a teammate recovers it, the ball comes back to the spot of the fumble (or the spot of recovery, if that is behind it).25 The rule exists to stop an offense from fumbling forward on purpose when it has nothing left to lose.

Backward passes and forward passes

Football allows exactly one forward pass per play, and it must be thrown from behind the line of scrimmage. It allows any number of backward passes (also called laterals), from anywhere, by anyone, at any time. The two are treated very differently when they hit the ground:

  • A forward pass that hits the ground is incomplete. The ball is dead, and the offense keeps it.
  • A backward pass that hits the ground is still live, exactly like a fumble. Either team may recover it, and either team may advance it.

Which is which? The test is the ball’s direction: compare the yard line where it left the passer’s hand with the yard line where it is first touched (or first hits the ground). If the second is closer to the opponent’s goal, the pass was forward. If it’s the same yard line or behind, the pass was backward, so a pass thrown perfectly parallel to the line counts as backward.26 Notice that it’s the ball’s path that counts, not the players’ positions on the field. (This chapter calls the yard line where the ball leaves the passer’s hand the release line; that’s our label for the diagrams, not a rulebook term.)

The forward pass’s two limits are fouls of their own, and the line judge watches for the first. A forward pass is illegal if the passer’s entire body and the ball are beyond the line of scrimmage when he lets go, which is the call you see on a quarterback who scrambles up to the line and flips it at the last moment: one foot still behind the line keeps it legal. A second forward pass on the same play is illegal too. Either costs a loss of down and 5 yards.

Show the Python
off = offense("gun_2x2")
off = [q.moved(w=2.6) if q.key == "RB" else q for q in off]
lp = Play(off, None, los=40, to_go=None)
lp.path("RB", [(-6.0, 4.6), (-6.4, 7.8)], absolute=True)           # swings out to take the pitch
lp.path("H", [(-3.2, -10.2), (-5.1, -10.9), (-5.4, -10.6)], absolute=True)   # the bubble: bows back
fld = lp.draw(lateral=(-19.5, 19.5), window=(-12.0, 4.5), title=False)
ax = fld.ax
no_numbers(ax)
rel = (-5.4, 0.3)
x0, y0 = XY(fld, lp, rel[0], -18.0)
x1, y1 = XY(fld, lp, rel[0], 18.0)
ax.plot([x0, x1], [y0, y1], color=PURPLE, lw=1.2, ls=(0, (4, 3)), zorder=2)
say(fld, lp, -4.4, -15.6, "release line", color=PURPLE, fs=6.6, weight="bold")
for tgt, col, lab, lat in [((-6.6, 7.4), GREEN, "1  backward:\nlive if dropped", (-9.6, 7.6)),
                           ((-5.4, -10.6), GREEN, "2  parallel = backward:\nlive if dropped", (-8.8, -10.0)),
                           ((-0.9, 14.0), RED, "3  forward:\nincomplete if dropped", (1.9, 9.4))]:
    path_arrow(fld, lp, [rel, tgt], color=style.BALL, lw=1.5)
    say(fld, lp, lat[0], lat[1], lab, color=col, fs=6.6, weight="bold")
say(fld, lp, 1.0, -3.0, "line of scrimmage", color=style.OFFENSE_DARK, fs=6.2)
plt.show()
Figure 49.8: Forward or backward is decided by the yard line where the ball leaves the passer’s hand (dashed ‘release line’) and the yard line where it’s first touched. From the shotgun, the quarterback catches the snap five yards deep. A pitch to the running back (1), who has swung out to the right and slightly back, is caught behind the release line: a backward pass, live if it hits the ground. A bubble screen (2) to the slot receiver, who has bowed back from his alignment to the release line, is parallel, which counts as backward. A quick screen to the outside receiver (3) is caught about five yards ahead of the release line: a forward pass, incomplete (and dead) if it’s dropped.

Why does a dropped backward pass stay live? Because the rules treat it as the normal case. A backward pass is just a handoff through the air: the ball stays a runner’s ball, and if he doesn’t catch it, it’s loose, like any fumble. The forward pass is the special case, the one the rules ration (one per play, from behind the line) and give a special ending: when it fails, the play stops and the offense keeps the ball, paying with the down. The result shows up in three places on a broadcast:

  • Pitches and option plays. A pitch on the option is a backward pass. Drop it and you’ve fumbled, in effect, which is why option teams drill the pitch relentlessly.
  • Screens. Most shotgun screens are forward passes, caught closer to the line than the five or six yards deep where the quarterback let go. But a bubble or swing screen to a player who has drifted back level with the quarterback may be backward, so defenders are coached to scoop up every dropped screen and run: if it was backward, the ball is theirs. (The illegal-man-downfield rule applies only to a forward pass thrown beyond the line, so on a true backward pass linemen may already be blocking downfield.)
  • Last-play desperation. The multi-lateral kickoff return or final snap, the ball pitched backward again and again, is legal because every pitch is backward.

The most famous backward pass in NFL history came in a wild-card game on January 8, 2000, on a kickoff with 16 seconds left: Tennessee’s Frank Wycheck threw the ball across the field to Kevin Dyson, who ran 75 yards for the winning touchdown. Replay couldn’t show that the throw had gone forward, so the ruling of a legal lateral stood, and the “Music City Miracle” became the standard illustration of the rule.27

Intentional grounding and the tackle box

Quarterback Play introduced the throwaway and the rule that limits it. Here is the full rule, and the reasoning behind it.

Intentional grounding is a foul when a passer who is facing an imminent loss of yardage because of the rush throws a pass that isn’t in the direction and vicinity of an eligible receiver. (The rulebook says originally eligible: eligible when the ball was snapped, so a lineman who has wandered downfield doesn’t count as a target.) Three conditions, all needed:28

  1. Pressure. He must be facing a likely sack. A quarterback under no pressure who throws the ball into the turf has wasted a down, but he hasn’t grounded it.
  2. No realistic target. The pass isn’t thrown near an eligible receiver. “Near” is a judgment, and throwing the ball well over the head of a covered receiver in the right part of the field counts.
  3. Inside the tackle box. The tackle box, which the rulebook calls the pocket area, is the region between the outside edges of where the two offensive tackles lined up, running from the line of scrimmage all the way back to the offense’s own end line. It’s fixed by where the tackles aligned at the snap: a tight end lined up outside a tackle doesn’t widen it, and it doesn’t move when the quarterback does.

The exception is what makes the box matter: a passer who is or has been outside the tackle box may throw the ball away freely, as long as it lands at or beyond the line of scrimmage (extended to the sidelines), including out of bounds past it. Since the 2024 rulebook he counts as outside the box if any part of his body, or the ball, is outside it. And “has been” means what it says: a quarterback who escapes the box and then drifts back inside it keeps the exception for the rest of the play.

The penalty is built to cost about what the sack would have: loss of down and 10 yards from the previous spot, or loss of down at the spot of the pass if that is farther back, and a safety if he throws it from his own end zone. The other exception is the spike: a quarterback who throws the ball straight into the ground immediately after the snap, to stop the clock, loses only the down (more in The Clock, the Two-Minute Drill, and Fourth Down).

Show the Python
off = offense("gun_2x2")
off = [q for q in off if q.key in ("LT", "LG", "C", "RG", "RT", "Y")]
off = [q.moved(d=7.5, w=8.0) if q.key == "Y" else q for q in off]
gp = Play(off + [O("QB", "QB", -6.0, 0.0, "A")],
          [D("LB", "MIKE", 9.0, 9.2, "M"), D("E1", "DE", -4.8, -2.2, "E"), D("E2", "DE", -5.2, 2.0, "T"),
           D("E3", "DE", -6.4, 9.4, "E")],                     # closing on quarterback B
          los=14, ball_y="right", to_go=None)
fld = gp.draw(lateral=(-20.5, 27.2), window=(-14.5, 15.5), title=False)
ax = fld.ax
no_numbers(ax)
tackle_box(ax, fld, gp, -14.0)
qbB = (-7.5, 12.5)
draw_marker(ax, *XY(fld, gp, *qbB), "off", "B", fld.pts_per_yard())
path_arrow(fld, gp, [(-6.0, 0.0), (-1.0, -3.5), (6.0, -6.0)], color=RED, lw=1.6)
path_arrow(fld, gp, [(-6.0, 0.0), (5.0, 6.0), (11.0, 9.0)], color=GREEN, lw=1.6)
path_arrow(fld, gp, [qbB, (2.5, 24.4)], color=GREEN, lw=1.6)
path_arrow(fld, gp, [qbB, (-3.2, 24.4)], color=RED, lw=1.6)
say(fld, gp, 8.8, -8.5, "1  grounding: inside the box,\nthe line doesn't help (safety)", color=RED, fs=6.8, weight="bold")
say(fld, gp, 12.8, 5.0, "2  legal: near Y", color=GREEN, fs=6.8, weight="bold")
say(fld, gp, 5.4, 15.8, "3  legal: out of\nbounds past the line", color=GREEN, fs=6.8, weight="bold")
say(fld, gp, -11.0, 16.6, "4  grounding: short\nof the line (safety)", color=RED, fs=6.8, weight="bold")
say(fld, gp, -11.7, 0.0, "tackle box\n(back to the end line)", color=PURPLE, fs=6.4, weight="bold")
say(fld, gp, -3.0, -10.5, "goal line", fs=6.0)
say(fld, gp, 1.2, -16.0, "line of scrimmage", color=style.OFFENSE_DARK, fs=6.2)
say(fld, gp, -9.0, -12.0, "end zone", fs=6.4, color=style.INK_2)
xs_, ys_ = XY(fld, gp, 6.0, 25.3)
ax.text(xs_, ys_, "out of bounds", rotation=90, ha="center", va="center", fontsize=6.0, color=style.INK_2)
plt.show()
Figure 49.9: Intentional grounding backed up at the offense’s own 4, where the tackle box (shaded) runs back into the end zone. Quarterback A, inside the box and in his end zone, throws to an empty part of the field (1): grounding, and from the end zone that’s a safety. Throwing it over the covered tight end’s head instead (2) is a legal throwaway. Quarterback B has escaped the box with a defender closing: throwing it out of bounds past the line of scrimmage (3) is legal even though no one is near, but a throw that lands out of bounds short of the line (4) is grounding, also a safety from the end zone. Notice that throw 1 lands past the line too: inside the box, reaching the line doesn’t help.

Why draw the line at the box? A sack is something the defense earned. If a quarterback could always throw the ball into the ground to avoid one, the pass rush would lose much of its value, so inside the pocket, where the defense has him trapped, he must at least throw toward someone. A quarterback who has escaped the pocket has beaten the rush himself; letting him throw it away (provided it reaches the line, so he can’t just dump it at his feet) rewards the escape. The 2024 wording tilted that balance a little further his way.

The best-known grounding call of recent decades shows the safety clause at work: on New England’s first offensive play of Super Bowl XLVI, February 5, 2012, Tom Brady, pressured in his own end zone, threw deep down the middle to nobody. Grounding from the end zone is a safety, and the Giants led 2–0 before the Patriots had gained a yard. They won by four.29

The “has been outside” clause is the subtle part, and it’s easiest to see in motion.

Show the Python
off = offense("gun_2x2")
dfn = defense("nickel", "two_high", off)
dfn = [q.moved(d=6.0, w=-3.5) if q.key == "WILL" else q for q in dfn]
sp = Play(off, dfn, los=40, to_go=10)
for k in ("X", "Z"):
    sp.route(k, r.go(12))
for k in ("H", "Y"):
    sp.route(k, r.seam(11))
for dk, rk in (("LCB", "X"), ("RCB", "Z"), ("NB", "H"), ("SS", "Y")):
    sp.man(dk, rk)
for k in ("LT", "LG", "C", "RG", "RT"):                  # the line sets and holds
    sp.block(k, pts=[(-1.3, 0.0)])
sp.block("RB", pts=[(0.6, -2.2)])                        # the back stays in to block
# the quarterback: drops, is flushed well right (out of the box), then steps back up inside it
sp.path("QB", [(-2.0, 0.0), (-2.8, 8.5), (-1.0, 1.5)], speed=5.0)
sp.path("SDT", [(-0.4, 0.9)], absolute=True); sp.path("WDT", [(-0.4, -0.9)], absolute=True)
sp.path("WDE", [(-3.5, -4.5), (-7.0, -1.2), (-8.8, 0.6)], absolute=True, speed=5.5)   # flushes him, overruns
sp.path("SDE", [(-1.8, 4.6)], absolute=True)                                            # held up by the tackle...
sp.path("SDE", [(-6.0, 10.8)], absolute=True, delay=1.0)                                # ...then closes outside
sp.drop("MIKE", (6.0, 2.5)); sp.drop("FS", (13.0, -7.0))
trk = sp.to_tracking(t_after=2.4)
trk = trk[trk.time <= 4.6].copy()
T_THROW, LAND = 3.5, (2.5, -5.5)                         # lands past the line, in open grass
qb_at = sp.position("QB", T_THROW)
ball = trk.side == "ball"
pre = ball & (trk.time > 0.15) & (trk.time < T_THROW)       # carried in his right hand, not over his face
trk.loc[pre, "y"] -= 0.8
m = ball & (trk.time >= T_THROW)
tt = trk.loc[m, "time"].to_numpy()
T_FLIGHT = np.hypot(*(np.array(LAND) - qb_at)) / 16.0
f = np.clip((tt - T_THROW) / T_FLIGHT, 0, 1)
bd = qb_at[0] + f * (LAND[0] - qb_at[0])
bw = qb_at[1] + f * (LAND[1] - qb_at[1])
trk.loc[m, "x"], trk.loc[m, "y"] = sp.to_abs(bd, bw)
GNOTES = [("inside the box:\nthrow near a receiver", PURPLE), ("well outside:\nexception on", GREEN),
          ("back inside, but has\nbeen outside: still on", GREEN), ("lands past the line:\nlegal throwaway", GREEN)]


def g_decor(fld, t):
    tackle_box(fld.ax, fld, sp, -13.0, alpha=0.12)
    if t >= T_THROW:                                    # the ball's flight so far
        g = min(1.0, (t - T_THROW) / T_FLIGHT)
        end = (qb_at[0] + g * (LAND[0] - qb_at[0]), qb_at[1] + g * (LAND[1] - qb_at[1]))
        if g > 0.05:
            path_arrow(fld, sp, [tuple(qb_at), end], color=style.BALL, lw=1.6, head=10)


def g_notes(fld, i, t):
    txt, col = GNOTES[i]
    say(fld, sp, -10.8, -12.0, txt, color=col, fs=6.6 if PDF else 8.0, weight="bold")


show_scene(sp, trk, [0.4, 2.1, 3.4, 4.4], window=(-13.5, 15.5), lateral=(-19.5, 19.5), decor=g_decor,
           notes=g_notes)
Figure 49.10: Once outside, always outside (simulated tracking in Big Data Bowl format; an illustrative play). 0.4 s: the quarterback finishes his drop in the middle of the tackle box (shaded), so a throwaway must go near a receiver. 2.1 s: pressure flushes him to his right, well outside the box; the grounding exception is now on. 3.4 s: he steps back up inside the box, but he has been outside, so the exception stays on for the rest of the play. 4.4 s: he has thrown it away (dashed brown line) into open grass on the left, away from every receiver, and it landed past the line of scrimmage: legal, no flag. Had it landed short of the line, it would be grounding.

The measurement: chains, cameras, and the spot

Downs, Distance, and Field Position described the chain crew’s ritual: two sticks joined by ten yards of chain, carried onto the field to see whether the ball’s nose had reached the front stick. Since 2025 that walk is mostly gone. A virtual measurement, often called a Hawk-Eye measurement after the Sony system that does it, uses six 8K cameras around the stadium to measure the distance from where the ball sits to the line to gain, and hands the answer to the officials in about 30 seconds, while a virtual graphic of the measurement plays on the broadcast and the stadium screens. The chain crew stays on the sideline as the visible marker for players and coaches, and as a backup if the cameras fail.30

Show the Python
q = Play([], None, los=62.0, ball_y="middle", to_go=None)   # d = yards past where this series began
LTG, NOSE = 10.0, 9.85                                     # line to gain; the ball's nose, about 5 inches short
fig, axes = plt.subplots(1, 2, figsize=(6.5, 4.0), gridspec_kw=dict(width_ratios=[1.25, 1]))


def ball_shape(ax, fld, w=0.0, scale=1.0):
    bx, by = XY(fld, q, NOSE - 0.155 * scale, w)
    ax.add_patch(Ellipse((bx, by), 0.19 * scale, 0.31 * scale, fc=style.BALL, ec="white", lw=0.6, zorder=9))


def ltg_line(ax, fld, w0, w1):
    (x0, y0), (x1, y1) = XY(fld, q, LTG, w0), XY(fld, q, LTG, w1)
    ax.plot([x0, x1], [y0, y1], color=style.LINE_TO_GAIN, lw=2.2, zorder=3)


# left: the chain crew's measurement on the field
ax = axes[0]
fld = Field(ax=ax, orient="vertical", los=69.0, window=(-8.0, 6.0), to_go=None,
            lateral=(MIDDLE - 6.5, MIDDLE + 6.5))
no_numbers(ax)
for ln in list(ax.lines):                       # the line of scrimmage Field draws is not part of this story
    if ln.get_color() == style.OFFENSE_DARK:
        ln.remove()
ltg_line(ax, fld, -6.5, 6.5)
ball_shape(ax, fld, scale=3.0)
for d_ in (0.0, LTG):
    ax.plot(*XY(fld, q, d_, 0.6), marker="s", ms=6, color=style.DEFENSE_DARK, zorder=10)
ax.plot(*zip(XY(fld, q, 0.0, 0.6), XY(fld, q, LTG, 0.6)), color=style.INK_2, lw=1.0, ls=(0, (1, 1)), zorder=8)
ax.plot(*XY(fld, q, 3.0, 0.6), marker="D", ms=4.5, color=style.INK, zorder=10)
say(fld, q, 0.3, 3.2, "rear stick", fs=6.4)
say(fld, q, 3.0, 3.8, "clip laid on the\nnearest 5-yard\nstripe", fs=6.4)
say(fld, q, 11.0, 3.2, "front stick", fs=6.4)
say(fld, q, 10.9, -3.6, "line to gain", fs=6.4, color=style.INK)
say(fld, q, 8.0, -2.8, "the ball\n(not to scale)", fs=6.2, color=style.BALL, weight="bold")
ax.set_title("Until 2024: the chains walk out", fontsize=8.2, loc="left", fontweight="bold", color=style.INK)
# right: a close-up of the same spot, where the cameras measure
ax = axes[1]
fld = Field(ax=ax, orient="vertical", los=62.0 + LTG, window=(-1.0, 0.9), to_go=None,
            lateral=(MIDDLE - 0.95, MIDDLE + 0.95), hashes=False, numbers=False)
xl, yl = ax.get_xlim(), ax.get_ylim()           # Field pads half a yard; at this zoom, drop the pad
ax.set_xlim(xl[0] + 0.5, xl[1] - 0.5); ax.set_ylim(yl[0] + 0.5, yl[1] - 0.5)
ltg_line(ax, fld, -0.95, 0.95)
band = [XY(fld, q, *pt) for pt in [(NOSE - 0.33, -0.95), (NOSE - 0.33, 0.95), (NOSE + 0.33, 0.95), (NOSE + 0.33, -0.95)]]
ax.add_patch(Polygon(band, closed=True, fc=style.DEFENSE, alpha=0.10, ec="none", zorder=2))
ball_shape(ax, fld)
(mx, my0), (_, my1) = XY(fld, q, NOSE, 0.28), XY(fld, q, LTG, 0.28)
ax.annotate("", xy=(mx, my1), xytext=(mx, my0), arrowprops=dict(arrowstyle="<->", color=GREEN, lw=1.3,
                                                                 shrinkA=0, shrinkB=0), zorder=11)
say(fld, q, LTG + 0.5, 0.45, "measured: about\n5 inches short", fs=6.4, color=GREEN, weight="bold")
say(fld, q, LTG + 0.5, -0.5, "line to gain", fs=6.4, color=style.INK)
say(fld, q, NOSE - 0.62, 0.0, "the spot, chosen by eye\n(shaded: illustrative error)", fs=6.0,
    color=style.DEFENSE_DARK, weight="bold")
ax.set_title("Since 2025: cameras measure the gap", fontsize=8.2, loc="left", fontweight="bold",
             color=style.INK)
fig.tight_layout(w_pad=0.8)
plt.show()
Figure 49.11: What changed in 2025, and what didn’t. Left, the old way: the chain crew carries the sticks onto the field. At the start of the series an official clipped the chain at the nearest 5-yard stripe; laying that clip back on the same stripe puts the rear stick exactly where the series began, so the front stick, ten yards on, can be compared with the nose of the ball (the ball is drawn larger than scale). Right, a close-up of the same spot, about two yards across: since 2025, six cameras around the stadium measure the gap between the ball’s nose and the line to gain, to a fraction of an inch. But in both, the ball sits where an official spotted it by eye (the shaded band is an illustrative margin of error, not a measured one): the cameras measure from that spot; they don’t choose it.

The change is a nice lesson in two words that sound alike. Precision is how finely you can measure; accuracy is whether you measured from the right place. The chains were not very precise (a clip laid by hand, a chain pulled taut by eye), and they were slow. The cameras are extremely precise. But they measure from the spot, and the spot is still a human judgment: an official running alongside the play, often looking through a pile of bodies, deciding where the ball’s nose was when forward progress stopped. A measurement precise to a fraction of an inch, taken from a spot that could be off by a foot, is only as accurate as the spot. That is why the spot itself can still be reviewed, but only in narrow cases: on a play that’s challenged or booth-reviewed, or through replay assist, the booth can move the spot when the video clearly shows where the ball was relative to the line to gain or the goal line. (Who decides to measure at all? The referee. A team’s captain can ask him for one, but it’s his call.)31

CautionCommon misconception

“The cameras decide first downs now.” They decide the measurement. The officials still spot the ball by eye, and the yellow line on your screen is still the broadcaster’s drawing, not an official mark. When a spot looks wrong, the cameras can’t help; only the replay booth’s look at the spot can.

Reading the referee’s announcement

Every announcement follows the same grammar, and once you know it you can usually finish the referee’s sentence for him. For a foul, the order is: what the foul was, who committed it (offense or defense, and the player’s number), how much it costs and from where, and what happens to the down. For a review it’s: the outcome (stands, confirmed, reversed), the reason in a sentence, and the result (the new down, distance and spot, and anything about the clock).

Table 49.2: Six announcements decoded. The words in quotation marks are the typical form; referees vary the wording a little.
What the referee says What it means
“Holding, number 72, offense. Ten-yard penalty. Repeat second down.” An accepted offensive holding foul: 10 yards from the previous spot, and the down is played again.
“Pass interference, defense, number 24. Spot foul. Automatic first down.” Defensive pass interference: the ball goes to the spot of the foul with a new set of downs.
“Offsetting fouls. Repeat third down.” A foul by each team; they cancel and the down is replayed.
“Illegal formation, offense. The penalty is declined. Fourth down.” The defense chose the play’s result over the yards (a third-down incompletion, say).
“After review, the ruling on the field stands. Third down.” The video wasn’t clear enough to overturn the call, whichever way it was.
“After review, the ruling on the field is reversed. The runner’s knee was down before the ball came out. There is no fumble. Second down.” The booth turned a turnover back into a tackle: the down-by-contact order of events.

The enforcement words (spot foul, declined, automatic first down) are taught in Contact Rules and Penalties. Before the announcement, the referee’s arm signal tells you most of it, and a few signals cover most flags: a hand gripping the other wrist for holding; both hands on the hips for offside or encroachment; forearms rolling over each other in front of the chest for a false start; both open hands pushed forward from the shoulders for pass interference; one wrist chopping the other above the head for a personal foul; and both arms, held parallel, waved diagonally across the body for intentional grounding.32

Do crews call games differently?

Each referee leads the same crew through a regular season, and fans and bettors love the idea that some crews are “flag-happy”. The data gives a measured answer. (The names are the referees who led each crew; Shawn Hochuli, for one, is Ed Hochuli’s son.)

Show the Python
fig, ax = plt.subplots(figsize=(6.5, 4.3))
ys = np.arange(len(wide))
ax.axvspan(avg25 - 2 * se_crew, avg25 + 2 * se_crew, color=style.GRID, alpha=0.7, lw=0, zorder=0)
ax.axvline(avg25, color=style.MUTED, lw=1.0, ls=(0, (3, 2)), zorder=1)
for y, (name, row) in zip(ys, wide.iterrows()):
    ax.plot([row[2024], row[2025]], [y, y], color=style.BASELINE, lw=1.4, zorder=2)
    ax.plot(row[2024], y, "o", ms=6, mfc=style.SURFACE, mec=style.OFFENSE, mew=1.4, zorder=3)
    ax.plot(row[2025], y, "o", ms=6, color=style.OFFENSE, zorder=4)
ax.set_yticks(ys, wide.index, fontsize=7.2)
ax.grid(axis="y", visible=False)
ax.tick_params(axis="x", labelsize=7)
ax.set_xlabel("Accepted penalties per game", fontsize=7.6)
ax.text(avg25, len(wide) - 0.2, f"2025 average {avg25:.1f}", ha="center", va="bottom", fontsize=6.8,
        color=style.INK_2)
h = [Line2D([], [], marker="o", ls="", mfc=style.SURFACE, mec=style.OFFENSE, mew=1.4, ms=6, label="2024"),
     Line2D([], [], marker="o", ls="", color=style.OFFENSE, ms=6, label="2025")]
ax.legend(handles=h, loc="lower right", fontsize=7.2)
ax.set_ylim(-0.7, len(wide) + 0.4)
fig.tight_layout()
plt.show()
Figure 49.12: Accepted penalties per game (both teams combined, every play) in games led by each referee’s crew, 2024 (hollow) and 2025 (filled), for the referees who led a crew in both seasons, sorted by 2025. The grey band is the range around the 2025 league average that a crew would land in from game-to-game randomness alone, about two standard errors for a 16-game sample. Most crews sit inside it, and the order reshuffles from one season to the next. Source: nflverse play-by-play and officials data (regular seasons).

In 2025 an average game had 12.8 accepted penalties, and the crews’ averages ran from 10.2 (Brad Allen’s crew) to 14.6 (Adrian Hill’s).33 That spread sounds large until you set it against the noise. A single game’s total varies a lot (the standard deviation was about 4.3 penalties), so a crew’s 16- or 17-game average would wander about ±2.2 around the league average by luck alone. Most crews sit inside that band. And the ranking usually doesn’t hold: the correlation between a crew’s 2024 and 2025 averages was 0.28, and across the ten seasons from 2016 to 2025 the year-to-year correlation was usually weak (median 0.28), occasionally strong (it ranged from -0.35 to 0.76). Only 12 of the 16 crews landed in the same half of the table both years.

So crews differ a little, and inconsistently. Teams are hardly more predictable: a team’s own rate of accepted fouls has a median year-to-year correlation of 0.32 over the same seasons. Most of a single game’s flag count, in other words, is noise: who happened to hold on which snap, in front of which official. And some of the variation is the league’s doing, not the crews’: the league-wide average swings with points of emphasis, from 11.2 to 13.5 per game across 2016–2025, which is why a preseason memo telling officials to watch for a particular foul can move the numbers for every crew at once.

Film room

NoteFilm room: Cowboys at Packers, 2014 divisional playoffs, the catch that wasn’t

Find the play: January 11, 2015, fourth quarter, 4:42 left, fourth-and-2 at the Green Bay 32, Dallas down 26–21. Watch Dez Bryant and count the gates. Control: yes, above the cornerback. Feet: yes. Time: the argument. He takes three steps while falling and stretches the ball toward the goal line, and the ball hits the turf and moves as he lands. Under the 2014 rule, he was going to the ground in the process of the catch, so his three steps and his reach didn’t count; he had to keep control through the ground, and replay ruled he hadn’t. Under the 2018 rule, those steps and that reach are acts common to the game, made before the ball touched down, so the catch was complete before he landed. Watch the replay twice, once with each rule in your head, and you’ll understand why the league changed it.

NoteFilm room: Patriots at Jets, 2017, the touchback nobody recovered

October 15, 2017, fourth quarter, 8:31 left, the Jets down 24–14 at the New England 4. Austin Seferian-Jenkins catches a short pass and turns toward the goal line; as he dives for it, with a defender on him, the ball comes loose. Ruled a touchdown, it went to the booth as a scoring play. Replay ruled he lost the ball before crossing the line and didn’t regain control until he was out of bounds in the end zone: a fumble out of the end zone. That second point was the argument afterward; two former league officiating chiefs said they wouldn’t have overturned it, and the league stood by the call. No defender recovered anything, and the Patriots got the ball at their own 20. New England won by seven.34

NoteFilm room: the 2025 season, the cameras arrive

Pick any 2025 or 2026 game and wait for a close spot on third or fourth down. Watch the order of events: the official spots the ball by eye, the referee signals for a measurement, and within about half a minute the stadium screen shows the virtual line against the ball’s nose. The chain crew never leaves the sideline. Then watch the reactions: players and coaches now argue about the spot, the only human part left, and almost never about the measurement.

Watch for it on Sunday

TipWatch for it: the ref’s mic

Every time a flag flies, or a ruling is close, make two calls before the referee turns on his microphone:

  1. Name the official. Who threw it? A flag from the line of scrimmage at a sideline is the down or line judge (pre-snap foul, likely false start, offside or illegal formation). A flag from deep downfield is a side, field or back judge (likely pass interference or illegal contact). A flag from the backfield, near the quarterback, is the referee (roughing the passer, grounding) or the umpire (holding in the middle).
  2. Name the foul or the ruling, and its result: how many yards, from where, and the down that follows.
  3. On every review, predict the outcome: reversed, confirmed or stands. First ask who started it (a coach’s flag, or the booth: after the two-minute warning, a score, a turnover). Then ask which angle would settle it. If the decisive moment is hidden (a pile, a body in the way), say stands.
  4. On every close catch, count the gates out loud: control, feet, time.

Keep a tally for one game, and add your review predictions to your prediction log. You’ll miss plenty at first; by the end of a season the official-then-foul habit will have you announcing it before the referee does.

Predict the play

TipPredict the play 1: the sideline catch
Show the Python
off = [O("QB", "QB", -6.5, -1.0, "Q"), O("Z", "WR", -0.7, 13.0, "Z")]
dfn = [D("RCB", "CB", 15.0, 17.0, "C"), D("SS", "SS", 12.0, 7.0, "S")]
pp = Play(off, dfn, los=58, ball_y="right", to_go=6)
pp.route("Z", [(0, 0), (9.0, 0.5), (13.2, 8.8)], side=+1)
pp.path("RCB", [(13.3, 20.3)], absolute=True)                    # rallies down from deeper and drives him out
pp.pass_to("Z", t=1.6)
fld = pp.draw(lateral=(-3.0, 32.0), window=(-8.5, 22.5), title=False)
ax = fld.ax
no_numbers(ax)
official(ax, *XY(fld, pp, 19.6, 25.0), "FJ", fld.pts_per_yard(), r=1.3)
feet = [(12.6, 22.0), (14.0, 23.1)]                  # right foot, then left foot, both inside the line
for dd, ww in feet:
    ax.plot(*XY(fld, pp, dd, ww), marker="o", ms=5.5, color=style.OFFENSE_DARK, zorder=11, mec="white", mew=0.6)
ball_at(fld, pp, 15.4, 25.6)
ax.annotate("", xy=XY(fld, pp, 12.3, 22.4), xytext=XY(fld, pp, 9.0, 25.0), zorder=11,
            arrowprops=dict(arrowstyle="-", color=style.OFFENSE_DARK, lw=0.8))
say(fld, pp, 8.0, 26.6, "both feet down\nin bounds", fs=6.6, color=style.OFFENSE_DARK, weight="bold")
say(fld, pp, 12.0, 28.4, "ball shifts\nin his hands\nas he lands", fs=6.4, color=style.DEFENSE_DARK, weight="bold")
say(fld, pp, 3.0, 24.6, "sideline", fs=6.0, box=False, rot=90)
plt.show()
Figure 49.13: Second quarter, 1:52 left. The receiver (Z) catches a pass running toward the right sideline at the opponent’s 38, gets his right foot down in bounds, then his left, and is knocked out of bounds by the cornerback. As he lands out of bounds the ball shifts in his hands, but his hands stay on it and it never touches the ground. The deep official on that side, about 20 yards downfield near the sideline (the far side from the chain crew), signals incomplete. The offense’s head coach reaches for his red flag.

Which official made the call? Can the coach challenge? Who decides, and what will the referee announce?

The field judge, the deep wing on the far side from the chain crew. The coach can’t challenge: it’s after the two-minute warning, so only the booth can review it (his flag would just cost a timeout). The replay official starts the review, New York decides, the referee announces.

The review runs the gates. Control and feet: yes, both feet in bounds with the ball secured. Time: a toe-tap leaves no time for a football act, so he had to keep control through his landing out of bounds, and he did: a ball that shifts while his hands stay on it is slight movement, and it never touched the ground. So: “After review, the ruling on the field is reversed. The pass is complete,” dead where he went out. No 10-second runoff: a catch that ends out of bounds stops the clock anyway. (Had the ball come loose and hit the ground, it would “stand” or be “confirmed”: incomplete.)

TipPredict the play 2: reaching for the pylon
Show the Python
gl = [O(k, k, -0.7, w, "") for k, w in [("LT", -3.2), ("LG", -1.6), ("C", 0.0), ("RG", 1.6), ("RT", 3.2)]]
gl += [O("YL", "TE", -0.7, -4.8, "Y"), O("YR", "TE", -0.7, 4.8, "Y"), O("Z", "WR", -1.5, 17.0, "Z"),
       O("QB", "QB", -2.0, 0.0, "Q"), O("FB", "FB", -4.4, 0.0, "F"), O("RB", "RB", -6.8, 0.0, "R")]
pz = Play(gl, [D("SS", "SS", 3.5, 8.0, "S"), D("CB", "CB", 3.0, 20.5, "C")], los=107, ball_y="right", to_go=None)
pz.run("RB", [(-3.2, 4.0), (-1.6, 9.6), (2.0, 14.2)], absolute=True)       # bounces outside the tight end
pz.path("SS", [(2.6, 11.2)], absolute=True)
pz.path("CB", [(1.2, 15.8)], absolute=True)
fld = pz.draw(lateral=(-8.5, 30.0), window=(-8.5, 13.5), title=False)
ax = fld.ax
no_numbers(ax)
xmark(fld, pz, 2.0, 14.2)
path_arrow(fld, pz, [(2.0, 14.2), (4.8, 17.6), (7.5, 23.58), (8.0, 24.8)])
say(fld, pz, -2.5, 25.2, "sideline", fs=6.0, box=False, rot=90)
say(fld, pz, 3.6, 4.0, "goal line", fs=6.2)
say(fld, pz, 11.8, 12.0, "end line", fs=6.2)
ax.annotate("", xy=XY(fld, pz, 2.4, 13.6), xytext=XY(fld, pz, 4.6, 12.9), zorder=11,
            arrowprops=dict(arrowstyle="-", color=style.DEFENSE_DARK, lw=0.8))
say(fld, pz, 5.6, 12.2, "punched out\nat the 1", fs=6.6, color=style.DEFENSE_DARK, weight="bold")
say(fld, pz, 8.6, 17.0, "out of bounds\nin the end zone", fs=6.6, color=style.BALL, weight="bold")
plt.show()
Figure 49.14: Third-and-goal from the 3, third quarter, the offense in a heavy goal-line set (two tight ends, a fullback). The running back (R) bounces outside and dives for the pylon, holding the ball out in his outside arm. At the 1 the cornerback (C), coming from outside, punches it loose; it bounces into the end zone and rolls out of bounds through the side of the end zone. Nobody touches it after the punch.

What’s the ruling, and who gets the ball where? What if the ball had gone out of bounds at the 1 instead?

A fumble through the end zone: touchback, the defense’s ball at its own 20, though it never recovered anything. As a turnover, the booth reviews it automatically, asking in order: did the ball break the plane, or touch the pylon, while he still had it? (touchdown); was he touched and down before it came out? (fourth-and-goal at the 1); did the loose ball really go out in the end zone? (A loose ball that hits the pylon is out there too: touchback.)

Out of bounds at the 1 instead, the offense keeps it, back at the spot of the fumble: fourth-and-goal from the 1. A few feet of turf, worth several expected points: that’s why coaches tell runners to carry the ball high and tight near the goal line.

TipPredict the play 3: flushed and thrown away
Show the Python
gg = [O(k, k, -0.7, w, "") for k, w in [("LT", -3.2), ("LG", -1.6), ("C", 0.0), ("RG", 1.6), ("RT", 3.2)]]
gg += [O("QB", "QB", -5.0, 0.0, "Q"), O("RB", "RB", -4.6, -2.6, "RB")]
pg = Play(gg, [D("DE", "DE", 0.9, 4.6, "E"), D("DT", "DT", 0.9, -0.9, "T")], los=40, to_go=8)
pg.path("QB", [(-7.5, 1.0), (-8.0, 7.0), (-7.0, 12.5)], absolute=True)
pg.block("RB", pts=[(0.8, -0.8)])
fld = pg.draw(lateral=(-12.0, 30.5), window=(-14.0, 6.0), title=False)
ax = fld.ax
no_numbers(ax)
tackle_box(ax, fld, pg, -14.0)
official(ax, *XY(fld, pg, -11.5, 5.5), "R", fld.pts_per_yard(), r=1.15)
path_arrow(fld, pg, [(0.0, 5.2), (-4.6, 7.6), (-6.0, 10.6)], color=style.DEFENSE, lw=1.4, ls="-", head=10)  # the end closes
path_arrow(fld, pg, [(-7.0, 12.5), (-1.0, 27.8)], color=style.BALL, lw=1.6)
ball_at(fld, pg, -1.0, 27.8)
say(fld, pg, -9.0, 22.0, "lands out of bounds,\na yard short of the line", fs=6.4, color=style.BALL, weight="bold")
say(fld, pg, -11.8, -4.8, "tackle box", color=PURPLE, fs=6.4, weight="bold")
say(fld, pg, 1.4, -7.0, "line of scrimmage", color=style.OFFENSE_DARK, fs=6.2)
say(fld, pg, 1.0, 25.4, "sideline", fs=6.0, box=False, rot=90)
plt.show()
Figure 49.15: Third-and-8 at the offense’s own 30. The quarterback is flushed from the pocket to his right, well outside the tackle box (shaded), with the end closing on him and his receivers covered downfield. Running toward the sideline, he throws the ball away; it lands out of bounds a yard short of the line of scrimmage. A flag flies from the backfield. The referee (R) is shown where he started the play, behind the quarterback on his throwing-arm side.

Who threw the flag, and for what? Where is the ball, and what down is it?

The referee, for intentional grounding: he watches the quarterback, and grounding is his call. Pressure: the end was closing. No receiver near: nobody. The box: he was outside it, so the exception applies, but only if the ball reaches the line of scrimmage, and this one landed a yard short. (A yard past the line, it would have been a legal throwaway.)

The penalty is loss of down and 10 yards from the previous spot (the spot of the pass, about 7 yards back, isn’t farther), so the ball goes back to the 20 and it’s fourth-and-18: almost certainly a punt. “Intentional grounding, offense. Ten-yard penalty and loss of down. Fourth down.” Replay assist can’t save him: being outside the pocket isn’t what made this one grounding.

Takeaways

  • Seven officials split the field and the players: the referee (white cap) the quarterback, the umpire the interior line, the down and line judges the line of scrimmage and sidelines, the side, field and back judges the receivers downfield. Where a flag came from tells you what it is likely to be.
  • Replay asks two questions in order. Is the ruling reviewable at all (judgment fouls aren’t)? Does the booth review it automatically (scores, tries, turnovers, short on fourth down, after the two-minute warning, overtime)? If not, only a coach’s challenge, paid for with a timeout, can open it. Replay assist runs alongside on clear objective facts and the objective part of a short list of flags. There is no sky judge.
  • Reversals need clear and obvious evidence, so a hidden moment usually “stands”; “stands” and “confirmed” leave the play exactly as called.
  • A catch is three gates: control, feet down, then time. Since 2018 a football act made on the way down finishes the catch; only a receiver who hits the ground before he’s had time for one must survive the ground. The rule now matches what people see, at the price of a judgment about time.
  • The order of events decides possession, and direction and territory decide the rest. Ball out before the knee is a fumble; an NFL runner needs to be touched to be down. A forward fumble out of bounds comes back to the spot of the fumble, but into the opponent’s end zone and out it’s a touchback. A pass that doesn’t go forward is a backward pass and stays live if dropped. Grounding is about the box and the line: once outside the box, a throwaway just has to reach the line.
  • Cameras measure, people spot, and crew differences in flags are small and unstable from year to year.

Connections

Builds on: Contact Rules and Penalties (the fouls these officials call and how they’re enforced), Quarterback Play (the throwaway), Downs, Distance, and Field Position (the spot, forward progress, the chains) and What a Play Really Is (the staff who advise on challenges).

Sets up: The Clock, the Two-Minute Drill, and Fourth Down, where spikes, grounding, the booth’s control of the final two minutes and the value of a timeout spent on a challenge all become clock decisions; and Red Zone, Goal Line, Two-Point Plays, and Short Yardage, where forward progress and the goal-line spot decide the tush push and every fourth-and-inches. The rules’ history (the 1978 passing changes, the catch rule, replay) is placed in context in The 1978 Liberation and Appendix E, and Part 13 shows how to pull the review and penalty data behind this chapter’s charts yourself (nflverse in Python).

NoteGo deeper
  • The NFL Rulebook (NFL Football Operations, free online): Rule 7 (dead ball, down by contact), Rule 8 (passes, grounding, fumbles), Rule 15 (instant replay); the league also posts officiating videos.
  • Football Zebras (footballzebras.com), written by former officials and longtime followers of officiating: crew assignments, rule changes and play-by-play explanations of controversial calls.
  • nflverse (via nflreadpy): load_officials() for every game’s crew since 2015, and the play-by-play desc text for every recorded review and penalty, enough to rebuild this chapter’s charts.
  • Former NFL officiating chiefs (Mike Pereira, Dean Blandino) explain controversial calls on broadcasts every week: the fastest way to learn how the booth thinks.

  1. The positions and duties follow the NFL’s own descriptions (“Officials’ responsibilities and positions,” NFL Football Operations), as reproduced in Crescent City Sports, “Breakdown of duties for NFL game officials” (Oct. 20, 2019): referee and umpire 10–12 yards deep in the backfield, side judge and field judge 20 yards downfield, back judge 25 yards: https://crescentcitysports.com/breakdown-of-duties-for-nfl-game-officials/ ; “Official (American football),” Wikipedia, for the referee favoring the quarterback’s throwing arm and the seven abbreviations: https://en.wikipedia.org/wiki/Official_(American_football).↩︎

  2. The umpire was moved to the offensive backfield for the 2010 season after a run of injuries to umpires in the middle of the defense (five serious ones in 2009). Because walking up from the backfield to spot the ball slowed hurry-up offenses, from 2010 to 2015 he returned to the defensive side in the closing minutes of the game (Wikipedia gives the last five minutes; some accounts of the 2010 rule add the last two minutes of the first half); that exception was dropped in 2016, and since 2023 he works on the defensive side on field goals and extra points. “Official (American football),” Wikipedia (umpire): https://en.wikipedia.org/wiki/Official_(American_football).↩︎

  3. The NFL went to seven officials in 1978 by adding the side judge; the back judge and field judge exchanged titles in 1998 to match college and high-school usage; and the head linesman was renamed the down judge in 2017. “Official (American football),” Wikipedia (history): https://en.wikipedia.org/wiki/Official_(American_football) ; “1998 NFL season,” Wikipedia: https://en.wikipedia.org/wiki/1998_NFL_season. The 1978 changes to pass-defense rules are covered in The 1978 Liberation.↩︎

  4. Part-time status and the full-time experiments of 2017, 2019 and 2020: Associated Press, “NFL set to begin hiring and training replacement officials, AP sources say” (Mar. 30, 2026), via WTOP: https://wtop.com/nfl/2026/03/nfl-set-to-begin-hiring-and-training-replacement-officials-ap-sources-say/ . Playoff crews assembled from individually graded officials (“mixed crews”; all-star crews only for the conference championships and the Super Bowl): Ben Austro, “How does the NFL assign mixed crews for the playoffs,” Football Zebras (Jan. 6, 2025): https://www.footballzebras.com/2025/01/how-does-the-nfl-assign-mixed-crews-for-the-playoffs-2024/ . The one-year contingency rule: Fox News, “2026 NFL rule changes: 1-year rule to allow replay center to correct mistakes approved” (Mar. 31, 2026): https://www.foxnews.com/sports/2026-nfl-rule-changes-1-year-rule-allow-replay-center-correct-mistakes-approved . The seven-year agreement (May 8, 2026, through 2032): Pro Football Rumors, “NFL, NFLRA agree to seven-year CBA”: https://www.profootballrumors.com/2026/05/nfl-nflra-agree-to-seven-year-cba.↩︎

  5. Pro Football Hall of Fame, Art McNally (Class of 2022, the first game official enshrined; NFL supervisor of officials 1968–1991; the “Father of Instant Replay”): https://www.profootballhof.com/players/art-mcnally/ ; Pro Football Hall of Fame, “1975: Referees are equipped with wireless microphones”: https://www.profootballhof.com/football-history/football-history/1960-1979/1975 ; Football Zebras, “Referee announcements have come a long way in 38 years” (Oct. 2013): https://www.footballzebras.com/2013/10/referee-announcements-have-come-a-long-way-in-38-years/. The league’s New York officiating center is “Art McNally GameDay Central”: https://operations.nfl.com/rules-officiating/instant-replay/art-mcnally-gameday-central.↩︎

  6. NFL Rulebook (2026), Rule 15, Section 1, Article 2 (only the Replay Official, or the senior vice president of officiating or a designee, may start a review after the two-minute warning, in overtime, on scores, tries, turnovers, a ruling of short on fourth down, kicking-team possession and disqualifications) and Section 2 (reviews conducted by the senior vice president of officiating or a designee, in consultation with the Replay Official and the Referee at a field-level monitor): https://operations.nfl.com/rules-officiating/2026-nfl-rulebook .↩︎

  7. “Replay review in gridiron football,” Wikipedia (NFL section): the 1986–1991 system, the 1999 challenge system, automatic review of scoring plays (2011) and turnovers (2012), centralized decisions in New York (2017), and the one-season pass-interference review (2019): https://en.wikipedia.org/wiki/Replay_review_in_gridiron_football.↩︎

  8. NFL Rulebook (2026), Rule 15, Section 1: two challenges, each needing an available timeout; a timeout charged for an unsuccessful challenge; a third challenge if at least one succeeds; a team that challenges when it isn’t permitted to is charged a timeout, or 15 yards if it has no timeouts left; only the Replay Official may start a review after the two-minute warning, in overtime, on scores, tries, turnovers and a ruling of short on fourth down: https://operations.nfl.com/rules-officiating/2026-nfl-rulebook . The 2024 change (a Detroit proposal; before it, both of the first two challenges had to succeed): Pride of Detroit, “Detroit Lions rule proposal on challenges barely accepted” (Mar. 25, 2024): https://www.prideofdetroit.com/2024/3/25/24111469/detroit-lions-rule-proposal-challenges-barely-accepted-2024-nfl-season.↩︎

  9. nflverse play-by-play, 2012 Week 12, Houston at Detroit, third quarter, 6:50: “28-J.Forsett up the middle for 81 yards, TOUCHDOWN. Penalty on Detroit head coach. PENALTY on DET, Unsportsmanlike Conduct, 15 yards”; Houston won 34–31 on an overtime field goal. NFL.com, “NFL executive promises challenge rule will be changed” (Nov. 2012): https://www.nfl.com/news/nfl-executive-promises-challenge-rule-will-be-changed-0ap1000000140759 ; the change adopted at the March 2013 annual meeting (a timeout charged, or 15 yards with none left, and the play still reviewed): Close Call Sports, “NFL deletes tuck rule during annual meeting” (Mar. 21, 2013): https://www.closecallsports.com/2013/03/nfl-deletes-tuck-rule-during-annual.html.↩︎

  10. Course calculation from nflverse play-by-play, 2016–2025: plays flagged replay_or_challenge, classified by their description (“[team] challenged the … ruling” for a coach’s challenge, “The Replay Official reviewed the … ruling” for the booth) and by the result (“REVERSED” or “Upheld”; nflverse text does not separate “stands” from “confirmed”). Challenge figures are regular season only. Reviews that ended quickly without a stoppage are generally not written into the play text.↩︎

  11. NFL Rulebook (2026), Rule 15, Section 5 (after a changed ruling the clock is reset to when the ball should have been dead; a 10-second runoff when the changed ruling means a running clock, for plays after the two-minute warning, avoidable with a timeout) and Rule 4, Section 7, Article 4: https://operations.nfl.com/rules-officiating/2026-nfl-rulebook.↩︎

  12. 2021 start: ESPN, “NFL replay reviews, challenges drop with new rules and tech”: https://www.espn.com/nfl/story/_/id/35468076/nfl-replay-reviews-challenges-drop-new-rules-tech . 2024 (flags for roughing the passer, grounding, hits out of bounds): CBS Sports, “NFL to expand replay reviews to include intentional grounding, roughing the passer, hit out of bounds” (Mar. 30, 2024): https://www.cbssports.com/nfl/news/nfl-to-expand-replay-reviews-to-include-intentional-grounding-roughing-the-passer-hit-out-of-bounds . 2025 (hits on a defenseless player, face mask, horse-collar, tripping, roughing or running into the kicker; no fouls added): CBS Sports, “Five new NFL rules to know heading into Week 1 of preseason”: 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 . The current list is in NFL Rulebook (2026), Rule 15, Section 9: https://operations.nfl.com/rules-officiating/2026-nfl-rulebook . 2026: Seattle Seahawks, “NFL announces approved rule changes for 2026 season” (league personnel may consult on ejections for flagrant football and non-football acts): https://www.seahawks.com/news/nfl-announces-approved-rule-changes-for-2026-season.↩︎

  13. Mike Florio, “USFL playoff game shows value of sky judge approach,” ProFootballTalk (June 25, 2023): https://www.nbcsports.com/nfl/profootballtalk/rumor-mill/news/usfl-playoff-game-shows-value-of-sky-judge-approach . The NFL idea dates at least to 2019, when the coaches’ subcommittee of the competition committee proposed an eighth official in the booth: NFL.com, “Competition committee will explore adding sky judge” (Feb. 2019): https://www.nfl.com/news/competition-committee-will-explore-adding-sky-judge-0ap3000001019996.↩︎

  14. NFL Rulebook (2026), Rule 8, Section 1, Article 3 (completed or intercepted pass): control in the hands or arms before the ball touches the ground; both feet or another body part other than the hands in bounds; then an act common to the game, or control long enough to perform one; Note 1, movement of the ball does not automatically mean loss of control; Note 2, a player who has not yet made the act and loses control when he hits the ground, in bounds or out, has not caught it; Note 4, a simultaneous catch by two eligible opponents belongs to the passing team, but not if one player had control first: https://operations.nfl.com/rules-officiating/2026-nfl-rulebook.↩︎

  15. All three plays appear in nflverse play-by-play: 2010 Week 1, Detroit at Chicago, 0:31 left in the fourth quarter (“pass incomplete deep right to 81-C.Johnson. The Replay Assistant challenged the incomplete pass ruling, and the play was Upheld”); the 2014 divisional round, Dallas at Green Bay, 4:42 left (“pass deep left to 88-D.Bryant to GB 1 for 31 yards … Green Bay challenged the pass completion ruling, and the play was REVERSED”); 2017 Week 15, New England at Pittsburgh, 0:34 left (“pass short middle to 81-J.James for 10 yards, TOUCHDOWN. The Replay Official reviewed the pass completion ruling, and the play was REVERSED”). Final scores: Bears 19–14, Packers 26–21, Patriots 27–24.↩︎

  16. NFL.com, “NFL teams unanimously approve simplified catch rule” (Mar. 27, 2018; control, two feet or another body part down, and a football move such as a third step or reaching for the line, or the ability to perform one; the going-to-the-ground element removed): https://www.nfl.com/news/story/0ap3000000923342/article/nfl-teams-unanimously-approve-simplified-catch-rule ; CBS Sports, “NFL catch rule: Dez Bryant, Jesse James non-catches would now count” (Troy Vincent and Al Riveron on the two plays): https://www.cbssports.com/nfl/news/nfl-catch-rule-dez-bryant-jesse-james-non-catches-would-now-count.↩︎

  17. The “force-out” ruling, under which an official could rule a catch when a receiver was pushed out of bounds before landing, was eliminated for the 2008 season: NFL.com, “New NFL rules for 2008”: https://www.nfl.com/news/new-nfl-rules-for-2008-09000d5d809f6279 . The carried-out exception: NFL Rulebook (2026), Rule 8, Section 1, Article 3, Note 5: https://operations.nfl.com/rules-officiating/2026-nfl-rulebook.↩︎

  18. NFL Rulebook (2026), Rule 7, Section 2, Article 1(a) (the ball is dead when a runner is contacted by an opponent and touches the ground with any part of his body other than his hands or feet) and 1(d) (a runner who slides or gives himself up) and 1(b) (the ball is dead when a runner’s forward progress ends, so a runner then pushed out of bounds is treated as down in bounds): https://operations.nfl.com/rules-officiating/2026-nfl-rulebook ; NCAA Football Rules, Rule 4-1-3 (a ball carrier is down when any part of his body other than a hand or foot touches the ground, contact or not).↩︎

  19. NFL Rulebook (2026), Rule 7, Section 2, Article 1(o) (erroneous whistle: a team in possession may take the ball where it was declared dead or replay the down; after a fumble or backward pass, the team last in possession may take it where possession was lost or replay the down; a legal forward pass or a kick in flight is replayed), which yields to replay under Rule 15-2-3: https://operations.nfl.com/rules-officiating/2026-nfl-rulebook.↩︎

  20. nflverse play-by-play, 2008 Week 2, San Diego at Denver, 1:17 left in the fourth quarter, second-and-goal at the 1: “6-J.Cutler pass incomplete short right to 28-M.Pittman. The Replay Assistant challenged the fumble ruling, and the play was REVERSED. … FUMBLES (Team), declared dead at LAC 10.” Final score Broncos 39, Chargers 38. On Hochuli’s apology: “Ed Hochuli,” Wikipedia: https://en.wikipedia.org/wiki/Ed_Hochuli.↩︎

  21. ProFootballTalk, “Hochuli rule approved” (March 2009): https://www.nbcsports.com/nfl/profootballtalk/rumor-mill/news/hochuli-rule-approved . The current wording (“possession may be awarded to a player who clearly recovers a loose ball in the immediate continuing action”): NFL Rulebook (2026), Rule 15, Section 2, Article 3: https://operations.nfl.com/rules-officiating/2026-nfl-rulebook.↩︎

  22. “Tuck Rule Game,” Wikipedia (the January 19, 2002, divisional playoff between the Raiders and Patriots, and the rule’s abolition in 2013): https://en.wikipedia.org/wiki/Tuck_Rule_Game.↩︎

  23. NFL Rulebook (2026), Rule 8, Section 7, Article 3, Items 3 and 4 (a fumble out of bounds forward is returned to the spot of the fumble; one that goes forward into the opponent’s end zone and over the end line or sideline is a touchback for the defense; one that goes out of bounds in a team’s own end zone, when that team supplied the impetus, is a safety), Rule 11, Section 6 (touchbacks) and Rule 3, Section 28 (safety): https://operations.nfl.com/rules-officiating/2026-nfl-rulebook . The Seferian-Jenkins play is in nflverse play-by-play, 2017 Week 6, New England at the Jets, 8:31 left in the fourth quarter (“The Replay Official reviewed the runner broke the plane ruling, and the play was REVERSED … FUMBLES (21-M.Butler), ball out of bounds in End Zone, Touchback”); final score Patriots 24, Jets 17.↩︎

  24. CBS Sports, “NFL competition committee sees no need to change rule on fumbling through end zone, per report” (Feb. 26, 2024; the second time since 2017 the committee declined to change it): https://www.cbssports.com/nfl/news/nfl-competition-committee-sees-no-need-to-change-rule-on-fumbling-through-end-zone-per-report/ . Rule 8, Section 7, Article 3, Item 4(a) of the 2026 rulebook still makes it a touchback.↩︎

  25. “Holy Roller (American football),” Wikipedia (Raiders at Chargers, September 10, 1978, and the 1979 rule limiting fourth-down and late-game fumble advances to the fumbling player): https://en.wikipedia.org/wiki/Holy_Roller_(American_football) ; today’s wording: NFL Rulebook (2026), Rule 8, Section 7, Articles 5 and 6.↩︎

  26. NFL Rulebook (2026), Rule 8, Section 1, Articles 1 and 2 (a forward pass and the one legal forward pass per down, thrown from behind the line); Rule 3, Section 12, Article 2 (a pass parallel to a yard line is backward); Rule 8, Section 7, Article 1 (a runner may throw a backward pass at any time, and players of either team may advance after catching it or recovering it after it touches the ground); Rule 8, Section 1, Article 2, Item 1 and its penalties (a forward pass is illegal when the passer’s entire body and the ball are beyond the line at release, or when it is a second forward pass; loss of down and 5 yards): https://operations.nfl.com/rules-officiating/2026-nfl-rulebook.↩︎

  27. nflverse play-by-play, 1999 wild-card round, Buffalo at Tennessee, January 8, 2000, 0:16 left: “S.Christie kicks 46 yards from BUF 30 to TEN 24. L.Neal to TEN 25 for 1 yard. Lateral to F.Wycheck to TEN 25 for no gain. Lateral to K.Dyson for 75 yards, TOUCHDOWN.” “Music City Miracle,” Wikipedia (the replay review and the 22–16 final): https://en.wikipedia.org/wiki/Music_City_Miracle.↩︎

  28. NFL Rulebook (2026), Rule 8, Section 2, Article 1 (intentional grounding: the pass must be in the direction and vicinity of an originally eligible receiver unless a passer who is or has been outside the pocket area throws it to land at or beyond the line of scrimmage extended; penalty loss of down and 10 yards or at the spot of the pass, a safety from the end zone; the spike exception) and Rule 3, Section 25 (the pocket area, between the outside edges of the normal tackle positions, back to the end line): https://operations.nfl.com/rules-officiating/2026-nfl-rulebook . On the 2024 wording (any part of the body or the ball outside the pocket): Mike Florio, “New rule book subtly makes it easier for quarterbacks to throw ball away,” ProFootballTalk, July 31, 2024: https://www.nbcsports.com/nfl/profootballtalk/rumor-mill/news/new-rule-book-subtly-makes-it-easier-for-quarterbacks-to-throw-ball-away.↩︎

  29. nflverse play-by-play, Super Bowl XLVI (2011 season), New York Giants vs New England, February 5, 2012, first quarter, 9:00, first-and-10 at the New England 6: “12-T.Brady pass incomplete deep middle [91-J.Tuck]. PENALTY on NE-12-T.Brady, Intentional Grounding, 6 yards, enforced in End Zone, SAFETY.” The Giants won 21–17.↩︎

  30. NPR, “Say goodbye to chain crews: The NFL will use camera technology to measure 1st downs” (Apr. 1, 2025): https://www.npr.org/2025/04/01/nx-s1-5347990/nfl-first-downs-measurements-hawk-eye ; Sony, “Sony’s Hawk-Eye Innovations selected by the NFL to revolutionize line-to-gain measurements”: https://sony.mediaroom.com/2025-04-01-Sonys-Hawk-Eye-Innovations-Selected-by-the-NFL-to-Revolutionize-Line-to-Gain-Measurements ; CBS Sports on the 2025 debut (six 8K cameras, about 30 seconds per measurement): https://www.cbssports.com/nfl/news/no-chain-no-problem-nfl-debuts-new-virtual-measurement-system-during-hall-of-fame-game.↩︎

  31. NFL Rulebook (2026), Rule 4, Section 5, Article 5(a) (a referee’s timeout “when there is the possibility of a measurement for a first down, or if the Referee is consulting with a captain about one”) and Rule 15, Section 9(h) (replay assist on the location of the ball relative to a line): https://operations.nfl.com/rules-officiating/2026-nfl-rulebook.↩︎

  32. NFL Rulebook (2026), “Official Signals” (holding: grasping one wrist, the fist clenched, in front of the chest; offside or encroachment: hands on hips; false start: forearms rotated over and over in front of the body; pass interference: hands open and extended forward from the shoulders; personal foul: one wrist striking the other above the head; intentional grounding: parallel arms waved in a diagonal plane across the body): https://operations.nfl.com/rules-officiating/2026-nfl-rulebook.↩︎

  33. Course calculation, 2024 and 2025 regular seasons: nflverse load_officials() (the referee of each game) joined to play-by-play; accepted fouls counted from the play text, where nflverse writes an accepted foul as “PENALTY on” and a declined or offsetting one as “Penalty on”. Both teams’ fouls on every play, including kicks and pre-snap fouls, are counted. The band uses the 2025 game-level standard deviation and the average number of games per crew. Year-to-year correlations use every referee who led a crew in consecutive seasons, 2016–2025; the team version counts each team’s accepted fouls from the same play text, divided by 16 games a season through 2020 and 17 from 2021. Ed and Shawn Hochuli: “Ed Hochuli,” Wikipedia: https://en.wikipedia.org/wiki/Ed_Hochuli.↩︎

  34. ESPN, “Officiating czar stands by call to nullify New York Jets touchdown” (Oct. 2017; Al Riveron: he “never regains control of the football while contacting inbounds”; Mike Pereira and Dean Blandino said they would not have overturned it): https://www.espn.com/nfl/story/_/id/21042849/officiating-czar-stands-call-nullify-new-york-jets-touchdown.↩︎