Coverage Fundamentals: Zones, Leverage, and Reading the Shell

The names coaches give the grass, how a defender lines up on a receiver, the three ways to guard one, and how to read the safeties before the ball is snapped.

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

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

import gridiron.play as gplay
from gridiron import Play, Player, Field, style, draw_marker, routes as r

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

HALF = 80 / 3            # yards from the middle of the field to either sideline (26.7)
HASH_W = 18.5 / 6        # NFL hash marks: 18 ft 6 in apart, so 3.1 yards either side of the middle
NUM_W = HALF - 12.0      # the painted numbers start 12 yards in from the sideline: 14.7 from the middle
GREEN_TEXT = "#0f7a55"   # a darker step of the green highlight, for text on the light field
DD = style.DEFENSE_DARK
GREY = style.MUTED


# ---------------------------------------------------------------- players and alignments
def O(key, pos, d, w, label=None):
    return Player(key, pos, "off", d, w, label=key if label is None else label)


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


def line5():
    """The five offensive linemen, 1.6 yards apart (only the center is lettered)."""
    return [O(k, k, -0.7, w, "C" if k == "C" else "") for k, w in
            (("LT", -3.2), ("LG", -1.6), ("C", 0.0), ("RG", 1.6), ("RT", 3.2))]


def spread():
    """11 personnel, shotgun 2x2: X and Z on the line (with the five linemen: seven on the line),
    H in the left slot and the tight end Y flexed into the right slot, both a step off the ball."""
    return line5() + [O("QB", "QB", -5.0, 0.0, "Q"), O("RB", "RB", -5.0, -1.5, "R"),
                      O("X", "WR", -0.7, -15.0), O("H", "WR", -1.5, -9.0),
                      O("Y", "TE", -1.5, 9.0), O("Z", "WR", -0.7, 15.0)]


def front4():
    return [D("WDE", "DE", 1.0, -5.6, "E"), D("WDT", "DT", 1.0, -0.8, "T"),
            D("SDT", "DT", 1.0, 2.4, "T"), D("SDE", "DE", 1.0, 5.6, "E")]


def nickel(**spots):
    """4-2-5 nickel against the 2x2. Defaults are a neutral two-high look; pass KEY=(d, w) to move
    anyone (keys: MIKE, WILL, NB, LCB, RCB, FS, SS)."""
    base = {"MIKE": (4.5, 1.8), "WILL": (4.5, -2.2), "NB": (5.0, -7.4), "LCB": (7.0, -16.0),
            "RCB": (7.0, 16.0), "FS": (12.5, -8.5), "SS": (12.5, 8.5)}
    base.update(spots)
    lab = {"MIKE": ("MIKE", "M"), "WILL": ("WILL", "W"), "NB": ("NB", "$"), "LCB": ("CB", "CB"),
           "RCB": ("CB", "CB"), "FS": ("FS", "FS"), "SS": ("SS", "SS")}
    return front4() + [D(k, lab[k][0], *base[k], lab[k][1]) for k in base]


def protect(p, rushers=("WDE", "WDT", "SDT", "SDE"), linemen=("LT", "LG", "C", "RG", "RT")):
    """Linemen set, four rushers engage them: enough to say 'pass', no more."""
    for k in linemen:
        if k in p.players:
            p.block(k, pts=[(-1.2, 0.0)])
    for k in rushers:
        if k in p.players:
            p.rush(k, pts=[(-1.6, 0.0)], speed=2.0)


# ---------------------------------------------------------------- drawing helpers
def P(fld, p, d, w):
    return fld.xy(*p.to_abs(d, w))


def clean(ax):
    """Drop the painted yard numbers (they sit where receivers stand); clip text to the window."""
    for t in list(ax.texts):
        if t.get_alpha() == 0.55:
            t.remove()
        else:
            t.set_clip_on(True)


def ruler(fld, p, fs=6.0, step=5, top=40):
    """Depth labels (yards past the line of scrimmage) just inside the left edge of the window."""
    xl = (160 / 3) - fld.y1 + 0.4
    for d in range(step, top + 1, step):
        y = p.los + d
        if fld.x0 + 1.5 <= y <= fld.x1 - 1.5:
            fld.ax.text(xl, y, f"{d}" + (" yd" if d == step else ""), fontsize=fs, color=style.INK_2,
                        ha="left", va="center", zorder=12,
                        bbox=dict(boxstyle="round,pad=0.12", fc=style.SURFACE, ec="none", alpha=0.85))


def widths(fld, p, d, fs=6.0, which=("hash", "numbers")):
    """Italic 'hash' and 'numbers' markers at depth d, wherever they fall inside the window."""
    spots = []
    if "hash" in which:
        spots += [(-HASH_W, "hash"), (HASH_W, "hash")]
    if "numbers" in which:
        spots += [(-NUM_W, "numbers"), (NUM_W, "numbers")]
    for w, txt in spots:
        x, y = P(fld, p, d, w)
        if fld.y0 + 2.5 <= p.ball_y - w <= fld.y1 - 2.5:
            fld.ax.text(float(x), float(y), txt, fontsize=fs, color=style.INK_2, ha="center", va="center",
                        style="italic", zorder=12,
                        bbox=dict(boxstyle="round,pad=0.12", fc=style.SURFACE, ec="none", alpha=0.85))


def say(fld, p, d, w, text, color=style.INK_2, fontsize=7.0, ha="center", weight="normal", box=True):
    x, y = P(fld, p, d, w)
    fld.ax.text(float(x), float(y), text, fontsize=fontsize, color=color, ha=ha, va="center", zorder=13,
                fontweight=weight, linespacing=1.15,
                bbox=dict(boxstyle="round,pad=0.18", fc=style.SURFACE, ec="none", alpha=0.9) if box else None)


def point_to(fld, p, text_at, target, text, color=style.INK_2, fontsize=7.0, ha="center"):
    (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=ha, va="center", zorder=13, linespacing=1.15,
                    arrowprops=dict(arrowstyle="-", color=color, lw=0.7, shrinkA=2, shrinkB=7),
                    bbox=dict(boxstyle="round,pad=0.18", fc=style.SURFACE, ec="none", alpha=0.9))


def dim(fld, p, a, b, text, text_at, color=style.INK_2, fontsize=6.8):
    """A dimension line between two (d, w) points, labelled at text_at."""
    (x0, y0), (x1, y1) = P(fld, p, *a), P(fld, p, *b)
    fld.ax.annotate("", (float(x1), float(y1)), xytext=(float(x0), float(y0)),
                    arrowprops=dict(arrowstyle="<->", color=color, lw=0.8, shrinkA=0, shrinkB=0), zorder=6)
    say(fld, p, *text_at, text, color=color, fontsize=fontsize)


def zone_box(fld, p, d0, d1, w0, w1, label="", color=style.DEFENSE, alpha=0.12, fs=7.0, ls=(0, (3, 2))):
    """A rounded, shaded rectangle from depth d0 to d1 and width w0 to w1 (yards), labelled in the middle."""
    (x0, y0), (x1, y1) = P(fld, p, d0, w0), P(fld, p, d1, w1)
    lo_x, lo_y = float(min(x0, x1)), float(min(y0, y1))
    fld.ax.add_patch(FancyBboxPatch((lo_x, lo_y), float(abs(x1 - x0)), float(abs(y1 - y0)),
                                    boxstyle="round,pad=0,rounding_size=1.2", fc=color, alpha=alpha,
                                    ec="none", zorder=1.5))
    fld.ax.add_patch(FancyBboxPatch((lo_x, lo_y), float(abs(x1 - x0)), float(abs(y1 - y0)),
                                    boxstyle="round,pad=0,rounding_size=1.2", fc="none", ec=color, lw=0.9,
                                    ls=ls, zorder=1.6))
    if label:
        say(fld, p, (d0 + d1) / 2, (w0 + w1) / 2, label, color=style.INK, fontsize=fs, box=False)


def path(fld, p, pts, color=style.DEFENSE, lw=1.4, dash=(0, (3, 2)), z=5):
    """A dashed arrow through absolute (d, w) points."""
    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=dash, zorder=z, solid_capstyle="round")
    fld.ax.add_patch(FancyArrowPatch((xs[-2], ys[-2]), (xs[-1], ys[-1]), arrowstyle="-|>",
                                     mutation_scale=9, color=color, lw=lw, zorder=z))


def ghost(fld, p, d, w, label="", color=style.DEFENSE):
    """A hollow, dashed defender: where he stood before he moved."""
    x, y = P(fld, p, d, w)
    ppy = fld.pts_per_yard()
    fld.ax.add_patch(RegularPolygon((float(x), float(y)), 4, radius=gplay.MARKER_R * 1.25, orientation=np.pi / 4,
                                    fc="none", ec=color, lw=1.1, ls=(0, (2, 1.2)), zorder=6))
    if label:
        fld.ax.text(float(x), float(y), label, ha="center", va="center", color=color, fontweight="bold",
                    zorder=6, fontsize=max(4.0, min(8.5, ppy * 0.75)))


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


def draw(p, ax=None, lateral="full", window=(-8.5, 22), width_in=6.5, show_ruler=True, rfs=6.0):
    fld = p.draw(ax=ax, lateral=lateral, window=window, width_in=width_in, title=False)
    clean(fld.ax)
    if show_ruler:
        ruler(fld, p, fs=rfs)
    return fld


LEGEND = {
    "route": Line2D([], [], color=style.OFFENSE, lw=1.8, label="route"),
    "drop": Line2D([], [], color=style.DEFENSE, lw=1.3, ls=(0, (3, 2)), label="defender's movement"),
    "ghost": Patch(fc="none", ec=style.DEFENSE, lw=1.1, ls=(0, (2, 1.2)), label="where he lined up"),
    "ring": Line2D([], [], marker="o", ls="", ms=11, mfc="none", mec=style.THIRD, mew=2, label="watch him"),
    "zone": Patch(fc=style.DEFENSE, alpha=0.18, ec=style.DEFENSE, ls=(0, (3, 2)), label="zone"),
    "pass": Line2D([], [], color=style.BALL, lw=1.3, ls=(0, (2, 2)), label="the throw"),
    "ltg": Line2D([], [], color=style.LINE_TO_GAIN, lw=2.2, label="line to gain"),
}


def field_legend(ax, keys, fs=7.0, ncol=None):
    hs = [LEGEND[k] for k in keys]
    ax.legend(handles=hs, loc="upper center", bbox_to_anchor=(0.5, 0.0), ncol=ncol or min(len(hs), 4),
              fontsize=fs, frameon=False, handlelength=2.0, columnspacing=1.2, borderaxespad=0.2)


# ---------------------------------------------------------------- moments of a simulated play
def set_track(p, key, rows):
    """Hand-made keyframes [(t, d, w), ...] for one player (zone reads and man shadowing that
    gridiron's straight-line drop() and man() can't express). Call after every other action."""
    kf, t0, t1 = p._compile()
    kf = dict(kf)
    q = p.players[key]
    rows = [(min(t0, -1.0), q.d, q.w), (0.0, q.d, q.w)] + [tuple(x) for x in rows]
    kf[key] = np.array(rows, dtype=float)
    p._compiled = (kf, t0, max(t1, rows[-1][0]))


def shadow(p, key, target, off, lag=0.3, t_on=0.9, t_from=0.0, start=None, t_end=3.0):
    """Keyframes for a defender who leaves `start` (or his alignment) at t_from and settles
    `off` = (down, right) yards from where `target` was `lag` seconds earlier, fully by t_on."""
    q = p.players[key]
    s = np.array(start if start is not None else (q.d, q.w), dtype=float)
    rows = []
    for tt in np.round(np.arange(t_from + 0.05, t_end + 1e-9, 0.05), 3):
        f = min(1.0, max(0.0, (tt - t_from) / max(1e-6, t_on - t_from)))
        f = f * f * (3 - 2 * f)
        tgt = p.position(target, max(0.0, tt - lag)) + np.array(off)
        rows.append((tt, *(s * (1 - f) + tgt * f)))
    return rows


def moment(ax, p, t, lateral, window, rings=(), throw_t=None, label_fs=None):
    """Everyone at time t, with faint trails of where they have been and the ball's flight so far."""
    ylo, yhi = sorted((p.ball_y - lateral[0], p.ball_y - lateral[1]))
    fld = Field(ax=ax, orient="vertical", los=p.los, window=window, numbers=False, lateral=(ylo, yhi),
                to_go=None)
    ppy = fld.pts_per_yard()
    inside = lambda d, w: (window[0] + 0.6 <= d <= window[1] - 0.6) and (lateral[0] + 0.6 <= w <= lateral[1] - 0.6)  # noqa: E731
    for k, q in p.players.items():
        if q.pos in ("LT", "LG", "C", "RG", "RT", "DE", "DT"):
            continue
        pts = np.array([p.position(k, tt) for tt in np.linspace(0.0, max(t, 0.0), 40)])
        if t > 0 and np.ptp(pts[:, 0]) + np.ptp(pts[:, 1]) > 0.3:
            xs, ys = P(fld, p, pts[:, 0], pts[:, 1])
            ax.plot(xs, ys, color=style.OFFENSE if q.side == "off" else style.DEFENSE,
                    lw=1.0, alpha=0.55, zorder=3, ls="-" if q.side == "off" else (0, (3, 2)))
    if throw_t is not None and t > throw_t:
        b = np.array([p.ball_position(tt) for tt in np.linspace(throw_t, t, 25)])
        xs, ys = P(fld, p, b[:, 0], b[:, 1])
        ax.plot(xs, ys, color=style.BALL, lw=1.3, ls=(0, (2, 1.5)), zorder=9)
    for k, q in p.players.items():
        d, w = p.position(k, t)
        if not inside(d, w):
            continue
        x, y = P(fld, p, d, w)
        draw_marker(ax, float(x), float(y), q.side, q.label, ppy, ring=style.THIRD if k in rings else None)
    if t > 0.05:
        bd, bw = p.ball_position(t)
        if inside(bd, bw):
            # in the quarterback's hand: beside him; thrown: just upfield of the ball, so letters stay readable
            bx, by = P(fld, p, *((bd, bw - 1.0) if t <= (throw_t or 99) else (bd + 1.2, bw)))
            ax.add_patch(Ellipse((float(bx), float(by)), 1.0, 0.62, fc=style.BALL, ec="white", lw=0.5, zorder=11))
    return fld


