Pass Protection: Slides, Man Schemes, and Who Blocks the Extra Guy

Five linemen, a clock, and a defense that decides after the snap how many are coming: how an offense keeps its quarterback upright, and how to see it from the couch

Show the Python (shared drawing helpers for this chapter)
import logging
logging.getLogger("matplotlib.font_manager").setLevel(logging.ERROR)
import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.patches import Circle, Ellipse, FancyArrowPatch, Polygon, RegularPolygon
from gridiron import Play, Player, Field, offense, defense, style
import gridiron.play as _gp

# Slightly smaller player markers than the book default: linemen stand about a yard and a half
# apart, and this chapter's diagrams are mostly about the space between them.
_gp.draw_marker.__defaults__ = (None, 0.62)

GREEN = "#0f7a55"          # darker step of the aqua highlight, for text on the light field
PURPLE = style.SERIES[6]   # a ring colour that is neither offense blue nor defense orange
RED = style.SERIES[7]
OL_KEYS = ["LT", "LG", "C", "RG", "RT"]
SPLIT = 1.6                # center-to-guard and guard-to-tackle spacing, as in the rest of the book


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


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


def line():
    """The five offensive linemen, labelled so the reader can follow each one."""
    return [O(k, k, -0.7, (i - 2) * SPLIT, k) for i, k in enumerate(OL_KEYS)]


def gun(rb_w=-1.5, qb_d=-5.0):
    """Shotgun quarterback with the back beside him (rb_w=None: no back)."""
    out = [O("QB", "QB", qb_d, 0.0, "Q")]
    if rb_w is not None:
        out.append(O("RB", "RB", qb_d, rb_w, "R"))
    return out


def four_down(mike=(4.5, 1.2), will=(4.5, -2.2), lbs=True):
    """A generic four-man front: ends outside the tackles, a 1-technique shaded on the center's
    left shoulder and a 3-technique on the right guard's outside shoulder, two linebackers."""
    out = [D("LE", "DE", 1.0, -5.0, "E"), D("NT", "DT", 1.0, -0.7, "1"),
           D("DT", "DT", 1.0, 2.35, "3"), D("RE", "DE", 1.0, 5.0, "E")]
    if lbs:
        out += [D("MIKE", "MIKE", mike[0], mike[1], "M"), D("WILL", "WILL", will[0], will[1], "W")]
    return out


def to(p, key, end, kind="block", via=(), delay=0.0, speed=None):
    """Move `key` through absolute (d, w) points `via` to `end` as a block, rush, path, route or run."""
    start = np.array(p._cur(key))
    pts = [tuple(np.array(q) - start) for q in (*via, end)]
    if kind == "block":
        return p.block(key, pts=pts, delay=delay, speed=speed)
    if kind == "rush":
        return p.rush(key, pts=pts, delay=delay, speed=speed)
    if kind == "route":
        return p.route(key, pts, frame="field", delay=delay, speed=speed)
    return {"path": p.path, "run": p.run}[kind](key, pts, delay=delay, speed=speed)


def timed(p, key, way, kind="path"):
    """Script a player for the frame strips: `way` = [(t, d, w), ...] absolute spots reached at time t
    (seconds after the snap). Standing still between two times is allowed."""
    cur = np.array(p._cur(key), dtype=float)
    tc, wait = 0.0, 0.0
    for t, d, w in way:
        nxt = np.array([d, w], dtype=float)
        dist = float(np.hypot(*(nxt - cur)))
        if dist < 1e-3:
            wait += t - tc
        else:
            p._add(kind, key, [tuple(cur), tuple(nxt)], speed=dist / (t - tc - 0.0), delay=wait)
            wait = 0.0
            cur = nxt
        tc = t
    return p


def _P(fld, p, d, w):
    return fld.xy(*p.to_abs(d, w))


def say(fld, p, d, w, text, color=style.INK_2, fontsize=7.2, ha="center", weight="normal"):
    """A short on-field label at (d, w)."""
    x, y = _P(fld, p, d, w)
    fld.ax.text(x, y, text, fontsize=fontsize, color=color, ha=ha, va="center", zorder=12, fontweight=weight,
                bbox=dict(boxstyle="round,pad=0.18", fc=style.SURFACE, ec="none", alpha=0.92))


def point_to(fld, p, text_at, target, text, color=style.INK_2, fontsize=7.0, shrink=7):
    """A label with a thin leader line to the player or spot it names."""
    (xt, yt), (xp, yp) = _P(fld, p, *text_at), _P(fld, p, *target)
    fld.ax.annotate(text, (float(xp), float(yp)), xytext=(float(xt), float(yt)), fontsize=fontsize,
                    color=color, ha="center", va="center", zorder=12,
                    arrowprops=dict(arrowstyle="-", color=color, lw=0.7, shrinkA=2, shrinkB=shrink),
                    bbox=dict(boxstyle="round,pad=0.18", fc=style.SURFACE, ec="none", alpha=0.92))


def assign(fld, p, a, b, color=GREEN, lw=1.1, via=()):
    """A thin dotted 'this is my man' line from blocker `a` to defender `b` (alignment spots), optionally
    bent through absolute (d, w) points `via` so it does not run through another player."""
    pa, pb = p.players[a], p.players[b]
    pts = [(pa.d, pa.w), *via, (pb.d, pb.w)]
    xs, ys = _P(fld, p, np.array([q[0] for q in pts]), np.array([q[1] for q in pts]))
    fld.ax.plot(xs, ys, color=color, lw=lw, ls=(0, (1, 1.6)), zorder=3.2)


def gap_oval(fld, p, w, d=0.15, width=1.25, height=1.0, color=GREEN, alpha=0.22):
    """Shade a gap on the line at width w: the area a sliding lineman owns."""
    x, y = _P(fld, p, d, w)
    fld.ax.add_patch(Ellipse((float(x), float(y)), width, height, fc=color, alpha=alpha, ec=color, lw=0.9,
                             ls=(0, (2, 1.5)), zorder=1.6))


def tag(fld, p, key, text, dd=1.05, dw=0.0, color=GREEN, fontsize=7.4):
    """A small numbered tag just upfield of a player: the protection's count."""
    q = p.players[key]
    x, y = _P(fld, p, q.d + dd, q.w + dw)
    fld.ax.text(float(x), float(y), text, fontsize=fontsize, color="white", ha="center", va="center", zorder=13,
                fontweight="bold", bbox=dict(boxstyle="circle,pad=0.16", fc=color, ec="none"))


def free_path(fld, p, pts, color=RED, lw=2.2, label=None, label_at=None):
    """A highlighted dashed path through absolute (d, w) points (a free rusher)."""
    xs, ys = _P(fld, p, np.array([q[0] for q in pts]), np.array([q[1] for q in pts]))
    fld.ax.plot(xs[:-1], ys[:-1], color=color, lw=lw, ls=(0, (3, 1.8)), zorder=6)
    fld.ax.add_patch(FancyArrowPatch((xs[-2], ys[-2]), (xs[-1], ys[-1]), arrowstyle="-|>", mutation_scale=12,
                                     color=color, lw=lw, zorder=6))
    if label:
        say(fld, p, *(label_at or pts[-1]), label, color=color, weight="bold")


def clean(ax):
    """Box-zoomed diagrams: drop hash ticks and yard numbers, clip text to the window."""
    for ln in list(ax.lines):
        xs, ys = ln.get_data()
        if len(xs) == 2 and ln.get_linewidth() == 0.5 and np.hypot(xs[1] - xs[0], ys[1] - ys[0]) < 1.0:
            ln.remove()
    for t in list(ax.texts):
        if t.get_text().isdigit() and t.get_alpha() == 0.55:
            t.remove()
        else:
            t.set_clip_on(True)


def draw(p, width_in=5.8, ax=None, ol_fs=None, **kw):
    """Play.draw, sized for the page, cleaned for a box-sized window. ol_fs: a smaller font for the two-letter
    line labels (LT, LG, RG, RT) on wide, full-field figures, where the default size overprints."""
    fld = p.draw(width_in=width_in, ax=ax, **kw)
    clean(fld.ax)
    if ol_fs:
        for t in fld.ax.texts:
            if t.get_text() in ("LT", "LG", "RG", "RT"):
                t.set_fontsize(ol_fs)
    return fld


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


def pdf_build():
    return os.environ.get("RTG_FORMAT", "").lower() in ("pdf", "typst", "print")


# --- frame strips (print) and videos (web) for the simulated plays ---------------------------
MARK_R = 0.6   # smaller markers than the static diagrams so engaged players (about a yard apart) stay apart


def tracking(play):
    df = play.to_tracking()
    df["_id"] = df["displayName"].astype(str)
    return df


RING_R = 0.9  # ring radius in the strips: big enough to see, small enough not to swallow a neighbour


def panel(ax, play, df, t, lateral, window, rings=(), hull=False, links=()):
    """One moment of a simulated play: markers, faint trails, rings, and optionally the pocket outline."""
    tmap = df.groupby("frameId")["time"].first()
    fid = int((tmap - t).abs().idxmin())
    ylo, yhi = sorted((play.ball_y - lateral[0], play.ball_y - lateral[1]))
    fld = Field(ax=ax, orient="vertical", los=play.los, window=window, numbers=False, hashes=False,
                lateral=(ylo, yhi), to_go=play.to_go)
    cur = df[df["frameId"] == fid]
    shown = cur[cur["x"].between(play.los + window[0] + 0.4, play.los + window[1] - 0.4)
                & cur["y"].between(ylo + 0.4, yhi - 0.4)]
    ids = set(shown["_id"])
    trails = df[(df["frameId"] <= fid) & df["_id"].isin(ids) & (df["side"] != "ball")]
    for (_, side), g in trails.groupby(["_id", "side"]):
        xs, ys = fld.xy(g["x"].values, g["y"].values)
        ax.plot(xs, ys, color=style.OFFENSE if side == "off" else style.DEFENSE, lw=0.9, alpha=0.4, zorder=3)
    if hull:
        draw_hull(fld, cur)
    ppy = fld.pts_per_yard()
    for _, r in shown.iterrows():
        x, y = (float(v) for v in fld.xy(r["x"], r["y"]))
        if r["side"] == "ball":
            continue
        lab = str(r.get("label", "") or "")
        if r["side"] == "off":
            ax.add_patch(Circle((x, y), MARK_R, fc=style.OFFENSE, ec="white", lw=0.6, zorder=8))
            tc = "white"
        else:
            ax.add_patch(RegularPolygon((x, y), 4, radius=MARK_R * 1.3, orientation=np.pi / 4,
                                        fc=style.DEFENSE_TINT, ec=style.DEFENSE, lw=1.0, zorder=8))
            tc = style.INK
        fs = max(4.0, min(7.5, ppy * (0.8 if len(lab) <= 1 else 0.55)))
        ax.text(x, y, lab, ha="center", va="center", fontsize=fs, color=tc, fontweight="bold", zorder=10)
    for key, col in rings:
        r = cur[cur["displayName"] == key].iloc[0]
        x, y = fld.xy(r["x"], r["y"])
        ax.add_patch(Circle((float(x), float(y)), RING_R, fc="none", ec=col, lw=1.7, zorder=7))
    for a, b in links:                      # dotted 'who has whom' lines between current positions
        pa = cur[cur["displayName"] == a].iloc[0]
        pb = cur[cur["displayName"] == b].iloc[0]
        xs, ys = fld.xy(np.array([pa["x"], pb["x"]]), np.array([pa["y"], pb["y"]]))
        ax.plot(xs, ys, color=GREEN, lw=1.5, ls=(0, (1, 1.4)), zorder=9)
    return fld


def strip(play, times, notes=None, lateral=(-9, 9), window=(-9, 6), ncols=4, rings=(), title=None,
          width_in=6.5, hull=False, final_links=()):
    """Numbered, captioned frame strip with a fixed box-sized window, so markers stay legible in print."""
    df = tracking(play)
    nrows = int(np.ceil(len(times) / ncols))
    pw = width_in / ncols
    span_w, span_d = lateral[1] - lateral[0], window[1] - window[0]
    fig, axes = plt.subplots(nrows, ncols, squeeze=False,
                             figsize=(width_in, nrows * (pw * span_d / span_w + (0.55 if notes else 0.25))))
    for ax in axes.flat[len(times):]:
        ax.axis("off")
    for i, (ax, t) in enumerate(zip(axes.flat, times)):
        panel(ax, play, df, t, lateral, window, rings, hull, final_links if i == len(times) - 1 else ())
        ax.set_title(f"{i + 1}.  " + ("snap" if abs(t) < 1e-6 else f"{t:+.1f} s"),
                     fontsize=8.2, color=style.INK_2, loc="left")
        if notes:
            ax.text(0.5, -0.02, notes[i], transform=ax.transAxes, ha="center", va="top",
                    fontsize=7.0, color=style.INK, linespacing=1.15)
    if title:
        fig.suptitle(title, x=0.01, ha="left", fontsize=11, fontweight="bold", color=style.INK)
    fig.tight_layout(h_pad=1.0 if notes else 0.5, w_pad=0.5)
    return fig


def video(play, times, notes=None, lateral=(-9, 9), window=(-9, 6), rings=(), width_in=5.4, hull=False):
    """Web version of the strip: every frame, with the strip's notes as running captions."""
    import shutil
    from matplotlib import animation
    from IPython.display import HTML, display
    df = tracking(play)
    span_w, span_d = lateral[1] - lateral[0], window[1] - window[0]
    fig, ax = plt.subplots(figsize=(width_in, width_in * span_d / span_w + 0.4))
    tmap = df.groupby("frameId")["time"].first()

    def update(fid):
        ax.clear()
        t = float(tmap[fid])
        panel(ax, play, df, t, lateral, window, rings, hull)
        txt = "snap" if abs(t) < 0.05 else f"{t:+.1f} s"
        if notes:
            cur = [n.replace("\n", " ") for tt, n in zip(times, notes) if tt <= t + 1e-6]
            txt += ("   " + cur[-1]) if cur else ""
        ax.set_title(txt, fontsize=8.5, color=style.INK, loc="left")
        return []

    frames = [f for f in sorted(df["frameId"].unique()) if float(tmap[f]) >= -0.3]
    anim = animation.FuncAnimation(fig, update, frames=frames, interval=100)
    html = (anim.to_html5_video(embed_limit=40).replace("<video ", '<video style="max-width:100%;height:auto" ')
            if shutil.which("ffmpeg") else anim.to_jshtml(default_mode="once"))
    plt.close(fig)
    display(HTML(html))


def protection_animation(play, times, notes=None, **kw):
    """Video on the website; a numbered, captioned frame strip in the PDF."""
    if pdf_build():
        strip(play, times, notes=notes, **kw)
        plt.show()
    else:
        video(play, times, notes=notes, **{k: v for k, v in kw.items() if k in ("lateral", "window", "rings", "hull")})


# --- the pocket as a shape: convex hull of the five linemen and the quarterback ---------------
def convex_hull(pts):
    """Monotone-chain convex hull of (x, y) points, counter-clockwise."""
    pts = sorted(set(map(tuple, np.round(np.asarray(pts, dtype=float), 4))))
    if len(pts) < 3:
        return np.array(pts)

    def cross(o, a, b):
        return (a[0] - o[0]) * (b[1] - o[1]) - (a[1] - o[1]) * (b[0] - o[0])
    lower, upper = [], []
    for q in pts:
        while len(lower) >= 2 and cross(lower[-2], lower[-1], q) <= 0:
            lower.pop()
        lower.append(q)
    for q in reversed(pts):
        while len(upper) >= 2 and cross(upper[-2], upper[-1], q) <= 0:
            upper.pop()
        upper.append(q)
    return np.array(lower[:-1] + upper[:-1])


def hull_area(h):
    x, y = h[:, 0], h[:, 1]
    return 0.5 * abs(np.dot(x, np.roll(y, -1)) - np.dot(y, np.roll(x, -1)))


def pocket_points(frame):
    """BDB (x, y) of the five linemen and the quarterback in one tracking frame."""
    sel = frame[frame["displayName"].isin(OL_KEYS + ["QB"])]
    return sel[["x", "y"]].to_numpy()


def draw_hull(fld, frame, color=GREEN):
    h = convex_hull(pocket_points(frame))
    xs, ys = fld.xy(h[:, 0], h[:, 1])
    fld.ax.add_patch(Polygon(np.column_stack([xs, ys]), closed=True, fc=color, alpha=0.18, ec=color, lw=1.2,
                             zorder=2.5))

Third-and-7, late in the first half. The offense lines up with five receivers spread across the field and nobody beside the quarterback. The defense walks two linebackers right up to the line, one on each side of the center, and a slot cornerback creeps toward the edge. You count seven defenders who might rush; the offense has five blockers. The center points and shouts a number. The quarterback points somewhere else and shouts a different word. Then the ball is snapped, the slot cornerback comes free off the edge, untouched, and the ball is already gone: a quick slant to the slot receiver, caught in the space where the cornerback used to be. Nobody blocked the man who came free, and that was the plan. This chapter is about why.

You’ll be able to:

NoteYou’ll need
  • Passing Game Fundamentals: the quarterback’s drop, the steps he takes back before he throws (three, five or seven from under center; one, three or five from the shotgun, where he already starts five yards deep), and the idea that routes are timed to it. Protection exists to make that timing possible.
  • The Language of the Run Game: gaps A, B and C outward from the center, technique numbers (a 3-technique lines up on the guard’s outside shoulder, a 1-technique shaded on the center), and hat math: counting blockers against defenders.
  • The Pre-Snap Phase: the quarterback or center pointing at a linebacker and calling “54’s the Mike!”, and defenses moving after the offense has made its calls.

How to read the diagrams. Offense is blue circles, defense orange squares, and left and right are always the offense’s. The five offensive linemen are labelled LT, LG, C, RG and RT, Q is the quarterback and R the running back; X, Z and H are wide receivers and Y (and U) tight ends. On defense, E is an end, and the two defensive tackles are labelled by technique: 1 for the one shaded on the center, 3 for the one on a guard’s outside shoulder. M, W and S are the Mike, Will and Sam linebackers, NB the slot (nickel) cornerback, C a cornerback, FS and SS the safeties. A line ending in a short bar is a block or a pass set (the spot a blocker moves to at the snap to meet his rusher; more on sets later), an arrow a path, a dotted green line “this blocker is responsible for that defender,” and a shaded green oval a gap a lineman owns. Rushers’ paths are orange; a red dashed arrow is a rusher nobody blocks. A dotted orange line from a defender to a receiver means man coverage, the dotted brown arrow is the ball in the air, and the solid orange line across the field, where one is drawn, is the line to gain.

Protection is counting

Start with the arithmetic, because every protection in this chapter is an answer to it.

On a pass, the offense always has five blockers: the five offensive linemen, who are not allowed to go out for passes (they are ineligible) and so have nothing else to do. It may add more. A running back or a tight end can stay in to block, making six, seven or even eight. Every extra blocker is one fewer receiver, and that is the trade at the heart of the whole subject.

The defense, meanwhile, can rush anyone it likes. Most of the time it rushes four: in the 2024 and 2025 regular seasons about two dropbacks in three faced exactly four rushers, about one in five faced five, and fewer than one in ten faced six or more.1 Four is the default for the reason A First Look at Defense gave: four rushers leave seven defenders to cover at most five receivers. A blitz (sending a fifth, sixth or seventh rusher) flips that trade, giving up coverage to try to create a rusher the offense cannot block.

So the offense’s question on every pass is: how many might come, how many can I block, and if the answer is “not enough,” who is left over? Three ideas follow from it, and they organise the rest of the chapter.

1. The protection does not have to win forever, only long enough. A quarterback in today’s NFL gets the ball out in a little under three seconds on average (you will see the numbers at the end of the chapter). A rusher who arrives at 3.5 seconds has not hurt anyone. Protection is a race against a clock, not a wrestling match to the finish.

2. Block inside-out. Rushers from the middle of the line have the shortest path to the quarterback; rushers from the edges have to run around the blockers. So when an offense must choose who to block and who to leave, it blocks the inside man and leaves the widest one, because he has the longest way to go and the ball can be out before he gets there.

3. Someone left unblocked on purpose is the quarterback’s. If six come and the offense has five blockers, one rusher is unblocked by design. That man is called a free rusher: a rusher nobody is assigned to block. The protection does not fail when there is a free rusher; it hands him to the quarterback, who must throw before he arrives. A free rusher who was supposed to be blocked is a different thing: a bust, and you will learn to tell the two apart.

ImportantWhy it exists

Pass protection exists because the defense chooses its numbers after the offense has chosen its own. The offense commits its blockers in the huddle; the defense can show four rushers and bring six, or show six and bring three. Every protection scheme is a set of rules that decides, after the snap, which blocker takes which rusher, so that the most dangerous rushers are always blocked and any man left over is one the quarterback can beat with a quick throw.

The pocket: a cup, not a wall

Before we can say who blocks whom, we need the shape of what they are protecting. The pocket is the protected space the blockers form around the quarterback, and the best way to picture it is a cup, not a wall.

Show the Python
p = Play(line() + gun(None, qb_d=-7.5), four_down(lbs=False), los=35, to_go=None,
         title="The pocket is a cup, not a wall")
SETS = {"LT": (-3.6, -4.4), "LG": (-2.0, -1.8), "C": (-1.6, 0.0), "RG": (-2.0, 1.8), "RT": (-3.6, 4.4)}
for k, sp in SETS.items():
    to(p, k, sp)
to(p, "LE", (-6.6, -3.4), "rush", via=[(-1.2, -6.1), (-4.6, -5.9)])
to(p, "RE", (-6.6, 3.4), "rush", via=[(-1.2, 6.1), (-4.6, 5.9)])
to(p, "NT", (-1.0, -1.1), "rush"); to(p, "DT", (-1.1, 2.1), "rush")
fld = draw(p, lateral=(-12, 12), window=(-12, 4.2))
cup = [(-3.6, -4.4), (-2.0, -1.8), (-1.6, 0.0), (-2.0, 1.8), (-3.6, 4.4), (-8.6, 3.0), (-9.6, 0.0), (-8.6, -3.0)]
xy = np.array([_P(fld, p, d, w) for d, w in cup], dtype=float)
fld.ax.add_patch(Polygon(xy, closed=True, fc=GREEN, alpha=0.13, ec=GREEN, lw=1.0, ls=(0, (3, 2)), zorder=1.5))
(x0, y0), (x1, y1) = _P(fld, p, -6.6, 0.0), _P(fld, p, -5.0, 0.0)
fld.ax.add_patch(FancyArrowPatch((x0, y0), (x1, y1), arrowstyle="-|>", mutation_scale=11, color=GREEN, lw=1.8,
                                 zorder=9))
say(fld, p, -5.6, 1.9, "step up", color=GREEN, weight="bold")
point_to(fld, p, (-10.3, -4.0), (-7.5, 0.0), "launch point\n(about 7-8 yd deep)")
# path lengths: the end's arc around the tackle vs the 3-technique's straight line to the launch point
arc = [(1.0, -5.0), (-1.2, -6.1), (-4.6, -5.9), (-6.6, -3.4), (-7.5, 0.0)]
edge = sum(np.hypot(b[0] - a[0], b[1] - a[1]) for a, b in zip(arc[:-1], arc[1:]))
inside = np.hypot(1.0 + 7.5, 2.35)
point_to(fld, p, (2.75, -7.6), (1.0, -5.0), f"edge rusher: about {edge:.0f} yd\naround the tackle", shrink=9)
point_to(fld, p, (2.75, 4.6), (1.0, 2.35), f"3-technique: about {inside:.0f} yd\nstraight up the middle", shrink=9)
for side in (-1, 1):
    say(fld, p, -5.0, side * 9.6, "tackles give\nground and push\nthe edge past", fontsize=7, color=GREEN)
say(fld, p, -3.6, 0.0, "interior: hold firm", fontsize=7, color=GREEN)
plt.show()
Figure 21.1: The pocket’s shape, about a second after the snap (the quarterback is drawn at his launch point; backs and receivers are not shown). The interior linemen take short sets, only a yard or so back, and hold firm; the tackles kick back several yards so the ends must run an arc around them. That arc is far longer than the 3-technique’s straight path up the middle, which is why the edge can be pushed past the quarterback while the middle must not give an inch, and why the quarterback steps up into the cup rather than drifting back.

Three facts about the cup explain most of pass protection.

The quarterback throws from a spot, and the linemen know where it is. The launch point is where the quarterback sets his feet to throw at the end of his drop. From the shotgun he starts five yards deep and takes a short drop, so on a typical dropback he throws from about seven or eight yards behind the line; from under center a five-step drop ends at a similar depth and a seven-step drop deeper.2 Linemen set their depth to that spot. The aim is not to stop every rusher at the line; it is to keep every rusher off that spot until the ball is gone. When a play-action pass or a rollout moves the launch point, the whole line’s geometry changes with it, which is why those plays have their own protections (Play-Action, Bootlegs and Screens).

The interior must not give ground. Look at the distances in Figure 21.1. A defensive tackle rushing straight up the middle is about nine yards from the launch point. An end rushing around the tackle has to run an arc of about thirteen. So the guards and center set only a step or two back and then hold, because every yard they give is a yard straight into the quarterback’s face. Pressure up the middle is the most destructive kind: the quarterback cannot step up into it, cannot see over it, and cannot escape it by moving forward.

The tackles give ground on purpose. The tackles retreat several yards, backward and outward, keeping themselves between the end and the quarterback. If the end keeps running his arc, the tackle runs with him and pushes him past the launch point, deeper than the quarterback, where he is no threat. That is why a quarterback with a good pocket steps up: he moves forward into the cup as the edge rushers are pushed behind him. Stepping up is a skill the quarterback chapter builds on; for now, notice that it only works if the interior held. A quarterback who drifts backward instead runs into the ends the tackles were pushing past him.

CautionCommon misconception

“The offensive line should form a wall.” A flat wall at the line of scrimmage would be beaten at both ends in a second, because the edge rushers would simply run around it. The pocket is deliberately bent: firm in the middle, deep at the edges, with the quarterback inside the bend. When you see a tackle five yards behind the line with a defensive end running past him, that is usually the protection working, not failing.

Two ways to block five: slide and man

Now the assignments. There are two basic ways to decide which blocker takes which rusher, and every protection in the NFL is one of them or a mix of the two. They are the pass-protection cousins of the two run-blocking philosophies in 03-01: blocking an area and blocking a man.

Show the Python
LAT, WIN = (-7.2, 7.2), (-6.8, 6.4)
fig, axes = plt.subplots(1, 2, figsize=(6.6, 3.7))
for ax, kind in zip(axes, ("slide", "man")):
    p = Play(line() + gun(-1.5), four_down(), los=35, to_go=None)
    if kind == "slide":
        for k, wg in zip(OL_KEYS, (-2.4, -0.8, 0.8, 2.4, 4.0)):
            to(p, k, (-0.25, wg - 0.15))
        to(p, "RB", (-3.6, -3.9))
    fld = draw(p, ax=ax, title=False, lateral=LAT, window=WIN)
    if kind == "slide":
        for wg in (-2.4, -0.8, 0.8, 2.4, 4.0):
            gap_oval(fld, p, wg)
        assign(fld, p, "RB", "LE")
        panel_title(ax, "Slide right: each lineman owns a gap")
        say(fld, p, 2.6, -0.2, "the gap to my right,\nwhoever comes", color=GREEN)
        say(fld, p, -5.2, -4.6, "back: the end\nleft behind", color=GREEN)
    else:
        for k, m in zip(OL_KEYS + ["RB"], ("LE", "NT", "MIKE", "DT", "RE", "WILL")):
            assign(fld, p, k, m, lw=1.6)
        panel_title(ax, "Man (BOB): each blocker owns a man")
        say(fld, p, -3.6, 4.2, "linemen: the four\nlinemen + the Mike", color=GREEN)
        say(fld, p, -5.4, -4.6, "back: the Will", color=GREEN)
fig.tight_layout(w_pad=0.8)
plt.show()
Figure 21.2: The same six blockers against the same front, two ways (receivers and defensive backs not shown). Left, slide right: each lineman takes the gap to his right (shaded), whoever comes through it, so the 1-technique belongs to the LG, the 3-technique to the RG and the right end to the RT; the Mike or Will, if they blitz, run into the C’s or LT’s gap. The slide leaves the left end behind, so the back takes him. Right, man protection, also called BOB (big-on-big): the linemen take the four defensive linemen and the Mike, and the back takes the Will.

Slide protection. In slide protection every lineman takes his first step the same way and owns the gap on that side, whoever comes through it. In the left panel of Figure 21.2 the line slides right: the left tackle owns the gap between himself and the left guard, the left guard the gap between himself and the center, and so on across to the right tackle, who owns the space outside himself. Notice that nobody on the line has to know in advance which defender will rush where. If the 1-technique rushes, he is in the left guard’s gap; if instead the Will linebacker blitzes and the 1-technique drops into coverage (defenses do this; see Zone Blitzes and Simulated Pressure), the left tackle’s gap gets the Will and the left guard’s gap gets nobody, and the left guard helps a neighbor.

The price of sliding one way is the man on the other end. Five linemen sliding right cover five gaps, from the left B gap to outside the right tackle, and that leaves the left end, outside everyone, uncovered. Someone else has to take him: the running back in the picture, or a tight end. That is the slide’s weak spot. The man it leaves behind is usually a defensive end, often the defense’s best pass rusher, and now a 215-pound back has him.

So the direction of the slide is a decision, and it follows one rule of thumb: the slide goes where the trouble is inside, and never leaves a star alone with a back. Offenses slide toward the most dangerous inside rusher, or toward the side with more possible rushers (an overload). If the defense’s best player is an edge rusher, they slide away from him and block him with the tackle man to man (the half-slide coming up next does exactly this), then add a chip (later in this chapter) on top. Help is always in addition to the tackle, never instead of him.

Man protection. In man protection, each blocker is given a specific defender before the snap. The usual rule is the one in the right panel: the five linemen take the four defensive linemen plus one linebacker, and the back takes the other linebacker. Line coaches call it “big on big” (BOB, or big-on-big), because the big men block the big men, and the back is left with a linebacker, a fairer fight than a defensive end.

Man protection matches strength to strength, and it handles a four-man rush cleanly. Its weakness is movement. If two defenders cross paths after the snap (a stunt, coming up later in this chapter), each man-blocker must chase his man through traffic. If a linebacker the line was counting on drops out and a different one rushes, the assignments are wrong for the rusher who actually came. Slide protection shrugs off both, because a gap does not move. That is the trade, and it is the same one zone and gap blocking make in the run game: man blocking wins the one-on-one matchups it planned for; area blocking survives the ones it did not.

Half-slide: the NFL’s everyday six-man protection

Most real protections split the difference. In a half-slide the center and the two linemen on one side slide that way and block gaps, the two linemen on the other side block man-to-man, and the running back takes the first extra rusher on the man side. This is the “60” protection from the play call you decoded in What a Play Really Is, and some version of it is the most common six-man protection in football. (Many playbooks number their protections in families, “50s,” “60s,” “90s,” with the number saying which way the slide goes and who blocks; others use words. What each number means differs from team to team.)

Show the Python
p = Play(line() + gun(-1.5), four_down(), los=35, to_go=None,
         title="Half-slide right against a four-man rush")
to(p, "C", (-1.8, -0.75), via=[(-1.8, 0.45)])
for k, wg in zip(["RG", "RT"], (2.4, 4.0)):
    to(p, k, (-0.25, wg - 0.15))