def tag(fld, p, t, text, fs=6.6):
    """A caption tucked in the bottom-left corner of a frame panel (the empty backfield)."""
    fld.ax.text(0.03, 0.03, text, transform=fld.ax.transAxes, ha="left", va="bottom", fontsize=fs,
                color=style.INK, zorder=15, linespacing=1.15,
                bbox=dict(boxstyle="round,pad=0.25", fc=style.SURFACE, ec=style.BASELINE, lw=0.5))

Second-and-8, first quarter. Before the snap, the broadcast’s analyst draws a circle around a cornerback standing eight yards away from the receiver he’s supposedly guarding, and says, “Look at that cushion. Off coverage, eyes inside. Middle of the field is closed. I’d bet Cover 3.” The quarterback takes the snap and throws a quick hitch right in front of that cornerback for six yards. On the next play the same cornerback is standing a yard from the same receiver, nose to nose, and the analyst says, “Now he’s pressing. But watch: he’ll bail.” At the snap the corner turns his back on the receiver and sprints downfield, and the quarterback, who expected man coverage, throws a quick out into a zone, where a linebacker who never left the area knocks it down. A casual fan hears this as a stream of jargon. Why would a defender stand so far from the player he’s meant to stop? What does “the middle of the field is closed” mean, and why does it predict a number? What is Cover 3? This chapter is the vocabulary every other chapter in Part 6 is written in: the names coaches give the grass, the ways a defender can line up on a receiver, the three ways to guard one, and how to read the whole picture from the safeties before the ball is snapped.

You’ll be able to…

NoteYou’ll need
  • The defense’s two big pictures (A First Look at Defense): in man coverage each defender has a receiver; in zone coverage each has an area. The shell is the safeties’ picture before the snap: one-high (one deep safety in the middle) or two-high (one deep on each side). The nickel defense (five defensive backs) is the NFL’s everyday package, and a four-man rush leaves seven defenders to cover.
  • The routes the zones are drawn against (Dropback Concepts): offenses run receivers in combinations, such as curl-flat, flood, smash and four verticals, that put two receivers on one defender or more deep routes than there are deep defenders. That chapter drew them from the offense’s side; this one draws the defense they are attacking.
  • Routes and leverage (Passing Fundamentals, The Quick Game): a seam runs straight up between the hash and the numbers, a dig breaks flat across the field at 10 to 15 yards, a hitch stops and turns back, a flat route runs to the sideline near the line. A defender’s leverage is which side of the receiver he stands on: inside protects the middle, outside the sideline. Receivers are numbered from the sideline in: #1 is the widest on his side, then #2.
  • The field (The Game in Fifteen Minutes): the NFL hash marks sit only about 3 yards either side of the middle of a field 53⅓ yards wide; the painted yard-line numbers start 12 yards in from each sideline, about 15 yards from the middle.

Reading the diagrams: offense is blue circles (X, H, Y and Z receivers; Q quarterback; R running back; C center). Defense is outlined squares: E and T the defensive ends and tackles, M and W the Mike and Will linebackers, $ the nickel back, CB a cornerback, FS and SS the free and strong safeties. A green ring marks the player to watch. Faint lines across the field are 5 yards apart, starting at the line of scrimmage (the darker blue line); the small numbers on the left edge give the depth in yards. Solid arrows are routes; dashed arrows are defenders’ movements; a brown dotted line is the ball in the air. A solid orange line across the field is the line to gain (the first-down line).

The defense’s arithmetic

Start with a problem of numbers and geometry. On a typical passing down the defense rushes four and has seven players left to guard five eligible receivers and a field 53⅓ yards wide and as deep as the quarterback can throw. That sounds like plenty, seven against five, until you remember that the offense chooses where its five go, and the defense has to decide where its seven stand before it knows.

There are only two ways to hand out the seven. You can give each defender a person (man coverage), or a piece of the field (zone coverage). Every coverage in the NFL is one of those, a mixture of the two, or, increasingly, a zone that turns into man once the receivers declare their routes. This chapter is about the vocabulary of the zone half first, because the zones are also the map everybody, including man-coverage defenders, uses to talk about where the ball can go.

The map has two layers, and the reason is the most important idea in pass defense. A ball thrown over a defender’s head is worth far more than a ball caught in front of him. A completion in front of the defense gains what it gains and the receiver is tackled. A completion behind the defense can be a touchdown. So every coverage first decides how many players it will spend on the deep layer, guaranteeing that nobody gets behind them, and then spreads the rest across the underneath layer, in front of them. That one decision, how many deep, is what the coverage numbers count, what the safeties’ alignment advertises, and what the rest of this chapter keeps coming back to. (Expected Points, EPA, and Success Rate puts numbers on how much more a deep completion is worth.)

ImportantWhy it exists

Zones exist because the quarterback, not the receiver, decides where the ball goes. A defender who watches the quarterback can react to the throw from wherever he is, and a defense with every defender facing the quarterback can rally to the ball and tackle. What zone gives up is the space between defenders. With seven players on a field this big there are always seams between the zones, and much of offensive football (most of Dropback Concepts) is the art of putting receivers in those seams, or putting two receivers in one defender’s zone so he can only take one.

The zone map: names for the grass

Coaches carve the underneath layer into a handful of named areas. The names are old and nearly universal, though the exact boundaries vary by team, and they are worth learning because broadcasters use them constantly (“he’s the curl-flat player,” “they sat a linebacker in the hole”).

Show the Python
zm = Play(spread(), [], los=40, to_go=None)
fld = draw(zm, lateral="full", window=(-8.5, 32.0))
for s in (-1, 1):
    zone_box(fld, zm, 1.0, 7.0, s * 11.0, s * 23.5, "flat\n0–7 yd deep")
    zone_box(fld, zm, 7.5, 14.5, s * 6.5, s * 14.8, "curl\n~10–12 yd")
    zone_box(fld, zm, 5.0, 11.5, s * 0.7, s * 6.0, "hook\n5–12 yd")
zone_box(fld, zm, 12.0, 17.5, -4.2, 4.2, "hole (rat)")
zone_box(fld, zm, 19.0, 30.0, -24.0, 24.0, "the deep layer: split into thirds, halves or quarters",
         color=style.OFFENSE_DARK, alpha=0.06, fs=7.5)
widths(fld, zm, -7.0)
plt.show()
Figure 33.1: The zone map, drawn against a 2x2 formation with the ball in the middle of the field. Underneath, from the sideline in: the flat (shallow, near the sideline), the curl (between the numbers and the hash, about 10 to 12 yards deep), the hook (around the hash, over the tackles) and, in the middle, the hole in front of the deep defenders. The deep layer above about 15 yards is split into thirds, halves or quarters depending on the coverage (next figure). The boxes are where each zone’s defender works, not walls: real zones overlap, stretch and shift with the formation and the ball’s spot.

Here is what each zone is for, and why it sits where it does.

  • The flat zone is the short area near the sideline, from the line of scrimmage to about 6 or 7 yards deep, from roughly the slot receiver or the numbers out to the sideline. It is where flat routes, quick outs, swing passes and screens are caught. Why guard it at all, when a catch there gains only a few yards? Because an unguarded flat is an easy few yards: a completion on every snap moves the chains. The defender who has it is usually a cornerback (in Cover 2), a nickel back or an outside linebacker.
  • The curl zone sits between the numbers and the hash, centred about 10 to 12 yards deep. It is named for the route a wide receiver runs into it: push up the field, stop, turn back inside. It is the first throw past the sticks on most third downs, which is why the defender who has it matters so much.
  • The hook zone is inside the curl, around the hash and over the offensive tackles, about 5 to 12 yards deep: the linebackers’ home. Tight ends and slot receivers “hook up” (stop and turn) here, and it is the lane of the quick in-breaking routes.
  • The hole zone is the middle of the field in front of the deep defenders, roughly 8 to 15 yards deep between the hashes. Digs and crossing routes arrive here, so a defender sitting in the hole (often called a rat, or a robber when it’s a safety coming down) is aiming at the most valuable intermediate throws on the field. Usage of “rat” varies: some staffs mean any hole player, others a defender sitting lower, 5 to 8 yards deep, under the crossing routes.

Notice how few defenders that leaves. There are seven underneath areas on the map (two flats, two curls, two hooks, the hole), and with four rushers and three deep defenders, there are only four players to cover them. That isn’t a design flaw. It’s the trade every coverage makes, and it’s why defenders are taught to cover two areas each, as “curl-flat” or “hook-curl” players, starting in one and sliding to the other as the routes develop.