to(p, "LT", (-1.6, -4.3)); to(p, "LG", (-1.2, -1.2))
to(p, "LE", (-1.4, -5.6), "rush", via=[(0.0, -5.6)])
to(p, "RE", (-1.4, 5.6), "rush", via=[(0.0, 5.6)])
to(p, "NT", (0.1, -0.85), "rush"); to(p, "DT", (0.1, 2.3), "rush")
p.drop("MIKE", (9.0, 2.0)); p.drop("WILL", (8.5, -4.5))
to(p, "RB", (-1.0, -6.6), "route", via=[(-3.8, -2.6)])
fld = draw(p, lateral=(-9.5, 9.5), window=(-7.2, 10.4))
for wg in (0.8, 2.4, 4.0):
    gap_oval(fld, p, wg)
for k, m in (("LT", "LE"), ("LG", "NT")):
    assign(fld, p, k, m, lw=1.6)
point_to(fld, p, (-3.7, 3.7), (-1.8, 0.3), "C: no one came into\nhis gap, so he helps", color=GREEN)
say(fld, p, 2.9, 4.4, "slide side", color=GREEN, weight="bold")
say(fld, p, 2.9, -4.4, "man side", color=GREEN, weight="bold")
point_to(fld, p, (-5.8, -6.4), (-3.8, -2.6), "back: checks the Will,\nthen releases", color=GREEN)
say(fld, p, 8.8, -6.9, "Will drops", fontsize=6.8)
say(fld, p, 9.2, 4.4, "Mike drops", fontsize=6.8)
plt.show()
Figure 21.3: Half-slide right against a four-man rush (receivers and defensive backs not shown). The C, RG and RT slide right and own the shaded gaps; the LG and LT block the man in front of them; the back’s job is the Will. Here both linebackers drop into coverage, so nobody comes into the center’s gap and nobody comes for the back: the center helps the left guard on the 1-technique, and the back, having checked the Will, slips out into a route. Six blockers have become five against four, with a spare, plus a sixth receiver.

Walk through Figure 21.3. On the right, the slide side, the center, right guard and right tackle each own a gap, so any combination of the 3-technique, the right end and the Mike linebacker is accounted for. On the left, the man side, the guard has the 1-technique and the tackle has the left end. The back watches the Will. Count it: six blockers for six possible rushers (four linemen, two linebackers), with every gap and every man covered once.

The half-slide is popular because it gives each part of the line the job it is best at. The slide side handles the movement defenses love to run inside (stunts, linebackers looping through gaps). The man side keeps the offense’s tackle on the defensive end, big on big, rather than handing that end to the back. And the back gets the defender with the longest path, an off-the-ball linebacker, whom he can meet in the hole.

Against the four-man rush in the picture, both linebackers dropped. The protection does not care: the center had nobody in his gap, so he “looks for work” and helps a neighbor (here the left guard on the 1-technique), and the back, whose man did not come, runs a route. Six blockers turned into five plus a receiver. That last move is called check-release, and it is one of the most important things a back does; it gets its own section below.

Why would anyone still call a full slide, then? Because it puts all five linemen on gaps, and gaps are the answer to movement. Against a front that loves stunts, or that stacks linebackers to come through the A and B gaps, a full slide toward the pressure means no lineman has to chase anybody; the offense accepts the cost (a back or tight end on the backside end) because the inside threat is the bigger one.

How to tell which one you are watching. On the broadcast, look at the linemen’s first step after the snap. All five step the same way: a slide. The center and the two linemen on one side step together while the other two set straight back at the man in front of them: a half-slide, with the slide toward the center’s step. Each lineman sets to a different defender, some stepping left and some right: man.

Mike identification: counting from the same man

Every protection above depends on everyone agreeing which linebacker is which. The half-slide said “the back takes the Will,” and the man protection “the linemen take the four linemen and the Mike.” But the defense does not wear name tags, and linebackers move. So before the snap one player makes the call you heard in The Pre-Snap Phase: “54’s the Mike!” That call is Mike identification, often written MIKE ID. In most offenses the quarterback has the final word, because he sees the whole defense; in others the center, who is closest to the front and runs the line’s communication, makes it.3

How the count works

The “Mike” in the call is a reference point, not necessarily the defense’s real middle linebacker. Every assignment is written relative to him, so naming him turns six separate judgments (“which one is mine?”) into one decision that everyone follows. Systems differ in the details, but one common way to build a six-man protection around the call, the one in Figure 21.4, works like this.

  1. The center works toward the Mike. He and the two linemen on that side slide that way and own the gaps there, so the Mike (call him 0) and anyone on his side belong to the slide.
  2. The other two linemen count outward from the Mike on their side. The guard takes the first defender on the line (1), the tackle the second (2). This is the man side.
  3. The back takes the next threat beyond the line’s count (3), usually the linebacker on the man side. If he rushes, the back blocks him; if he drops, the back releases. In many playbooks the back has two men to check in order, inside first (a dual read), and takes whichever comes.
Show the Python
LAT, WIN = (-7.2, 7.2), (-7.4, 6.8)
fig, axes = plt.subplots(1, 2, figsize=(6.6, 4.0))
for ax, mike in zip(axes, ("54", "52")):
    dfn = [q.moved(label="54") if q.key == "MIKE" else q.moved(label="52") if q.key == "WILL" else q
           for q in four_down(will=(4.5, -2.6))]
    p = Play(line() + gun(-1.5), dfn, los=35, to_go=None)
    if mike == "52":
        to(p, "RB", (-3.4, 1.7), via=[(-4.0, -0.5)])
    fld = draw(p, ax=ax, title=False, lateral=LAT, window=WIN)
    if mike == "54":
        for wg in (0.8, 2.4, 4.0):
            gap_oval(fld, p, wg)
        tag(fld, p, "MIKE", "0"); tag(fld, p, "NT", "1"); tag(fld, p, "LE", "2"); tag(fld, p, "WILL", "3")
        for k, m in (("LG", "NT"), ("LT", "LE")):
            assign(fld, p, k, m, lw=1.6)
        assign(fld, p, "RB", "WILL", lw=1.6, via=[(-2.4, -2.4)])
        panel_title(ax, "1  \"54's the Mike!\"")
        say(fld, p, -2.9, 4.6, "slide side:\n0 and his side,\nby gaps", color=GREEN)
        say(fld, p, -3.2, -4.8, "man side:\nG takes 1, T takes 2", color=GREEN)
        say(fld, p, -6.2, -4.2, "back: 3", color=GREEN, weight="bold")
    else:
        for wg in (-0.8, -2.4, -4.0):
            gap_oval(fld, p, wg)
        tag(fld, p, "WILL", "0"); tag(fld, p, "DT", "1"); tag(fld, p, "RE", "2"); tag(fld, p, "MIKE", "3")
        for k, m in (("RG", "DT"), ("RT", "RE")):
            assign(fld, p, k, m, lw=1.6)
        panel_title(ax, "2  The quarterback names 52")
        say(fld, p, -2.9, -4.6, "slide side:\n0 and his side,\nby gaps", color=GREEN)
        say(fld, p, -6.2, 4.0, "back: 3, across\nthe QB's face", color=GREEN, weight="bold")
fig.tight_layout(w_pad=0.8)
plt.show()
Figure 21.4: The count, number by number (receivers and defensive backs not shown; the linebackers are labelled by jersey number). Left: “54’s the Mike.” The center works toward 54, so the C, RG and RT slide right and own the shaded gaps; 54 is 0 and belongs to the slide. On the man side the guard takes the first defender on the line (1), the tackle the second (2), and the back the linebacker beyond them (3). Right: the same defense, but the quarterback names 52 instead. Now the slide goes left, the RG and RT take the 3-technique and the end man to man, and the back’s man is 54, on the other side of the quarterback: he has to block across the quarterback’s face, which takes him longer.

Numbered like that, the call does all the work, and the right panel shows its power: change the name and the slide flips, the guard and tackle on the man side have new men, and the back’s man moves to the other side. So the call is also a tool. A quarterback who sees a threat gathering on one side can name a defender over there, which pulls the slide, and its linemen, toward the threat, so that a lineman rather than the back is responsible for the most dangerous rusher. The cost of all this is time and noise: every call has to be heard by five or six men, on the road, with the play clock running.

The right panel also answers a question about the back. In most half-slides he lines up on the man side, the side he will check, so he has a short trip. When the call puts his man on the other side, he has to block across the quarterback’s face, in front of him to the other side, which takes longer. So the back’s alignment is a clue to the protection, not a guarantee. Watch where he steps at the snap.

That is what happened in the opening scene. The center pointed and called a number: his Mike, one of the two linebackers standing in the A gaps. The quarterback, who has the final word, pointed elsewhere and called a word of his own, a code that set which way the line would work and so which side the unblocked rusher would come from. That also told the slot receiver on that side that he was the answer. (The words are code and change from team to team; some staffs use one word for each direction, others fold the direction into a protection number.)

Show the Python
LAT, WIN = (-7.2, 7.2), (-7.4, 6.6)
fig, axes = plt.subplots(1, 2, figsize=(6.6, 3.9))
for ax, bust in zip(axes, (False, True)):
    dfn = [q.moved(label="54") if q.key == "MIKE" else q.moved(label="52") if q.key == "WILL" else q
           for q in four_down(will=(4.5, -2.9))]
    p = Play(line() + gun(-1.5), dfn, los=35, to_go=None)
    fld = draw(p, ax=ax, title=False, lateral=LAT, window=WIN)
    if not bust:
        for k, m in zip(OL_KEYS, ("LE", "NT", "MIKE", "DT", "RE")):
            assign(fld, p, k, m, lw=1.6)
        assign(fld, p, "RB", "WILL", lw=1.6, via=[(-2.4, -2.5)])
        panel_title(ax, "1  One call: \"54's the Mike!\"")
        say(fld, p, -3.3, 4.3, "line: the four linemen\n+ 54 (the Mike)", color=GREEN)
        say(fld, p, -6.4, -3.9, "back: 52", color=GREEN)
    else:
        for k, m in (("LT", "LE"), ("LG", "NT"), ("RG", "DT"), ("RT", "RE")):
            assign(fld, p, k, m, lw=1.6)
        assign(fld, p, "RB", "WILL", lw=1.6, via=[(-2.4, -2.5)])
        assign(fld, p, "C", "WILL", lw=1.6, color=RED, via=[(0.6, -1.9)])
        free_path(fld, p, [(4.5, 1.2), (0.2, 0.75), (-4.0, 0.3)], label="54: free", label_at=(-2.6, 2.6))
        panel_title(ax, "2  The center thought 52 was the Mike")
        say(fld, p, 2.6, -5.0, "two blockers\non 52", color=RED)
fig.tight_layout(w_pad=0.8)
plt.show()
Figure 21.5: Why one player names the Mike (receivers and defensive backs not shown; the linebackers are labelled by jersey number). Left: the call is “54’s the Mike,” so the linemen take the four defensive linemen plus 54, and the back takes 52; every possible rusher has exactly one blocker. Right: the same defense, but the center counted from 52 instead. He turns to 52, the back also takes 52, and when 54 blitzes the right A gap nobody is responsible for him. The defense rushed no more men than the offense had blockers; the free rusher came from two blockers counting from different men.

Figure 21.5 shows what happens when the count is not shared: the defense rushed only five men against six blockers and still got a man free, because two blockers counted from different starting points. This is the classic bust, and when you see a linebacker run untouched through the middle against a normal-looking rush, it is the first thing to suspect. (Re-declaring the Mike when a defender walks up late, which you met in The Pre-Snap Phase, is the offense’s attempt to keep the count shared after the defense has moved.)

Some quarterbacks make this part of their game. Tom Brady was known for it: his Mike calls are audible on broadcasts, and teammates describe him overruling the line’s identification at the line of scrimmage (“no, he’s the Mike”) to move the protection toward a matchup he did not like, then getting the ball out to the hot receiver before a free rusher arrived.4 The skill is invisible on most broadcasts, and it is part of why analysts treat sack rate as partly a quarterback statistic, not only a line statistic.

Defenses know this, which is why they move after the call. Linebackers walk up into the A gaps at the last second, safeties rotate down, a lineman stands up and drops back. Each move is an attempt to make the offense’s count wrong after it is too late to fix. The two-linebacker version, both standing in the A gaps on either side of the center, is the “double A-gap mug” of Blitz and Man Pressure, and it exists almost entirely to attack the Mike call: with both linebackers threatening the middle, which one is the Mike? Here, in miniature, is why the pre-snap phase looks like the busiest few seconds in sport.

NoteMadden vs. real life

In Madden you can tap a button to “slide protection left” or tell the back to block, and the computer linemen then know exactly who to block. Real linemen have to agree on it, out loud, in a few seconds, in a stadium built to drown them out, while the defense rearranges itself to make their agreement wrong. Most of what makes an NFL offensive line “good” in the eyes of coaches is invisible on a broadcast: not strength, but five players reaching the same answer at the same time, snap after snap.

The back and the tight end: check-release and chip

The running back in a six-man protection is the part of the protection you can see most easily, and his job is the subtlest. He has a defender to watch, not a defender to block, and he finds out after the snap which job he has. That rule is called check-release: check your man; if he rushes, block him; if he does not, release into your route. The animation shows the “he rushes” half.

Show the Python
def pickup_play():
    p = Play(line() + gun(-1.5), four_down(), los=35, to_go=None)
    timed(p, "QB", [(0.9, -7.4, 0.0)])
    # the four linemen rush; each is met by the blocker the half-slide gives him
    timed(p, "LE", [(0.5, -0.6, -5.9), (1.0, -2.3, -6.0), (2.0, -3.5, -5.8)], "rush")
    timed(p, "LT", [(0.5, -1.7, -4.2), (1.0, -2.8, -4.8), (2.0, -3.9, -4.6)], "block")
    timed(p, "NT", [(0.5, 0.0, -0.9), (1.0, -0.5, -0.9), (2.0, -0.9, -0.9)], "rush")
    timed(p, "LG", [(0.5, -1.3, -1.5), (1.0, -1.7, -1.2), (2.0, -2.1, -1.1)], "block")
    timed(p, "C", [(0.5, -1.4, 0.3), (1.0, -1.8, 0.4), (2.0, -2.2, 0.4)], "block")
    timed(p, "DT", [(0.5, 0.0, 2.3), (1.0, -0.6, 2.2), (2.0, -0.9, 2.1)], "rush")
    timed(p, "RG", [(0.5, -1.3, 1.8), (1.0, -1.8, 1.9), (2.0, -2.1, 1.9)], "block")
    timed(p, "RE", [(0.5, -0.6, 5.7), (1.0, -2.3, 5.6), (2.0, -3.5, 5.3)], "rush")
    timed(p, "RT", [(0.5, -1.7, 4.0), (1.0, -2.8, 4.4), (2.0, -3.9, 4.2)], "block")
    # the Will blitzes the left B gap; the Mike drops
    timed(p, "WILL", [(0.5, 1.9, -2.7), (1.0, -0.6, -3.0), (2.0, -1.0, -3.0)], "rush")
    timed(p, "MIKE", [(1.0, 6.5, 1.5), (2.0, 8.0, 1.8)], "path")
    # the back: eyes on the Will, steps up and meets him in the hole, a yard or two behind the line
    timed(p, "RB", [(0.5, -4.2, -2.3), (1.0, -2.3, -3.0), (2.0, -2.6, -3.0)], "block")
    return p


protection_animation(pickup_play(), [0.0, 0.5, 1.0, 2.0],
    notes=["snap: six blockers;\nthe back watches W", "W blitzes the B gap;\nthe back steps up",
           "the back meets him\nin the hole", "five rushers, six blockers:\nthe pocket holds"],
    lateral=(-7.5, 6.5), window=(-8.6, 6.4), ncols=2, rings=(("RB", style.THIRD), ("WILL", PURPLE)))
Figure 21.6: Check-release, when the check comes (simulated). Half-slide right as in the earlier figure, but this time the Will (ringed in purple) blitzes through the left B gap while the Mike drops. The back (ringed in green) keeps his eyes on the Will from the snap, steps up, and meets him in the hole between the left guard and left tackle, so five rushers face six blockers and the pocket holds. Had the Will dropped, the back would have released into his route.

Three details in Figure 21.6 are worth noticing, because they are what coaches grade backs on.

His eyes go to the linebacker, not the quarterback. At the snap the back is looking at the Will. He has a fraction of a second to decide, and a back who looks at the quarterback first, or at the ball, will be late.

He steps up to meet the blitzer. The back attacks forward into the gap rather than waiting for the linebacker to arrive at the quarterback’s feet. Meeting him in the hole, a yard or two behind the line and well in front of the quarterback, keeps the collision away from the launch point and gives the linebacker less room to run around him.

He takes on a bigger, faster-moving man. A linebacker on a blitz may outweigh the back by 20 pounds and is running at full speed; the back is standing nearly still. That is why “can he pass protect?” is one of the first questions asked about a rookie running back, and why a back who can’t is often taken off the field on third down, however well he runs.

The other half of the rule, the release, is what makes the six-man protection efficient. A back who stays in to block nobody has wasted a receiver. With check-release, the offense gets a blocker when it needs one and a receiver when it doesn’t, and it finds out which only after the defense has committed. Tight ends play by the same rule when they are part of the protection.

Two refinements, both about order. When a back has more than one man to check (the dual read above), he looks inside first, because the inside blitzer has the shorter path. And when the play also asks him to chip, the order is fixed: check, then chip, then release. The blitz comes first, because a blitzer is a free man and an end already has a tackle on him.

The chip: help on the way out

Between “block” and “release” there is a third option. A chip is a quick shove by a tight end or back on a pass rusher, usually an edge rusher, delivered on the way out into his route. It is not a block. It is a hit, a second at most, aimed at knocking the rusher off his path or breaking his rhythm, so that the tackle can catch up with him.

Show the Python
off = line() + gun(1.5) + [O("Y", "TE", -1.2, -4.8, "Y"), O("X", "WR", -0.7, -15.0, "X"),
                           O("Z", "WR", -0.7, 15.0, "Z")]
dfn = [D("LE", "DE", 1.0, -6.3, "E"), D("NT", "DT", 1.0, -0.7, "1"), D("DT", "DT", 1.0, 2.35, "3"),
       D("RE", "DE", 1.0, 5.3, "E"), D("MIKE", "MIKE", 4.8, 1.0, "M"), D("WILL", "WILL", 4.8, -2.6, "W")]
p = Play(off, dfn, los=35, to_go=None, title="Chip, then release")
to(p, "LE", (-3.4, -5.6), "rush", via=[(-0.5, -6.8)])
to(p, "RE", (-3.6, 5.2), "rush", via=[(-1.0, 6.0)])
to(p, "LT", (-2.9, -4.6)); to(p, "RT", (-3.0, 4.3))
to(p, "NT", (0.1, -0.85), "rush"); to(p, "DT", (0.1, 2.3), "rush")
to(p, "LG", (-1.3, -1.3)); to(p, "C", (-1.4, 0.0)); to(p, "RG", (-1.3, 1.9))
to(p, "Y", (8.0, -6.6), "route", via=[(-0.4, -5.9), (2.4, -5.6)])
to(p, "RB", (0.0, 9.2), "route", via=[(-2.6, 5.4), (-1.8, 7.0)])
p.drop("MIKE", (9.5, 1.5)); p.drop("WILL", (9.0, -3.5))
fld = draw(p, lateral=(-11.5, 11.5), window=(-7.4, 11.4))
for (d, w) in ((-0.4, -5.9), (-2.6, 5.4)):
    x, y = _P(fld, p, d, w)
    fld.ax.plot([x], [y], marker="*", ms=13, color=style.THIRD, mec="white", mew=0.8, zorder=11)
point_to(fld, p, (-5.6, -7.6), (-0.4, -5.9), "Y chips the end\nfrom the inside\n(a shove, not a block)", color=GREEN)
point_to(fld, p, (-5.4, 7.8), (-2.6, 5.4), "the back chips\nthe other end", color=GREEN)
say(fld, p, 5.8, -8.6, "...then up\nthe seam", color=GREEN)
say(fld, p, 2.4, 8.4, "...then\nthe flat", color=GREEN)
plt.show()
Figure 21.7: Chip, then release (the outside receivers are not shown). Y lines up as a wing, a step outside and behind the left tackle, with the left end wider still (a wide alignment coaches call a 9-technique); the back stands to the quarterback’s right. At the snap each hits the nearest end from the inside as he starts his rush (the stars), knocking him wider and slowing him for the tackle, and then runs his route: Y up the seam, the back to the flat. The back has checked first that no linebacker is blitzing (check, chip, release). The offense gets help against two pass rushers and still gets two receivers out, just a beat later.

The chip exists because of the slide’s weak spot and the defense’s best player. When a defense has one edge rusher the tackle cannot handle alone, the offense has three choices: leave the tackle on an island and hope, keep a tight end in to block the rusher full-time (and lose a receiver), or chip him (and lose a beat on the route). The chip is the cheap version of help. Its cost is timing: a receiver who chips is late into his route, so chips go with routes that do not need to be on time, like a back’s checkdown to the flat (the short, safe throw a quarterback makes when nothing downfield is open) or a tight end’s route underneath. And the chip comes from the inside, knocking the end wider and deeper, the direction the tackle is already pushing him; a chip that drives him inside would push him straight at the quarterback.

More blockers, fewer receivers: max protect

Add a tight end to a six-man protection and you have a seven-man protection: the five linemen, the back and a tight end. It usually stays flexible. The tight end and back check, chip and release, so three receivers are out on time and one or two more arrive late, and its most common job is the one you just saw: putting help on a dangerous edge rusher.

At the far end of the counting spectrum is max protect. The difference is not only the number but the commitment: seven or eight blockers who stay in to block whatever the defense does, no check-releases, with only two or three receivers in the pattern. It is the offense’s way of buying the most time it can, and it nearly always travels with a deep throw.

Show the Python
off = [q.moved(label=q.key) if q.key in OL_KEYS else q for q in offense("ace")]
off = [q.moved(w=-10.0) if q.key == "X" else q.moved(w=10.0) if q.key == "Z" else q for q in off]
dfn = [q.moved(label={"WDT": "1", "SDT": "3"}.get(q.key, q.label))
       for q in defense("4-3_over", "single_high", off)]
p = Play(off, dfn, los=35, to_go=10, title="Max protect: eight block, two go deep")
p.dropback(8.5)
to(p, "RB", (-4.6, -1.6), "block")
to(p, "WDE", (-2.0, -5.0), "rush", via=[(0.0, -4.6)])
to(p, "WDT", (-0.2, -1.0), "rush"); to(p, "SDT", (-0.2, 2.3), "rush"); to(p, "SDE", (-0.3, 4.0), "rush")
to(p, "WILL", (0.2, -2.6), "rush")
# the linemen and tight ends set only a step (not drawn, so their labels stay readable)
p.route("X", [(0, 0), (9, 0), (15.0, -4.0)]); p.route("Z", [(0, 0), (14.0, 0), (14.0, -9.0)])
p.drop("MIKE", (10.0, 1.0)); p.drop("SAM", (9.5, 7.5)); p.drop("SS", (11.0, 4.0))
p.drop("LCB", (12.5, -10.5)); p.drop("RCB", (12.5, 10.5)); p.drop("FS", (15.5, 0.0))
fld = draw(p, width_in=5.6, lateral=(-12.6, 12.6), window=(-11.8, 17.6), ol_fs=6.2)
say(fld, p, -5.4, -8.6, "8 blockers\nvs 5 rushers", color=GREEN, fontsize=8, weight="bold")
say(fld, p, -4.6, 8.4, "2 receivers\nvs 6 in coverage", color=RED, fontsize=8, weight="bold")
point_to(fld, p, (-8.2, 6.0), (-1.2, 4.0), "spare blockers\nlook for work", color=GREEN)
point_to(fld, p, (-9.0, -5.0), (-4.6, -1.6), "the back stays in", color=GREEN)
point_to(fld, p, (-10.3, 4.2), (-10.4, 0.3), "Q's launch point", fontsize=6.8)
plt.show()
Figure 21.8: Max protect from two tight ends (12 personnel), under center with a seven-step drop (Q is shown at the snap; the dotted line behind him is his drop, about nine yards deep). Eight men block (the five linemen, both tight ends U and Y, and the back R) against five rushers, so three blockers are spare and help wherever a rusher is winning. Only X and Z run routes, a deep post and a deep crossing route at about 14 yards, into six defenders in coverage. The offense has bought time, and spent receivers to do it: the play works only if one of those two gets open deep.

Max protect exists because deep routes take time. A 20-yard post needs the quarterback to hold the ball for three seconds or more, and against a good rush that time has to be bought with bodies. It pairs naturally with play-action (a fake handoff before the pass), because the heavy formation and the extra blockers look exactly like a run, which freezes the linebackers and safeties for the half-second the deep routes need.

The trade is stark, and Figure 21.8 puts numbers on it. With eight blocking and five rushing, the quarterback has all the time he wants. But two receivers against six defenders in coverage means double coverage somewhere, and nowhere to go if both are covered except the sideline, a scramble or a sack. Max protect is a bet that one of two receivers will beat his man deep. It is a good bet against a defense that has to respect the run and a bad one against a defense that just drops eight.

Fewer blockers, more receivers: scat and empty

At the other end are protections that block with five, or as close to five as possible, so that more players can run routes.

In empty protection, the offense lines up with nobody in the backfield except the quarterback (the “empty” formations of Spread and Modern Formations), so the five linemen are the whole protection. Many teams block it man-to-man, the four defensive linemen plus the Mike; others run it as a five-man slide or half-slide. Either way, any sixth rusher is the quarterback’s problem.

In scat protection, the back lines up in the backfield, so the defense has to respect him as a blocker, but he releases into his route at the snap instead of checking a blitzer first. The line blocks, and as in empty, an extra rusher is the quarterback’s.5 Teams use the word in different ways (in some playbooks “scat” is one numbered protection, in others a tag that can be added to several), so treat it as “six in the picture, five in the protection.”

Both exist for the same reason: five receivers stretch a defense further than four, and the quickest throws come out before an extra rusher could arrive anyway. The quick game of 04-03 is built on this: a ball out in a second and a half makes a sixth rusher irrelevant. And both carry the same obligation. If the defense sends one more than the protection can block, somebody has to get the ball out, now.

When rushers outnumber blockers: hot routes and sight adjusts

That obligation is the last piece of the protection puzzle. When six rush and five block, the protection has done its job if the man left over is the right man, the one with the longest path, and the rest of the answer belongs to the quarterback and his receivers.

Show the Python
def empty_3x2():
    """Empty backfield, 3x2: X and H on the left, Y, the back (R) and Z on the right."""
    return line() + gun(None) + [O("X", "WR", -0.7, -13.5), O("H", "WR", -1.4, -8.0),
                                 O("RB", "RB", -1.4, 6.5, "R"), O("Y", "TE", -1.4, 10.0), O("Z", "WR", -0.7, 14.0)]


def cover1_pressure():
    """Six rushers (four linemen, the Mike, the nickel back over H) and man coverage behind them."""
    return four_down(will=(4.5, 6.3)) + [
        D("NB", "NB", 4.5, -7.6, "NB"), D("LCB", "CB", 6.0, -13.5, "C"), D("RCB", "CB", 6.0, 14.0, "C"),
        D("SS", "SS", 6.0, 10.0, "SS"), D("FS", "FS", 13.0, 0.0, "FS")]


p = Play(empty_3x2(), cover1_pressure(), los=35, to_go=8, title="Six rush, five block: the throw goes hot")
p.dropback(1.0)
to(p, "LT", (-1.7, -4.3)); to(p, "RT", (-1.7, 4.3))     # interior sets are a step: not drawn
to(p, "LE", (-1.0, -5.6), "rush", via=[(0.0, -5.6)]); to(p, "RE", (-1.0, 5.6), "rush", via=[(0.0, 5.6)])
to(p, "NT", (0.2, -0.9), "rush"); to(p, "DT", (0.2, 2.25), "rush"); to(p, "MIKE", (0.6, 0.7), "rush")
p.route("H", [(0, 0), (1.5, 0), (5.0, -4.5)]); p.pass_to("H", t=0.95)
for k in ("X", "Z"):
    p.route(k, [(0, 0), (6, 0), (5.4, -0.6)])
p.route("Y", [(0, 0), (12, -0.5)]); p.route("RB", [(0, 0), (5, 0), (5, 4)])
for d_, r_ in (("LCB", "X"), ("RCB", "Z"), ("SS", "Y"), ("WILL", "RB")):
    p.man(d_, r_)
p.drop("FS", (15.0, 0.0))
fld = draw(p, width_in=6.4, lateral=(-15.6, 15.6), window=(-8.8, 16.6), ol_fs=6.2)
blitz = [(4.5, -7.6), (1.0, -6.6), (-3.6, -4.0), (-5.2, -1.2)]
free_path(fld, p, blitz)
run = sum(np.hypot(b[0] - a[0], b[1] - a[1]) for a, b in zip(blitz[:-1], blitz[1:]))
say(fld, p, 2.4, -11.6, "free rusher:\nthe nickel back", color=RED, weight="bold")
point_to(fld, p, (8.6, -7.0), (3.4, -5.1), "hot: H breaks into the\nspace the blitzer left", color=GREEN)
say(fld, p, -6.0, 8.5, "5 blockers: the four\nlinemen + the Mike", color=GREEN)
say(fld, p, -6.6, -10.2, f"ball out in about 1 s;\nthe blitzer has about\n{run:.0f} yd to run, close to 2 s", fontsize=6.8)
plt.show()
Figure 21.9: Six rush, five block: the throw goes hot. The offense is in an empty 3x2 formation, so its five linemen are the whole protection; they take the four defensive linemen and the Mike. The defense brings a sixth rusher, the nickel back (NB) from over H, and plays man coverage behind it with one deep safety. Blocking inside-out leaves the nickel, the widest rusher with the longest path, unblocked by design (red). The answer is the hot throw: H breaks inside into the space the blitzer just left, and the ball is out before the nickel gets home.

A hot route is the throw built into a play for exactly this moment: when a rusher comes that the protection cannot block, the quarterback throws at once to a receiver running into the area that rusher just left. The logic is simple and a little beautiful. A defender who rushes is a defender who is not covering, so the space he came from is, for a second or so, empty. In Figure 21.9 the nickel back was the man over H; when he blitzes, H’s quick inside break runs straight into the hole. The quarterback does not have to read the coverage; he has to recognise the blitz and be on time.

That is why “who’s hot?” is part of the design of most dropback passes, not something made up on the field. The play call and the protection together decide it: once the offense knows which rusher it will leave unblocked if everyone comes, it knows which receiver’s route has to be ready early. Usually the hot receiver is the man whose defender is most likely to blitz (a slot receiver against a slot-cornerback blitz, a tight end against a linebacker blitz). The quarterback’s pre-snap job is to see whether the hot is live on this snap; a play whose protection can block everyone who might come needs no hot at all.

Coaches decide where the leftover man comes from, too, not only how many. Inside-out settles the count; the direction of the slide settles the side. Given the choice, they would rather leave the free rusher where the quarterback can see him, on the side he is looking to throw, than coming from behind his back.

A sight adjust is the receiver’s half of the same idea. The receiver sees the blitz too, and changes his route after the snap: a receiver running a deep route against a defender who has just blitzed cuts it off short, stopping and turning back to the quarterback or breaking inside, so the ball can come out immediately. The quarterback, reading the same blitz, expects it. Teams use the two words differently. Some call any blitz-beater “hot,” some reserve “hot” for a designated route and “sight” for a converted one. What matters on the broadcast is the shape: a quick throw, often to a slot receiver or tight end, into the space a blitzer just vacated.

NoteMadden vs. real life

In Madden a “hot route” is something you do before the snap: you press a button and change one receiver’s route to a slant or a streak. Real offenses do change individual routes before the snap, with tags and signals, but that is not what coaches mean by “hot.” In football a hot route is the answer to an unblocked rusher: a throw the quarterback makes because someone is coming free, to the space that rusher left. It is decided by the defense’s choice, after the snap, not by a menu.