What makes him slide? Take the curl-flat defender. He drops first toward the curl, because the curl is the deeper and more dangerous throw, and he keeps his eyes on the quarterback while feeling the receivers around him: the outside receiver (#1) threatening the curl behind him, the inside one (#2) heading for the flat in front of him. When the quarterback looks to the flat, or the ball is thrown there, he breaks down to it; until then he sits under the curl. That is the dilemma the curl-flat concept builds on purpose: one receiver in each of his two areas, and the quarterback throws to whichever one he doesn’t take. A flat throw is the one he can afford to give up, because he arrives as the ball does and tackles for a short gain.

Landmarks: how a zone stays the same shape

A zone defender doesn’t drop to “somewhere around the curl.” He drops to a landmark: a spot defined by a depth and a width keyed to something on the field. “Twelve yards deep, top of the numbers.” “Ten yards, inside shoulder of #1.” “Deep middle, 18 yards, splitting the hashes.” Landmarks exist for the same reason a choreographer marks the stage: if every defender hits his spot, the gaps between the zones are the size the coach planned, on every snap, wherever the ball is spotted. A defender who drifts two yards off his landmark opens a window two yards wider for somebody else’s receiver. Landmarks are also what receivers aim at from the other side: seams two yards outside the hash, go routes on the numbers (Dropback Concepts lists them). Offense and defense are aiming at the same painted lines.

Landmarks move with the ball. With the ball on a hash, the short side of the field (the boundary) is about 23½ yards wide and the wide side about 30, so a deep third to the boundary is narrower than one to the field, and many teams play different coverages to the two sides for exactly that reason (Disguise, Rotation, and Split-Field Coverage). Most snaps on a broadcast look like this, not like the tidy middle-of-the-field map above.

Show the Python
zh = Play(spread(), [], los=40, ball_y="left", to_go=None)
fld = draw(zh, lateral="full", window=(-8.5, 19.0))
MB = -HASH_W                      # the ball is a hash-width left of the middle


def zh_box(d0, d1, m0, m1, lab):
    """Zone box with widths given from the middle of the field (m), drawn relative to the ball."""
    zone_box(fld, zh, d0, d1, m0 - MB, m1 - MB, lab, fs=6.6)


zh_box(1.0, 7.0, -14.0, -25.2, "flat")
zh_box(7.5, 14.5, -9.0, -15.5, "curl")
zh_box(5.0, 11.5, -3.6, -8.5, "hook")
zh_box(5.0, 11.5, -2.6, 3.4, "hook")
zh_box(7.5, 14.5, 3.9, 15.5, "curl")
zh_box(1.0, 7.0, 12.0, 25.2, "flat")
zh_box(12.0, 17.5, -7.0, 1.0, "hole")
dim(fld, zh, (-6.6, -HALF - MB + 0.2), (-6.6, MB - MB), "boundary ≈ 23½ yd", (-4.9, (-HALF - MB) / 2))
dim(fld, zh, (-6.6, 0.0), (-6.6, HALF - MB - 0.2), "field ≈ 30 yd", (-4.9, (HALF - MB) / 2 + 4.0))
plt.show()
Figure 33.2: The same underneath map with the ball on the offense’s left hash, the usual broadcast picture. The zones are keyed to the paint, so they slide with the ball: the boundary (short) side is squeezed into about 23½ yards and its flat is small, while the field (wide) side stretches across about 30, with a wide flat that a single defender struggles to cover.

The deep layer: thirds, halves and quarters

Above the underneath zones the field is split between the deep defenders. There are three standard splits, and almost every coverage you’ll meet uses one of them.

Show the Python
SPLITS = {
    "Thirds (Cover 3)": dict(edges=[-HALF, -HALF / 3, HALF / 3, HALF], names=["deep ⅓", "deep ⅓", "deep ⅓"],
                             deep=[(18.0, -17.0, "CB"), (18.0, 0.0, "FS"), (18.0, 17.0, "CB")],
                             under=[(7.0, -14.0), (8.5, -5.0), (8.5, 5.0), (7.0, 14.0)]),
    "Halves (Cover 2)": dict(edges=[-HALF, 0.0, HALF], names=["deep ½", "deep ½"],
                             deep=[(18.0, -12.0, "FS"), (18.0, 12.0, "SS")],
                             under=[(5.0, -18.5), (8.5, -9.5), (9.5, 0.0), (8.5, 9.5), (5.0, 18.5)],
                             under_lab={0: "CB", 4: "CB"}),
    "Quarters (Cover 4)": dict(edges=[-HALF, -HALF / 2, 0.0, HALF / 2, HALF], names=["¼", "¼", "¼", "¼"],
                               deep=[(17.0, -19.0, "CB"), (15.5, -6.5, "FS"), (15.5, 6.5, "SS"), (17.0, 19.0, "CB")],
                               under=[(7.0, -12.0), (8.0, 0.0), (7.0, 12.0)]),
}


def split_panel(ax, title, spec):
    p = Play([O("QB", "QB", -5.0, 0.0, "Q")], [], los=40, to_go=None)
    fld = Field(ax=ax, orient="vertical", los=40, window=(-3.0, 31.0), numbers=False, lateral=None)
    ppy = fld.pts_per_yard()
    e = spec["edges"]
    for i, (a, b) in enumerate(zip(e[:-1], e[1:])):
        zone_box(fld, p, 14.0, 29.5, a + 0.5, b - 0.5, "", alpha=0.10 if i % 2 == 0 else 0.20)
        say(fld, p, 26.5, (a + b) / 2, spec["names"][i], color=style.INK, fontsize=6.6, box=False)
    marks = [(d, w, lab, 1.65) for d, w, lab in spec["deep"]]
    marks += [(d, w, spec.get("under_lab", {}).get(i, ""), 1.4) for i, (d, w) in enumerate(spec["under"])]
    for d, w, lab, rad in marks:
        x, y = P(fld, p, d, w)
        draw_marker(ax, float(x), float(y), "def", "", ppy, r=rad)
        if lab:
            ax.text(float(x), float(y), lab, ha="center", va="center", fontsize=5.6, fontweight="bold",
                    color=style.INK, zorder=10)
    for w in (-6.0, -2.0, 2.0, 6.0):           # four rushers, drawn faint
        x, y = P(fld, p, 1.0, w)
        ax.add_patch(RegularPolygon((float(x), float(y)), 4, radius=0.9, orientation=np.pi / 4, fc="none",
                                    ec=GREY, lw=0.8, zorder=7))
    x, y = P(fld, p, -0.6, 0.0)
    ax.plot([float(x)], [float(y)], marker="o", ms=4, color=style.BALL, zorder=8)
    panel_title(ax, title, fs=8.5)


fig, axes = plt.subplots(2, 2, figsize=(6.6, 5.2))
for ax, (title, spec) in zip(axes.flat, SPLITS.items()):
    split_panel(ax, title, spec)
ax = axes[1, 1]
rows = [("Cover 3", 3, 4), ("Cover 2", 2, 5), ("Cover 4", 4, 3)]
for i, (nm, deep, under) in enumerate(rows):
    y = 2 - i
    ax.barh(y, deep, color=style.DEFENSE, height=0.55)
    ax.barh(y, under, left=deep, color=style.DEFENSE_TINT, edgecolor=style.DEFENSE, lw=0.8, height=0.55)
    ax.text(deep / 2, y, f"{deep} deep", ha="center", va="center", fontsize=7.5, color="white", fontweight="bold")
    ax.text(deep + under / 2, y, f"{under} under", ha="center", va="center", fontsize=7.5, color=style.INK)
ax.set_yticks([2, 1, 0], [nm for nm, _, _ in rows], fontsize=8)
ax.set_xlim(0, 7.2)
ax.set_xticks([0, 1, 2, 3, 4, 5, 6, 7])
ax.tick_params(labelsize=7)
ax.grid(axis="y", visible=False)
ax.set_xlabel("defenders in coverage (four rush)", fontsize=7.5)
panel_title(ax, "The trade: deep vs underneath", fs=8.5)
fig.tight_layout(h_pad=1.2, w_pad=1.0)
plt.show()
Figure 33.3: The three ways to split the deep field, with the cornerbacks (CB) and safeties (FS, SS) where they end up after the snap, at their deep landmarks; the underneath defenders are plain squares and the four rushers faint squares at the line. (Before the snap, quarters safeties often stand shallower than this; see the shell section.) Thirds (Cover 3): two corners and one safety, each about 18 yards wide, leaving four underneath. Halves (Cover 2): two safeties, each 27 yards wide, leaving five underneath, with the corners in the flats. Quarters (Cover 4): two corners and two safeties, each about 13 yards wide, leaving three underneath. Bottom right, the trade in one picture: with four rushing, every defender added deep is one taken from underneath.
  • A deep third is a third of the field’s width, about 18 yards. In Cover 3 the two cornerbacks take the outside thirds and a safety the middle one. What it buys: only three deep, so four defenders underneath and, often, a safety free to come down and help against the run. What it gives up: each deep defender has a wide strip to himself, and four vertical routes against three deep defenders leave one of them guarding two. The seams, the lanes where one third meets the next, are the classic targets.
  • A deep half is half the field’s width, about 27 yards, each guarded by a safety in Cover 2. What it buys: five underneath, the most of any zone, so the short and intermediate throws are crowded, and the corners can sit in the flats. What it gives up: each safety has the widest deep zone there is, so a throw down the sideline behind the corner (the “hole shot”) or straight up the middle between the two safeties stresses him.
  • A deep quarter is a quarter of the width, about 13 yards: two corners outside, two safeties inside, in quarters (Cover 4). What it buys: four deep defenders each guarding a narrow lane, so deep throws are hard, and because the lanes are narrow the safeties can stand closer to the line and jump into the run fit. What it gives up: only three underneath, so the short areas outside are thin, and a safety who comes up for the run has a long way back if it’s play-action. One more thing makes quarters different, and it matters later in this chapter: the four deep players don’t just guard lanes, they read receivers. Each safety watches the inside receiver on his side (#2): if #2 runs vertically, the safety covers him like a man; if #2 runs short or out, the safety drops off him to help on the outside receiver, or comes up to stop the run. Each corner takes the outside receiver (#1) deep wherever he goes, unless #1 runs a short route. That makes quarters the purest example of the pattern-matching zone described below.

These splits are where the first coverage numbers come from: three deep is Cover 3, two deep is Cover 2, four deep is Cover 4. Hold that thought until the numbering section; first, how a single defender lines up.

How a defender lines up: press, off and bail

Now zoom in on one cornerback and one wide receiver. Before the snap the corner has two choices to make, and each of them sends a message.

Show the Python
def one_on_one(kind):
    p = Play([O("X", "WR", -0.7, -15.0), O("LT", "LT", -0.7, -3.2, "")],
             [D("LCB", "CB", 1.0, -15.6, "CB")], los=40, to_go=None)
    if kind == "off":
        p.players["LCB"] = p.players["LCB"].moved(d=7.5, w=-16.0)
    if kind == "bail":
        p.players["LCB"] = p.players["LCB"].moved(d=13.0, w=-18.2)
    return p


fig, axes = plt.subplots(1, 3, figsize=(6.6, 3.3))
for ax, kind in zip(axes, ("press", "off", "bail")):
    p = one_on_one(kind)
    p.highlight("LCB")
    fld = p.draw(ax=ax, lateral=(-25.0, -5.5), window=(-3.5, 18.0), title=False)
    clean(ax)
    ruler(fld, p, fs=5.5)
    (x0, y0), (x1, y1) = P(fld, p, 5.0, -25.0), P(fld, p, 5.0, -5.5)
    ax.plot([float(x0), float(x1)], [float(y0), float(y1)], color=style.INK_2, lw=1.1, ls=(0, (4, 2)),
            zorder=2)
    if kind == "press":
        say(fld, p, 6.9, -10.0, "5 yd: contact\nends here", fontsize=6.0, color=style.INK_2)
        say(fld, p, 2.5, -9.6, "within a yard,\nhands on him\nat the snap", fontsize=6.3)
        say(fld, p, 10.5, -15.0, "eyes: the receiver\n(man), or a peek\nat the QB (zone)", fontsize=6.3)
        panel_title(ax, "Press", fs=8.5)
    elif kind == "off":
        dim(fld, p, (0.1, -18.5), (7.3, -18.5), "", (3.6, -18.5))
        say(fld, p, 3.6, -21.3, "cushion\n≈ 8 yd", fontsize=6.3)
        say(fld, p, 11.5, -13.0, "outside shade,\nturned in to see\nthe quarterback", fontsize=6.3)
        panel_title(ax, "Off", fs=8.5)
    else:
        ghost(fld, p, 1.6, -15.8, "CB")
        path(fld, p, [(2.3, -16.0), (7.0, -16.9), (12.2, -18.0)])
        say(fld, p, 8.5, -11.2, "looks like press,\nturns and runs\nat the snap", fontsize=6.3)
        panel_title(ax, "Bail (from a press look)", fs=8.5)
fig.tight_layout(w_pad=0.8)
plt.show()
Figure 33.4: Three ways for a cornerback (CB) to play the same wide receiver (X), drawn on the offense’s left. Press: within about a yard, shaded to the outside because his help is in the middle, ready to jam X with his hands. Off: about 8 yards away, also shaded outside; the gap between them is the cushion. Bail, here from a press look: he lines up a yard or two off (dashed outline), then at the snap turns his hips and runs, bending toward a deep-third landmark: the alignment of a man defender and the job of a zone defender. The grey dashed line marks 5 yards past the line of scrimmage: all of the corner’s contact has to happen short of it.

How close? In press the defender lines up within about a yard of the receiver and tries to jam him with his hands at the snap: punch his chest, turn his shoulders, push him off the line he wants to run. A route is a timing play (The Quick Game): the quarterback’s feet tell him when to throw, and a slant that should break after three steps but breaks after five because the receiver was wrestling at the line arrives after the quarterback has had to move on. What press buys: the defender is right there, so short throws are contested and the timing is wrecked. What it gives up: if the receiver beats the jam with a quick move, the defender is beaten at the line with nothing but grass ahead of the receiver, so press almost always comes with help deep.

In off coverage the defender starts several yards away, usually 5 to 10, and gives ground at the snap. The gap between them is the cushion: how many yards of depth the defender has on the receiver. Cushion is time. A receiver needs a second or more to eat up eight yards, and in that second the defender reads the route and the quarterback. What off coverage buys: it’s very hard to get behind a defender who starts eight yards deep and keeps backing up. What it gives up: the receiver can stop in front of him (a hitch, a quick out) and catch the ball before the defender can close the gap. When the analyst says “he’s giving a big cushion,” he means the defense has decided it would rather give up five yards than fifty. Many coaches teach the cushion as a budget: backpedal while it lasts, and when the receiver has eaten it down to two or three yards, stop giving ground, turn and run with him, or drive on him if he stops.

Which side? The defender’s alignment also has a lean, its leverage: shaded inside the receiver, he is protecting the middle of the field and daring the receiver to go outside, toward the sideline (which acts like an extra defender); shaded outside, he’s protecting the sideline and pushing the receiver inside, usually because he knows he has help in the middle. Leverage is never random. It tells you where the defender’s help is, which is why quarterbacks are taught to throw away from it.

The third option is a technique, and sometimes a lie. To bail, a corner turns his hips at the snap and runs to a deep landmark instead of backpedalling. From an off alignment it is an everyday technique, the usual way a Cover 3 corner gets to his deep third against a fast receiver, because nobody can backpedal as fast as a receiver can sprint. From a press look, a yard or two off, it becomes a disguise, often called press-bail. Why line up close only to leave? Because a pressed corner says “man coverage” to the quarterback, and the quarterback reacts: he expects his receiver to run away from a defender who has his back turned, and he expects quick throws to beat press. If the corner bails into a deep third instead, the quarterback is throwing at a zone he thought was man. Press-bail is the cheapest disguise in football, and it costs something too: a corner who starts at two yards and has to reach eighteen is running backward and sideways while the receiver runs forward, so the deep ball outside is a risk. The full art of showing one thing and playing another is the subject of Disguise, Rotation, and Split-Field Coverage.

CautionCommon misconception

“The corner who lines up close is playing man; the one who backs off is playing zone.” It’s a lean, not a rule. The classic Cover 2 corner is often right up on the receiver: a hard corner who jams #1, knocks him off his line toward the safety, and then sinks into the flat, a zone player in a press alignment. Seattle’s famous Cover 3 corners pressed receivers and then ran with them into their deep thirds (film room, below). And plenty of man-coverage corners play off on third-and-long, because the first job of any coverage on third-and-12 is to keep the receiver from getting past the sticks and past the defender. Read the corner’s alignment together with his eyes and the safeties, never alone.

Trail, and the defender’s eyes

Once the ball is snapped, a man defender has to decide where to be relative to his receiver. The most common choice, when there’s a safety deep to help, is trail technique: run a step behind the receiver and slightly underneath him, on his hip. Why behind? Because the defender has handed the deep ball over the top to the safety, so his job is the throws in front of the receiver: the slant, the dig, the out. From the hip he can drive on any break and get a hand on the ball. The price is the deep ball if the help never arrives, and the back-shoulder throw, aimed at the receiver’s back hip, where the trailing defender can’t reach. (Man Coverage builds the other man techniques.)

Show the Python
def trail_panel(ax, kind):
    XP = (12.5, -15.8)
    p = Play([O("X", "WR", *XP)], [], los=40, to_go=None)
    fld = Field(ax=ax, orient="vertical", los=40, window=(-2.5, 23.0), numbers=False,
                lateral=sorted((p.ball_y + 24.5, p.ball_y + 2.0)), to_go=None)
    ppy = fld.pts_per_yard()
    xs, ys = P(fld, p, np.array([-0.7, 11.6]), np.array([-15.8, -15.8]))
    ax.plot(xs, ys, color=style.OFFENSE, lw=1.8, zorder=4)
    ax.add_patch(FancyArrowPatch((xs[0], ys[0]), (xs[1], ys[1]), arrowstyle="-|>", mutation_scale=9,
                                 color=style.OFFENSE, lw=1.6, zorder=4))
    if kind == "trail":
        zone_box(fld, p, 4.0, 9.5, -12.8, -5.2, "", alpha=0.18)
        say(fld, p, 6.8, -9.0, "his throws:\nslant, dig, out", fontsize=6.2)
        cb = (10.6, -13.6)
        path(fld, p, [(1.0, -15.2), (6.0, -14.2), (9.6, -13.7)])
        say(fld, p, 15.6, -10.8, "a step behind,\non his inside hip", fontsize=6.2)
        fs = (19.5, -6.0)
        x, y = P(fld, p, *fs)
        draw_marker(ax, float(x), float(y), "def", "FS", ppy)
        path(fld, p, [(19.5, -7.2), (19.0, -12.0)], lw=1.1)
        say(fld, p, 21.0, -13.0, "deep ball: the safety's", fontsize=6.2)
        panel_title(ax, "Trail (help deep)", fs=8.2)
    else:
        zone_box(fld, p, 2.0, 9.5, -12.8, -5.2, "", alpha=0.10)
        say(fld, p, 5.8, -9.0, "his price:\nthe short throw", fontsize=6.2)
        cb = (14.4, -13.9)
        path(fld, p, [(7.0, -14.4), (10.5, -14.0), (13.4, -13.9)])
        say(fld, p, 17.8, -14.5, "level or deeper:\nnothing behind him", fontsize=6.2)
        say(fld, p, 21.0, -7.0, "no safety", fontsize=6.2, color=GREY)
        panel_title(ax, "On top (no help)", fs=8.2)
    for (d, w), lab, side in ((cb, "CB", "def"), (XP, "X", "off")):
        x, y = P(fld, p, d, w)
        draw_marker(ax, float(x), float(y), side, lab, ppy, ring=style.THIRD if lab == "CB" else None)
    x, y = P(fld, p, -0.6, -3.0)
    ax.plot([float(x)], [float(y)], marker="o", ms=0)
    ruler(fld, p, fs=5.5, top=20)


fig, axes = plt.subplots(1, 2, figsize=(6.0, 3.0))
for ax, kind in zip(axes, ("trail", "top")):
    trail_panel(ax, kind)
fig.tight_layout(w_pad=1.0)
plt.show()
Figure 33.5: Trail, and what “underneath” means. Left: with a free safety deep, the corner runs a step behind X and on his inside hip, between X and the quarterback, so the short and in-breaking throws (shaded) have to go through him; the deep ball is the safety’s. Right, for contrast: with no help behind him, a man defender stays level with or deeper than the receiver (on top), and the short throw in front of him is the price.

Which brings us to the most underrated skill in coverage, eye discipline: looking at the right thing at the right moment. A man defender looks at his man, mostly at his hips, which can’t fake where the receiver is going the way a head or shoulders can. A zone defender looks at the quarterback, because the quarterback’s eyes and shoulders tell him where the ball is going, and he “feels” the receivers entering his area out of the corner of his eye. The two have opposite failure modes. A man defender who peeks at the quarterback loses a step on his receiver. A zone defender who stares at a receiver drifts with him, out of his zone, and the window he was supposed to close opens behind him; one who stares at the quarterback can be moved by a play-action fake or a quarterback who looks one way and throws the other. Coaches call a defender caught looking at the wrong thing an eye violation, and when you see a receiver running wide open on a replay, the first question to ask is where the nearest defender was looking.

The 5-yard rule

Press has a legal limit, and it shapes the whole position. In the NFL a defender may make contact with a receiver only until the receiver is 5 yards past the line of scrimmage. After that, until the ball is thrown, and as long as the quarterback is still in the pocket with it, any contact that impedes him (beyond incidental contact) is illegal contact, a 5-yard penalty with an automatic first down, and grabbing him is defensive holding, the same penalty.1

It wasn’t always so. For most of the league’s history a defender could keep hitting a receiver downfield until the ball was thrown, and physical cornerbacks such as the Steelers’ Mel Blount turned every route into a fight. The league trimmed that in steps through the 1970s: in 1977 defenders were allowed to contact a receiver only once,2 and in 1978 the rule that still applies limited contact to the first 5 yards, a change still called the “Mel Blount rule.”3 The league tightened it again after the January 2004 AFC Championship Game, in which New England’s corners, led by Ty Law, manhandled Indianapolis’s receivers: from 2004 officials were told to enforce illegal contact and pass interference strictly, a crackdown many called the “Ty Law rule.”4 Both changes made passing easier, and both are part of why passing numbers have climbed for decades (The 1978 Liberation).

Why does this matter for reading coverage? Because it explains why press lives where it lives. Inside 5 yards the corner may jam, re-jam and ride the receiver; past 5 yards he may not touch him at all. All of the contact has to happen in those first 5 yards, about the first second of the route, so press is about the release, and a receiver who gets through it clean is in open space with a defender chasing him. It’s why pressed corners nearly always have a safety behind them, why offenses love quick, sharp releases and stacked receivers against press (one receiver behind another, so the defender can’t get his hands on the back one), and why on third-and-long, when the receiver will run well past 5 yards, many defenses don’t bother to press at all. Contact Rules and Penalties as Strategy covers the rule book side, including pass interference.

Three ways to guard a receiver: spot-drop, pattern-match and man

You’ve met man and zone. In the modern NFL, zone itself comes in two styles, and the difference between them is most of the story of coverage since the 1990s.

In spot-drop zone each defender drops to his landmark and then plays the quarterback: when the quarterback looks, he leans; when the ball is thrown, he breaks on it. He guards an area, whoever comes through it. In pattern matching each defender starts as a zone player but reads the receivers’ routes as they develop, and by rule (an if-then rule agreed before the play) picks up whoever enters or stays in his area and covers him like man, passing him off to a teammate if he leaves. “If #2 goes to the flat, I take him; if he goes vertical, I carry him up the seam,” where carry means stay with him as he runs deeper. A match zone is a zone coverage that turns into man coverage once the routes declare (once each receiver has shown where he’s going, usually in the first second or so), so that each receiver has a defender on him wherever the offense put him. Quarters, with its safeties reading #2, is the classic example.

The easiest way to see the three is to run the same routes against all of them.

Show the Python
LAT, WIN = (-21.0, 2.5), (-9.0, 19.5)
THROW_T = 1.6


def catch_time(p, t_throw):
    """When the thrown ball reaches its target (same flight model as gridiron)."""
    start = p.ball_position(t_throw)
    t_arr = t_throw + 0.5
    for _ in range(5):
        t_arr = t_throw + float(np.linalg.norm(p.position("X", t_arr) - start)) / gplay.BALL_SPEED
    return t_arr


def break_on_ball(p, key, landmark, t_land, t_react, t_arr, stop=3.0):
    """Zone drop to a landmark, sit, then break toward the catch point after the throw, arriving late."""
    q = p.players[key]
    catch = p.position("X", t_arr)
    lm = np.array(landmark)
    v = catch - lm
    dist = float(np.linalg.norm(v))
    end = lm + v * max(0.0, (dist - stop) / dist)
    rows = [(t_land, *lm), (t_react, *lm), (t_arr, *end), (t_arr + 0.6, *end)]
    set_track(p, key, rows)


def three_ways(kind):
    off = line5()[:3] + [O("QB", "QB", -5.0, 0.0, "Q"), O("RB", "RB", -5.0, -1.5, "R"),
                         O("X", "WR", -0.7, -15.0), O("H", "WR", -1.5, -9.0)]
    dfn = [D("WDE", "DE", 1.0, -5.6, "E"), D("WDT", "DT", 1.0, -0.8, "T"), D("WILL", "WILL", 4.5, -3.0, "W"),
           D("NB", "NB", 5.0, -7.6, "$"), D("LCB", "CB", 7.0, -16.0, "CB"), D("FS", "FS", 13.0, 0.0, "FS")]
    p = Play(off, dfn, los=40, to_go=None)
    p.route("X", r.dig(12.0, 6.0))
    p.route("H", r.out(5.0, 7.5))
    p.dropback(2.5)
    p.block("RB", pts=[(0.6, -1.4)])
    protect(p, rushers=("WDE", "WDT"), linemen=("LT", "LG", "C"))
    if kind == "spot":
        p.drop("LCB", (17.5, -16.5), speed=4.6)
        p.drop("FS", (17.0, -1.0), speed=3.5)
        p.pass_to("X", t=THROW_T)
        t_arr = catch_time(p, THROW_T)
        break_on_ball(p, "NB", (10.5, -15.0), 1.7, THROW_T + 0.4, t_arr, stop=3.5)
        break_on_ball(p, "WILL", (10.0, -2.8), 1.4, THROW_T + 0.4, t_arr, stop=3.5)
    elif kind == "match":
        p.drop("FS", (16.5, -2.5), speed=3.5)
        set_track(p, "NB", [(0.6, 6.8, -9.8)] + shadow(p, "NB", "H", off=(1.2, 1.7), lag=0.25, t_from=0.6,
                                                        t_on=1.3, start=(6.8, -9.8)))
        set_track(p, "LCB", [(1.3, 11.0, -15.9), (2.0, 13.8, -14.8), (3.0, 16.0, -14.0)])
        set_track(p, "WILL", [(0.9, 7.5, -4.4), (1.6, 9.2, -6.0), (2.4, 9.4, -7.4), (3.0, 9.4, -7.4)])
    else:
        p.drop("FS", (17.0, -1.0), speed=3.5)
        p.drop("WILL", (7.5, -2.0), speed=2.5)
        # hand-keyed man play: the CB backpedals, then undercuts the dig from X's inside hip;
        # the $ mirrors H, holding his cushion, then drives on the out
        set_track(p, "LCB", [(0.6, 7.6, -15.9), (1.2, 9.4, -15.6), (1.6, 10.4, -15.0), (2.0, 9.8, -12.8),
                             (2.4, 9.7, -9.8), (3.0, 9.7, -9.6)])
        set_track(p, "NB", [(0.6, 5.5, -8.7), (0.9, 5.3, -9.6), (1.3, 4.9, -12.6), (1.7, 4.9, -14.8),
                            (2.4, 4.9, -15.0), (3.0, 4.9, -15.0)])
    return p


THREE = [("Spot-drop", three_ways("spot"), THROW_T), ("Pattern-match", three_ways("match"), None),
         ("Man", three_ways("man"), None)]
TIMES = [0.0, 0.6, 1.2, 2.4]
RINGS = ("NB", "WILL")
EARLY = {"Spot-drop": "$ drops\nto a spot", "Pattern-match": "$ drops:\nzone so far",
         "Man": "$ goes with\nH at once"}
FINAL = {"Spot-drop": "$ sank to the curl, H ran\nunder him; the dig settles\nbetween $ and W",
         "Pattern-match": "$ took the out, W the dig;\nCB carried X, handed him\noff and stayed deep",
         "Man": "CB and $ chase their men,\nbacks to the QB. W has\nno man: rat in the hole"}

if PDF:
    span_w, span_d = abs(LAT[1] - LAT[0]), WIN[1] - WIN[0]
    pw = 6.4 / 4
    fig, axes = plt.subplots(3, 4, figsize=(6.4, 3 * (pw * span_d / span_w + 0.26)))
    for row, (name, p, tt) in enumerate(THREE):
        for col, t in enumerate(TIMES):
            fld = moment(axes[row, col], p, t, LAT, WIN, rings=RINGS, throw_t=tt)
            lab = "snap" if t == 0 else f"+{t:.1f} s"
            panel_title(axes[row, col], f"{name} · {lab}", fs=6.8)
            if col == 1:
                tag(fld, p, t, EARLY[name], fs=5.6)
            if col == 3:
                tag(fld, p, t, FINAL[name], fs=5.4)
    fig.tight_layout(h_pad=0.6, w_pad=0.3)
    plt.show()
else:
    from matplotlib import animation
    from IPython.display import HTML, display
    fig, axes = plt.subplots(1, 3, figsize=(7.4, 3.6))
    ts = np.round(np.arange(-0.3, 2.81, 0.1), 2)

    def update(i):
        for ax, (name, p, tt) in zip(axes, THREE):
            ax.clear()
            t = max(0.0, float(ts[i]))
            fld = moment(ax, p, t, LAT, WIN, rings=RINGS, throw_t=tt)
            panel_title(ax, f"{name} · " + ("snap" if t == 0 else f"+{t:.1f} s"), fs=9)
            if 0.5 <= t <= 1.0:
                tag(fld, p, t, EARLY[name], fs=6.5)
            if t >= 2.3:
                tag(fld, p, t, FINAL[name], fs=6.0)
        return []

    fig.tight_layout()
    anim = animation.FuncAnimation(fig, update, frames=len(ts), 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))
Figure 33.6: The same two routes against three kinds of coverage (offense’s left side; simulated play). X runs a dig (up to 12 yards, then across); H runs a short out, so the routes cross. All three rows start from the same alignment; watch the ringed nickel ($) and Will (W). At +0.6 s the man $ is already moving with H, while the two zone $s are still dropping. Spot-drop (top): the $ sinks to his curl landmark and leaves H to run under him into the flat; the dig settles in the window between the $ and the W, who break on the throw too late. Pattern-match (middle): the $ picks up H when he breaks out, the W picks up the dig, and the CB carries X, hands him off and stays deep: nobody is open. Man (bottom): the CB and $ chase their men with their backs to the quarterback (the CB undercutting the dig from X’s inside hip), and the W, with no receiver, sits in the hole as a rat. On the web this is a video.

Watch one defender in each row, the nickel ($), for the first second. In man he goes with H from the first step: at +0.6 s he is already shuffling outside with him, holding his cushion, eyes on H. In spot-drop and pattern-match he looks the same at +0.6 s: he turns and drops toward the curl like a zone player, eyes on the quarterback. The two zones split when H breaks out, just under a second in. The pattern-match $ sees #2 go to the flat and comes down with him; the spot-drop $ keeps sinking to his curl landmark and lets H run underneath him, because his job is a place, and he trusts that a throw to the flat is short and he can break on it. That first second is how you tell them apart on a replay: did the defender run to a spot or with a receiver, and if with a receiver, did he start with him or pick him up after a beat?

Then look at the Will (W) in each row. In spot-drop he sits in his hook zone and the dig settles in the window between him and the $. In pattern-match he picks up the dig as it crosses into his area. In man he has no receiver at all (the running back stayed in to block), so he becomes an extra defender sitting in the hole, which is why man coverage defenses so often have a “free” player.

Now the trade-offs, which are the reason all three still exist.

  • Spot-drop zone is simple to teach, keeps every defender’s eyes on the quarterback, and gives the offense nothing deep: it’s hard to complete a long pass over defenders who are dropping to depth and reading the throw. But it is passive. The windows between the landmarks are a known size, and an offense that runs receivers into those windows, or puts two receivers into one defender’s area (the flood concept is built to do exactly that), completes balls all day. The top row shows the classic case: a dig that settles between two defenders who both did their jobs. The trade is that both of them are facing the ball when it’s thrown, so they break on it together and the catch gains what it gains and no more.
  • Pattern matching fixes that by letting the routes decide who covers whom. Each receiver ends up with a defender on him, but the defenders started as zone players, facing the quarterback, so they still see scrambles and throws coming. The price is complexity. Every defender needs rules for every combination of routes (“#2 out, I take the flat; #2 vertical, I carry him; #1 under, I pass him to the hook”), the rules have to agree with each other, and a defender who misreads one route can leave two defenders on one receiver and none on another. Offenses fight match with routes that change direction late, crossing routes that force defenders to pass receivers off to each other at full speed, and motion before the snap.
  • Man coverage is the tightest of all: every receiver has a shadow from the first step. It’s also the most fragile. Defenders have their backs to the quarterback (so a scramble is dangerous; look at the bottom row), crossing routes and rubs make them run through traffic, and one lost footrace means a big play. Man Coverage covers when defenses choose it anyway.
ImportantWhy it exists: pattern matching

The problem it solved. Spot-drop zones were the standard for decades, and by the 1980s and 1990s offenses had learned to beat them by design: four receivers running vertically against three deep defenders, or two receivers flooding one curl-flat defender. The answer was to make the zone react to the routes. Nick Saban, building a pattern-matching Cover 3 with Bill Belichick in Cleveland in the early 1990s, is the coach most often credited, and his later Michigan State, LSU and Alabama defenses spread the idea through college football; the coaching writer Cameron Soran, whose guide to Saban’s coverages is the most detailed public account, writes that this kind of Cover 3 “simply did not exist” before then.5 Like most “who invented it” stories, it’s disputed: zone defenders have always adjusted to routes somewhat, and other staffs developed match rules in parallel. Today almost every NFL zone matches to some degree, which is why the man/zone labels in charting data are fuzzier than they look.

What it gives up. Teaching time, and certainty. A match coverage has dozens of rules, and offenses design plays specifically to make two defenders’ rules contradict each other.

Reading the shell: is the middle of the field closed or open?

A First Look at Defense taught the two shells, one-high and two-high, and the corner tell that goes with them. It also named the coaches’ words for them, which this chapter now makes official:

  • MOFC, the middle of the field closed: one deep safety in the middle of the field, so the deep middle is guarded. That’s a one-high defense: Cover 1 (man underneath) or Cover 3 (zone underneath), most of the time.
  • MOFO, the middle of the field open: nobody in the deep middle, usually because two safeties have split the field between them. That’s two-high: Cover 2, quarters, 2-Man (Cover 2’s two deep safeties with man coverage underneath) or Cover 6 (quarters on one side, Cover 2 on the other; more on both numbers below). Cover 0, with no safety deep at all, also counts as “open”: the label answers the quarterback’s question “is anyone guarding the deep middle?”, and in Cover 0 nobody is.

Why talk about the middle rather than counting safeties? Because the deep middle is the most dangerous place on the field to leave unguarded. A ball thrown down the middle can be caught with room to run either way, and the post route (a deep route breaking toward the goalposts) is the easiest deep throw for a quarterback to make, straight ahead with no sideline to squeeze it. That is why coaches call the deep middle itself “the post”, and a lone safety there the post safety. So the quarterback’s first question after “how many deep?” is really “is anyone in the post?” It decides his best deep throw: against MOFC, attack outside, down the sidelines and up the seams beside the deep safety; against MOFO, attack the middle, between the safeties.

It also feeds the option routes that Passing Fundamentals introduced. The core rule there was about the underneath defenders: against man, break away from your defender; against zone, find the soft spot between two defenders and sit. The shell is a fast first guess at that, because MOFC with defenders tight on the receivers usually means Cover 1, man, and so “break away”; two-high usually means a zone, and so “sit”. But the guess has exceptions the receiver has to read through: Cover 3 is MOFC and a zone (sit in the window), and 2-Man is MOFO with every underneath defender in trail man (break away). For a receiver running deep, the shell gives its own rule: against MOFC, bend away from the post safety (toward the sideline or up the seam); against MOFO, split the two safeties or take the post.

Depth and width: what the safeties and corners tell you

Inside each family, the details of the alignment narrow it down, because every defender lines up where his real job is reachable. Here are four common pictures against the same offense.

Show the Python
MOFO_LB = dict(MIKE=(4.8, 5.6), WILL=(4.5, -0.8))   # apex over Y, and a linebacker stacked over the ball
SHELLS = {
    "MOFC · pressed, everyone on a man (Cover 1 look)": dict(
        FS=(14.0, 0.0), SS=(4.0, 8.4), NB=(1.6, -8.4), LCB=(1.3, -15.7), RCB=(1.3, 15.7), MIKE=(4.5, 1.2),
        WILL=(4.5, -2.4)),
    "MOFC · off, eyes in (Cover 3 look)": dict(
        FS=(14.0, 0.0), SS=(5.5, 6.9), NB=(5.0, -6.9), LCB=(7.5, -16.3), RCB=(7.5, 16.3)),
    "MOFO · deep and wide, corners squat (Cover 2 look)": dict(
        FS=(13.0, -7.5), SS=(13.0, 7.5), NB=(4.5, -6.8), LCB=(5.0, -16.4), RCB=(5.0, 16.4), **MOFO_LB),
    "MOFO · shallow and tight (quarters look)": dict(
        FS=(10.0, -4.5), SS=(10.0, 4.5), NB=(4.5, -6.8), LCB=(7.5, -15.8), RCB=(7.5, 15.8), **MOFO_LB),
}
fig, axes = plt.subplots(2, 2, figsize=(6.6, 4.6))
for ax, (title, spots) in zip(axes.flat, SHELLS.items()):
    p = Play(spread(), nickel(**spots), los=40, to_go=None)
    p.highlight("FS", "SS", "LCB", "RCB")
    fld = draw(p, ax=ax, lateral=(-21.5, 21.5), window=(-6.5, 19.5), rfs=5.0)
    fs = spots["FS"]
    if fs[1] == 0.0:
        say(fld, p, fs[0] + 2.4, 0.0, f"{fs[0]:.0f} yd deep, in the middle", fontsize=5.6)
    else:
        wtxt = f"{abs(fs[1]):.1f}".replace(".5", "½").replace(".0", "")
        say(fld, p, fs[0] + 2.9, 0.0, f"both {fs[0]:.0f} yd deep,\n{wtxt} yd from the middle", fontsize=5.6)
    panel_title(ax, title, fs=7.4)
fig.tight_layout(h_pad=0.9, w_pad=0.6)
plt.show()
Figure 33.7: Four pre-snap pictures against the same 2x2 offense, safeties and corners ringed. Top row, both middle of the field closed: compare the corners (pressed and square, with every receiver covered tight, against 7 to 8 yards off with the slot defenders inside). Bottom row, both middle of the field open: compare the safeties’ depth and width (deeper and wider for Cover 2, shallower and tighter to the hash for quarters). In both two-high pictures a linebacker stands in the apex outside the right tackle, over the slot tight end. Each picture is a lean, not a guarantee.

The tells, and the reason behind each:

  • Safety depth. Two-high safeties in Cover 2 line up deep, 12 to 14 yards, because each is responsible for the deepest ball thrown anywhere in his half of the field. Quarters safeties can line up shallower, 8 to 11 yards, because their deep zone is narrow and they are also run defenders: they read the slot receiver or tight end in front of them, and if it’s a run, they fly downhill. A single high safety in Cover 3 or Cover 1 is usually the deepest player on the field, 13 to 16 yards. In the NFL, treat depth as a weak tell. Many two-high defenses, Fangio’s and the many copied from it, line every safety up at the same 12 to 14 yards whatever the call, precisely so that depth won’t give the coverage away; the shallow quarters safety is more of a college picture.
  • Safety width. A Cover 2 safety has half the field, so he lines up wider, several yards outside the hash and closer to the slot receiver, to be able to reach the sideline. A quarters safety has only the inside quarter and reads the slot receiver, so he lines up tighter, nearer the hash and well inside that receiver. On the NFL’s narrow hashes the difference is only a few yards, so compare the safety with the slot receiver on his side: closer to the slot leans halves, closer to the hash leans quarters. Width that doesn’t fit the coverage the shell suggests (a “two-high” safety who is almost in the middle) is a classic rotation tell (Disguise, Rotation, and Split-Field Coverage).
  • Corner depth and leverage. Cover 2 corners have the flat, so they play short: squatting at about 5 yards, or pressing to jam #1 and knock him inside before sinking to the flat, always with outside leverage, forcing everything inside to the safety. Cover 3 corners sit 7 to 8 yards off with outside leverage and turn their shoulders in to see the quarterback, because they have a deep third. Cover 1 corners often press, square to their man, eyes on him, shading toward the side away from their help. Quarters corners sit off, eyes on #1, because in quarters they usually take #1 deep wherever he goes. That last difference is also the best way to tell Cover 3 from quarters after the snap, when both showed off corners: the Cover 3 corner turns and bails to a landmark, the quarters corner pedals and reads #1.
  • The slot defenders. A nickel or safety tight on a slot receiver, nose to nose, suggests man; one standing a few yards inside him, in the apex between the slot and the tackle, suggests zone.

None of these is a guarantee on its own. The skill is adding them up, and then, as the quarterback does, checking the answer one second after the snap. The shell before the snap is a hypothesis; what the safeties do at the snap is the evidence. (Who decides the call, and how it can change once the defense sees the formation, is in the Madden box below.)

ImportantWhy it exists: reading the shell

For the quarterback, the shell is the first filter on the play: it tells him which side and which receiver to start with, whether the deep ball is outside or in the middle, and whether to change the play at the line. For the defense, the shell is the price of physics: a safety can only cover so much ground after the snap, so where he stands limits what he can do. That’s why the shell carries real information, and why a defense that wants to lie has to do it carefully, with safeties who move late or rotate at the snap; the Fangio film room below is the famous example of a shell that lies on purpose. How often does the pre-snap shell match the coverage played? No public source we trust gives a league-wide rate. The numbers you’ll see count coverages played: Next Gen Stats’ split-safety rate, the share of plays in two-high coverages such as Cover 2, 4 and 6, rose from 32.9 percent in 2018 to 42.0 percent in 2025, the highest since its tracking began.6

Decoding the numbers: Cover 0 to Cover 9

On a broadcast you’ll hear coverages called by number: “that’s Cover 1,” “they’re playing a lot of Cover 6.” Coverage numbering (Cover 0 to Cover 9) is the closest thing football has to a common language for pass defense, and it starts out simple: through Cover 4, the number counts the deep defenders. Cover 0 has none, Cover 1 has one, Cover 2 has two, Cover 3 three, Cover 4 four.

After 4 the counting stops and the numbers become names. Cover 5 isn’t five deep (nobody plays five deep); in most systems it’s another name for 2-Man, two deep with man underneath. Cover 6 is the most famous non-count: a split-field coverage that plays quarters on one side and Cover 2 on the other, a quarter, a quarter and a half, and many coaches remember the number by adding them up: four plus two. Which side gets which matters, and it is decided by the offense’s strength. You met formation strength in Formation Rules and Vocabulary; for coverage, the version that usually counts is the passing strength, the side with more receivers. The usual Cover 6 puts its quarters half toward the strength (or the wide field side), where the receivers are, and its Cover 2 half toward the weak side or the short boundary. From 7 up, the numbers belong to individual staffs, and you can’t decode them without knowing whose playbook you’re in.

Show the Python
DIAL = [
    ("Cover 0", [], "man", "no deep safety;\nman, usually a blitz", False),
    ("Cover 1", [(-HALF, HALF, "1 free")], "man", "one free safety;\nman underneath", False),
    ("Cover 2", [(-HALF, 0, "½"), (0, HALF, "½")], "zone", "two deep halves;\nfive under", False),
    ("Cover 3", [(-HALF, -HALF / 3, "⅓"), (-HALF / 3, HALF / 3, "⅓"), (HALF / 3, HALF, "⅓")], "zone",
     "three deep thirds;\nfour under", False),
    ("Cover 4", [(-HALF, -HALF / 2, "¼"), (-HALF / 2, 0, "¼"), (0, HALF / 2, "¼"), (HALF / 2, HALF, "¼")],
     "zone", "quarters: four deep,\nthree under", False),
    ("Cover 5", [(-HALF, 0, "½"), (0, HALF, "½")], "man", "usually 2-Man: two\ndeep, man under", True),
    ("Cover 6", [(-HALF, -HALF / 2, "¼"), (-HALF / 2, 0, "¼"), (0, HALF, "½")], "zone",
     "quarters to the 3-receiver\nside, half away", True),
    ("Cover 7", [(-HALF, -HALF / 2, "¼"), (-HALF / 2, 0, "¼"), (0, HALF / 2, "¼"), (HALF / 2, HALF, "¼")],
     "match", "Saban: split-field\nmatch, quarters-based", True),
    ("Cover 8", [(-HALF, 0, "½"), (0, HALF / 2, "¼"), (HALF / 2, HALF, "¼")], "zone",
     "Fangio: half to the 3-\nreceiver side, ¼s away", True),
    ("Cover 9", [(-HALF, -HALF / 3, "⅓"), (-HALF / 3, HALF / 3, "⅓"), (HALF / 3, HALF, "⅓")], "match",
     "drawn: Cover 3 match;\nvaries by staff", True),
]


def dial_panel(ax, name, deep, under, note, dialect):
    p = Play([O("QB", "QB", -5.0, 0.0, "Q")], [], los=40, to_go=None)
    fld = Field(ax=ax, orient="vertical", los=40, window=(-2.0, 30.0), numbers=False, hashes=False,
                lateral=None)
    for i, (a, b, lab) in enumerate(deep):
        zone_box(fld, p, 15.0, 28.0, a + 0.8, b - 0.8, "", alpha=0.12 if i % 2 == 0 else 0.24, ls="-")
        say(fld, p, 21.5, (a + b) / 2, lab, color=style.INK, fontsize=6.6, box=False, weight="bold")
    if not deep:
        say(fld, p, 21.5, 0.0, "nobody deep", color=DD, fontsize=6.2, box=False)
    col = {"man": style.OFFENSE_DARK, "zone": DD, "match": "#6a4fb0"}[under]
    zone_box(fld, p, 2.0, 12.0, -24.5, 24.5, "", color=col, alpha=0.10, ls="-")
    say(fld, p, 7.0, 0.0, {"man": "man under", "zone": "zone under", "match": "match under"}[under],
        color=col, fontsize=6.4, box=False, weight="bold")
    if name in ("Cover 6", "Cover 8"):         # receivers at the line: three to the offense's left (the strength)
        for w in (-21.0, -14.5, -8.0, 20.0):
            x, y = P(fld, p, -0.9, w)
            ax.plot([float(x)], [float(y)], marker="o", ms=3.2, color=style.OFFENSE, mec="white", mew=0.4,
                    zorder=9)
    if dialect:
        for s in ax.spines.values():
            s.set_visible(True)
        ax.axis("on")
        ax.set_xticks([])
        ax.set_yticks([])
        for s in ax.spines.values():
            s.set_linestyle((0, (3, 2)))
            s.set_edgecolor(style.INK_2)
            s.set_linewidth(0.9)
    ax.set_title(name, fontsize=8.5, color=style.INK, fontweight="bold", loc="center", pad=3)
    ax.text(0.5, -0.06, note, transform=ax.transAxes, ha="center", va="top", fontsize=6.3, color=style.INK_2,
            linespacing=1.15)


fig, axes = plt.subplots(2, 5, figsize=(6.6, 3.0))
for ax, args in zip(axes.flat, DIAL):
    dial_panel(ax, *args)
fig.tight_layout(h_pad=2.0, w_pad=0.5)
plt.show()
Figure 33.8: Cover 0 to Cover 9 at a glance: the deep split (shaded, with the share of the width each deep defender guards) and how the underneath players cover: man (blue), zone (orange) or match (purple, zone that turns into man by rule). In the Cover 6 and Cover 8 panels the blue dots are the receivers: three on the left make that the offense’s passing strength, and the two coverages are the same idea with the halves swapped. Through Cover 4 the number counts the deep defenders. From Cover 5 on the numbers are names; panels with a dashed border are dialect numbers, drawn in one common meaning (named below each panel), and mean something else in other playbooks. The full dialect table is in Appendix D, the Coverage and Pressure Atlas.

The higher numbers are where football’s dialects live. These are real examples, and they are exactly why the Coverage and Pressure Atlas keeps a dialect table:

  • Cover 6 is, for most of the NFL, quarter-quarter-half, with the quarters toward the strength. But in Nick Saban’s vocabulary “6” has been a Cover 3 with a weak rotation: at the snap the safety on the side away from the offense’s strength comes down toward the line, and the other safety goes to the deep middle. His “7” is a whole family of split-field, quarters-based match coverages built from a separate call for each side (Cover 7 is defined in Disguise, Rotation, and Split-Field Coverage).7
  • Cover 8 is rare in charting and has no standard meaning. In Vic Fangio’s system, the most copied NFL defense of the last decade, Cover 8 is the same quarters-and-half idea that most teams call Cover 6, with the halves swapped. The analyst Cody Alexander describes Fangio’s version as putting the Cover 2 half toward the offense’s passing strength and the quarters away from it, the mirror image of the usual Cover 6.8 Other staffs use 8 for other calls entirely.
  • Cover 9 depends on whom you ask. Some NFL staffs use it for the weak-rotation Cover 3 that Saban calls 6: one film analyst described the 2022 Seahawks as playing “a nickel cover-9 defense (cover-3 with safety rotation away from the nickel defender).”9 Saban’s 6 is someone else’s 9, which is the dialect problem in one line. Others use 9 for Cover 3 match (the meaning drawn above), or for a split-field call. In the Madden video game it is the mirror image of Cover 6: quarters on one side and Cover 2 on the other, flipped.10
NoteMadden vs. real life

Madden’s play-call screen makes coverages look like a fixed menu: Cover 3 Sky, Cover 2 Man, Cover 6, each with one diagram. Real NFL defenses don’t call “Cover 3” and get one picture. A call is a word or two in the team’s own language, plus tags that adjust it to the formation, the down and the opponent (“Cover 3, rotate weak, match the slot”), and the same word means different things in different buildings. When a broadcaster or a charting service says “Cover 3,” it’s a translation into the common numbering of what the defense actually called. And the call isn’t fixed when the huddle breaks. It comes from the sideline, usually through the helmet radio of one defender, and most defenses carry automatic checks that change it once they see the formation or the motion (the 3x1 checks in Disguise, Rotation, and Split-Field Coverage are the standard example). That’s also why two careful charters can watch the same play and write down different numbers, as the next chart shows.

How often you’ll see each number

Two charting services have labelled every NFL dropback’s coverage since 2018: Next Gen Stats, the league’s own tracking-data arm, through 2022, and FTN, a private football-data company that charts every play from video, from 2023. Both sets of labels are published free through nflverse. Their labels give a rough sense of how common each coverage is, and their disagreements are a lesson in dialects of their own.

Show the Python (coverage labels on NFL dropbacks, nflverse, 2018–2025)
from gridiron.data import nfl, pbp

LABEL = {"COVER_0": "Cover 0", "COVER_1": "Cover 1", "COVER_2": "Cover 2", "2_MAN": "2-Man (Cover 5)",
         "COVER_3": "Cover 3", "COVER_4": "Cover 4 (quarters)", "COVER_6": "Cover 6", "COVER_9": "Cover 9"}


def labelled_dropbacks(season):
    """Regular-season dropbacks with a charted coverage label (nflverse pbp + participation)."""
    b = pbp([season], columns=["game_id", "play_id", "season_type", "qb_dropback"])
    b = b[(b["season_type"] == "REG") & (b["qb_dropback"] == 1)]
    part = nfl().load_participation([season]).to_pandas().rename(columns={"nflverse_game_id": "game_id"})
    m = b.merge(part[["game_id", "play_id", "defense_coverage_type"]], on=["game_id", "play_id"])
    m = m[m["defense_coverage_type"].notna()].copy()
    m["season"] = season
    return m


COV = pd.concat([labelled_dropbacks(s) for s in range(2018, 2026)], ignore_index=True)
COV["era"] = np.where(COV["season"] <= 2022, "2018–2022 (Next Gen Stats charting)", "2023–2025 (FTN charting)")
COV["label"] = COV["defense_coverage_type"].map(LABEL).fillna("Other (prevent, combo, blown)")
SHARE = (COV.groupby("era")["label"].value_counts(normalize=True).mul(100).unstack(0).fillna(0.0))
ORDER = ["Cover 0", "Cover 1", "Cover 2", "2-Man (Cover 5)", "Cover 3", "Cover 4 (quarters)", "Cover 6",
         "Cover 9", "Other (prevent, combo, blown)"]
SHARE = SHARE.reindex(ORDER)
N_ERA = COV.groupby("era").size()
Show the Python
eras = list(SHARE.columns)
y = np.arange(len(ORDER))[::-1]
fig, ax = plt.subplots(figsize=(6.6, 3.9))
hgt = 0.38
for i, (era, col) in enumerate(zip(eras, (style.SERIES[0], style.SERIES[1]))):
    vals = SHARE[era].values
    ax.barh(y + (hgt / 2 if i == 0 else -hgt / 2), vals, height=hgt, color=col, label=era)
    for yy, v in zip(y + (hgt / 2 if i == 0 else -hgt / 2), vals):
        ax.text(v + 0.4, yy, f"{v:.1f}%" if v >= 0.05 else "—", va="center", fontsize=6.8, color=style.INK_2)
ax.set_yticks(y, ORDER, fontsize=8)
ax.set_xlabel("share of labelled dropbacks (%)", fontsize=8)
ax.set_xlim(0, max(SHARE.max()) * 1.15)
ax.grid(axis="y", visible=False)
ax.tick_params(axis="x", labelsize=7.5)
ax.legend(loc="lower right", fontsize=7.5)
fig.tight_layout()
plt.show()
Figure 33.9: Share of labelled regular-season dropbacks by coverage, as charted by Next Gen Stats (2018–2022, about 90,000 dropbacks) and by FTN (2023–2025, about 61,000). Cover 3 and Cover 1, the two one-high coverages, lead in both. Cover 9 exists only in the FTN labels, and the two services split the rest differently (FTN calls far more plays Cover 2 and fewer Cover 3), so compare coverages within a period, not across the break.

Three things to take from the chart:

  • One-high still rules on an ordinary down. In both periods Cover 3 and Cover 1 together account for more than half of the labelled dropbacks. Two-high has been growing (the Next Gen Stats split-safety rate above), but the two classic one-high coverages remain the foundation of most NFL defenses. Why, when the famous defenses of the last decade went two-high? Because the safety who isn’t deep is an extra run defender in the box, which two-high gives up (A First Look at Defense counts the boxes), and because Cover 1 and Cover 3 are the simplest coverages to teach and to play fast.
  • Cover 9 appears only from 2023, because FTN uses the label and Next Gen Stats did not; the public data dictionary lists it without defining it, and at 1.5 to 2.5 percent of labelled dropbacks a season it’s a niche call whatever it means.11
  • The two charters disagree. FTN labels far more dropbacks Cover 2 and far fewer Cover 3 than Next Gen Stats did. Even on the same season they differ: for 2025, Next Gen Stats’ own figures put Cover 2 at about 14 percent of plays, while FTN’s labels put it above 20. Neither is “wrong”: both are translating thousands of defensive calls into ten numbers, with different rules. That is the dialect problem in data form, and it’s why Tracking Data and the Big Data Bowl treats coverage labels as estimates, not facts.12

Film room

NoteFilm room: Seattle Seahawks 2013 — press Cover 3

Pete Carroll’s Seattle defenses of the early 2010s, the “Legion of Boom,” were built on the simplest coverage in this chapter played with unusual corners. The base call was Cover 3: Earl Thomas alone in the deep middle, Richard Sherman and Brandon Browner (then, late in 2013, Byron Maxwell) in the deep outside thirds, and Kam Chancellor, the strong safety, rolled down as one of the four underneath defenders. What made it look strange was that the corners pressed. Tall, long-armed cornerbacks lined up on the receivers’ noses and used Carroll’s “step-kick”, a patient step and then a kick back to stay on the receiver’s hip, which the players summarised as “step for patience, kick for position.”13 It is a press-and-carry technique, not a bail: the corner stays square, gets his hands on the receiver inside the 5-yard limit, and if the receiver runs deep, runs with him up the sideline as if in man, inside his own deep third. NFL.com described the scheme simply as a “press man, Cover Three defense.”14 It wasn’t press on every snap: against a side with a single receiver the corner pressed, and against a side with two or more receivers he usually played off and bailed.15 In 2013 the defense led the league in points allowed, yards allowed and takeaways, the first to lead all three since the 1985 Bears, and beat Denver 43–8 in Super Bowl XLVIII.16

What to notice: the corners’ pre-snap alignment says man and the single high safety says MOFC. At the snap, watch the corner’s first steps (the jam) and then his path: running with the receiver deep, but staying outside the middle third, which is Thomas’s. The underneath defenders face the quarterback like zone players, but by rule they carry receivers who run up the seams, so it’s a zone with match rules; analysts at the time described Seattle’s corners as playing “press and pattern match.”17 Cover 3 builds Seattle’s match version.

NoteFilm room: Tampa Bay Buccaneers 1996–2002 — spot-drop zone and eyes on the quarterback

Tony Dungy and Monte Kiffin’s Buccaneers turned a two-deep zone into an identity. The Tampa 2 was Cover 2 with a twist: the middle linebacker ran deep down the middle of the field at the snap, closing the hole between the two deep safeties. Dungy said its roots were in the 1970s Steelers (“My philosophy is really out of the 1975 Pittsburgh Steelers playbook”), and in 2002, the season after Dungy left for Indianapolis, Kiffin’s defense finished first in the league in yards allowed and won Super Bowl XXXVII under Jon Gruden.18 Cover 2 and Tampa 2 has the details.

What to notice: the defenders’ drops. At the snap the underneath players turn and run to spots, the hook defenders to the hashes, with their eyes on the quarterback, and then they break on the ball together. It’s spot-drop zone at heart, with one key match rule: the middle linebacker doesn’t just drop to a spot, he runs straight back and carries the inside receiver who runs up the seam between the two safeties. Otherwise no defender chases a receiver; everyone faces the throw, and receivers are tackled the moment they catch it.

NoteFilm room: Philadelphia Eagles 2024 — Vic Fangio’s two-high match

Vic Fangio’s defenses, from his Bears years (2015–18) through the 2024 Eagles, showed quarterbacks the middle of the field open on snap after snap: two safeties deep, usually at the same depth whatever the call, then a quarters coverage, a Cover 6 (his Cover 8), or a rotation to Cover 3 at the snap. In his first season in Philadelphia the Eagles allowed the fewest yards per game in the league (278.4) and the second-fewest points.19 They won Super Bowl LIX 40–22, with their pass rush coming from four-man rushes.20 Fangio is still the Eagles’ defensive coordinator in 2026.

What to notice: before the snap, two safeties at 12 yards or more and corners off with eyes inside, the same picture whatever is coming, which is the point: depth tells you little here. After the snap, watch whether the safeties stay deep and read the slot receivers (quarters) or one of them rotates down (a Cover 3 call disguised as two-high). The shell says “middle open” every time; the coverage changes underneath it. The full story is the case study Fangio’s Two-High Revolution and Macdonald’s Answer.

TipWatch for it on Sunday: one or two?

For one quarter, on every passing down:

  • Before the snap, count the deep safeties. One in the middle or two split wide? Say “closed” or “open” out loud at the snap. Then look at the details: deep and wide (toward the slot receivers) leans halves; shallower and tight to the hashes leans quarters. Many NFL teams hide this by lining every safety up at the same depth, so don’t lean on it hard.
  • Look at one cornerback. Press or off? Inside or outside shade? Eyes on the receiver or turned in to the quarterback? Press with eyes on the receiver leans man; off and turned in leans zone.
  • One second after the snap, check yourself. Did the middle stay closed or open? Did a “two-high” safety drop down into the box or the hole? Did the corner run with his receiver, or turn and bail to a spot (Cover 3), or pedal and read the receiver in front of him (quarters)? Write down what it became.
  • On the replay, watch one underneath defender for one second. To a spot (spot-drop), with a receiver from the start (man), or with a receiver after a beat (match)? Then find the ball: if a receiver was open, which zone was he in, and where were the nearest defender’s eyes?

On the broadcast camera. The usual live shot is from high on the sideline, looking across the field, so the offense moves left or right across your screen, and the two cornerbacks are at the top and bottom edges. The safeties are often out of frame until the snap, or just at the edge, which is why the analyst’s “middle of the field closed” usually comes on the replay. A bail looks like a corner at the top or bottom of the screen turning and running the same way as the receiver before the receiver has reached him; press looks like two players colliding at the edge of the frame. The high, wide replay angles (the closest a broadcast gets to the All-22 film coaches use) are the best place to make the call and check it.

Predict the play

TipPredict the play 1: off corners, one safety, then the snap
Show the Python
def offman():
    pr = Play(spread(), nickel(FS=(14.5, 0.5), SS=(5.5, 7.4), NB=(5.0, -7.4), LCB=(7.8, -16.3),
                               RCB=(7.8, 16.3), MIKE=(4.5, 1.6), WILL=(4.5, -2.4)), los=40, to_go=11)
    pr.route("X", r.go(20.0))
    pr.route("Z", r.go(20.0))
    pr.route("H", [(0, 0), (2.0, -1.0), (3.0, -18.0)])
    pr.route("Y", r.out(5.0, 5.0))
    pr.block("RB", pts=[(0.6, 1.2)])
    pr.dropback(2.5)
    protect(pr)
    pr.drop("FS", (16.0, 0.5), speed=2.0)
    pr.drop("MIKE", (5.5, 1.2), speed=2.0)
    pr.drop("WILL", (6.8, -1.6), speed=2.5)
    set_track(pr, "LCB", [(0.5, 8.6, -16.0), (0.9, 9.4, -15.5), (1.5, 11.0, -15.4)])
    set_track(pr, "RCB", [(0.5, 8.6, 16.0), (0.9, 9.4, 15.5), (1.5, 11.0, 15.4)])
    # man: the $ follows H across the formation, the SS goes outside with Y
    set_track(pr, "NB", [(0.4, 4.5, -7.6), (0.8, 3.6, -6.0), (1.3, 3.0, -2.4), (2.0, 3.0, 3.0)])
    set_track(pr, "SS", [(0.4, 5.2, 8.0), (0.8, 4.8, 9.2), (1.3, 4.6, 12.4), (2.0, 4.6, 13.0)])
    return pr


pr1 = offman()
fig, axes = plt.subplots(1, 2, figsize=(6.6, 3.0))
for ax, t, ttl in zip(axes, (0.0, 1.3), ("Before the snap", "+1.3 s after the snap")):
    fld = moment(ax, pr1, t, (-22.0, 22.0), (-7.5, 18.5), rings=("LCB", "RCB", "NB", "SS"))
    panel_title(ax, ttl, fs=8.2)
    ruler(fld, pr1, fs=5.2, top=15)
fig.tight_layout(w_pad=0.8)
plt.show()
Figure 33.10: Third-and-11, ball in the middle. Left, the pre-snap picture: one safety (FS) deep in the middle; both corners (CB) about 8 yards off with outside leverage; the nickel ($) and the strong safety (SS) about 5 yards deep, just inside the slot receivers. Right, the same play 1.3 seconds after the snap: H is running a shallow cross to the right, Y a short out. The corners and the two slot defenders are ringed.

Before the snap, what does this look like? After it, what is it really, and why would a defense play it this way on third-and-11?

It looks like Cover 3 and it’s Cover 1, man coverage played from off alignments. Before the snap everything points to Cover 3: middle of the field closed, corners 8 yards off with outside leverage, the slot defenders a few yards inside the slots like curl-flat players. A second later the evidence overrules the hypothesis. The nickel has gone across the formation with H on his shallow cross, and the strong safety has gone outside with Y. Zone defenders don’t do that: a curl-flat defender would let H run out of his area to the hook defender. When a slot defender follows his receiver out of his own area within the first second, it’s man. The corners, square and staying on top of X and Z rather than turning and bailing to a landmark, agree.

Why off-man on third-and-11? Because the first job is to keep everything in front of the defenders and short of the sticks, and a corner pressed on a receiver who only needs to run past 11 yards risks being beaten deep. From off, he can give up the short throw and tackle it. The quarterback’s answer is the crosser: H is dragging his defender through traffic, and a deeper crossing route or a rub would get a receiver past the sticks with a man defender trailing him.

TipPredict the play 2: two safeties, close to the box
Show the Python
pr2 = Play(spread(), nickel(FS=(10.0, -4.5), SS=(10.0, 4.5), NB=(4.5, -6.8), LCB=(7.5, -15.8),
                            RCB=(7.5, 15.8), MIKE=(4.8, 5.6), WILL=(4.5, -0.8)), los=40, to_go=6)
pr2.highlight("FS", "SS")
fld = draw(pr2, lateral=(-22, 22), window=(-7.5, 19.0))
widths(fld, pr2, -6.6)
plt.show()
Figure 33.11: Second-and-6, ball in the middle. Two safeties about 10 yards deep, each just outside a hash and well inside a slot receiver; corners 7 to 8 yards off; the nickel ($) in the apex inside the left slot, the Mike (M) in the apex inside the tight end, the Will (W) over the ball. The safeties are ringed.

Closed or open? What coverage do the safeties’ depth and width suggest, and where is this defense thinnest against the pass?

Middle of the field open, and the shallow, tight safeties point to quarters (Cover 4). Cover 2 safeties would usually be deeper (12 to 14 yards) and wider (out toward the slot receivers), because each has half the field. These two are at 10 yards, near the hashes and well inside the slots, the alignment of quarters safeties, who guard only the inside quarter deep and read the slot receiver in front of them (#2). If #2 runs vertically, the safety covers him; that is who has Y here. If #2 blocks or the play is a run, the safety comes downhill and becomes an extra run defender. Count them: four linemen, two linebackers and two safeties are eight players who can reach a run between the tackles, with the nickel in the apex as a ninth to the outside. That is why defenses like quarters on early downs: two-high against the pass, with numbers against the run. One caution: a disciplined NFL defense may line up exactly like this and play something else, or play quarters from 13 yards, so the snap still has the last word.

The thin spot is underneath and outside. Four deep leaves three underneath, so short throws to the outside receivers (hitches and quick outs in front of the off corners) and to the flats are open, and a safety reading the run is vulnerable to play-action behind him. What’s hard is the deep ball: four defenders in four narrow lanes. (Quarters shows how its match rules handle the slot routes.)

TipPredict the play 3: third-and-6, everybody tight
Show the Python
pr3 = Play(spread(), nickel(FS=(15.0, 0.0), SS=(4.0, 8.4), NB=(1.6, -8.4), LCB=(1.3, -15.7),
                            RCB=(1.3, 15.7), MIKE=(4.5, 1.2), WILL=(4.5, -2.4)), los=40, to_go=6)
pr3.highlight("FS", "LCB", "RCB")
fld = draw(pr3, lateral=(-22, 22), window=(-7.5, 19.0))
widths(fld, pr3, -6.6)
plt.show()
Figure 33.12: Third-and-6. One safety (FS) 15 yards deep in the middle. Both corners (CB) pressed about a yard off the outside receivers, square to them; the nickel ($) pressed on the left slot; the strong safety (SS) 4 yards off the tight end Y in the right slot; the two linebackers inside. The corners and the free safety are ringed.

Man or zone? What is the defense most likely playing, which routes should the quarterback like, and what does the 5-yard rule have to do with it?

Most likely man coverage with one deep safety: Cover 1. Middle of the field closed, and every receiver has a defender tight on him: corners pressed and square, the nickel pressed on H, the strong safety close on Y. The linebackers likely “have the back”: one of them covers the running back man to man if he runs a route, and the other, with nobody to cover, sits in the hole as a rat or joins the rush. On third-and-6 that’s a common call: the defense wants every short throw contested.

The quarterback should like routes that beat man: quick slants and outs that win at the break, crossing routes and rubs that drag defenders through traffic (Dropback Concepts‘s mesh), and a back-shoulder throw against a corner in trail. He should not expect receivers to “find a soft spot and sit,” because there are no soft spots in man: sitting down next to your defender just makes the throw harder. And the 5-yard rule is the receiver’s friend: all of the corners’ contact has to happen inside 5 yards. A receiver who wins his release has a defender chasing him with his back to the quarterback, and only the free safety behind them. If the pressed corners bail at the snap, it was a disguised zone and the quarterback has to adjust after the snap.

Takeaways

  • Every coverage is a decision about how many defenders to put deep. Thirds (three deep, four under), halves (two deep, five under) and quarters (four deep, three under) each buy something and give something up; with four rushers, every defender added deep is one taken from underneath.
  • The underneath map is flat, curl, hook and hole. There are always more areas than defenders, so zone players are taught to cover two areas each, and they drop to landmarks so the gaps are the planned size on every play.
  • How a defender lines up is a message. Press contests timing and needs help deep; off coverage gives a cushion to protect against the deep ball; a press-bail makes zone look like man. Leverage tells you where his help is, and the 5-yard rule means all of press’s contact has to happen in the first 5 yards.
  • There are three ways to guard a receiver: spot-drop zone (run to a place, watch the quarterback), pattern matching (start as zone, pick up receivers by rule) and man (go with one receiver from the snap). Watch one underneath defender for one second and you can usually tell which.
  • Read the middle of the field. Closed (one safety in the post) means Cover 1 or Cover 3 most of the time; open means a two-high coverage. Safety depth and width, corner depth and leverage, and slot alignment narrow it down, and the snap confirms or overturns it.
  • Coverage numbers count deep defenders through Cover 4, then become names. Cover 6, 7, 8 and 9 mean different things in different playbooks, and even charting services disagree.

Connections

Builds on: A First Look at Defense (man vs zone, one-high vs two-high) and Dropback Concepts (the routes and combinations these zones are built to stop), with leverage and the pre-snap read from The Quick Game.

Sets up: every chapter in Part 6. Man Coverage builds Cover 0 and Cover 1 from press, trail and inside help; Cover 3, Cover 2 and Tampa 2 and Quarters and the Two-High Match Family each take one deep split and make it a full coverage; Disguise, Rotation, and Split-Field Coverage shows how defenses hide the shell and play Cover 7 and other split-field calls. On the rules side, Contact Rules and Penalties as Strategy covers illegal contact and pass interference, and What Beats What pairs every concept with the coverages here. The Coverage and Pressure Atlas has a card for every coverage number and the full dialect table.

Case study: Fangio’s Two-High Revolution and Macdonald’s Answer follows the middle-of-the-field-open idea through the last decade of NFL defense.

NoteGo deeper
  • Cody Alexander, Match Quarters and his MatchQuarters newsletter: a coach’s-eye view of zone, match and the modern NFL coverage vocabulary, including the Fangio and Saban numbering systems.
  • Cameron Soran, “The Complete Guide to Nick Saban Coverages at Alabama,” Throw Deep Publishing (2021): how one famous system names and builds its coverages, numbers included.
  • Chris B. Brown, The Art of Smart Football (2015) and The Essential Smart Football (2012): short, clear essays on Cover 2, Cover 3 and the history of pattern matching.
  • Tony Dungy’s Quiet Strength (2007) for the man behind the Tampa 2, and the NFL’s own rulebook (operations.nfl.com) for the exact wording of the contact rules.

  1. NFL Rulebook, Rule 8, Section 4, “Legal and Illegal Contact with Eligible Receivers”; the rulebook’s distance-penalty table lists illegal contact as 8-4-3 and defensive holding as 12-1-6, each a loss of 5 yards: https://operations.nfl.com/the-rules/nfl-rulebook/ . The rule text, the pocket condition and the automatic first down, as summarised for fans with a league umpire: “Football 101: What Is Illegal Contact?”, PhiladelphiaEagles.com (Oct. 12, 2014): https://www.philadelphiaeagles.com/news/football-101-what-is-illegal-contact-13967625 (“Beyond the five-yard zone, if the player who receives the snap remains in the pocket with the ball, a defender cannot initiate contact with a receiver who is attempting to evade him”). The automatic first down still applies in 2026: a Lions proposal to remove it for illegal contact and defensive holding failed in 2025 (SI, “Lions’ defensive holding proposal does not pass”: https://www.si.com/nfl/lions/news/lions-defensive-holding-proposal-does-not-pass), and the 2026 rule changes did not touch it.↩︎

  2. “1977 NFL season,” Wikipedia: https://en.wikipedia.org/wiki/1977_NFL_season (rule changes: “Defenders are only permitted to make contact with receivers once”; the same year outlawed the head slap).↩︎

  3. “1978 NFL season,” Wikipedia: https://en.wikipedia.org/wiki/1978_NFL_season (“defenders are permitted to make contact with receivers only to a point of five yards beyond the line of scrimmage”); on the name and Blount’s own account, Steelers Depot, “Mel Blount explains play that created ‘Mel Blount Rule’” (Feb. 2024): https://steelersdepot.com/2024/02/mel-blount-explains-play-that-created-mel-blount-rule . The same 1978 changes also loosened the rules on pass blocking.↩︎

  4. NBC Sports Boston, “They called it the ‘Ty Law Rule’ … and that was OK with him”: https://www.nbcsportsboston.com/nfl/new-england-patriots/they-called-it-the-ty-law-rule-and-that-was-ok-with-him/393549/ (the Competition Committee’s 2004 emphasis on downfield contact beyond 5 yards and on defensive pass interference, after the 2003-season AFC Championship Game between New England and Indianapolis).↩︎

  5. Cameron Soran, “The Complete Guide to Nick Saban Coverages at Alabama,” Throw Deep Publishing (Feb. 24, 2021): https://throwdeeppublishing.com/blogs/news/nick-saban-s-alabama-pass-coverages (“It is a pattern-matching form of Cover 3 that prior to his association with Belichick with the Browns in the early 1990s simply did not exist”). Soran writes as an outside student of the system, not a member of Alabama’s staff. Saban was Cleveland’s defensive coordinator under Belichick from 1991 to 1994 (“Nick Saban,” Wikipedia: https://en.wikipedia.org/wiki/Nick_Saban).↩︎

  6. NFL Next Gen Stats via NFL.com, “The coverage that turned the Seahawks into Super Bowl winners and is taking the NFL by storm”: https://www.nfl.com/news/the-coverage-that-turned-the-seahawks-into-super-bowl-winners-and-is-taking-the-nfl-by-storm (split-safety rate 32.9% in 2018, 42.0% in 2025; 2025 coverage shares Cover 4 17.2%, Cover 2 13.9%, Cover 6 9.2%). A different TruMedia/538 series, measured on early downs, gives lower numbers and should not be mixed with this one.↩︎

  7. Saban’s numbering, from the Soran guide cited in the note on pattern matching (Cover 3: the safety rotates toward the passing strength; Cover 6: the safety rotates away from it; Cover 7: a modular family of split-field coverages). Cody Alexander, “Explaining Fangio’s ‘Sub-Zeus’ Tag,” MatchQuarters (June 12, 2023): https://www.matchquarters.com/p/explaining-fangios-sub-zeus-tag (“In the Saban system, ‘6’ refers to weak rotation Cover 3”; “multiple man-match concepts in the Saban system (Cover 7)”).↩︎

  8. Cody Alexander, “Explaining Fangio’s ‘Sub-Zeus’ Tag,” MatchQuarters (June 12, 2023), cited above (“Cover 8 in the Fangio system is mainly known as Cover 6 (4+2 = 6)”; “The concept puts the Cover 2 side to the Ni and the Quarters side away”, that is, the half goes to the nickel’s side, where the slot and the passing strength are); and Cody Alexander, “What is Cover 6 vs Cover 8?”, MatchQuarters (Aug. 2, 2025): https://www.matchquarters.com/p/what-is-cover-6-vs-cover-8-nfl-defense-explained-vic-fangio (Cover 8 is “the sister coverage that flips the scheme, putting Cover 2 to the strong side, or passing strength”). Both pieces put the Cover 2 half toward the passing strength.↩︎

  9. West Coast Football (Substack), “49ers Film Room: How Shanahan exploited Seattle’s defensive coverage rules” (Dec. 24, 2022), on the 2022 Week 15 49ers–Seahawks game: https://westcoastfootball.substack.com/p/49ers-week-15-shanahan-bag-of-tricks↩︎

  10. Chase Becotte, “How to Identify Coverages Pre-Snap in Madden 25 and College Football 25,” Operation Sports (Aug. 14, 2024): https://www.operationsports.com/identifying-coverages-pre-snap-in-madden-25-and-college-football-25/ (“The simplest way to look at Cover 9 is realize it’s Cover 6 but flipped”).↩︎

  11. nflreadr data dictionary, participation: https://nflreadr.nflverse.com/articles/dictionary_participation.html (defense_coverage_type values include COVER_9; no definition of the label is given).↩︎

  12. Course calculation from nflverse load_pbp() and load_participation(), regular-season plays with qb_dropback == 1 and a charted defense_coverage_type, 2018–2025, pooled within each period. Coverage labels come from Next Gen Stats for 2016–2022 (none for 2016–2017) and from FTN from 2023, with different label sets (COVER_9, COMBO and BLOWN appear only from 2023; PREVENT only through 2022). The man share of labelled dropbacks in these files is 28.8% (2022), 41.2% (2023), 48.3% (2024) and 30.8% (2025), a swing that looks like a labelling artefact rather than a change in how teams defend. For 2025, FTN’s labels give Cover 2 22.9% and Cover 4 10.1% of labelled dropbacks, against Next Gen Stats’ published 13.9% Cover 2, 17.2% Cover 4 and 9.2% Cover 6 (NFL.com article cited in the note on the split-safety rate).↩︎

  13. Sheil Kapadia, “Step-kick is one secret to Seahawks’ success on defense,” ESPN (Oct. 8, 2015): https://www.espn.com/blog/seattle-seahawks/post/_/id/14964/step-kick-is-one-secret-to-seahawks-success-on-defense (Carroll traces the technique to watching Hall of Famer Willie Brown, then the Raiders’ defensive backs coach, “probably back in 1981 or ‘82”; the players’ summary is”step for patience, kick for position”).↩︎

  14. Chris Wesseling, “Why is the Seattle Seahawks’ defense great?”, NFL.com: https://www.nfl.com/news/why-is-the-seattle-seahawks-defense-great-0ap3000000464856 (Jan. 28, 2015).↩︎

  15. Bucky Brooks, “Seattle Seahawks’ defense must adjust to vulnerabilities,” NFL.com (2015): https://www.nfl.com/news/seattle-seahawks-defense-must-adjust-to-vulnerabilities-0ap3000000561985 (“The cornerbacks will press on the single-receiver side and use a ‘bail’ technique (side shuffle) if they are on the side with two or more receivers”; “the other safety playing as a curl-flat dropper or in the hook zone”).↩︎

  16. “2013 Seattle Seahawks season,” Wikipedia: https://en.wikipedia.org/wiki/2013_Seattle_Seahawks_season (“The defense led the league in points allowed (231), yards allowed (4,378), and takeaways (39), the first team to lead all three categories since the 1985 Chicago Bears”; Super Bowl XLVIII, Seattle 43, Denver 8, Feb. 2, 2014; the 2013 roster, with Maxwell replacing the suspended Browner late in the season). On Chancellor’s role as the safety who drops into the hook or curl-flat in Seattle’s Cover 3, see Brooks, cited in the note on press to one-receiver sides.↩︎

  17. Matt Bowen, “How Can Hobbled Aaron Rodgers Attack Legion of Boom?”, Bleacher Report (Jan. 13, 2015): https://bleacherreport.com/articles/2328344-how-can-hobbled-aaron-rodgers-attack-legion-of-boom (“the technique the Seahawks use at the cornerback position (press and pattern match)”; “the curl-flat defender (linebacker K.J. Wright) has to match (or carry) the vertical from No. 2”).↩︎

  18. “Tampa 2,” Wikipedia: https://en.wikipedia.org/wiki/Tampa_2 (Dungy and Kiffin; Bud Carson’s 1970s Steelers roots; Dungy: “My philosophy is really out of the 1975 Pittsburgh Steelers playbook”). On 2002: “2002 Tampa Bay Buccaneers season,” Wikipedia: https://en.wikipedia.org/wiki/2002_Tampa_Bay_Buccaneers_season (first in total defense, points allowed and interceptions; won Super Bowl XXXVII 48–21 over Oakland, under head coach Jon Gruden with Kiffin still coordinator). Dungy was Tampa Bay’s head coach from 1996 to 2001 (“Tony Dungy,” Wikipedia: https://en.wikipedia.org/wiki/Tony_Dungy) and Kiffin its defensive coordinator from 1996 to 2008 (“Monte Kiffin,” Wikipedia: https://en.wikipedia.org/wiki/Monte_Kiffin).↩︎

  19. “2024 Philadelphia Eagles season,” Wikipedia: https://en.wikipedia.org/wiki/2024_Philadelphia_Eagles_season (Fangio named defensive coordinator Jan. 27, 2024; first in total defense at 278.4 yards per game, 17.8 points per game second-fewest). Fangio was the Chicago Bears’ defensive coordinator from 2015 to 2018 (“Vic Fangio,” Wikipedia: https://en.wikipedia.org/wiki/Vic_Fangio).↩︎

  20. Super Bowl LIX, Feb. 9, 2025, Caesars Superdome: Eagles 40, Chiefs 22. NFL.com highlights and CBS Sports’ MVP report: https://www.cbsnews.com/amp/news/nfl-mvp-super-bowl-jalen-hurts-eagles . Fangio’s 2026 status: Eagles staff announcements (course fact sheet, checked Oct. 2026).↩︎