Hot throws explain a strange-looking fact you will start to notice: some of the most dangerous blitzes are the ones that produce quick completions, not sacks. A six-man blitz that the offense has blocked correctly, inside-out, leaves the quarterback a free rusher and a hot receiver. If he sees it, he completes a slant for eight yards; if he doesn’t, he is sacked from his blind side and the announcer blames the tackle, who did nothing wrong. Blitz math, from the defense’s side, is in Blitz and Man Pressure.

The protection families, side by side

Pass protections by how many block and how many go out. Names and details vary by team; the counting does not.
Protection Who blocks Routes An extra rusher is… Typical use
Empty 5 linemen (man, or a slide) 5 the QB’s: throw hot Empty sets, quick game
Scat 5 linemen (back aligned in the backfield) 5 the QB’s: throw hot Quick throws
Half-slide 5 linemen + back 4, or 5 if the back releases the back’s (man side) or the slide’s Most ordinary dropbacks
Full slide 5 linemen + back or TE 4, or 5 if the back releases the slide’s; the back takes the end left behind Stunts, inside pressure
Man (BOB) 5 linemen + back 4, or 5 if the back releases the back’s: the second linebacker Clean four-man fronts
Seven-man 5 linemen + back + TE 3 on time, more late after check or chip picked up; chips help the tackles Long routes, a star edge rusher
Max protect 7 or 8, all staying in 2 or 3 picked up by spare blockers Deep shots, play-action

The lineman’s half: sets, punch and anchor

Schemes decide who blocks whom. Technique decides whether he can. Pass blocking is a strange athletic task: a 315-pound man moving backward, against a man who is moving forward, faster and with a head start, who knows where he is going. The offensive lineman’s advantages are that he knows where the quarterback will be and that he only has to stay in the way for about three seconds. Everything in his technique is built on those two facts.

The set: kick slide, vertical, 45-degree, jump

At the snap, a pass blocker sets: he rises out of his stance and moves to the spot from which he will meet his rusher. For a tackle facing a fast edge rusher, the footwork is the kick slide. The outside foot kicks back and out, the inside foot slides after it, and the feet never cross, so he can move backward and sideways while his shoulders stay square to the line and he can still change direction. A tackle who crosses his feet, or turns his hips to run, has handed the rusher the inside path to the quarterback.

Where the kick slide takes him is a choice, and the choice is a trade between time and space.

Show the Python
SETS3 = [("Vertical set", (-3.7, 3.9), [(-1.4, 6.3), (-3.2, 5.0)],
          "Kick-slides straight back\nfor depth: the end must\ngo around him"),
         ("45-degree set", (-2.1, 4.7), [(-1.4, 5.9)],
          "Back and out at an\nangle: meets a wide\nrusher sooner"),
         ("Jump set", (-0.3, 4.5), [(0.2, 6.6), (-0.15, 5.4)],
          "Attacks at the line:\nno runway for the end;\nthe ball must come out fast")]
fig, axes = plt.subplots(1, 3, figsize=(6.5, 3.5))
for ax, (name, rt_end, e_path, note) in zip(axes, SETS3):
    off = [q for q in line() if q.key in ("RG", "RT")]
    p = Play(off, [D("DT", "DT", 1.0, 2.35, "3"), D("RE", "DE", 1.0, 5.6, "E")], los=35, to_go=None)
    to(p, "RT", rt_end)
    to(p, "RE", e_path[-1], "rush", via=e_path[:-1])
    fld = draw(p, ax=ax, title=False, lateral=(0.3, 8.0), window=(-5.2, 3.0))
    st, en = np.array([-0.7, 3.2]), np.array(rt_end)
    for i, f in enumerate(np.linspace(0.25, 0.85, 4)):      # footprints: kick (outside), slide (inside)
        q = st + (en - st) * f
        x, y = _P(fld, p, q[0], q[1] + (0.35 if i % 2 == 0 else -0.35))
        ax.plot([x], [y], marker="o", ms=3.0, color=style.OFFENSE_DARK, alpha=0.6, zorder=5)
    panel_title(ax, name, size=8.4)
    ax.text(0.5, -0.02, note, transform=ax.transAxes, ha="center", va="top", fontsize=7.0, color=style.INK)
fig.tight_layout(w_pad=0.6)
plt.show()
Figure 21.10: Three ways for a right tackle to set against a wide edge rusher (the dots are his footsteps). A vertical set kick-slides almost straight back for depth: the end must run a long arc around him. A 45-degree set goes back and out at an angle: he meets the rusher sooner, wider and with less ground given. A jump set attacks forward to meet the end at the line, taking away his running start; it pairs with quick throws, because if the tackle misses, the end has a short path to the quarterback.

A vertical set kick-slides almost straight back, giving ground fast. It is the answer to a speed rusher: the deeper the tackle gets, the longer the arc the rusher must run around him, and the more likely the rusher ends up behind the quarterback. Its risk is the inside. A tackle who has bailed straight back has left room between himself and his guard, and a good rusher will fake the arc and come back underneath into that space.

A 45-degree set goes back and out at an angle. It meets a wide rusher sooner and with less ground given, at the cost of a little depth. Many tackles mix the two on purpose, so the rusher cannot time his moves to one picture.

A jump set is the aggressive one: instead of retreating, the blocker moves forward or flat to meet the rusher at or near the line of scrimmage. It takes away the rusher’s running start, the few yards he uses to build up speed before his move, and it gives the quarterback clean throwing lanes on quick passes. It is also a gamble: a lineman who lunges and misses has nobody behind him, and the rusher’s path to the quarterback is now short. That is why jump sets travel with the quick game, when the ball will be gone in a second and a half anyway, and why good tackles sprinkle them into longer dropbacks too, so rushers never know what is coming.

Interior linemen set too, but differently: they have no room to give, so their sets are short, a step or two, and their battles are decided almost immediately by hands and leverage.

Punch and anchor

Once he has set, the blocker has to win the contact. The punch is his weapon: a short, violent, two-handed strike into the rusher’s chest, inside the rusher’s arms, to stop his momentum and take control of his body. Timing is everything. Punch too early and the rusher swats the hands away and runs past; too late and the rusher’s hands are already on the blocker’s chest. That is why many NFL tackles no longer throw one textbook two-handed punch against every rusher: against men who swipe and chop at the hands, they “catch” the rusher and strike late, or use one hand at a time, so there is nothing early to swat. Hands inside matter for a second reason: the rules. A blocker may first contact a rusher on or outside his frame (his body below the neck, facing the blocker), but he must work immediately to get his hands inside it, and using hands or arms to grab, hook or turn the rusher, restricting his path, is holding, wherever the hands are.6 Hands outside the frame are where a restriction is easiest to commit and easiest for an official to see. That is why linemen spend so much practice time on “inside hands”: it is the safest place to win from.

The punch is only possible because of a rule change. Until 1978, pass blockers in the NFL had to keep their hands close to their bodies; that season the league allowed them to extend their arms and open their hands, one of a pair of rule changes meant to open up passing.7 Before it, linemen pass-blocked with their forearms and elbows, more like a wall of shoulders than a pair of arms. The change made the modern pass set, and the modern passing game, possible. The 1978 Liberation tells that story.

The anchor is the answer to power. A bull rush (the rusher driving straight through the blocker’s chest) does not try to get around the blocker; it tries to push him backward into the quarterback. To anchor, the blocker drops his hips, widens his base and resets his feet so that the push stops. A guard who cannot anchor is the most dangerous weakness a line can have, because the pocket collapses from the middle, exactly where Figure 21.1 said it must not.

CautionCommon misconception

“Pass blocking is about strength.” Strength matters most in the anchor, but most pass-blocking losses are losses of position or timing: a set too shallow or too deep, a punch thrown too early, feet that stopped moving. That is why some of the best pass-blocking tackles are not the strongest men on their line, and why a rusher’s best moves, the ones The Pass Rush describes, are aimed at the blocker’s hands and feet, not his strength.

Stunts: passing them off

The defense has its own way to beat protection without adding rushers: make two of them swap jobs. In a stunt (also called a twist or a game), two rushers exchange gaps after the snap. The most common is the T-E stunt (tackle first, end second): the defensive tackle, here the 3-technique, goes first, crashing outward into the offensive tackle, and the end loops around the back of him, on the defense’s side of the line, into the space he left inside. (Its mirror, the E-T stunt, sends the end inside first and loops the tackle around the outside.) The first man is the penetrator; his job is to occupy, or even knock over, the blocker the looper needs to get past. The second is the looper.

The offense’s answer is the pass-off: two adjacent blockers handing the rushers to each other. There are two ways to do it, switch and stay, and the animation shows the one coaches usually teach against a clean twist.

Show the Python
def stunt_play(switch=True):
    """A T-E stunt on the offense's right: the 3-technique crashes out into the tackle, the end loops inside
    behind him. switch=True: the RG and RT trade men. False: each follows the man he started on."""
    p = Play(line() + gun(None), four_down(lbs=False), los=35, to_go=None)
    timed(p, "QB", [(0.9, -7.4, 0.0)])
    timed(p, "LE", [(0.5, -0.6, -5.7), (1.0, -2.3, -5.6), (1.6, -3.3, -5.4)], "rush")
    timed(p, "LT", [(0.5, -1.7, -4.0), (1.0, -2.8, -4.4), (1.6, -3.6, -4.3)], "block")
    timed(p, "NT", [(0.5, 0.0, -0.9), (1.0, -0.5, -1.0), (1.6, -0.8, -1.0)], "rush")
    timed(p, "LG", [(0.5, -1.3, -1.6), (1.0, -1.7, -1.4), (1.6, -2.0, -1.3)], "block")
    timed(p, "C", [(0.5, -1.4, 0.1), (1.0, -1.8, 0.2), (1.6, -2.1, 0.3)], "block")
    # the penetrator: the 3-technique slants hard outside into the RT
    timed(p, "DT", [(0.4, 0.0, 3.0), (0.8, -0.7, 3.6), (1.1, -1.1, 3.9), (1.4, -1.35, 4.0), (1.8, -1.45, 4.0)], "rush")
    # the looper: the end jabs upfield, then loops around the back of the 3-technique (on the defense's side)
    loop = [(0.4, 0.1, 5.7), (0.8, 0.7, 4.7), (1.1, 0.5, 3.1), (1.4, -0.4, 2.2)]
    timed(p, "RE", loop + ([(1.8, -0.85, 2.0)] if switch else [(1.8, -2.2, 1.7), (2.2, -4.2, 1.1)]), "rush")
    if switch:
        # the RT squeezes down on the penetrator; the RG stays home and meets the looper
        timed(p, "RG", [(0.4, -1.2, 1.9), (0.8, -1.6, 2.0), (1.1, -1.9, 2.0), (1.4, -2.1, 1.9), (1.8, -2.3, 1.9)], "block")
        timed(p, "RT", [(0.4, -1.4, 3.8), (0.8, -2.1, 4.0), (1.1, -2.5, 4.1), (1.4, -2.7, 4.1), (1.8, -2.85, 4.1)], "block")
    else:
        # stay: the RG chases the 3-technique outside; the RT, trying to follow the end inside, is cut off by them
        timed(p, "RG", [(0.4, -1.2, 2.1), (0.8, -1.8, 2.6), (1.1, -2.1, 2.9), (1.4, -2.3, 3.0), (1.8, -2.4, 3.0)], "block")
        timed(p, "RT", [(0.4, -1.6, 3.9), (0.8, -2.1, 4.4), (1.1, -2.5, 4.6), (1.4, -2.8, 4.6), (1.8, -2.9, 4.6)], "block")
    return p


protection_animation(stunt_play(True), [0.0, 0.4, 0.8, 1.1, 1.4, 1.8],
    notes=["snap: 3 over the RG,\nE over the RT", "3 crashes outside;\nE jabs upfield",
           "RT squeezes down on the 3;\nRG feels him leave", "E loops behind the 3;\nRG stays home",
           "switch: RT has the 3,\nRG meets the E", "two rushers, two blockers\n(dotted): nobody free"],
    lateral=(-1.2, 7.2), window=(-4.0, 2.4), ncols=3, rings=(("DT", PURPLE), ("RE", style.THIRD)),
    final_links=(("RT", "DT"), ("RG", "RE")))
Figure 21.11: Passing off a T-E stunt by switching (simulated; the view is zoomed on the offense’s right side, the quarterback is off the bottom of the frame, and the left side is blocked normally). The 3-technique (ringed in purple) slants hard outside into the right tackle while the end (ringed in green) jabs upfield and then loops around the back of him into the B gap. The right guard and right tackle stay on the same level and keep their areas: the tackle squeezes down and takes the 3-technique as he arrives, and the guard, instead of chasing the 3-technique outside, stays home and picks up the looping end. The dotted lines in the last frame show who finished on whom.

Switch means each blocker keeps his area and takes whoever comes into it. In Figure 21.11 the guard starts on the 3-technique, feels him crash outside, and lets him go to the tackle; the tackle starts on the end, sees him loop away inside, and lets him go to the guard. Each lineman ends up on the other’s man. The key coaching point is that the two blockers must be on the same level (the same depth), “hip to hip.” If the guard has set deeper than the tackle, or shallower, the penetrator slips between them before the hand-off happens. Line coaches add two cues: the tackle squeezes the penetrator, flattening down to meet him so he cannot split the seam, and the guard gives him a push toward the tackle as he leaves and turns his eyes inside at once, because the looper is coming next.

Stay means each blocker follows the man he started on, wherever he goes. Against a stunt, that usually loses, and the static picture shows why.

Show the Python
fig, axes = plt.subplots(1, 2, figsize=(6.5, 3.3))
for ax, sw, ttl in zip(axes, (False, True), ("Stay: each chases his man", "Switch: each keeps his area")):
    q = stunt_play(sw)
    fld = panel(ax, q, tracking(q), 2.1, (-2.5, 7.5), (-8.8, 2.6), rings=(("DT", PURPLE), ("RE", style.THIRD)),
                links=() if not sw else (("RT", "DT"), ("RG", "RE")))
    panel_title(ax, ttl)
    if not sw:
        say(fld, q, -4.4, 4.9, "E is through\nthe B gap", color=RED, weight="bold")
        say(fld, q, 1.4, 5.6, "RG and RT both\nend up on the 3", color=RED, fontsize=6.8)
    else:
        say(fld, q, 1.4, 6.0, "RT took the 3,\nRG took the E", color=GREEN, fontsize=6.8)
fig.tight_layout(w_pad=0.8)
plt.show()
Figure 21.12: The same T-E stunt, about two seconds after the snap, against two plans (simulated; faint lines are where each player has been). Left, stay: the right guard chases the 3-technique outside and the right tackle tries to chase the end inside, but the end’s loop runs behind the guard and the 3-technique, and the tackle is cut off by his own teammate and the penetrator. Both blockers finish on the 3-technique, and the end is through the B gap toward the quarterback. Right, switch: each blocker kept his area, so each finished on the rusher who came into it.

The stunt is designed to beat “stay.” The penetrator’s crash outside drags the guard with him and puts two bodies in the tackle’s path, and the looper simply walks around the traffic. That is why most line coaches teach switching against a clean two-man twist. Stay is not useless: if one blocker is already locked onto his man and winning, letting go to switch can free the rusher he was beating, and some games are built to punish a switch, with the looper waiting a beat (a delayed loop) so that the blockers trade too early. The decision is made in a split second by feel, and it is a large part of why linemen who have played together for years protect better than five talented strangers.

Notice, too, which scheme makes this easier. In a slide, every lineman already owns a gap, so a switch is the default: the looper comes into the guard’s gap, so he is the guard’s. In man protection the blockers have to recognise the stunt and decide to switch. That is one reason offenses facing stunt-heavy fronts lean on slide protection. Where a stunt aims matters too. The T-E game in the figures attacks the guard-tackle seam; its mirror, the E-T, sends the looper toward the guard-center seam, which is where a slide is strongest, because the center and guards are all already stepping the same way. So defenses choose their games against the protection they expect, and stunting is one of the main tools a four-man rush has for creating pressure without blitzing.

Linemen do talk through all of this. Before the snap they warn each other about alignments that suggest a stunt, and during the rush a switch is often called out loud. On a broadcast you will almost never hear it; you see it in the hand-off.

The pocket over time

Everything so far has been about the first second or two. A real dropback lasts longer, and the pocket is not a fixed shape; it breathes. It widens as the linemen set, holds for a while, and then shrinks as the rushers win ground. Tracking data lets us draw that as a shape: join the five linemen and the quarterback with the smallest polygon that contains them all (a convex hull), and you have a rough outline of the pocket, frame by frame.

The Big Data Bowl files this course uses (13-05) record every player’s position ten times a second. We have not downloaded those files, so the figure below uses a simulated play from the gridiron library, written out in exactly the Big Data Bowl format; the code to run the same measurement on a real play follows it.

Show the Python
def pocket_play():
    """A four-man rush against five blockers, played out to 3.2 s: the edges are run up the arc, the 1-technique
    bull-rushes the left guard and the spare center helps, the right end beats his tackle late, and the
    quarterback steps up toward the right B gap."""
    p = Play(line() + gun(None), four_down(lbs=False), los=35, to_go=None)
    timed(p, "QB", [(0.9, -7.4, 0.0), (2.3, -7.4, 0.0), (2.8, -6.5, 0.8), (3.2, -6.4, 0.9)])
    timed(p, "LE", [(0.5, -0.6, -5.7), (1.0, -2.3, -5.6), (2.0, -4.6, -5.1), (3.0, -6.8, -3.7), (3.2, -7.1, -3.2)], "rush")
    timed(p, "LT", [(0.5, -1.7, -4.0), (1.0, -2.8, -4.4), (2.0, -4.3, -4.1), (3.0, -5.8, -2.8), (3.2, -6.1, -2.5)], "block")
    timed(p, "NT", [(0.5, 0.0, -0.9), (1.0, -0.6, -1.0), (2.0, -1.6, -1.0), (3.0, -2.4, -0.9), (3.2, -2.5, -0.9)], "rush")
    timed(p, "LG", [(0.5, -1.3, -1.6), (1.0, -1.7, -1.3), (2.0, -2.7, -1.4), (3.0, -3.5, -1.4), (3.2, -3.6, -1.4)], "block")
    # the center: nobody in his gap, so he checks the middle and then posts onto the 1-technique's near hip
    timed(p, "C", [(0.5, -1.4, 0.2), (1.0, -1.8, 0.25), (2.0, -2.4, 0.15), (3.0, -3.1, 0.25), (3.2, -3.2, 0.25)], "block")
    timed(p, "DT", [(0.5, 0.0, 2.3), (1.0, -0.6, 2.2), (2.0, -1.0, 2.0), (3.0, -1.4, 1.9), (3.2, -1.5, 1.9)], "rush")
    timed(p, "RG", [(0.5, -1.3, 1.8), (1.0, -1.8, 1.9), (2.0, -2.2, 1.9), (3.0, -2.6, 1.9), (3.2, -2.7, 1.9)], "block")
    # the right end is run up the arc, then comes back underneath his tackle late
    timed(p, "RE", [(0.5, -0.6, 5.7), (1.0, -2.3, 5.6), (2.0, -4.6, 5.1), (2.6, -5.8, 4.4), (3.0, -6.2, 3.1), (3.2, -6.3, 2.6)], "rush")
    timed(p, "RT", [(0.5, -1.7, 4.0), (1.0, -2.8, 4.4), (2.0, -4.3, 4.1), (2.6, -5.3, 3.9), (3.0, -5.5, 4.0), (3.2, -5.5, 4.0)], "block")
    return p


pocket = pocket_play()
trk = pocket.to_tracking()          # simulated tracking in Big Data Bowl columns: frameId, time, x, y, ...
strip(pocket, [0.0, 1.0, 2.0, 3.0],
      notes=["snap: a straight wall\n(it becomes a cup)", "+1 s: sets made,\nthe cup at its widest",
             "+2 s: ends run up the arc;\nthe C helps the LG on the 1",
             "+3 s: the QB steps up;\nthe right end comes under"],
      lateral=(-7.5, 7.5), window=(-9.2, 2.6), ncols=2, hull=True)
plt.show()
Figure 21.13: The pocket over time (simulated, BDB-format tracking; four-man rush against five blockers). The green shape is the convex hull of the five linemen and the quarterback. At the snap it is a thin triangle. By one second the linemen have set and the cup is at its widest. By two seconds the tackles are running the ends up their arcs, level with them, and the 1-technique’s bull rush is driving the left guard back; the center, with nobody in his gap, has joined in to help. By three seconds the ends are at the quarterback’s depth, the right end has come back underneath his tackle, and the quarterback has stepped up toward the right B gap, where the interior held, into a pocket shrinking from the front and closing from the side.

The shape is useful because it can be turned into numbers, frame by frame, and the numbers tell the story of the play without any video at all.

Show the Python
times = [t for t in sorted(trk["time"].unique()) if 0 <= t <= 3.2 + 1e-9]
area, space = [], []
for t in times:
    fr = trk[np.isclose(trk["time"], t)]
    area.append(hull_area(convex_hull(pocket_points(fr))))
    qb = fr.loc[fr["displayName"] == "QB", ["x", "y"]].to_numpy()[0]
    rushers = fr.loc[fr["side"] == "def", ["x", "y"]].to_numpy()
    space.append(float(np.min(np.hypot(*(rushers - qb).T))))
style.apply()
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(6.5, 2.3))
ax1.plot(times, area, color=style.SERIES[2]); ax1.set_title("Pocket area (square yards)", fontsize=9)
ax2.plot(times, space, color=style.SERIES[1]); ax2.set_title("Quarterback to nearest rusher (yards)", fontsize=9)
for ax in (ax1, ax2):
    ax.set_xlabel("seconds after the snap", fontsize=7.5)
    ax.tick_params(labelsize=7.5)
    ax.set_xlim(0, 3.2)
    ax.set_ylim(bottom=0)
    for t in (1.0, 2.0, 3.0):
        ax.axvline(t, color=style.SERIES[6], lw=1.1, ls=(0, (3, 2)), zorder=3)
fig.tight_layout()
plt.show()
Figure 21.14: The same simulated play as two measurements, one per tenth of a second. Left: the area of the pocket outline nearly doubles as the linemen set, then shrinks as the rush wins ground. Right: the distance from the quarterback to the nearest rusher, the space he has to throw in, stays near six yards for about two seconds and then falls fast. The dashed lines mark the frames shown above (1, 2 and 3 seconds).

On real data, the same two lines are a way to compare protections without trusting anyone’s charting: how quickly a team’s pocket reaches its full size, how long it holds it, and how fast the quarterback’s space disappears. The code is the same; only the input changes.

Show the Python (the same measurement on a real Big Data Bowl play)
# Run this after downloading a Big Data Bowl edition (see 13-05). Column names differ by year;
# gridiron.bdb.prepare() normalizes direction and labels each player 'off', 'def' or 'ball'.
import pandas as pd
from gridiron import bdb

trk_all = bdb.load_tracking("data/bdb/tracking_week_1.csv")
plays = pd.read_csv("data/bdb/plays.csv")
players = pd.read_csv("data/bdb/players.csv")[["nflId", "position"]]
one = bdb.prepare(trk_all, plays, game_id=2022091100, play_id=55)      # any dropback you choose
one = one.merge(players, on="nflId", how="left")
line_and_qb = one[one["position"].isin(["T", "G", "C", "QB"])]           # five linemen and the passer
for fid, fr in line_and_qb.groupby("frameId"):
    if fr["time"].iloc[0] < 0:
        continue
    print(fr["time"].iloc[0], hull_area(convex_hull(fr[["x", "y"]].to_numpy())))

Measuring protection: pressure, time to throw and sacks

Now the numbers you will see on broadcasts and stat sites, and what each of them can and cannot tell you.

A sack (defined in Downs, Distance, and Field Position) is the number everyone knows: the quarterback tackled behind the line before he throws. Myles Garrett set the single-season record with 23 of them in 2025.8 But sacks are rare (about six or seven per hundred dropbacks) and they depend on many things besides the blocking, so analysts lean on broader measures.

Pressure is any rusher forcing the quarterback to change what he wanted to do. It comes in three kinds: the sack; the QB hit, contact that knocks the quarterback down or hits him as he throws; and the hurry, which forces him to throw early or move off his spot without contact. Pressure rate is pressures divided by dropbacks. It is the better measure of a protection (or a pass rush) because there are four or five pressures for every sack, so it settles down faster and is less a matter of luck: whether a pressure becomes a sack depends a great deal on the quarterback (The Pass Rush looks at it from the defense’s side).

There is one catch. Pressure is a judgment, and different data providers judge it differently. Some chart it by eye from video; others use tracking data and a distance rule. The nflverse data this course uses carries a pressure flag charted by FTN for recent seasons and by Next Gen Stats for earlier ones, and the two are not the same series.9 (FTN is a football-data company whose staff chart every play from video; Next Gen Stats is the league’s own tracking-data service.) Compare pressure rates only within one source.

Time to throw is the seconds from the snap to the release of a pass, as measured by Next Gen Stats; their average leaves sacks out.10 It tells you how long a quarterback holds the ball, which is partly the protection, partly the play call, and partly the quarterback. Pressure rate and time to throw are tied together, and the next chart shows how tightly.

Show the Python
from gridiron.data import nfl, pbp

style.apply()
FTN = [2024, 2025]
part = nfl().load_participation(seasons=FTN).to_pandas()[["nflverse_game_id", "play_id", "time_to_throw",
                                                           "was_pressure"]]
drop = pbp(FTN, columns=["game_id", "play_id", "season_type", "qb_dropback", "sack", "qb_hit", "epa"])
drop = drop[(drop["season_type"] == "REG") & (drop["qb_dropback"] == 1)].merge(
    part, left_on=["game_id", "play_id"], right_on=["nflverse_game_id", "play_id"], how="left")
press_rate = drop["was_pressure"].astype(float).mean()
press_to_sack = drop.loc[drop["was_pressure"] == True, "sack"].mean()   # noqa: E712
hit_rate = drop["qb_hit"].mean()
thrown = drop[drop["time_to_throw"].notna() & (drop["sack"] == 0)].copy()
EDGES = [0, 2.0, 2.5, 3.0, 3.5, 4.0, 5.0, 99]
LABS = ["<2.0", "2.0-2.5", "2.5-3.0", "3.0-3.5", "3.5-4.0", "4.0-5.0", "5.0+"]
thrown["bin"] = pd.cut(thrown["time_to_throw"], EDGES, labels=LABS, right=False)
byb = thrown.groupby("bin", observed=True).agg(n=("epa", "size"), epa=("epa", "mean"),
                                               pressure=("was_pressure", lambda s: s.astype(float).mean()))
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(6.6, 2.9))
x = np.arange(len(LABS))
ax1.bar(x, 100 * byb["pressure"], color=style.SERIES[1], width=0.72)
ax1.set_title("Pressured (% of throws)", fontsize=9)
ax2.bar(x, byb["epa"], color=np.where(byb["epa"] >= 0, style.SERIES[0], style.SERIES[7]), width=0.72)
ax2.axhline(0, color=style.BASELINE, lw=1)
ax2.set_title("EPA per throw", fontsize=9)
for ax in (ax1, ax2):
    ax.set_xticks(x, LABS, fontsize=7, rotation=35)
    ax.tick_params(axis="y", labelsize=7.5)
    ax.grid(axis="x", visible=False)
    ax.set_xlabel("time to throw (seconds)", fontsize=7.5)
fig.tight_layout()
plt.show()
Figure 21.15: The clock, in data: every pass thrown in the 2024 and 2025 regular seasons, grouped by time to throw. Left: the share of throws on which the quarterback was pressured climbs steadily, from under one in ten when the ball is out in two seconds to about three in four after five. Right: expected points added (EPA, the change in expected points a play produces, from 01-02) per throw rises at first, because longer-developing routes go deeper, peaks around three to three and a half seconds, and then falls off as pressure arrives. Sacks are left out of both panels, since a sack has no throw. Data: nflverse play-by-play and participation (FTN pressure charting) via nflreadpy.

Read Figure 21.15 as a picture of the bargain every pass play strikes. Across the two seasons, quarterbacks were pressured on 30% of dropbacks by FTN’s charting, and about 21% of those pressures (roughly one in 5) ended in a sack; the play-by-play flags a quarterback hit on about 14% of dropbacks. Throws out in under two seconds were pressured 9% of the time; throws held past five seconds, 74%. The right panel measures value in EPA, expected points added, from 01-02: the change in the offense’s expected points from before the play to after it. The middle of the range is where the offense profits: holding the ball three seconds buys deeper, more valuable throws, and the protection’s job is to make those three seconds safe. Past about three and a half, the rush is winning, and value falls off a cliff. (These are averages over very different plays. A five-second throw is often a scramble or a play that has broken down, which is part of why it does badly.)

Sack rate is sacks divided by dropbacks (pass attempts, sacks and scrambles). If protection were the whole story, a team whose quarterback holds the ball longer would be sacked more, and by a lot. The next chart checks.

Show the Python
SEASONS = list(range(2016, 2026))
ngs = nfl().load_nextgen_stats(stat_type="passing", seasons=SEASONS).to_pandas()
ngs = ngs[(ngs["week"] > 0) & (ngs["season_type"] == "REG")].copy()
ngs["tw"] = ngs["avg_time_to_throw"] * ngs["attempts"]
ttt = ngs.groupby(["season", "team_abbr"]).agg(tw=("tw", "sum"), att=("attempts", "sum")).reset_index()
ttt["ttt"] = ttt["tw"] / ttt["att"]
plays = pbp(SEASONS, columns=["season", "season_type", "posteam", "qb_dropback", "sack"])
db = plays[(plays["season_type"] == "REG") & (plays["qb_dropback"] == 1)]
sk = db.groupby(["season", "posteam"]).agg(dropbacks=("sack", "size"), sacks=("sack", "sum")).reset_index()
sk["sack_rate"] = sk["sacks"] / sk["dropbacks"]
teams = ttt.merge(sk, left_on=["season", "team_abbr"], right_on=["season", "posteam"])
r_all = np.corrcoef(teams["ttt"], teams["sack_rate"])[0, 1]
r_25 = np.corrcoef(*teams.loc[teams["season"] == 2025, ["ttt", "sack_rate"]].to_numpy().T)[0, 1]
b = np.polyfit(teams["ttt"], 100 * teams["sack_rate"], 1)
league_ttt = teams.groupby("season").apply(lambda g: np.average(g["ttt"], weights=g["att"]), include_groups=False)
league_sr = db.groupby("season")["sack"].mean()
chi = teams[teams["posteam"] == "CHI"].set_index("season")
cin = teams[teams["posteam"] == "CIN"].set_index("season")
rank_25 = int(teams[teams["season"] == 2025].set_index("posteam")["ttt"].rank(ascending=False)["CHI"])
chi_ttt_rank = "the longest of any team that season" if rank_25 == 1 else f"the {rank_25}th-longest in the league"

fig, ax = plt.subplots(figsize=(6.5, 4.2))
old, new = teams[teams["season"] < 2025], teams[teams["season"] == 2025]
ax.scatter(old["ttt"], 100 * old["sack_rate"], s=16, color=style.GRID, edgecolor=style.MUTED, lw=0.4,
           label="2016-2024 team-seasons", zorder=2)
ax.scatter(new["ttt"], 100 * new["sack_rate"], s=30, color=style.SERIES[0], edgecolor=style.SURFACE, lw=1.0,
           label="2025", zorder=3)
xs = np.linspace(teams["ttt"].min(), teams["ttt"].max(), 10)
ax.plot(xs, np.polyval(b, xs), color=style.INK_2, lw=1.2, ls=(0, (4, 2)), zorder=2, label="trend, all seasons")
a, z = chi.loc[2024], chi.loc[2025]
ax.annotate("", (z["ttt"], 100 * z["sack_rate"]), (a["ttt"], 100 * a["sack_rate"]),
            arrowprops=dict(arrowstyle="-|>", color=style.SERIES[1], lw=1.6, shrinkA=4, shrinkB=5), zorder=4)
ax.scatter([a["ttt"]], [100 * a["sack_rate"]], s=30, color=style.SERIES[1], edgecolor=style.SURFACE, lw=1.0,
           zorder=4, label="Bears 2024 (arrow: to 2025)")
ax.annotate(f"Bears 2024\n({a['sacks']:.0f} sacks)", (a["ttt"], 100 * a["sack_rate"]), xytext=(7, 4),
            textcoords="offset points", ha="left", fontsize=7.5, color=style.INK)
ax.annotate(f"Bears 2025\n({z['sacks']:.0f} sacks)", (z["ttt"], 100 * z["sack_rate"]), xytext=(6, -12),
            textcoords="offset points", ha="left", fontsize=7.5, color=style.INK)
ax.set_xlabel("Average time to throw (seconds, snap to release)", fontsize=8.5)
ax.set_ylabel("Sack rate (% of dropbacks)", fontsize=8.5)
ax.tick_params(labelsize=8)
ax.legend(loc="upper left", fontsize=7.5)
fig.tight_layout()
plt.show()
Figure 21.16: Holding the ball and getting sacked, team by team: every team-season from 2016 to 2025 (regular season). Time to throw is Next Gen Stats’ average for the team’s passers (snap to release, sacks excluded); sack rate is sacks per dropback from play-by-play. Teams that hold the ball longer are sacked a little more on average (the dashed trend), but the scatter around it is huge: at any given time to throw, sack rates range from about 3% to 10%. The arrow follows one team, the Chicago Bears, from 2024 to 2025. Data: nflverse via nflreadpy.

Three things to take from Figure 21.16.

The ball is coming out a little later than it used to. The league-wide average time to throw rose from 2.64 seconds in 2016 to 2.84 in 2025, while the league sack rate stayed within a point or so (5.6% of dropbacks in 2016, 6.5% in 2025). Quarterbacks hold the ball a fifth of a second longer than they did a decade ago and are sacked only a little more often, which says something about how protection, and quarterbacks’ pocket movement, have kept up.

Holding the ball explains only a little of who gets sacked. Across all team-seasons the correlation between time to throw and sack rate is 0.29, positive but weak; the trend line says each extra tenth of a second goes with about 0.3 more sacks per hundred dropbacks. Within 2025 alone it is 0.05, essentially nothing. Two teams can hold the ball equally long and be sacked at rates three times apart. What separates them is the quality of the protection, the play calls, and above all the quarterback: his sense of when to throw it away, when to step up, and when to run.

Sacks are shared. Follow the arrow. In 2024 the Bears’ quarterback, Caleb Williams, was sacked 68 times, a franchise record, on 9.9% of dropbacks. In 2025, with a new head coach and three new interior linemen, he was sacked 24 times (3.7%) while holding the ball longer: 3.19 seconds on average, the longest of any team that season, up from 2.92.11 The new linemen were the guards Joe Thuney (traded from Kansas City) and Jonah Jackson (from the Rams) and the center Drew Dalman (signed in free agency), all in the interior, the part of the pocket Figure 21.1 said must never give ground. Same quarterback, more time, a third as many sacks. Some of that is the line, some the scheme (Ben Johnson was the new head coach), some a second-year quarterback learning when to get rid of the ball. The data cannot split the credit, and neither can anyone who blames every sack on the left tackle. If you rewatch a 2025 Bears dropback next to a 2024 one, watch the interior: do the guards and center hold their ground, so that Williams can step up and throw, or step up and run?

CautionCommon misconception

“Sacks allowed measures the offensive line.” It measures the whole passing operation. A quarterback who holds the ball waiting for a deep route, refuses to throw it away, or drifts into the rush creates sacks no line could prevent, and a quarterback with a quick trigger hides a weak one. Analysts who want to grade the line alone use measures built from individual matchups, such as pass-block win rate or charted pressures allowed per blocker, and even those are noisy. When you hear “the line gave up five sacks,” ask how many of them came after three seconds.

Where protection came from

Pass protection as a system, with named schemes, counted assignments and a back with a rule, is younger than you might think, and two moments explain most of its shape.

The first is the 1978 rule change you met above. Before it, linemen could not extend their arms on a pass block, so protection was a matter of bodies in the way: a pass rusher who got his hands on a lineman had most of the advantages, and passing on long downs was dangerous. Letting blockers use their hands, together with new limits on how defenders could contact receivers, tilted the game toward the pass for good.12

The second is a player. Lawrence Taylor, the New York Giants’ outside linebacker from 1981, rushed the passer from a standing position off the edge, faster than any tackle could handle alone, and from a spot that standard protections assigned to a running back. Offenses had to invent ways to put a bigger man on him. Joe Gibbs, whose Washington teams played the Giants twice a year, is credited with building his one-back, two-tight-end formations partly to do exactly that: an extra tight end or an “H-back” lined up beside the tackle to block or chip Taylor, so that the back was never left alone with him.13 The chip, the help side and the seven-man protection, and the idea that the left tackle protecting a right-handed quarterback’s blind side is a premium position, all trace back to offenses deciding that one great rusher had to be accounted for before anyone else.

Since then the arms race has run in both directions. Defenses answered slide protections with stunts and with pressure that showed six and rushed four; offenses answered blitzes with hot routes and the quick game, and with quarterbacks and centers who could reset a protection at the line. The Mike call you hear on every broadcast is the current front of that race.

Film room

NoteFilm room: Cincinnati Bengals 2022 — rebuilding a line, and three backups in Buffalo

The problem. In 2021 Joe Burrow was sacked a league-high 51 times in the regular season and another 19 times in the playoffs, including nine in the divisional round against Tennessee and seven by the Rams in Super Bowl LVI, which tied the Super Bowl record.14 The Bengals went to the Super Bowl anyway, and lost it with their quarterback on the ground.

The rebuild. That offseason Cincinnati signed center Ted Karras, guard Alex Cappa and tackle La’el Collins, and drafted guard Cordell Volson: four new starters around Burrow.15 The team’s sack rate fell from 8.7% of dropbacks in 2021 to 6.4% in 2022.

The test. By the 2022 playoffs, injuries had taken three of the five starters, and in the divisional round at Buffalo on January 22, 2023, the Bengals started three backups: Jackson Carman, a second-year player whose six previous starts had all come at right guard, at left tackle; Max Scharping at right guard; and Hakeem Adeniji at right tackle. They won 27–10 and Burrow was sacked once and hit only three times.16 It is a good game to rewatch with this chapter’s tools: look for help on the backup tackles from tight ends and backs, and for how quickly the ball comes out.

The limit. A week later, in the AFC Championship Game at Kansas City (January 29, 2023), the same patched line gave up five sacks, two of them by defensive tackle Chris Jones, the second on third down on Cincinnati’s last possession, which forced the punt before the Chiefs’ winning drive; rookie end George Karlaftis had the first, on the game’s fifth play. Kansas City won 23–20.17 Schemes can hide a weak spot for a while. A great rusher, given enough snaps, finds it.

What to notice: on a Bengals rewatch, count blockers on third down, in a game with the healthy line and in one with the backups, and see whether the offense kept more men in to protect the patched line.

NoteFilm room: Philadelphia Eagles 2013–2025 — the Stoutland line

Jeff Stoutland coached the Eagles’ offensive line from 2013 through the 2025 season, a run that included both of the franchise’s Super Bowl titles (LII and LIX), and he was regarded as one of the best offensive line coaches in the league.18 His lines were known for athletic, technically precise linemen (Lane Johnson at right tackle, Jason Kelce and then Cam Jurgens at center, Jordan Mailata at left tackle) and, in Kelce’s years, for a center who made most of the protection calls; after Kelce retired, Jurgens and quarterback Jalen Hurts shared that job.19 The Eagles are also a reminder that a great line and a great run game go together: the same men who pass protect also block for the backs and for the tush push. Case study 12-06 goes deeper.

What to notice: on any Eagles dropback, watch Lane Johnson’s first two steps. You will see vertical sets, 45-degree sets and, on quick throws, a jump set right at the line, varied so the rusher cannot time his move.

Watch for it on Sunday

TipWatch for it

Before the snap.

  • Count the blockers you can see. Five linemen, plus a back beside the quarterback, plus any tight end on the line. Empty backfield means five-man protection: someone is hot.
  • Count the threats. How many defenders are standing within a couple of yards of the line? Six or seven at the line against five or six blockers means a hot throw is in the plan, or the defense is bluffing.
  • Listen and look for the Mike call. The center or quarterback points at a linebacker. If a defender moves after that, watch for a second call.
  • Find the help. A tight end next to a tackle may mean that side’s edge rusher is getting a chip. A back offset to one side more often shows his check side, the side he will watch for a blitzer (usually the man side, away from the slide), and maybe chip after. Neither is a guarantee: a late call can send him across the quarterback’s face.

After the snap: rushers versus blockers.

  • Watch the linemen’s first step. All five the same way: slide. The center and his two neighbours one way, the other two straight back at the man in front of them: half-slide. Each to a different defender: man.
  • Count, in the first second, how many rushed and how many blocked. Four rushers against six blockers? Look for the spare men helping. Six against six? Everyone has a man.
  • Watch the back’s first step. Forward into a gap: he has a blitzer. Out to the flat: his man dropped (check-release). A shove on an end and then out: a chip.
  • Watch the tackles’ sets. Deep and backward (vertical), angled out (45-degree), or forward at the line (jump, and expect a quick throw).
  • If a rusher comes free, guess who owned him. Was he the widest man, unblocked on purpose, with the ball out fast to the space he left? That was the plan. Was he an inside man, a linebacker through an A gap, with two blockers on someone else? That was a bust, probably a bad count. Check the replay. And look at the ball: a free man by design should be met by a quick throw. If the widest man came free and the ball was not out, the quarterback or the hot receiver missed it; if an inside man came free, suspect the protection first.
  • Note the time. Count “one-Mississippi” from the snap. Pressure inside about two and a half seconds is almost always the protection’s problem: the average throw is out by then. Past three seconds, where the EPA chart above peaked and started to fall, the quarterback owns part of it. These are rules of thumb from that chart, not laws.

For your prediction log: for one quarter, write down rushers and blockers on every dropback (for example, “4 v 6”) and whether anyone came free. By the end you will know whether that defense wins by numbers or by stunts.

Predict the play

TipPredict the play 1: seven at the line
Show the Python
dfn = [D("LE", "DE", 1.0, -5.0, "E"), D("NT", "DT", 1.0, -2.4, "3"), D("DT", "DT", 1.0, 2.4, "3"),
       D("RE", "DE", 1.0, 5.0, "E"), D("MIKE", "MIKE", 1.8, 0.95, "M"), D("WILL", "WILL", 1.8, -0.95, "W"),
       D("NB", "NB", 2.0, -7.6, "NB"), D("LCB", "CB", 6.0, -13.5, "C"), D("RCB", "CB", 6.0, 14.0, "C"),
       D("SS", "SS", 6.5, 10.0, "SS"), D("FS", "FS", 13.0, 1.0, "FS")]
p = Play(empty_3x2(), dfn, los=40, to_go=7)
p.highlight("MIKE", "WILL", "NB", color=PURPLE)
fld = draw(p, width_in=6.4, lateral=(-15.6, 15.6), window=(-6.8, 14.6), ol_fs=6.2)
plt.show()
Figure 21.17: Third-and-7. The offense is in an empty 3x2 formation: five blockers. The defense has two 3-techniques, shows both linebackers standing in the A gaps on either side of the center, and has walked the nickel back (NB) up over H. The three defenders who might or might not rush are ringed.

How many can the offense block, how many might come, and where should the ball go if they all do?

Five blockers, up to seven rushers, so the ball must come out fast, with a hot answer on each side. Count it: four defensive linemen, two linebackers in the A gaps and the walked-up nickel make seven possible rushers against an empty protection’s five. If all seven come, two are free; there is no protection that blocks seven with five.

Which two is the offense’s choice. Inside-out, the five linemen take the two A-gap linebackers and the two 3-techniques first, because their paths are shortest, and the fifth blocker goes to one of the ends. The offense picks the end by working the protection toward the side with more threats. The left has four possible rushers (the Will, a 3-technique, the end and the nickel), the right only three, so the line works left and the left tackle takes the left end. The two men left over are then the widest on each side: the nickel on the left and the right end on the right, each with the longest way to go.

Two free rushers need two answers. On the left, H is hot: if the nickel comes, H runs into the space he left. On the right, count the coverage as well as the rush, which is the first thing a quarterback coach asks. If seven rush, only four defenders are left to cover five receivers, so someone is uncovered; as drawn, nobody is over R. The quarterback’s throw depends on who actually comes, and it has to be out in about a second.

Two cautions. First, this is exactly the look that attacks the Mike call: with two linebackers in the A gaps, the offense must decide before the snap which one the line will count, and the defense will try to make him wrong. Second, the defense may not bring them all. Showing seven and rushing four, with the A-gap linebackers dropping out, is a staple of simulated pressure. Then the hot throw is thrown into a linebacker who never left. Good quarterbacks check where the threat goes at the snap, not where it stood.

TipPredict the play 2: two on the edge
Show the Python
off = line() + gun(-1.5) + [O("X", "WR", -0.7, -13.5), O("H", "WR", -1.4, -8.5), O("Y", "TE", -1.4, 8.5),
                            O("Z", "WR", -0.7, 13.5)]
dfn = [D("LE", "DE", 1.0, -5.0, "E"), D("NT", "DT", 1.0, -0.7, "1"), D("DT", "DT", 1.0, 2.35, "3"),
       D("RE", "DE", 1.0, 5.0, "E"), D("MIKE", "MIKE", 4.5, 1.4, "M"), D("WILL", "WILL", 1.4, -6.6, "W"),
       D("NB", "NB", 3.0, -8.9, "NB"), D("LCB", "CB", 6.5, -13.5, "C"), D("RCB", "CB", 6.5, 13.5, "C"),
       D("SS", "SS", 6.0, 8.5, "SS"), D("FS", "FS", 13.0, 0.0, "FS")]
p = Play(off, dfn, los=40, to_go=6)
p.highlight("WILL", "NB", color=PURPLE)
p.highlight("RB")
fld = draw(p, width_in=6.4, lateral=(-15.6, 15.6), window=(-6.8, 14.6), ol_fs=6.2)
for wg in (0.8, 2.4, 4.0):
    gap_oval(fld, p, wg, width=1.4, height=1.2, alpha=0.42)
say(fld, p, -3.2, 6.2, "slide right", color=GREEN, weight="bold")
plt.show()
Figure 21.18: Third-and-6. The offense is in 11 personnel with the back to the quarterback’s left and has called a half-slide right (the slide side’s gaps are shaded), so the back’s job is the left side. The Will linebacker has walked up to the line outside the left end, and the nickel back has crept down outside him, both ringed. The back is ringed in green.

(a) If both the Will and the nickel blitz from the left, whom does the back block, and who is the quarterback’s problem?

(b) Now a post-snap read. Suppose that instead the Mike comes through the right A gap untouched, while the center has turned left to help the left guard on the 1-technique. Was the Mike free by design, or was it a bust? And whose was he?

(a) The back takes the Will; the nickel is the quarterback’s, and the throw goes to H. On the left, the man side, the left tackle has the end and the left guard has the 1-technique. That leaves two potential rushers, the Will and the nickel, and one back. Block inside-out: the Will is closer to the quarterback’s path, so he is the back’s; the nickel, wider and deeper, has the longer way to go and is left free by design. His blitz empties the area over H, so H is the hot receiver, and the quarterback has to see the nickel come and throw at once.

The offense had other options before the snap: the quarterback could have re-declared the protection, sliding the line left toward the threat and sending the back right, or kept the tight end in. Notice why it might not bother: the right side has only three rushers for three sliding linemen, and a quick throw to H against a blitzing nickel is often the best play on the field. If the nickel doesn’t come, the back’s man (the Will) still might, and if neither comes, the back releases and five receivers are out.

(b) A bust, and the Mike was the center’s. In a half-slide right, the center owns the right A gap, whoever comes through it. He may “look for work” and help a neighbour only once nobody has come into his gap; turning left first left his own gap empty. Every tell in the “Watch for it” list points the same way: the free man came from the inside, through an A gap, the shortest path, while two blockers were on one defender. A free man by design is the widest man, and the ball is already on its way to the space he left.

TipPredict the play 3: the star on the edge
Show the Python
off = line() + gun(1.6) + [O("Y", "TE", -0.7, 4.8), O("X", "WR", -0.7, -13.5), O("H", "WR", -1.4, -8.5),
                           O("Z", "WR", -1.4, 13.0)]
dfn = [D("LE", "DE", 1.0, -5.0, "E"), D("NT", "DT", 1.0, -0.7, "1"), D("DT", "DT", 1.0, 2.35, "3"),
       D("RE", "DE", 1.0, 7.2, "99"), D("MIKE", "MIKE", 4.5, 1.6, "M"), D("WILL", "WILL", 4.5, -2.4, "W"),
       D("NB", "NB", 5.0, -8.1, "NB"), D("LCB", "CB", 6.5, -13.5, "C"), D("RCB", "CB", 6.5, 13.0, "C"),
       D("SS", "SS", 12.0, 8.0, "SS"), D("FS", "FS", 12.0, -8.0, "FS")]
p = Play(off, dfn, los=30, to_go=10)
p.highlight("RE", color=PURPLE)
fld = draw(p, width_in=6.4, lateral=(-15.6, 15.6), window=(-6.8, 14.6), ol_fs=6.2)
point_to(fld, p, (4.6, 10.0), (1.0, 7.2), "their best pass rusher,\nwide outside the tight end")
plt.show()
Figure 21.19: Second-and-10. The defense’s best pass rusher (99, ringed) lines up wide outside the offense’s right tight end. The offense has the tight end on the line next to the right tackle and the back offset to the right of the quarterback, with two receivers to the left.

Where is the protection’s help going, and what does the offense give up to send it?

99 belongs to the right tackle, and the help comes on top: chips from the tight end and the back. The price is receivers and time. Everything about the offense’s alignment points at the right edge. Expect a half-slide left: the center, left guard and left tackle slide left and own the gaps on that side (the 1-technique, the Will and the left end), while on the man side the right guard takes the 3-technique and the right tackle takes 99 man to man, big on big. Then the help. The tight end chips 99 from the inside as he releases. The back, offset to that side, checks his linebacker (the Mike) first; if the Mike doesn’t come, he chips 99 too and releases (check, chip, release). If the offense wants a full-time double team instead, it is the tackle and the tight end together, a seven-man protection.

What the offense will not do is leave 99 to the tight end and the back. You never leave a star alone with a back; help means in addition to the tackle.

The cost is visible too. With two players spending time on 99, only three receivers (X, H and Z) are out on time, and the tight end and back arrive late, so expect a throw to the receivers who are on time, or a two- or three-man route combination with lots of protection behind it. The defense’s answer is just as predictable: move 99 around (inside, to the other side, standing up over a guard) or run stunts with him, so that the offense’s help is in the wrong place. That cat-and-mouse is where The Pass Rush picks up the story.

Takeaways

  • Protection is counting. The offense always blocks with five and may add a back or tight ends; every added blocker is one fewer receiver. Block inside-out, and if someone must go unblocked, make it the widest man and make him the quarterback’s.
  • Two ways to assign blockers. Slide protection blocks gaps, so it absorbs stunts and surprises but leaves an end for the back. Man protection (BOB) blocks men, so it matches big on big but has to chase movement. The half-slide, the everyday six-man protection, does both. Slide toward the inside trouble, and never leave a star edge rusher alone with a back.
  • The Mike call makes six blockers one mind. Naming a reference defender sets every assignment (the center works toward him, the man side counts out from him, the back takes the next man); two blockers counting from different men produce a free rusher without the defense sending an extra man. Defenses move after the call to make it wrong.
  • Backs and tight ends decide after the snap. Check-release turns a blocker into a receiver when his man doesn’t come; a chip gives help on the way out. Max protect buys time with up to eight blockers; empty and scat buy receivers with five, and a blitz means a hot throw or a sight adjust into the space the blitzer left.
  • The pocket is a cup. The interior holds firm; the tackles give ground with a kick slide (vertical, 45-degree, or a jump set for quick throws) and push the edge past the quarterback, who steps up. Punch wins control, the anchor stops power, and switching beats stunts.
  • Measure pressure, not just sacks, and share the blame. Pressure rate is steadier than sack rate; pressure climbs with time to throw; and sack rate depends on the quarterback and the play call as much as on the line.

Connections

Builds on: Passing Game Fundamentals (drops and timing: what protection is buying time for); The Language of the Run Game (gaps, technique numbers and hat math, now applied to the pass); The Pre-Snap Phase (the Mike call and defenses moving after it); and A First Look at Defense (four-man rushes and blitzes).

Sets up: The Quick Game, the passing family built to make extra rushers irrelevant; Play-Action, Bootlegs and Screens, where max protect and moving launch points live; Quarterback Play, on stepping up, climbing the pocket and getting rid of the ball; The Pass Rush and Blitz and Man Pressure, the same fight from the defense’s side (moves, stunts, blitz math, and why pressure is steadier than sacks); and Contact Rules and Penalties as Strategy, on holding.

Case study: Fangio’s Two-High Revolution and Macdonald’s Answer, where defenses that rush four and play two deep safeties test protection with stunts and disguised pressure instead of numbers. Data: Tracking Data and the Big Data Bowl builds the pocket-shape measurement on real frames.

NoteGo deeper
  • Chris B. Brown, The Art of Smart Football (2015) and the Smart Football archive: short, clear essays on protection schemes, hot routes and the quick game.
  • Bill Walsh with Brian Billick and James Peterson, Finding the Winning Edge (1998): the West Coast offense’s builder on game planning and on how a coaching staff thinks, a book found in most NFL offices.
  • Duke Manyweather’s OL Masterminds clinics and the many offensive-line technique breakdowns on coaching sites: the set, the punch and the anchor, taught by and for linemen.
  • Next Gen Stats’ passing leaderboards (time to throw) and the nflverse data dictionaries for the participation file (pressure flags and their sources).

  1. Number of pass rushers on regular-season dropbacks, 2024 and 2025, from the nflverse participation file (number_of_pass_rushers, FTN charting): four rushers on about 69%, five on about 20%, six or more on about 7%, three or fewer on about 4%. Author’s calculation, nflverse data via nflreadpy: https://nflreadr.nflverse.com/articles/dictionary_participation.html.↩︎

  2. Drop depths are typical teaching landmarks, not rules; they vary by team, by play and by quarterback. See Passing Game Fundamentals for drops and timing.↩︎

  3. Who calls the Mike and how the protection works from him: Cory Bailey, “Coach’s View: Explaining pass protection adjustments, Patriots Mike calls,” Boston Sports Journal (Nov 7, 2018): “Most offenses have the quarterback identify the mike … However, others will allow the center to do so,” and “Once the mike is identified, the center knows which direction he is going to work. It also tells the running back which way he will initially work,” https://www.bostonsportsjournal.com/2018/11/07/coachs-view-explaining-pass-protection-adjustments-patriots-mike-calls; Football Nation, “Why Do Quarterbacks Point at the Mike Linebacker Before the Snap?” (once the Mike is identified, “the center and guards can establish which defenders belong to each side of the protection,” and the back “can learn where his scan begins”): https://www.footballnationusa.com/post/why-quarterbacks-point-mike-linebacker. The 0-1-2-3 numbering in this chapter’s count figure is a teaching device; real playbooks word their rules in many ways.↩︎

  4. Julian Edelman on Brady at the line: “He can veto something and say ‘Hey no, he’s the Mike. Linda that’,” changing the protection because of a matchup he does not like. Pewter Report, “Brady’s Former No. 1 WR Details Work With O-Line” (Sep 1, 2022): https://www.pewterreport.com/bradys-former-no-1-wr-details-work-with-line/; Cory Bailey, “Coach’s View: Explaining pass protection adjustments, Patriots Mike calls,” Boston Sports Journal (Nov 7, 2018): https://www.bostonsportsjournal.com/2018/11/07/coachs-view-explaining-pass-protection-adjustments-patriots-mike-calls.↩︎

  5. “Scat means that there are only the five offensive linemen pass protecting for the quarterback, with the running back immediately releasing on a route”: Matty F. Brown, “Schematic Detective: Seahawks 200/300 Scat Arrow Bow,” Sports Illustrated (Jun 22, 2022): https://www.si.com/nfl/seahawks/onsi/news/schematic-detective-seahawks-200-300-scat-arrow-bow.↩︎

  6. 2026 NFL Rulebook, Rule 12, Section 1, Article 2: a blocker “may use his arms, or open or closed hands, to contact an opponent on or outside the opponent’s frame (the body of an opponent below the neck that is presented to the blocker), provided that he does not materially restrict him. The blocker must work immediately to bring his hands inside the opponent’s frame.” Article 3(c) makes it holding to “materially restrict or alter the defender’s path or angle of pursuit … regardless of whether the blocker’s hands are inside or outside the frame” (10 yards). NFL Football Operations: https://operations.nfl.com/the-rules/nfl-rulebook/.↩︎

  7. “1978 NFL season,” Wikipedia (rule changes: pass blockers permitted to extend their arms and open their hands): https://en.wikipedia.org/wiki/1978_NFL_season.↩︎

  8. NFL.com, “Browns DE Myles Garrett reaches 23 sacks, sets new NFL single-season record” (Week 18, 2025): https://www.nfl.com/news/browns-de-myles-garrett-reaches-23-sacks-sets-new-nfl-single-season-record.↩︎

  9. nflverse participation data dictionary (was_pressure, time_to_throw): https://nflreadr.nflverse.com/articles/dictionary_participation.html. Next Gen Stats supplies the participation file for 2016–2022 and FTN for 2023 onward (nflverse-data release notes, https://github.com/nflverse/nflverse-data/releases/tag/pbp_participation). The chart uses 2024–2025 only, so it stays within one source; in those seasons the flag is filled on every dropback, including sacks.↩︎

  10. avg_time_to_throw: “Average time elapsed from the time of snap to throw on every pass attempt for a passer (sacks excluded).” nflverse Next Gen Stats data dictionary: https://nflreadr.nflverse.com/articles/dictionary_nextgen_stats.html.↩︎

  11. Sack counts and rates computed from nflverse play-by-play (all Bears dropbacks, regular season); 68 sacks in 2024 was the most in team history: Windy City Gridiron, “Chicago Bears Sackwatch 2024: year in review” (Jan 16, 2025), https://www.windycitygridiron.com/2025/1/16/24339074/chicago-bears-sackwatch-2024-year-in-review-and-historical-perspective-caleb-williams. Thuney and Jackson acquired by trade, Dalman signed in free agency, and 24 sacks allowed in 2025 (third fewest in the league): Chicago Bears, “Bears 2025 position review: Offensive line”, https://www.chicagobears.com/news/bears-2025-position-review-offensive-line.↩︎

  12. The 1978 changes (blockers allowed to extend their arms and open their hands; defenders limited to one contact zone of five yards beyond the line): “1978 NFL season,” Wikipedia, https://en.wikipedia.org/wiki/1978_NFL_season. On the passing boom that followed: Paul Zimmerman, “The Name of the Game Is Now Armball,” Sports Illustrated, November 19, 1979.↩︎

  13. On Gibbs’s two-tight-end, one-back offense and the H-back as a response to Lawrence Taylor: “H-back,” Wikipedia, https://en.wikipedia.org/wiki/H-back; Pro Football Hall of Fame, “Gold Jacket Spotlight: Lawrence Taylor created havoc” (2023): https://profootballhof.com/news/2023/gold-jacket-spotlight-lawrence-taylor-created-havoc. The Hall of Fame piece quotes Gibbs: “You get a back blocking Lawrence Taylor, you lose,” and describes his one-back scheme putting two and often three blockers on Taylor. Michael Lewis tells the same story in The Blind Side (2006), chapter 2. The attribution is widely repeated; Gibbs’s offense also had other motives (it suited his personnel and his counter running game).↩︎

  14. Burrow’s 51 regular-season sacks (league high) and 19 in the 2021 playoffs: Pro Football Rumors, “Offseason in Review: Cincinnati Bengals” (Aug 2022), https://profootballrumors.com/2022/08/offseason-in-review-cincinnati-bengals-3. Seven sacks in Super Bowl LVI, tying the record: CBS Sports, “Records set in Super Bowl 2022,” https://www.cbssports.com/nfl/news/records-set-in-super-bowl-2022-aaron-donald-rams-apply-record-tying-pressure-on-joe-burrow/. Nine in the divisional round at Tennessee, tying the NFL playoff record: theScore, “Bengals overcome 9 Titans sacks to reach AFC title game” (Jan 22, 2022), https://www.thescore.com/nfl/news/2282863.↩︎

  15. Pro Football Rumors, “Offseason in Review: Cincinnati Bengals” (Karras, Cappa and Collins signed; Volson drafted): https://profootballrumors.com/2022/08/offseason-in-review-cincinnati-bengals-3.↩︎

  16. Bengals.com, “Joe Burrow, Bengals win chance to defend AFC title; take a bow, O-line” (Jan 2023; Carman at left tackle, Burrow sacked once and hit three times): https://www.bengals.com/news/joe-burrow-bengals-win-chance-to-defend-afc-title-take-a-bow-o-line; “Bengals offensive line comes through in playoff win despite absence of 3 starters,” Sinclair/WKRC (Jan 22, 2023), via https://news4sanantonio.com/sports/cincinnati-bengals-offensive-line-comes-through-afc-divisional-round-playoffs-despite-absence-three-starters-nfl-pro-football-buffalo-bills-joe-burrow-mixon-zac-taylor-jackson-carman-max-scharping-hakeem-adeniji-cordell-volson-ted-karras; PFF, “NFL Divisional Round game recap: Cincinnati Bengals 27, Buffalo Bills 10”: https://pff.com/news/nfl-divisional-round-game-recap-cincinnati-bengals-27-buffalo-bills-10. Carman’s rookie season (six starts at right guard in 2021, the first against Pittsburgh): “Jackson Carman,” Wikipedia, https://en.wikipedia.org/wiki/Jackson_Carman; Journal-News, “Fairfield native Carman ‘super excited’ to beat Steelers in first NFL start for Bengals” (Sep 2021), https://www.journal-news.com/sports/bengals-carman-super-excited-to-beat-steelers-in-first-nfl-star/22UB4MXL4FHR3NNBNIN5ZAIYJM/.↩︎

  17. Associated Press, “Burrow comes up short of leading Bengals back to Super Bowl” (Jan 30, 2023): https://www.news4jax.com/sports/2023/01/30/burrow-comes-up-short-of-leading-bengals-back-to-super-bowl/.↩︎

  18. NFL.com, “Eagles OL coach Jeff Stoutland parting ways after 13 seasons” (Feb 2026): https://www.nfl.com/_amp/eagles-ol-coach-jeff-stoutland-parting-ways-after-13-seasons; NBC Sports Philadelphia, “Eagles’ legendary OL coach Jeff Stoutland stepping down after 13 seasons” (Feb 4, 2026; joined with Chip Kelly’s first staff in 2013, part of the LII and LIX titles): https://www.nbcsportsphiladelphia.com/nfl/philadelphia-eagles/eagles-legendary-ol-coach-jeff-stoutland-stepping-down-after-13-seasons/711829/.↩︎

  19. NBC Sports Philadelphia, “Why Cam Jurgens is feeling at home even as he replaces a legend” (Jul 27, 2024), on Kelce having carried most of the protection calls and Jurgens and Hurts sharing them from 2024: https://www.nbcsportsphiladelphia.com/nfl/philadelphia-eagles/why-cam-jurgens-is-feeling-at-home-even-as-he-replaces-a-legend/601059/.↩︎