1978 and the Passing Revolution (1978–1999)

Two rule changes in one spring, and the twenty-year arms race they started.

Show the Python (shared helpers for this chapter’s diagrams)
import logging
logging.getLogger("matplotlib.font_manager").setLevel(logging.ERROR)
import io
import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.patches import Circle, Ellipse, FancyArrowPatch, Rectangle, RegularPolygon, Wedge
from gridiron import Play, Player, Field, offense, technique, style, routes as r

style.apply()
GREEN = "#0f7a55"         # darker step of the aqua highlight, for text on the light field
PURPLE = style.SERIES[6]  # a ring colour that is neither offense blue nor defense orange
OL_KEYS = ("LT", "LG", "C", "RG", "RT")


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


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


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


def line(labels="full"):
    """The five offensive linemen, labelled LT..RT ("full") or with one letter, T G C G T ("short")."""
    short = {"LT": "T", "LG": "G", "C": "C", "RG": "G", "RT": "T"}
    return [p.moved(label=(p.key if labels == "full" else short[p.key])) for p in offense("singleback")
            if p.key in OL_KEYS]


def T(t, side=1):
    """Width of technique t on the offense's right (side=+1) or left (side=-1)."""
    return technique(t, side)


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


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


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


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


def spot(fld, p, d, w, color=style.DEFENSE_DARK, ms=10, marker="X"):
    """Mark a point (a hit, a tackle) with an X."""
    x, y = _P(fld, p, d, w)
    fld.ax.plot([x], [y], marker=marker, ms=ms, color=color, mec="white", mew=0.8, zorder=12)


def ring(fld, p, key, color=GREEN, r=1.25, lw=1.8, ls="-"):
    """A ring around a player at his alignment."""
    q = p.players[key]
    x, y = _P(fld, p, q.d, q.w)
    fld.ax.add_patch(Circle((float(x), float(y)), r, fc="none", ec=color, lw=lw, ls=ls, zorder=7.5))


def band(fld, p, d0, d1, w0, w1, color=GREEN, alpha=0.10, ls=(0, (3, 2)), lw=0.9):
    """Shade a rectangle from depth d0 to d1 and width w0 to w1 (alignment yards)."""
    (x0, y0), (x1, y1) = _P(fld, p, d0, w0), _P(fld, p, d1, w1)
    fld.ax.add_patch(Rectangle((min(x0, x1), min(y0, y1)), abs(x1 - x0), abs(y1 - y0), fc=color, alpha=alpha,
                               ec=color, lw=lw, ls=ls, zorder=0.8))


def dashed(fld, p, pts, color=style.THIRD, lw=1.5, dash=(0, (3, 2.2)), end="arrow"):
    """A dashed 'option' or 'intent' path 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]))
    xs, ys = np.asarray(xs, float), np.asarray(ys, float)
    if end == "arrow":
        hx, hy = xs[-2] + 0.75 * (xs[-1] - xs[-2]), ys[-2] + 0.75 * (ys[-1] - ys[-2])
        xs = np.concatenate([xs[:-1], [hx, xs[-1]]]); ys = np.concatenate([ys[:-1], [hy, ys[-1]]])
        fld.ax.plot(xs[:-1], ys[:-1], color=color, lw=lw, ls=dash, zorder=6)
        fld.ax.add_patch(FancyArrowPatch((xs[-2], ys[-2]), (xs[-1], ys[-1]), arrowstyle="-|>",
                                         mutation_scale=10, color=color, lw=lw, zorder=6))
    else:
        fld.ax.plot(xs, ys, color=color, lw=lw, ls=dash, zorder=6)


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


def draw(p, width_in=6.2, ax=None, numbers=True, **kw):
    """Play.draw, sized for the page, cleaned for a zoomed window."""
    fld = p.draw(width_in=width_in, ax=ax, **kw)
    clean(fld.ax, numbers=numbers)
    return fld


def ruler(fld, p, depths=(5, 10, 15, 20, 25), w=None, fs=6.5):
    """Depth labels (yards past the line of scrimmage) along the left edge of the window."""
    ax = fld.ax
    x_left = (160 / 3) - fld.y1 + 0.4
    for d in depths:
        y = p.los + d
        if fld.x0 + 0.8 <= y <= fld.x1 - 0.8:
            ax.text(x_left, y, f"{d}" + (" yd" if d == depths[0] 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 title(ax, text, size=9):
    ax.set_title(text, fontsize=size, loc="left", color=style.INK, fontweight="bold")


# --- frame strips (PDF) and video (web) for simulated plays ------------------------------------------
MARK_R = 0.62


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


def panel(ax, play, df, t, lateral, window, rings=(), ring_r=0.85):
    """One moment of a simulated play on `ax`: markers, trails, rings."""
    tmap = df.groupby("frameId")["time"].first()
    fid = int((tmap - t).abs().idxmin())
    ylo, yhi = sorted((play.ball_y - lateral[0], play.ball_y - lateral[1]))
    fld = Field(ax=ax, orient="vertical", los=play.los, window=window, numbers=False, hashes=False,
                lateral=(ylo, yhi), to_go=play.to_go)
    cur = df[df["frameId"] == fid]
    shown = cur[cur["x"].between(play.los + window[0] + 0.5, play.los + window[1] - 0.5)
                & cur["y"].between(ylo + 0.5, yhi - 0.5) | (cur["side"] == "ball")]
    ids = set(shown["_id"])
    trails = df[(df["frameId"] <= fid) & df["_id"].isin(ids) & (df["side"] != "ball")]
    for (_, side), g in trails.groupby(["_id", "side"]):
        xs, ys = fld.xy(g["x"].values, g["y"].values)
        ax.plot(xs, ys, color=style.OFFENSE if side == "off" else style.DEFENSE, lw=0.9, alpha=0.4, zorder=3)
    ppy = fld.pts_per_yard()
    for _, r_ in shown.iterrows():
        x, y = (float(v) for v in fld.xy(r_["x"], r_["y"]))
        if r_["side"] == "ball":
            ax.add_patch(Ellipse((x, y + 0.45), 0.7, 0.42, fc=style.BALL, ec="white", lw=0.5, zorder=9))
            continue
        lab = str(r_.get("label", "") or "")
        if r_["side"] == "off":
            ax.add_patch(Circle((x, y), MARK_R, fc=style.OFFENSE, ec="white", lw=0.6, zorder=8))
            tc = "white"
        else:
            ax.add_patch(RegularPolygon((x, y), 4, radius=MARK_R * 1.3, orientation=np.pi / 4,
                                        fc=style.DEFENSE_TINT, ec=style.DEFENSE, lw=1.0, zorder=8))
            tc = style.INK
        fs = max(4.0, min(8.0, ppy * (0.85 if len(lab) <= 1 else 0.62)))
        ax.text(x, y, lab, ha="center", va="center", fontsize=fs, color=tc, fontweight="bold", zorder=10)
    for key, col in rings:
        r_ = cur[cur["displayName"] == key].iloc[0]
        x, y = fld.xy(r_["x"], r_["y"])
        ax.add_patch(Circle((float(x), float(y)), ring_r, fc="none", ec=col, lw=1.6, zorder=7))
    for patch in ax.patches:
        patch.set_clip_on(True)
    return fld


def strip(moments, lateral, window, notes=None, rings=(), ncols=2, width_in=6.2, after=None):
    """Numbered frame strip. `moments` is a list of (play, t, tag)."""
    cache = {}
    nrows = int(np.ceil(len(moments) / ncols))
    pw = width_in / ncols
    span_w, span_d = lateral[1] - lateral[0], window[1] - window[0]
    fig, axes = plt.subplots(nrows, ncols, squeeze=False,
                             figsize=(width_in, nrows * (pw * span_d / span_w + (0.75 if notes else 0.25))))
    for ax in axes.flat[len(moments):]:
        ax.axis("off")
    for i, (ax, (play, t, tag)) in enumerate(zip(axes.flat, moments)):
        if id(play) not in cache:
            cache[id(play)] = tracking(play)
        fld = panel(ax, play, cache[id(play)], t, lateral, window, rings)
        if after:
            after(fld, play, t, i)
        lab = "snap" if abs(t) < 1e-6 else f"{t:+.1f} s"
        ax.set_title(f"{i + 1}.  {lab}" + (f"   {tag}" if tag else ""), fontsize=8.3, color=style.INK_2, loc="left")
        if notes:
            ax.text(0.5, -0.03, notes[i], transform=ax.transAxes, ha="center", va="top",
                    fontsize=7.1, color=style.INK)
    fig.tight_layout(h_pad=1.3 if notes else 0.6, w_pad=0.6)
    return fig


def video(play, notes, lateral, window, rings=(), width_in=4.8, after=None):
    """Web version: the play frame by frame, with each moment's note shown as the caption."""
    import shutil
    from matplotlib import animation
    from IPython.display import HTML, display
    span_w, span_d = lateral[1] - lateral[0], window[1] - window[0]
    fig, ax = plt.subplots(figsize=(width_in, width_in * span_d / span_w + 0.5))
    df = tracking(play)
    tmap = df.groupby("frameId")["time"].first()
    frames = [float(tmap[f]) for f in sorted(df["frameId"].unique())]

    def update(k):
        t = frames[k]
        ax.clear()
        fld = panel(ax, play, df, t, lateral, window, rings)
        if after:
            after(fld, play, t, -1)
        cur = [n for tt, n in notes if tt <= t + 1e-6]
        ax.set_title(("snap" if abs(t) < 0.05 else f"{t:+.1f} s") + (("\n" + cur[-1].replace("\n", " ")) if cur else ""),
                     fontsize=8.2, color=style.INK, loc="left")
        return []

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


def animation_or_strip(play, moments, lateral, window, rings=(), after=None, ncols=2, width_in=6.2):
    """Video on the website; a numbered, captioned frame strip in the PDF. moments = [(t, tag, note)]."""
    if pdf_build():
        strip([(play, t, tag) for t, tag, _ in moments], lateral, window, notes=[n for *_, n in moments],
              rings=rings, ncols=ncols, width_in=width_in, after=after)
        plt.show()
        return
    video(play, [(t, n) for t, _, n in moments], lateral, window, rings=rings, after=after)


def era_43(off, shell):
    """A 1980s 4-3 Over against a pro set or I (TE to the offense's right), corners 7 off."""
    dfn = [D("WE", "DE", 1.0, T("5", -1), "E"), D("WT", "DT", 1.0, T("1", -1), "T"),
           D("ST", "DT", 1.0, T("3"), "T"), D("SE", "DE", 1.0, T("5") + 0.2, "E"),
           D("SAM", "LB", 4.0, 6.4, "S"), D("MIKE", "LB", 4.5, 0.8, "M"), D("WILL", "LB", 4.5, -3.0, "W"),
           D("LCB", "CB", 6.5, -14.0, "CB"), D("RCB", "CB", 6.5, 14.0, "CB")]
    if shell == "two":
        dfn += [D("FS", "FS", 13.0, -8.0, "FS"), D("SS", "SS", 13.0, 8.0, "SS")]
    else:
        dfn += [D("FS", "FS", 13.0, 0.0, "FS"), D("SS", "SS", 8.0, 7.0, "SS")]
    return dfn


def ghost_off(fld, p, d, w, label="?"):
    x, y = (float(v) for v in _P(fld, p, d, w))
    fld.ax.add_patch(Circle((x, y), 0.75, fc="none", ec=style.OFFENSE, lw=1.3, ls=(0, (2, 1.4)), zorder=8))
    fld.ax.text(x, y, label, ha="center", va="center", fontsize=8, color=style.OFFENSE_DARK, fontweight="bold",
                zorder=9)

Put on a game from the early 1970s. The picture looks familiar: two wide receivers, a tight end, two backs, a quarterback under center. Then watch a receiver run a route. A linebacker hits him as he leaves the line, a safety hits him again eight yards downfield, and nobody throws a flag, because none of it is illegal. Watch an offensive tackle pass-block: his fists are balled against his chest and his elbows are out, like a man shielding himself in a crowd. The league trimmed that downfield contact twice in the mid-1970s and it made little difference: in 1977 NFL teams averaged 17.2 points a game, the fewest since 1942. Twenty-one years later a single team, the 1998 Minnesota Vikings, scored 556 points, a league record at the time. What happened in between? The answer starts with two short changes to the rulebook in March 1978, and with the twenty years of move and counter-move they set off, a story in which every offensive idea you now see on Sundays met a defensive answer, and every answer started the next round.

You’ll be able to:

NoteYou’ll need

This is a history chapter, so it leans on almost everything before it. The four direct prerequisites, one line each:

And a few terms from elsewhere that come up constantly here: nickel (five defensive backs) and dime (six), from A First Look at Defense; the 3-4 and the stand-up edge, from Odd and Hybrid Fronts; personnel groupings such as 12 personnel (one back, two tight ends), from Personnel Groupings; the pro set (two backs side by side) and the singleback formation, from Classic Formations; counter, from Gap Schemes; and the pass-protection words punch, kick slide and chip, from Pass Protection.

Reading the diagrams: offense is blue circles (Q quarterback; R or T the running back, F the fullback, H a halfback or H-back; X, Y, Z the receivers, Y usually the tight end; on the line, T G C G T are the tackles, guards and center). Defense is outlined squares (E end, T tackle, N nose, L or B linebackers, with M, W and S for the Mike, Will and Sam; CB corners; FS and SS safeties). Solid arrows are routes and runs, dashed orange arrows are defenders’ drops and options, a bar at the end of a line is a block, and the dashed brown line is the pass. A green ring marks the player to watch. The left-edge numbers give depth in yards past the line of scrimmage.

Where the story starts: the 1977 problem

The previous chapter ended with the defenses on top, and the recap is short. Until 1974 a defender could hit a receiver anywhere on the field until the ball was in the air, and a pass blocker had to keep his hands in to his chest and block with his forearms and shoulders. The league trimmed downfield contact in 1974, and in 1977 it allowed each receiver to be contacted only once and banned the head slap that pass rushers like Deacon Jones had used to stun blockers.1 None of it worked. In 1977 teams scored 17.2 points a game; only 40 percent of offensive plays were passes; and 5.7 percent of passes were intercepted, more than one in eighteen.

Why didn’t “only once” fix it? Because the defense chose where to spend its one hit. A pass play is a timed contract: the receiver promises to be at a spot at a moment, and the quarterback throws to the spot. One collision at 8 yards, from a linebacker the receiver had to run past anyway, was enough to make him half a second late, and a late receiver on a timed throw means an incompletion or an interception. The 1977 rule cut the number of hits but left the one that mattered. And for the pass blockers nothing had changed at all.

The league had reasons to care beyond taste. In October 1977 Pete Rozelle signed television contracts with all three networks that would carry every regular-season game from 1978, then the largest television package ever negotiated, and an expanded 16-game schedule was coming with them.2 A sport selling itself to a national audience every week needed points, and points in the 1970s came mostly from long, grinding drives that defenses were winning more often every season.

Spring 1978: two rules, one direction

In March 1978 the owners passed a package of changes. Two of them did almost all the work.3

The receiver goes free: the Mel Blount rule

The first rule drew a line five yards past the line of scrimmage. Inside that line, a defender squared up in front of a receiver may still contact him, jamming him, rerouting him, knocking him off the line, and he may stay on him (the rule’s word was maintain contact) until the receiver gets level with him or crosses the five-yard line. It is not a one-hit rule; it is a five-yard zone. Beyond it, while the quarterback still has the ball, a defender may not initiate contact that impedes the receiver: no shove, no chuck, no collision. Once the ball is thrown, any contact that interferes is pass interference, as before. (Today’s rulebook adds one condition worth knowing for old and new film alike: the restriction holds only while the quarterback is in the pocket with the ball. Once he scrambles out of it, defenders may chuck receivers downfield again; see Contact Rules and Penalties.) That five-yard zone is the Mel Blount rule (1978): a defender may contact a receiver only within five yards of the line, before the throw. The name honors, if that is the word, Pittsburgh’s 6-foot-3 cornerback Mel Blount, the 1975 defensive player of the year, whose bump-and-run coverage was so physical that the league’s answer was named after him. Some accounts attach the nickname to the 1977 one-chuck rule instead; the five-yard rule of 1978 is the one most people mean.4

Show the Python
def blount_panel(ax, era):
    off = [p for p in line("short") if p.key in ("C", "RG", "RT")] + [
        O("Y", "TE", -0.7, 4.8, "Y"), O("QB", "QB", -1.9, 0.0, "Q")]
    dfn = [D("SAM", "LB", 1.0, 7.0, "S"), D("MIKE", "LB", 4.5, 2.2, "M"), D("SS", "S", 15.0, 10.4, "SS"),
           D("DT", "DT", 1.0, T("3"), "T"), D("DE", "DE", 1.0, T("5") + 0.3, "E")]
    p = Play(off, dfn, los=35, to_go=None)
    if era == "old":
        go_to(p, "Y", (16.5, 9.6), kind="route", via=[(1.0, 5.3), (2.6, 6.4), (7.6, 5.5), (9.2, 7.6), (12.0, 7.9)])
        go_to(p, "MIKE", (7.4, 4.8), kind="path")
        go_to(p, "SS", (12.8, 8.6), kind="path")
    else:
        go_to(p, "Y", (17.5, 5.1), kind="route", via=[(1.0, 5.3), (2.4, 5.2)])
        go_to(p, "MIKE", (8.5, 3.2), kind="path")
        go_to(p, "SS", (16.5, 7.4), kind="path")
    p.highlight("Y")
    fld = draw(p, ax=ax, lateral=(-3.6, 12.6), window=(-3.4, 19.0), title=False)
    band(fld, p, 0.0, 5.0, -3.6, 12.6, color=GREEN, alpha=0.09 if era == "new" else 0.0,
         lw=0.0 if era == "old" else 0.9)
    if era == "old":
        for (d, w), lab, (td, tw) in [((1.0, 5.3), "hit 1", (2.5, 4.0)), ((7.6, 5.5), "hit 2", (7.2, 2.9)),
                                       ((12.0, 7.9), "hit 3", (11.0, 10.2))]:
            spot(fld, p, d, w, ms=9)
            say(fld, p, td, tw, lab, color=style.DEFENSE_DARK, fontsize=7, weight="bold")
        x2, y2 = _P(fld, p, 7.6, 5.5)
        ax.add_patch(Circle((float(x2), float(y2)), 1.15, fc="none", ec=style.DEFENSE_DARK, lw=1.3, zorder=7.5))
        say(fld, p, 6.0, 9.4, "1977: the one\nlegal hit", color=style.DEFENSE_DARK, fontsize=6.6)
        say(fld, p, 16.6, 3.2, "Y arrives late,\noff his path", color=style.OFFENSE_DARK, fontsize=7)
        title(ax, "Before 1978: hit him downfield\n(any number of times before 1974)")
    else:
        spot(fld, p, 1.0, 5.3, ms=9)
        say(fld, p, 2.5, 4.0, "hit", color=style.DEFENSE_DARK, fontsize=7, weight="bold")
        say(fld, p, 2.6, -0.3, "first 5 yards:\ncontact allowed", color=GREEN, fontsize=6.8)
        say(fld, p, 11.0, 1.2, "past 5 yards:\nhands off until\nthe ball is thrown", color=style.INK_2, fontsize=6.8)
        say(fld, p, 16.6, 1.6, "Y arrives on\ntime, on his path", color=style.OFFENSE_DARK, fontsize=7)
        title(ax, "From 1978: contact only in\nthe first 5 yards")
    ruler(fld, p, depths=(5, 10, 15))
    return fld


fig, axes = plt.subplots(1, 2, figsize=(6.4, 4.9))
blount_panel(axes[0], "old")
blount_panel(axes[1], "new")
fig.tight_layout(w_pad=1.0)
plt.show()
Figure 55.1: The 1978 contact rule, on one tight end’s seam route (illustrative). Left, before 1978: the Sam (S) hits Y at the line, the Mike (M) knocks him off his path at 8 yards, and the strong safety hits him again at 12, so he arrives late and wide of where his quarterback expects him. Before 1974 all three hits were legal. Under the 1977 one-contact rule only one was, so the defense let Y off the line clean and saved its hit for the Mike at 8 yards (hit 2, outlined), which alone is enough to make him late. Right, from 1978: contact is legal only in the green zone, the first five yards past the line. Past it the Mike and the safety may not touch Y until the ball is thrown, so he runs his seam on time and on his path.

Figure 55.1 shows what changed for the defense. Before, every defender between the receiver and his landmark was a potential speed bump. A zone defense could re-route receivers: knock crossers off their paths, steer a tight end toward a waiting safety, and destroy the timing a passing game depends on. After 1978, only the defenders near the line got a shot, and only once the receiver was past them was he free. A linebacker dropping to 8 yards could no longer hit the tight end running past him. He had to cover him, with his feet, and linebackers built to take on guards are not built to run with tight ends.

The deepest effect was on timing. A route that can be disrupted anywhere can’t be thrown on a count, because the quarterback never knows when his receiver will arrive. A route that can be disrupted only in the first five yards can be. If the receiver gets a clean release, he will be at 12 yards, breaking toward the sideline, at the same moment on Sunday that he was in Wednesday’s practice. The quarterback can throw to the spot before the receiver turns around. Every timing route you have met in this book, from the quick game to the dropback concepts, assumes that.

The blocker gets his hands: open-hand pass protection

The second rule was about the other end of the play. From 1978 an offensive lineman pass-blocking could extend his arms and open his hands. That sounds like a technicality; it changed the geometry of the pocket. A blocker restricted to his chest and forearms meets the rusher body to body, and a rusher who gets his shoulder past the blocker’s hip is past him. A blocker who can extend his arms meets the rusher at arm’s length and can steer him: feel which way he is going and push him further that way, past the quarterback, while staying between him and the passer. That is the punch of Pass Protection, and it doesn’t exist without the 1978 rule. Holding (grabbing and restricting the rusher) stayed illegal. What changed is that a lineman could now meet the rusher with extended arms and open hands instead of his chest and forearms.

More time in the pocket matters most to the throws that take the longest. A three-step drop and a quick slant need little protection; a seven-step drop and a 20-yard post need a lot. So the second rule pointed the same way as the first: toward the deep and intermediate passing game the 1970s defenses had strangled.

ImportantWhy it exists

The two rules attacked the 1970s defensive advantage from both ends at once. The Blount rule took away the defense’s best way to wreck a route (hitting the receiver), and the hands rule took away its best way to wreck the quarterback’s clock (beating a blocker who couldn’t use his arms). The league’s stated aim, in the Hall of Fame’s words, was to “open up the game.” What the rules gave up was a style of defense. A team built on big, physical defensive backs who won by contact, like the Steelers who gave the rule its name, now had to win with speed and position instead. And the Steelers are the first example of the chapter’s theme, that the team that adapts first wins: Pittsburgh won the next two Super Bowls with a passing game. Terry Bradshaw was the league’s MVP in 1978 and threw for 318 yards and four touchdowns in the 35–31 win over Dallas in Super Bowl XIII.5

And the rest of the package

Three smaller changes rode along, and each fits the same story. The schedule grew from 14 games to 16 and a second wild card was added in each conference, which meant more games to televise. The league added a seventh official, the side judge, partly to rule on what happens downfield: a new contact rule needs someone standing where the contact happens. And the next spring, in 1979, officials were told to blow the whistle as soon as a quarterback was “clearly in the grasp” of a tackler, the first of many rules protecting the passer that the league’s investment in passing would require.6

CautionCommon misconception

“The Mel Blount rule outlawed bump-and-run coverage.” It didn’t. Inside five yards a cornerback can still jam a receiver at the line, and teams have played press coverage ever since, from the 1980s Raiders to Seattle’s press Cover 3 of the 2010s. What the rule removed was the second, third and fourth hit downfield, the ones that let a zone defense steer receivers wherever it wanted. It was also not the last word. Officials let a good deal of downfield contact go in the years that followed, the league renewed its emphasis on the rule in its 1994 package (later in this chapter), and it was called strictly only from 2004, the “Ty Law rule” of Coverage Fundamentals. On old film, expect to see more contact past five yards than the rulebook allowed.

NoteMadden vs. real life

In a video game the rulebook is fixed, and the best plays are the best plays forever. In the NFL the rulebook is rewritten every spring, and schemes chase the rewrites. The 1978 changes are the clearest example in the sport’s history: no coach invented a play that ended the 1970s scoring drought. The owners did, by changing what a defender was allowed to do with his hands, and then the coaches spent twenty years finding out what that made possible. When a rule changes, ask the question this chapter asks over and over: what did this take away, and from whom?

What the numbers did

How big was the change? Season-level league totals answer that. Pro Football Reference keeps a year-by-year table of league averages, and Figure 55.2 draws four of its rates for every season from 1970 to 1999.7 Rates matter here, not totals, because the schedule grew from 14 to 16 games in 1978 and two seasons (1982 and 1987) were cut short by strikes.

Show the Python (league averages, 1970-1999)
# Pro Football Reference, "NFL League Year-by-Year Averages" (per team per game, and season totals).
LEAGUE = pd.read_csv(io.StringIO("""season,ppg,nya,att,cmp,int,td,rush_att
1970,19.3,5.5,9796,5008,510,427,11432
1971,19.4,5.6,9412,4788,544,389,11776
1972,20.3,5.7,9011,4659,480,404,12256
1973,19.5,5.3,8845,4603,470,378,12936
1974,18.2,5.3,9609,5041,500,376,12507
1975,20.6,5.4,9973,5231,533,433,13199
1976,19.2,5.3,10260,5351,497,432,14461
1977,17.2,5.2,9786,5022,562,388,14650
1978,18.3,5.5,11829,6278,639,468,16075
1979,20.1,5.8,12979,7022,597,538,15183
1980,20.5,6.0,13705,7699,627,606,14384
1981,20.7,6.0,14180,7745,609,591,14508
1982,20.2,5.8,7933,4474,349,320,7763
1983,21.8,6.0,14047,7993,620,625,14211
1984,21.2,5.9,14325,8076,584,615,13811
1985,21.5,5.8,14423,7911,602,598,13636
1986,20.5,5.9,14469,8014,581,586,13509
1987,21.6,5.9,13491,7396,540,611,13189
1988,20.3,5.9,14131,7670,553,556,13581
1989,20.6,6.1,14338,8000,559,582,13068
1990,20.1,6.0,13516,7572,480,575,12442
1991,19.0,6.0,13950,8003,488,511,12279
1992,18.7,5.8,13408,7705,519,516,12291
1993,18.7,5.8,14414,8351,469,517,12684
1994,20.3,6.0,15056,8739,474,583,12550
1995,21.5,6.0,16699,9717,512,663,13199
1996,20.4,5.8,15966,9198,542,626,13594
1997,20.7,5.7,15729,8844,479,617,13639
1998,21.3,5.9,15489,8766,509,658,13568
1999,20.8,5.8,16760,9567,562,665,13548
"""))
L = LEAGUE.assign(pass_share=100 * LEAGUE.att / (LEAGUE.att + LEAGUE.rush_att),
                  cmp_pct=100 * LEAGUE.cmp / LEAGUE.att, int_pct=100 * LEAGUE.int / LEAGUE.att)

fig, axes = plt.subplots(2, 2, figsize=(6.5, 5.2), sharex=True)
panels = [
    (axes[0, 0], "ppg", "Points per team per game", "{:.1f}", (15.5, 23), {1977: "below", 1983: "above", 1993: "below", 1999: "above"}),
    (axes[0, 1], "pass_share", "Passes as a share of plays (%)", "{:.0f}%", (36, 59), {1977: "below", 1981: "above", 1999: "above"}),
    (axes[1, 0], "int_pct", "Interceptions per 100 passes", "{:.1f}", (2.5, 6.5), {1977: "above", 1999: "below"}),
    (axes[1, 1], "nya", "Net yards per pass attempt", "{:.1f}", (4.9, 6.4), {1977: "below", 1980: "above", 1999: "below"}),
]
for ax, col, ttl, fmt, ylim, labs in panels:
    ax.axvspan(1969.5, 1977.5, color=style.GRID, alpha=0.45, lw=0, zorder=0)
    ax.axvline(1978, color=style.INK_2, lw=0.9, ls=(0, (3, 2)), zorder=1)
    ax.axvline(1994, color=style.MUTED, lw=0.8, ls=(0, (1, 2)), zorder=1)
    ax.plot(L.season, L[col], color=style.SERIES[0], lw=1.8, marker="o", ms=2.4, zorder=3)
    for yr, where in labs.items():
        v = L.loc[L.season == yr, col].iloc[0]
        dy = 7 if where == "above" else -9
        ha = "right" if yr == 1977 else "center"
        dx = -3 if ha == "right" else 0
        if yr == 1999:
            ha, dx, dy = "left", 4, 0
        ax.annotate(fmt.format(v), (yr, v), xytext=(dx, dy), textcoords="offset points", fontsize=7.2,
                    color=style.INK, ha=ha, va="center", zorder=4,
                    bbox=dict(boxstyle="round,pad=0.1", fc=style.SURFACE, ec="none", alpha=0.85))
    ax.set_title(ttl, fontsize=8.8)
    ax.set_ylim(*ylim)
    ax.set_xlim(1969.5, 2002.3)
    ax.tick_params(labelsize=7)
    ax.grid(axis="x", visible=False)
for ax in axes.flat:
    lo, hi = ax.get_ylim()
    ax.text(1973.5, hi - 0.03 * (hi - lo), "before\n1978", fontsize=6.6, color=style.INK_2, ha="center", va="top")
for ax in axes[0]:
    lo, hi = ax.get_ylim()
    ax.text(1978.4, lo + 0.02 * (hi - lo), "1978 rules", fontsize=6.6, color=style.INK_2, ha="left", va="bottom")
    ax.text(1994.4, lo + 0.02 * (hi - lo), "1994\npackage", fontsize=6.6, color=style.MUTED, ha="left", va="bottom")
for ax in axes[1]:
    ax.set_xticks([1970, 1978, 1986, 1994, 1999])
fig.tight_layout(h_pad=1.2, w_pad=1.6)
plt.show()
Figure 55.2: The NFL’s passing game, 1970 to 1999: four league-wide rates by season, from Pro Football Reference’s league averages. The shaded years are before the 1978 rules (dashed line); the dotted line marks the 1994 rule package. Passes as a share of plays jumped from 40% in 1977 to 49% in 1980 and kept rising. Interceptions per 100 passes fell from 5.7 to 3.4 over twenty years. Net yards per pass attempt rose from 5.2 to 6.0 and then stopped. Scoring rose from 17.2 points to the low 20s, sagged in the early 1990s and rose again after 1994.

Read Figure 55.2 panel by panel.

  • Passes as a share of plays (top right) is the cleanest signal, and the biggest. In 1977 teams threw on 40 percent of their plays. By 1980 it was 49 percent, and after 1983 it never went below half again. Offenses decided, almost at once, that throwing had become a better deal.
  • Interceptions (bottom left) fell from 5.7 per 100 passes in 1977 to 4.6 in 1979 and 1980, and kept falling for twenty years, to 3.4 in 1999. A receiver who can’t be knocked off his route is where the quarterback expects him to be, and a ball thrown to the right spot is harder to intercept. Completion rate rose too, from 51 percent in 1977 to 56 percent in 1980.
  • Net yards per pass attempt (bottom right: passing yards minus sack yardage, divided by attempts plus sacks) jumped from 5.2 in 1977 to 6.0 in 1980 and then stopped. Through the 1980s and 1990s it wandered between 5.7 and 6.1. Each throw got a little better, once, and then the defenses caught up with it.
  • Points (top left) went from 17.2 to 20.5 in three seasons. Note 1978 itself: only 18.3. The rules arrived that season, but the offenses that exploited them took a year or two to arrive.

The pattern in those last two panels is the theme of this chapter. A rule change opens a gap, the offense pours into it, and then the defense adapts and the efficiency gain levels off. What stays is the volume: teams kept throwing more, because once the defense adjusted to stop the pass, it had less left over to stop the run. And at the far right of the points panel is the next round of the same cycle: scoring sagged to 18.7 in 1992 and 1993, and the league changed the rules again (the 1994 package, later in this chapter).

Averages show the floor of the new game, not its ceiling. The best offenses ran far ahead of the league line: in 1984 Dan Marino threw for 5,084 yards, and in 1998 the Vikings scored 556 points, 34.8 a game against a league average of 21.3. Both were records at the time.

Offense’s first answer: Air Coryell stretches the field deep

The coach most ready for 1978 was already in the league. Don Coryell had built pass-first offenses at San Diego State in the 1960s and with the St. Louis Cardinals from 1973, and on September 25, 1978, four games into the season, he took over the San Diego Chargers. Coryell’s offense, built on Sid Gillman’s idea that a defense should be made to cover every blade of grass, put receivers in motion, lined them up all over the formation, and made the deep throw the first option on most passing plays. His quarterback, Dan Fouts, had spent five unremarkable seasons in San Diego. In 1979 he threw for 4,082 yards, breaking Joe Namath’s single-season record of 4,007; in 1981 he threw for 4,802, and he became the first quarterback to pass for 4,000 yards in three straight seasons, and San Diego led the league in passing yards every season from 1978 to 1983.8

The offense needed a different kind of tight end, and Coryell had one. Kellen Winslow, a first-round pick in 1979, was big enough to line up next to the tackle and fast enough to run with safeties. Coryell split him out, put him in motion, and threw to him down the seams. A tight end who can’t be hit past five yards and can outrun a linebacker is exactly the matchup the new rules created.

Show the Python
# ------------------------------------------------------------- Air Coryell: 896 against Cover 2
off = line("short") + [O("QB", "QB", -1.9, 0.0, "Q"), O("FB", "FB", -4.5, 0.0, "F"), O("RB", "RB", -7.0, 0.0, "R"),
                       O("Y", "TE", -0.7, 4.8, "Y"), O("X", "WR", -0.7, -14.0, "X"), O("Z", "WR", -1.5, 14.0, "Z")]
p = Play(off, era_43(off, "two"), los=30, to_go=None)
p.route("X", r.post(stem=10))
p.route("Y", r.seam(22))
p.route("Z", r.dig(depth=16.5, width=13))
p.dropback(7.0)
p.drop("FS", (19.0, -9.0), zone=(9, 16), label="deep half")
p.drop("SS", (19.0, 9.0), zone=(9, 16), label="deep half")
p.players["LCB"] = p.players["LCB"].moved(d=5.0)
p.players["RCB"] = p.players["RCB"].moved(d=5.0)
for k in ("SAM", "MIKE", "WILL"):
    q = p.players[k]
    p.drop(k, (10.0, q.w * 1.6 if k != "MIKE" else -1.6))
for k in ("LCB", "RCB"):
    q = p.players[k]
    p.drop(k, (7.0, q.w * 1.07))
for k in ("LT", "LG", "C", "RG", "RT"):
    p.block(k, pts=[(-1.2, 0.0)])
p.block("FB", pts=[(0.2, -2.0)])
p.block("RB", pts=[(1.6, 2.6)])
p.pass_to("Y", t=2.75)
p.highlight("Y")
fld = draw(p, width_in=5.6, lateral=(-18.5, 18.5), window=(-10.5, 25.5), title=False)
ruler(fld, p, depths=(5, 10, 15, 20))
say(fld, p, -8.4, 3.6, "7-step drop", fontsize=7)
say(fld, p, 22.6, -2.7, "X: 8 (post)", color=style.OFFENSE_DARK, fontsize=7, weight="bold")
say(fld, p, 22.4, 7.2, "Y: 9 (go)", color=style.OFFENSE_DARK, fontsize=7, weight="bold")
say(fld, p, 17.0, 14.3, "Z: 6 (dig)", color=style.OFFENSE_DARK, fontsize=7, weight="bold")
say(fld, p, -5.6, -11.0, "seven block:\nline + both backs", fontsize=6.8)
plt.show()
Figure 55.3: Air Coryell: ‘896’ from a two-back I formation against Cover 2 (illustrative). In the digit system X runs an 8 (a post), Y, the tight end (ringed), a 9 (a go, up the seam), and Z a 6 (a dig at 15 yards). Both backs and the line stay in to block, seven blockers, while the quarterback takes a seven-step drop. The ball goes to Y in the seam between the two deep safeties, each responsible for half the field. The linebackers drop to about 10 yards and the corners, who start 5 yards off, sink a couple of yards to guard the short outside zones (the flats); none of them may touch a receiver once he is five yards past the line.

Figure 55.3 is a Coryell-style call in the digit system of Offensive Systems: “896” gives X an 8 (a post), Y a 9 (a go, here up the seam), and Z a 6 (a dig). Three receivers attack three spots deep, and against the two deep safeties of Cover 2 the tight end’s seam splits them. Cover 2 has an answer on paper: the Mike is taught to run with the tight end up the seam. Before 1978 he could slow him down by hitting him on the way; now he has to keep up with a tight end like Winslow by running, and he can’t. Notice what pays for it: both backs stay in to block, seven blockers for a seven-step drop, so the quarterback has time to let the deep routes develop.

Why it works, and what it costs. Air Coryell answers the 1978 rules with depth. Receivers who can’t be rerouted can be sent long, and blockers who can use their hands can hold up long enough for them to get there. The cost is everything a deep passing game always costs: long drops, longer protection, fewer receivers in routes, and interceptions when the throw is late. Coryell’s Chargers had famously poor defenses and never reached a Super Bowl. His ideas lasted anyway. They ran through his assistants (Joe Gibbs, Ernie Zampese) to Norv Turner’s Dallas offenses of the 1990s and to Mike Martz’s 1999 St. Louis Rams, the “Greatest Show on Turf.”

NoteFilm room: San Diego Chargers 1981 — the Epic in Miami

The game: the AFC divisional playoff at the Miami Orange Bowl on January 2, 1982. San Diego led 24–0 in the first quarter, Miami came back to lead, and the Chargers won 41–38 in overtime. Fouts completed 33 of 53 passes for 433 yards, all NFL playoff records at the time; Winslow caught 13 passes, also a playoff record, for 166 yards, and blocked a field goal at the end of regulation that would have won it for Miami. Both teams finished exhausted in the Florida heat, and the game is still ranked among the best ever played.9

What to notice: the Chargers’ receivers lining up anywhere (Winslow wide, in the slot, in motion), the depth of the routes, and how often the first read is downfield. Then notice the defenses: still mostly in base personnel with four defensive backs, so wherever Winslow lines up, a linebacker or a safety has to cover him past five yards, where he can’t be touched. Watch Miami keep changing who covers him. That mismatch is the 1978 rule change on film.

Offense’s second answer: Walsh stretches it sideways

Bill Walsh read the same rules the other way. Walsh had built a short passing game in Cincinnati in the early 1970s, as an assistant to Paul Brown, around a quarterback who couldn’t throw deep (the story is in Passing Fundamentals). In January 1979 the San Francisco 49ers, 2–14 in 1978, made him their head coach. They went 2–14 again in his first season, but in the third round of the 1979 draft he had taken a Notre Dame quarterback, Joe Montana. Three seasons later the 49ers beat Cincinnati 26–21 in Super Bowl XVI.10

Show the Python
# ------------------------------------------------------------- West Coast: slant-flat with a shallow cross
off = line("short") + [O("QB", "QB", -1.9, 0.0, "Q"), O("HB", "RB", -5.0, -2.2, "H"), O("FB", "FB", -5.0, 2.2, "F"),
                       O("Y", "TE", -0.7, 4.8, "Y"), O("X", "WR", -0.7, -13.0, "X"), O("Z", "WR", -1.5, 13.0, "Z")]
dfn = [q.moved(w=-7.0) if q.key == "WILL" else q for q in era_43(off, "one")]   # Will as the weak curl-flat player
p = Play(off, dfn, los=30, to_go=None)
p.dropback(3.2)
p.route("X", [(0, 0), (1.8, 0), (7.6, -6.2)], speed=6.5)                 # slant: break at ~1 yd, catch at ~7
p.run("X", [(4.4, 3.4)])
p.route("HB", [(0, 0), (1.6, 2.6), (5.6, 7.4), (7.6, 11.4)], side=-1)    # flat: outside X's alignment, 2-3 yd deep
p.route("Y", [(0, 0), (2.5, -1.0), (3.5, -7.0)])
p.route("Z", r.curl(12))
for k in ("LT", "LG", "C", "RG", "RT"):
    p.block(k, pts=[(-1.0, 0.0)])
p.block("FB", pts=[(2.6, 0.9)])
p.drop("LCB", (11.5, -14.2))
p.drop("WILL", (3.6, -12.2), speed=4.2)
p.drop("MIKE", (8.0, 1.0))
p.pass_to("X", t=1.0)
p.highlight("X", "WILL")
fld = draw(p, width_in=6.0, lateral=(-18.5, 16.5), window=(-7.5, 16.5), title=False)
ruler(fld, p, depths=(5, 10, 15))
say(fld, p, 11.6, -2.6, "run after the catch", color=style.OFFENSE_DARK, fontsize=7)
say(fld, p, 7.6, -9.6, "slant", color=style.OFFENSE_DARK, fontsize=7, weight="bold")
say(fld, p, 0.8, -16.0, "flat", color=style.OFFENSE_DARK, fontsize=7, weight="bold")
point_to(fld, p, (10.4, -10.4), (3.6, -12.2), "W widens:\nslant or flat?", color=style.DEFENSE_DARK, fontsize=6.8)
say(fld, p, -5.9, 5.6, "3-step drop:\nball out in ~1 s", fontsize=6.8)
plt.show()
Figure 55.4: The West Coast idea: a quick slant with a flat route outside it, from the pro set, against Cover 3 (illustrative). The quarterback takes a three-step drop and throws in about a second. X runs the slant, breaking inside at 5 or 6 yards and catching the ball at about 7; the halfback (H) runs to the flat, outside X’s alignment; the tight end (Y) crosses underneath; the fullback (F) steps up to block and the line blocks. The Will linebacker (W, ringed) is the one defender between them. He can’t cover both, so as he widens toward the flat the window opens inside him and the ball goes to X (ringed) on the slant, in front of the corner, who has bailed to his deep third. The thick arrow is X’s run after the catch.

Walsh’s offense treats the short pass as a run. Figure 55.4 is the idea in its plainest form: a three-step drop, and the ball out in about a second to X on a quick slant, while the halfback runs to the flat outside him and the tight end crosses underneath. The Will linebacker can’t cover both the slant and the flat, a horizontal stretch, so whichever he chooses, the quarterback throws the other. The receiver catches the ball in stride, already running, and the yards come after the catch.

The quick slant is only the front door. The heart of Walsh’s offense was the five-step drop thrown on time, with high-low reads (one receiver deep and one short in the same area, so a defender who takes one leaves the other) and with the backs as real receivers rather than last-resort outlets. In 1985 Roger Craig became the first player to run for 1,000 yards and catch passes for 1,000 more in the same season.11

Why the 1978 rules made it work, and which rule did what. Be careful here, because the slant and the flat in Figure 55.4 live mostly inside the five-yard zone, where contact stayed legal. A corner can still jam X at the line, which is why pressing the receivers is still a defense’s first answer to a quick passing game. What the Blount rule gave Walsh was everything just past that line. X breaks inside at about 5 yards and catches the ball at 7, and the Will, who used to be allowed to knock him off his path as he crossed, can now only try to beat him to the spot; on a timed throw he never will. And most of Walsh’s offense lived further out still: crossing routes, digs and hooks at 8 to 15 yards, thrown off the five-step drop, running straight through the linebackers’ zones where re-routing used to happen. The hands rule did the rest. A timing offense needs the pocket to hold for exactly as long as the drop, every time, and blockers who could extend their arms could promise that. Walsh’s offense is the timing game at its purest: drops matched to route depths, the ball thrown to the spot before the receiver turns, and a progression the quarterback can run in a second and a half. It needs less protection than Coryell’s, throws fewer interceptions, and turns a 5-yard completion into a 15-yard gain. The cost is that it needs an extremely accurate quarterback and receivers who run every route to the inch, and that it is long and hard to learn: the West Coast play calls you met in Offensive Systems spell out every receiver’s job because the timing has no slack.

Walsh’s 49ers won Super Bowls after the 1981, 1984 and 1988 seasons, and his assistants carried the system everywhere (the coaching tree is in Case Study: Bill Walsh’s 49ers and the West Coast Offense). Between them, Coryell and Walsh defined the two ways to pass after 1978: stretch the defense vertically, or stretch it horizontally. Nearly every passing game since mixes the two.

Defense’s first answer: more defensive backs

Defenses answered the new passing game first with personnel. Offenses that meant to throw on half their plays wanted more receivers out in their routes, and they found them two ways. Some split a tight end or a back out wide, as Coryell split Winslow. Others took the second back off the field and sent on a third wide receiver, a set Sid Gillman had used since the 1960s, though teams didn’t use three-wide sets routinely, on any down, until the 1990s (the run-and-shoot and the K-Gun, later in this chapter).12 Either way, a linebacker covering that third receiver was a losing matchup. The fix was to take a linebacker off and put a fifth defensive back on: the nickel. The idea was older than 1978 (it is usually traced to Philadelphia assistant Jerry Williams around 1960, named by George Allen, and popularized by Don Shula and Bill Arnsparger’s Miami Dolphins in the 1970s),13 but after 1978 it went from a special package to an everyday one. In long-yardage situations defenses went further, to the dime: six defensive backs.

Each substitution is a trade. A nickel defense has one fewer player built to take on blockers, so it is softer against the run. And substitution became a game of its own: offenses changed their personnel to draw a defense into the wrong package, the substitution matching of Personnel Groupings. A defense in nickel against two tight ends is too light; a defense in base against three receivers is too slow. Hold on to that trade; it decides the K-Gun story later in this chapter.

Defense’s second answer: Arnsparger’s 53 and the 3-4

The second answer was about the front, and it had started in Miami before 1978. Bill Arnsparger, Don Shula’s defensive coordinator, asked the Dolphins to trade for a Cleveland linebacker named Bob Matheson before the 1971 season, and built a package around him. Matheson lined up at the end of the line on the tight end’s side, standing up. On some snaps he rushed the passer like a defensive end; on others he dropped into coverage like a linebacker. The package was named for his jersey number: the 53 defense, Arnsparger’s front in which one hybrid player decided, snap by snap, whether the defense was a 4-3 or a 3-4. The package dates from the start of the 1972 season, and the 1972 Dolphins, Arnsparger’s “No-Name Defense” (Tom Landry’s name for a unit with no stars), went 17–0.14

Show the Python
# ------------------------------------------------------------------ the 53
off = line("short") + [O("QB", "QB", -1.9, 0.0, "Q"), O("HB", "RB", -5.0, -2.2, "H"), O("FB", "FB", -5.0, 2.2, "F"),
                       O("Y", "TE", -0.7, 4.8, "Y"), O("X", "WR", -0.7, -13.0, "X"), O("Z", "WR", -1.5, 13.0, "Z")]
dfn = [D("WE", "DE", 1.0, T("5", -1), "E"), D("NT", "NT", 1.0, 0.0, "N"), D("SE", "DE", 1.0, T("5"), "E"),
       D("M53", "LB", 1.2, T("9") + 0.4, "53"), D("WLB", "LB", 4.2, -5.0, "L"),
       D("ILB1", "LB", 4.5, -1.2, "L"), D("ILB2", "LB", 4.5, 2.6, "L"),
       D("LCB", "CB", 7.0, -13.0, "CB"), D("RCB", "CB", 7.0, 13.0, "CB"),
       D("FS", "FS", 12.5, -3.0, "FS"), D("SS", "SS", 11.0, 3.6, "SS")]
p = Play(off, dfn, los=35, to_go=None)
p.highlight("M53")
fld = draw(p, width_in=6.2, lateral=(-16.5, 16.5), window=(-7.5, 14.5), title=False)
band(fld, p, 0.1, 1.9, T("5", -1) - 1.1, T("5") + 1.1, color=style.DEFENSE, alpha=0.10, lw=0.8)
dashed(fld, p, [(1.2, 6.2), (-1.6, 6.9), (-4.4, 3.4)], color=style.DEFENSE_DARK, lw=1.6, dash="-")
dashed(fld, p, [(1.2, 6.2), (4.5, 7.6), (7.6, 9.6)], color=style.DEFENSE_DARK, lw=1.6)
say(fld, p, -4.2, 9.6, "rush: a fourth\nlineman (a 4-3)", color=style.DEFENSE_DARK, fontsize=7.2)
say(fld, p, 10.3, 9.8, "or drop: a fourth\nlinebacker (a 3-4)", color=style.DEFENSE_DARK, fontsize=7.2)
say(fld, p, 2.6, -7.4, "three linemen, hands down", fontsize=7)
say(fld, p, 6.1, -4.6, "three linebackers off the ball", fontsize=7)
plt.show()
Figure 55.5: Arnsparger’s 53 (illustrative, against a 1970s pro set). Three linemen have a hand down (shaded); Bob Matheson, number 53 (ringed), is the only player standing at the end of the line, outside the tight end; the other three linebackers (L) are off the ball. At the snap he either rushes, making a four-man line (a 4-3), or drops into coverage, making four linebackers (a 3-4). The blockers have to decide before the snap whether to account for him, and they can’t know which he will do.

Look at Figure 55.5 from the quarterback’s side. Before the snap there are three linemen with a hand on the ground and a fourth man standing at the end of the line. Is it four rushers or three? The quarterback and his blockers have to decide where Matheson is going before he goes, and they have no way to know. If they block him and he drops, a blocker is wasted and a linebacker is covering a receiver they thought was open. If they ignore him and he rushes, he is a free rusher. Arnsparger’s own phrase for what the 53 gave him, in a later interview, was the ability to “rush five guys and cover with six” from a look that showed neither. He called it “safe pressure,” and it is the seed of the zone blitz.

What made the 53 special was where it hid the choice. Matheson came on the field as part of an ordinary-looking group, and he was the only standing end, so the offense had one question to answer and no substitution to warn it. The rest of the league took the alignment more than the trick. Through the mid-1970s, teams stood up the two ends of the Oklahoma 5-2 (five linemen and two linebackers, the classic college front) and called it a 3-4. Chuck Fairbanks’s 1974 Patriots and Bum Phillips’s Oilers were among the first to make it their base defense (the competing origin claims are laid out in Odd and Hybrid Fronts), and by the late 1970s and early 1980s it was the league’s most common base defense.

The 3-4 fitted the post-1978 game for a reason that had nothing to do with the nose tackle. A 3-4 has two standing players at the ends of the line, its outside linebackers, and either one can rush or drop, so the 53’s question gets asked on both edges on every snap. What the 3-4 gives up is the 53’s surprise: the offense sees three linemen and four linebackers come on the field and knows what it faces, even if it doesn’t know who is coming. And the 3-4 creates a place on the field for a particular kind of athlete, a linebacker who is really a pass rusher, the stand-up edge. In 1981 the most famous one of all arrived.

Lawrence Taylor and the blind side

The New York Giants took Lawrence Taylor from North Carolina with the second pick of the 1981 draft and played him at outside linebacker in their 3-4. He was the league’s defensive player of the year as a rookie, again in 1982, and a third time in 1986, when he had 20.5 sacks and became the first defensive player voted the league’s MVP unanimously. Bill Parcells, his defensive coordinator and then head coach, and Bill Belichick, the Giants’ defensive coordinator from 1985, built the defense around the fact that no one could block him.15

Taylor’s speed broke the way offenses protected the passer. Through the 1970s, a blitzing linebacker was a running back’s problem: the back stayed in to block whichever linebacker came. A running back blocking Lawrence Taylor was a mismatch, and teams spent the 1980s inventing better answers. San Francisco’s Walsh, in a January 1982 playoff game against the Giants, assigned his best blocker, guard John Ayers, to him, which other teams copied; then coaches moved the job to the tackle, and in the end to whole protection schemes built around where Taylor was (the slide, the chip and the help side of Pass Protection).

Where Taylor lined up mattered as much as how fast he was. He rushed most often from the defense’s right side, the offense’s left (he was the Giants’ right outside linebacker), and that is where a right-handed quarterback is most exposed. Nearly every starting quarterback threw right-handed, so a defense could count on it.

Show the Python
# ------------------------------------------------------------------ the blind side
off = line("short") + [O("QB", "QB", -7.5, 0.0, "Q"), O("Y", "TE", -0.7, 4.8, "Y")]
dfn = [D("LE", "OLB", 1.0, -6.8, "E"), D("LDT", "DT", 1.0, T("3", -1), "T"), D("RDT", "DT", 1.0, T("3"), "T"),
       D("RE", "DE", 1.0, T("9") + 0.4, "E")]
p = Play(off, dfn, los=35, to_go=None)
go_to(p, "LE", (-9.2, -1.5), kind="rush", via=[(-2.4, -7.6), (-5.6, -6.0), (-8.0, -3.8)])
go_to(p, "RE", (-5.4, 3.0), kind="rush", via=[(-2.4, 7.2), (-4.8, 5.4)], speed=4.0)
go_to(p, "LT", (-3.4, -5.0), kind="block", via=[(-1.6, -4.0)])
go_to(p, "RT", (-2.8, 4.9), kind="block", via=[(-1.4, 3.8)])
for k in ("LG", "C", "RG"):
    p.block(k, pts=[(-1.0, 0.0)])
p.block("Y", pts=[(-0.4, 0.8)])
p.highlight("LT", "LE")
fld = draw(p, width_in=6.0, lateral=(-13.5, 13.5), window=(-13.5, 6.5), title=False)
qx, qy = (float(v) for v in _P(fld, p, -7.5, 0.0))
fld.ax.add_patch(Wedge((qx, qy), 9.0, -35, 140, fc=style.THIRD, alpha=0.12, ec=style.THIRD, lw=0.8, zorder=1))
fld.ax.add_patch(Wedge((qx, qy), 6.0, 150, 285, fc=style.DEFENSE, alpha=0.13, ec=style.DEFENSE, lw=0.8,
                       ls=(0, (3, 2)), zorder=1))
say(fld, p, 3.6, 8.4, "what he sees\nas he sets to throw", color=GREEN, fontsize=7)
say(fld, p, -11.6, -5.0, "his blind side:\nbehind his left shoulder", color=style.DEFENSE_DARK, fontsize=7)
say(fld, p, 4.0, -7.4, "the most dangerous rusher\nlines up over here", color=style.DEFENSE_DARK, fontsize=7)
point_to(fld, p, (-3.2, -10.6), (-0.7, -3.2), "left tackle", color=style.OFFENSE_DARK, fontsize=7.2, shrink=9)
say(fld, p, -9.6, 3.6, "right-handed QB\nat the top of his drop", color=style.INK_2, fontsize=6.8)
plt.show()
Figure 55.6: Why the left tackle matters (illustrative). A right-handed quarterback at the top of his drop. As he sets to throw, his left shoulder points downfield and his eyes go with it, so he can see the area shaded green but not the area shaded orange, behind his left shoulder. The edge rusher on the right (the defense’s left) comes at him where he can see and avoid him. The one on the left (ringed) comes from the blind side, and if he beats the left tackle (ringed) around the edge, he arrives unseen, from inside the orange area. Defenses put their best pass rusher on that side, so offenses put their best pass blocker there to meet him.

Figure 55.6 shows why. A right-handed quarterback dropping back from under center turns his body to the right as he drops, and when he sets to throw, his left shoulder points at his target and his eyes go downfield. Everything coming from behind his left shoulder is outside his field of view. A rusher from the right side is in front of him or at the edge of his vision, and he can step up or slide away from it. A rusher from the left arrives unseen, at full speed, at a quarterback holding the ball away from his body. That produces fumbles and injuries, the most famous of them Taylor’s 1985 sack that ended Joe Theismann’s career, told in The Twenty-Two.

The result was a new idea of the offensive line. The blind-side tackle is the tackle who protects the side the quarterback can’t see: the left tackle for a right-handed passer. Teams began to put their best pass blocker there, to draft him early and, once a salary cap made every dollar a choice (later in this chapter), to pay him like it. Two caveats keep the idea honest. For a left-handed quarterback (Steve Young in San Francisco, Mark Brunell in Jacksonville in the 1990s) the blind side is the right. And the side matters less once defenses learned to move their best rusher around, as they all do now, and once quarterbacks played from the shotgun and turned less on the drop; today the right tackle is paid almost as well. The blind side still pulls: when a team has to choose, its best pass protector usually plays on the left.

Gibbs: one back, two tight ends, and the counter trey

Taylor’s division rival had the most direct answer. Joe Gibbs, Coryell’s former offensive coordinator in San Diego, became Washington’s head coach in 1981 and played the Giants twice a year. Gibbs’s solution, in his own words, was a game plan built for one man: “We had to try in some way have a special game plan just for Lawrence Taylor… he’s one person that we learned the lesson the hard way. We lost ball games.”16 He took the second back out of the backfield and put him beside the tackle as an extra blocker. Playbooks of the time labelled the backs Q, H and F, so the new player kept his letter: the H-back, a tight end or fullback who lines up a step off the line, outside the tackle, where he can block an edge rusher, chip him and release into a route, or go in motion to the other side. With a second tight end on the line, the formation became the one-back, two-tight-end set (12 personnel) that Washington made its base: the ace of Classic Formations.

The one-back formation answered more than Taylor. With one back, the defense couldn’t key a fullback to find the run. With two tight ends and an H-back, the offense had extra blockers at the line who could also go out for passes, so the same formation threatened both. And it fitted the run game Washington built behind its huge offensive line, the “Hogs”: the counter trey, the guard-and-tackle counter of Gap Schemes, in which the back steps one way and two backside linemen pull the other way to lead him (the language of those runs is in The Language of the Run Game).

Gibbs won three Super Bowls, after the 1982, 1987 and 1991 seasons, with three different starting quarterbacks (Joe Theismann, Doug Williams and Mark Rypien), which says something about how much of the offense was the system.

Buddy Ryan’s 46, and how the one-back attacked it

While Gibbs was building his offense, Chicago’s defensive coordinator Buddy Ryan was building the defense meant to destroy offenses like it. The 46 put eight men near the line, covered the center and both guards with a nose and two 3-techniques (the bear front), stacked both outside linebackers on the tight end’s side, and usually played man coverage behind a blitz. It was designed against the two-back offenses of the early 1980s, and against them it was devastating. A two-back, one-tight-end offense has seven blockers at most (five linemen, the tight end and the fullback) and an obvious strong side, the tight end’s; the 46 put eight defenders near the line and aimed its stack at that side. The arithmetic was simply against the offense: the 1985 Bears allowed the fewest points in the league and beat New England 46–10 in Super Bowl XX (the full plate and Ryan’s story are in Even Fronts).17

The 46’s strength was its aggression and its alignment rules: both outside linebackers go to the tight end. Against a one-back team with two tight ends, the rule becomes a question: which tight end? Whichever side the defense chooses, the other side has fewer defenders, and a counter run pulls two extra blockers to exactly that side.

Follow Figure 55.7. The defense sets its stack to the in-line tight end, Y, on the right: two outside linebackers (W and S) out there, plus the Mike over the right tackle. On the left the offense faces only the end, a tackle, the nose and the strong safety (SS), who in the 46 plays like a linebacker. The H-back lines up on that side. At the snap the back jabs right, toward the stack, and the Mike, reading him, steps that way too. Then the right guard and right tackle pull left. Count the left side now: the guard kicks out the end, the left tackle and left guard block down on the tackle and the nose, the H-back takes the safety, and the pulling tackle leads through the hole onto the Mike. Five blockers for five defenders, and the back has a hole. The two linebackers stacked on the tight end, the players who make the 46 so dangerous against plays toward them, are out of the play: Y’s block walls off the Will at the line, and the Sam, the one man the play leaves unblocked, can only chase from behind. After the handoff the quarterback usually carries out a fake the other way, a bootleg toward the stack, to make that unblocked man hesitate.

Notice what the offense gives up to do this. The center has to block back on the 3-technique the right guard leaves, the hardest block on the play: in the 46 that tackle is coached to slant inside and penetrate, and a pulling guard leaves him a gap to do it, so if the center doesn’t cut him off, the play dies from behind before it starts. The bear front is hard on every gap scheme for that reason, since it covers all three interior linemen, and teams that ran counter at it often pulled the guard and the H-back instead of the guard and the tackle (GH counter, in Gap Schemes), which keeps the tackle home to help on the backside. And the play only works if the defense commits to one side. The 46 had answers of its own: it could set its stack to the H-back, or flip it when he went in motion, or blitz the side the counter was headed for. The more famous way to beat it was not a run at all but spreading out and throwing quickly, which is how Miami handed the 1985 Bears their only loss (see Even Fronts). That is the pattern of this whole era. The offense found a formation that forced the defense to declare, and the defense found a way to declare late.

Show the Python (simulated play, video on the web, frame strip in print)
def one_back_vs_46():
    """Gibbs-style one-back (12 personnel: Y in-line right, H-back off the left tackle) against the 46,
    which sets its two outside linebackers to the in-line tight end. Counter trey (GT counter) left."""
    off = line("short") + [O("QB", "QB", -1.9, 0.0, "Q"), O("RB", "RB", -7.0, 0.0, "R"),
                           O("Y", "TE", -0.7, 4.8, "Y"), O("H", "TE", -1.5, -4.6, "H"),
                           O("X", "WR", -0.7, -14.0, "X"), O("Z", "WR", -1.5, 13.0, "Z")]
    bear = [D("WE", "DE", 1.0, -(3.2 + 1.5), "E"), D("WT", "DT", 1.0, T("3", -1), "T"), D("NT", "NT", 1.0, 0.0, "N"),
            D("ST", "DT", 1.0, T("3", 1), "T"), D("WILL", "LB", 1.3, 4.1, "W"), D("SAM", "LB", 1.4, 6.0, "S"),
            D("MIKE", "LB", 4.5, 3.2, "M"), D("SS", "S", 4.5, -3.2, "SS"),
            D("LCB", "CB", 1.2, -14.0, "C"), D("RCB", "CB", 1.2, 13.0, "C"), D("FS", "S", 10.0, -1.6, "FS")]
    p = Play(off, bear, los=35, to_go=None)
    # backfield: counter step right, then the handoff going left; the QB fakes a bootleg the other way
    go_to(p, "QB", (-3.9, -0.4), kind="path", speed=3.5)
    go_to(p, "QB", (-5.0, 4.0), kind="path", delay=0.55, speed=4.5)
    go_to(p, "RB", (-4.4, -0.9), kind="path", via=[(-6.6, 1.2)], speed=3.9)
    go_to(p, "RB", (5.6, -5.4), kind="run", via=[(-1.4, -3.4), (0.8, -4.4)], speed=5.0)
    p.handoff("RB", t=1.1)
    # play side: block down (each block ends just short of its man, so the markers touch, not overlap)
    go_to(p, "LT", (-0.1, -3.1))
    go_to(p, "LG", (-0.2, -1.1))
    go_to(p, "H", (0.9, -3.9), speed=3.2, delay=0.05)
    # backside: the center cuts off the slanting 3-technique; Y hinges on the Will and walls him off
    go_to(p, "C", (-0.4, 0.4))
    go_to(p, "Y", (0.0, 4.5))
    # the pullers: guard kicks out the end man, tackle wraps through the hole for the Mike
    go_to(p, "RG", (-0.6, -4.8), kind="pull", via=[(-1.6, 1.2), (-1.9, -3.0)])
    go_to(p, "RT", (2.9, -1.6), kind="pull", via=[(-2.3, 2.6), (-2.6, -3.6), (0.4, -4.0)], speed=6.6, delay=0.1)
    # receivers clear the corners away
    p.route("X", r.go(18)); p.route("Z", r.go(18))
    p.man("LCB", "X"); p.man("RCB", "Z")
    # defense: the bear front slants and penetrates; the backside 3-technique (ST) shoots the guard's gap
    go_to(p, "WE", (-0.2, -6.0), kind="rush", speed=1.5)
    go_to(p, "WT", (0.6, -1.9), kind="rush", speed=1.2)
    go_to(p, "NT", (0.6, 0.0), kind="rush", speed=1.0)
    go_to(p, "ST", (0.5, 1.3), kind="rush", speed=3.0)
    go_to(p, "WILL", (1.1, 4.0), kind="rush", speed=1.0)
    go_to(p, "SAM", (-1.4, 5.8), kind="rush", via=[(0.4, 6.9)], speed=4.8)
    go_to(p, "SAM", (-1.7, 0.7), kind="path", delay=0.35, speed=4.0)
    go_to(p, "MIKE", (4.3, 4.0), kind="path", speed=3.0)
    go_to(p, "MIKE", (4.1, -0.8), kind="path", delay=0.3, speed=4.4)
    go_to(p, "SS", (1.9, -3.0), kind="path", delay=0.45, speed=4.0)
    go_to(p, "FS", (6.1, -5.4), kind="path", delay=1.0, speed=4.2)
    return p


P46 = one_back_vs_46()


def tags(fld, p, t, i):
    first = i == 0 or (i == -1 and t < 0.3)
    hole = i in (2, 3) or (i == -1 and t >= 1.3)
    last = i == 3 or (i == -1 and t >= 2.3)
    if first:
        say(fld, p, 3.6, 7.2, "both OLBs\nto the TE", color=style.DEFENSE_DARK, fontsize=6.6)
        say(fld, p, -3.6, -5.4, "H-back", color=style.OFFENSE_DARK, fontsize=6.6)
    if hole:
        band(fld, p, -0.4, 2.6, -4.6, -3.4, color=GREEN, alpha=0.24, lw=1.1)
    if i == 2:
        say(fld, p, 3.4, -6.0, "the hole", color=GREEN, fontsize=6.6, weight="bold")
        say(fld, p, 2.9, 2.6, "C cuts off\nthe slant", color=style.OFFENSE_DARK, fontsize=6.4)
    if last:
        say(fld, p, -3.4, 2.6, "S: unblocked,\nchasing", color=style.DEFENSE_DARK, fontsize=6.4)
        say(fld, p, -6.4, 5.6, "Q fakes\nthe boot", color=style.OFFENSE_DARK, fontsize=6.4)


MOMENTS = [
    (0.0, "", "Both OLBs (W, S) are stacked on Y.\nLeft of the ball: E, T, N and SS."),
    (0.45, "counter step", "R jabs right, toward the stack;\nM steps with him. G and T pull."),
    (1.45, "pullers arrive", "G kicks out E; H takes SS; T and G block\ndown; C cuts off the slanting T."),
    (2.9, "through the hole", "T has M; Y has W. Only FS is ahead,\nand S chases from behind."),
]
animation_or_strip(P46, MOMENTS, lateral=(-9.6, 10.4), window=(-8.2, 11.2), width_in=6.0,
                   rings=(("RG", PURPLE), ("RT", PURPLE), ("RB", GREEN)), after=tags)
Figure 55.7: The counter trey from a one-back, two-tight-end set against the 46 (simulated, BDB-format tracking; illustrative, not a specific play). The 46 sets both outside linebackers (W, S) and the Mike to the in-line tight end, Y, on the right. 1: left of the ball are only the end, a 3-technique, the nose and the strong safety, with the H-back lined up across from them. 2: the back (green ring) jabs right toward the stack and the Mike steps with him, while the right guard and right tackle (purple rings) pull left. 3: the guard kicks out the end, the left tackle and guard block down, the H-back takes the safety, and the center cuts off the backside 3-technique, who slants into the gap the pulling guard left. The shaded green box is the hole. 4: the pulling tackle leads onto the Mike and the back is through the hole with only the free safety ahead. Y has walled off the Will at the line; the Sam, the one man left unblocked, can only chase from behind, slowed by the quarterback’s fake bootleg toward him. Faint lines are each player’s path so far.
NoteFilm room: Washington 1987 — Super Bowl XXII

The game: Washington 42, Denver 10, at San Diego on January 31, 1988. Denver led 10–0 after the first quarter. Washington then scored 35 points in the second quarter, still the Super Bowl record: Doug Williams, the first Black quarterback to start and win a Super Bowl, threw four touchdown passes in that quarter alone and finished with 340 yards, and rookie Timmy Smith, making his first NFL start, ran for a Super Bowl record 204 yards.18

What to notice: the one-back sets with two tight ends, the H-back moving before the snap, and Smith’s long runs, which come behind pulling linemen after a step the wrong way: the counter trey. Denver played Joe Collier’s 3-4, with standing outside linebackers at the ends of the line, and a counter that kicks out the end man and wraps a tackle onto a linebacker is built to gash exactly that front. Then watch Ricky Sanders’s two touchdown catches in the same quarter, of 80 and 50 yards, and ask yourself whether you could have told run from pass before the snap. That uncertainty is the point of the formation.

The rivalry went on after Ryan left Chicago to coach the Philadelphia Eagles (1986–1990): his Eagles knocked nine Washington players out of a November 1990 game, the “Body Bag Game,” and Washington beat them in the playoffs eight weeks later, after which the Eagles fired Ryan.19

Spreading the field: the run-and-shoot and the K-Gun

By the late 1980s the next offensive answer was simply more receivers. If the 46 and the blitz-heavy defenses of the decade were built to win with numbers near the line, an offense could take the numbers away by spreading out.

The run-and-shoot went furthest: four wide receivers, one back, no tight end, and routes chosen after the snap from what the coverage did. Mouse Davis and June Jones, its two great teachers, brought it to the NFL, and between 1989 and the mid-1990s it was the base offense of the Detroit Lions, the Houston Oilers and the Atlanta Falcons. Warren Moon led the league in passing yards for Houston in 1990 and 1991. The defenses’ answer was the one Ryan always preached: hit the quarterback. Four receivers meant only five or six blockers, and blitzes that brought more rushers than that forced the quarterback to throw before the routes had sorted themselves out. Ryan, by then Houston’s defensive coordinator, called his own team’s run-and-shoot the “chuck and duck,” and the feud ended with him swinging at its coordinator, Kevin Gilbride, on the sideline in January 1994.20 The language and the reads of the run-and-shoot are in Offensive Systems.

Buffalo’s version was more durable. The K-Gun was a no-huddle offense run with three wide receivers, one tight end and one back (11 personnel), most often with quarterback Jim Kelly in the shotgun a few yards behind the center, calling the plays at the line.21 Its weapon was the clock between plays. A defense matches the offense’s personnel by substituting when the offense does; when the offense doesn’t substitute and doesn’t huddle, the defense has no time to change, and is stuck with whatever it had on the field when the drive started (the history, including the 1989 attempt to penalize the no-huddle, is in In-Game Adjustments and Tempo). The 1990 Bills went 13–3, scored a league-high 428 points and beat the Raiders 51–3 in the AFC Championship Game. They went on to play in four straight Super Bowls, and lost all four.

Show the Python
def spread_panel(ax, kind):
    if kind == "rs":
        off = line("short") + [O("QB", "QB", -1.9, 0.0, "Q"), O("RB", "RB", -5.5, 0.0, "R"),
                               O("X", "WR", -0.7, -15.0, "X"), O("H", "WR", -1.5, -8.0, "H"),
                               O("S", "WR", -1.5, 8.0, "S"), O("Z", "WR", -0.7, 15.0, "Z")]
        ttl, notes = "Run-and-shoot: four wide, no tight end", [(-4.2, -8.6, "slot"), (-4.2, 8.6, "slot")]
    else:
        off = line("short") + [O("QB", "QB", -5.0, 0.0, "Q"), O("RB", "RB", -5.0, 1.6, "R"),
                               O("Y", "TE", -0.7, 4.8, "Y"), O("X", "WR", -0.7, -15.0, "X"),
                               O("H", "WR", -1.5, -8.5, "H"), O("Z", "WR", -1.5, 14.0, "Z")]
        ttl, notes = "K-Gun: three wide, a tight end, no huddle", [(-7.0, -2.4, "shotgun"), (1.6, 4.8, "TE")]
    p = Play(off, [], los=35, to_go=None)
    fld = draw(p, ax=ax, lateral=(-16.8, 16.8), window=(-8.6, 3.2), title=False)
    for d, w, t in notes:
        say(fld, p, d, w, t, color=style.OFFENSE_DARK, fontsize=7)
    title(ax, ttl, size=9)


fig, axes = plt.subplots(2, 1, figsize=(6.2, 4.6))
spread_panel(axes[0], "rs")
spread_panel(axes[1], "kgun")
fig.tight_layout(h_pad=0.8)
plt.show()
Figure 55.8: How to spot the two spread offenses of the late 1980s and early 1990s on old film (illustrative alignments). Top, the run-and-shoot: four wide receivers, two of them slots (H, S) a step off the line inside the outside receivers, one back, and no tight end, so only five linemen and the back to block. Bottom, the K-Gun: three wide receivers (X, H, Z), a tight end (Y) and a back, with the quarterback most often in the shotgun, and no huddle between plays. The run-and-shoot spreads the defense with its personnel; the K-Gun freezes the defense’s personnel with its tempo.

Figure 55.8 shows the two together. The tell for the run-and-shoot is the empty spot where a tight end should be, with two slot receivers standing a step off the line. The tell for the K-Gun is the tight end still attached to the line with three receivers around him, and above all the offense walking straight back to the line after the whistle while the defense’s sideline stays put.

NoteFilm room: New York Giants 1990 — Super Bowl XXV

The game: Giants 20, Bills 19, at Tampa on January 27, 1991, decided when Scott Norwood’s 47-yard field goal try went wide right with eight seconds left. The Giants were heavy underdogs to the K-Gun, which had scored 95 points in two playoff games.22

What to notice: both of the Giants’ game plans answer the no-huddle. On defense, Bill Belichick played extra defensive backs to take away Buffalo’s passing game, had them play Buffalo’s receivers physically wherever the rules allowed, and told his players, who had been the league’s best run defense, that they would win if Thurman Thomas ran for more than 100 yards. Thomas ran for 135 and the Giants won. On offense, Parcells kept the K-Gun on the sideline: the Giants held the ball for 40 minutes and 33 seconds, still the Super Bowl record. You can’t use tempo while you’re standing on the sideline. Belichick’s defensive plan is now in the Pro Football Hall of Fame.

Safe pressure: the zone blitz meets the spread

The spread offenses beat man-coverage blitzes with hot throws: when more rushers come than the protection can block, the quarterback throws immediately to the receiver the blitzer left, and with four or five receivers spread wide, someone is always open for a moment. The 1990s defensive answer went back to Arnsparger’s idea of safe pressure: rush five, but from places the protection doesn’t expect, and drop a lineman into the throwing lane the quarterback expects to be open. The zone blitz gave a defense the pressure of a blitz without the man coverage that hot throws punish.

Who invented it is disputed. Some histories credit Arnsparger’s Miami defenses, in the 1970s or in his second stint in the 1980s with the “Killer B’s” (named for how many of its players’ surnames began with B); others credit Dick LeBeau, Cincinnati’s coordinator from 1984, who studied Arnsparger and turned the idea into a system. This book gives Arnsparger the idea and LeBeau the system (the case is laid out in Zone Blitzes). It became famous in Pittsburgh, where Dom Capers and LeBeau built “Blitzburgh”: the 1994 Steelers led the league with 55 sacks. Capers then took it to the expansion Carolina Panthers in 1995, and in their second season those Panthers went 12–4 and reached the NFC Championship Game.23

1994: the league tilts the board again

Look back at the points panel of Figure 55.2. By 1992 and 1993 scoring had fallen to 18.7 points a game, the lowest since 1978, as the zone blitz, better pass rushers and faster defenses caught up. The owners responded as they had in 1978: in March 1994 they adopted a package of changes “to increase offensive production.” It modified line play and the roughing-the-passer rule, adopted the neutral zone infraction (a defender who enters the neutral zone and draws a flinch stops the play dead), and, in the part that matters most to this chapter, renewed the emphasis on “downfield chucking”: the 1978 five-yard rule was still on the books, and officials were told to call it. It also made two changes that are easy to see on any broadcast.24

The two-point conversion. After a touchdown, a team may now try to score two points by running or passing the ball into the end zone from the 2-yard line, instead of kicking for one. College football had used it since 1958 and the American Football League all through the 1960s; the NFL waited until 1994, 24 seasons after the merger, to adopt it. The first one in NFL history was scored by Cleveland’s punter and holder Tom Tupa, running in a faked kick in the opening week of 1994.25

The decision is a small expected-points problem, the kind Expected Points teaches. Kicking was worth almost exactly one point: from 1999 to 2014 (the seasons in nflverse data before the extra point was moved back in 2015), NFL kickers made 98.8 percent of extra points. Going for two succeeded 46.9 percent of the time, which is worth 2 × 0.469 ≈ 0.94 points.26 So on average the kick was slightly better, and teams went for two only a few times a season each.

The two-point try is a situational weapon, because late in a game what matters is not points but the chance of winning. Suppose you trail by 8 and score a touchdown with no time left. Kick, and you lose by 1: a near-certain point that is worth nothing. Go for two, and about 47 times in 100 you tie and go to overtime, roughly a coin flip, so about a 23 percent chance to win instead of none. The same logic runs the other way: score to go up by 1 late, and a kick puts you up 2, where a field goal still beats you, while a two-pointer puts you up 3, where a field goal only ties. Coaches carry a two-point chart that works through every score in this way; it is in Clock and Game Management.

Kickoffs from the 30. The kicking spot moved back five yards, from the 35 to the 30. A kickoff from five yards further back lands five yards shorter, so fewer kicks reach the end zone and more are returned: in 1993 only 68 percent of kickoffs were returned; in 1994, 88 percent. Why does a return help the offense? A touchback then put the ball at the 20, but the average return did better: in the seasons from 1999 to 2010, when the league still kicked off from the 30, a returned kickoff started the offense at about its own 28, eight yards better, and now and then a return went the distance. More returns meant better starting field position, which is what the package was for. (The kickoff spot went back to the 35 in 2011, and the kickoff has since been rebuilt entirely; see Kickoffs and Returns.)27

Scoring rose to 20.3 points a game in 1994 and 21.5 in 1995. The 1978 pattern again: the rules open a gap, and offenses move in.

Free agency and the salary cap: changing how teams are built

The last two changes of the era weren’t about the field at all, and they may have changed the game more than any rule about hands. Until 1993, an NFL player whose contract ended could not simply sign with another team. Through the 1980s the league’s rules made movement rare, and from 1989 to 1992 a system called Plan B let each team protect 37 players and leave only the rest free to sign elsewhere. Players sued, under the antitrust laws, which forbid competing businesses to agree among themselves not to compete; the players’ case was that the teams had done exactly that, agreeing not to bid for one another’s players. In 1992 a federal jury in a case brought by eight players, led by the Jets’ Freeman McNeil, agreed that Plan B violated those laws, and in January 1993 the league and the players settled the remaining suits with a seven-year agreement that rebuilt the system.28

Free agency (1993)

Free agency (1993) is the system, in force since March 1, 1993, that lets a veteran whose contract has expired sign with any team. What counts is accrued seasons: a player earns one for each season he spends at least six regular-season games on full pay status. Today a player with four or more accrued seasons and an expired contract is an unrestricted free agent, free to sign anywhere. With three, he is a restricted free agent: other teams may bid, but his old team can keep him by matching the offer. With fewer than three, he is an exclusive-rights free agent: if his old team offers him a one-year minimum contract, he can’t negotiate with anyone else.29 The first great free-agent signing showed what it could do. Reggie White, the best defensive end of his era, left Philadelphia in 1993 for a four-year, $17 million contract with Green Bay that made him the third-highest-paid player in the league, and after the 1996 season he set a Super Bowl record with three sacks as the Packers won Super Bowl XXXI.30

The salary cap (1994)

In exchange, the owners got the salary cap: a hard limit, the same for every team, on what a club may count against its player payroll in a season, set each year from a share of league revenue. It began in 1994 at $34.6 million per team, higher than the expected $32 million because a new television deal with a new network, Fox, raised league revenue. It is a hard cap: no team may exceed it for any reason.31

ImportantWhy it exists

The two came as a pair, and each answers the other’s problem. Free agency gave players the right to sell their services to the highest bidder; the cap kept the richest owners from simply buying every good player, which the league feared would end competitive balance. The trade the players made was a fixed share of revenue in return for movement; the trade the teams made was freedom to spend in return for a ceiling that made every contract a choice against every other.

The cap counts money by rules of its own, and one of them shapes every big contract. A signing bonus is paid when the contract is signed, but it counts against the cap spread evenly over the years of the contract (today, over at most five). Without that rule a team could pay a huge bonus in a year it had room and show only small salaries afterwards. With it, the same rule became the tool teams use to push cap charges into future years: turn this year’s salary into a bonus and most of its cap charge moves into later seasons. Under a hard cap the fights are not over whether money counts but when. Denver learned that the hard way: in 2004 the league fined the Broncos $950,000 and took a third-round pick for agreements, in 1996 to 1998, that deferred players’ salaries with interest and, the league ruled, got around the cap.32

How the cap changed football strategy. You will see three of its effects in almost every chapter of this book.

  1. Positions got prices. Under a cap, paying one player means not paying another, so teams had to decide which positions are worth the most. The answers that emerged in the 1990s still hold: quarterback first, then the players who decide whether the quarterback has time, the pass rusher and the blind-side tackle. The cap is what turned Lawrence Taylor’s effect into a salary structure. Building a Roster follows that logic to today’s contracts.
  2. Rosters churned, so systems had to travel. With players moving every spring, a team could no longer assume its starters had spent five years learning its playbook. Offenses and defenses had to be teachable to a newcomer in one off-season, which rewarded concept-based languages (one word for a whole pattern, the Erhardt-Perkins idea) and coaches who could install fast. Coaches moved too, and took their systems with them; the coaching trees of Part 12 are a product of the same mobility.
  3. Depth got thinner, and cheap players got valuable. A team at the cap can’t stockpile veterans, so the draft, where players are cheap for their first contract, became the most valuable source of talent, and specialists who play only in certain packages (a third-down pass rusher, a nickel corner) are bought cheaply rather than kept on the roster as insurance.

Where the era landed: 1998 and 1999

By the end of the 1990s, each of the era’s big ideas had a winner. In 1998 the Denver Broncos went 14–2 behind Mike Shanahan’s offense, which married Walsh’s play-action passing to the outside-zone running Alex Gibbs had brought to Denver in 1995 (the story is in Zone Running). Terrell Davis ran for 2,008 yards, and John Elway, in his last game, was the MVP of a 34–19 win over Atlanta in Super Bowl XXXIII.33 The same season the Minnesota Vikings, coached by Dennis Green, a former Walsh assistant, and with a rookie receiver named Randy Moss, scored 556 points, then the most in league history, before losing the NFC Championship Game in overtime.34 And in 1999 the St. Louis Rams, running Mike Martz’s Coryell-descended offense, the “Greatest Show on Turf,” beat the Tennessee Titans 23–16 in Super Bowl XXXIV.35

Two champions and a record-setter, and every line of descent from 1978 is in them: Walsh’s timing game married to Alex Gibbs’s zone running (which came down a different line altogether) in Denver, a Walsh-tree offense with a vertical threat in Minnesota, and Coryell’s vertical game in St. Louis. Meanwhile the defenses had their nickel and dime packages, their 3-4 edge rushers and their zone blitzes, and were waiting for the next rule change. The next round of the story, the spread offenses that came up from college and the defenses built to stop them, is in The College Laboratory and Dynasties and Counterpunches.

The whole era on one page

Figure 67.6 puts the chapter’s moves and counter-moves side by side, year by year. Read across a row to see what was happening at the same moment, and down a column to follow one side’s line of thought. (Entries not sourced earlier in the chapter come from the Hall of Fame’s year-by-year chronology and the other notes listed here.)36

Show the Python
import textwrap

TIMELINE = [  # (year, offense, rules and business, defense)
    (1972, "", "", "Arnsparger's “53”: Matheson rushes or drops; Miami goes 17–0"),
    (1974, "", "Downfield contact limited (the “Isaac Curtis rule”); kickoffs move back to the 35",
     "Fairbanks's Patriots and Phillips's Oilers make the 3-4 a base defense"),
    (1977, "", "One chuck per receiver; head slap banned. Scoring hits 17.2 points a team-game", ""),
    (1978, "Coryell takes over the Chargers", "Mel Blount rule; open-hand pass blocking; 16 games; a seventh official", ""),
    (1979, "Walsh hired by the 49ers; Fouts passes for 4,082 yards", "“In the grasp”: the whistle protects the passer", ""),
    (1981, "Gibbs to Washington: one-back, H-back, counter trey", "", "Lawrence Taylor drafted second overall"),
    (1982, "", "57-day players' strike; a nine-game season", ""),
    (1984, "Marino passes for 5,084 yards", "", "LeBeau becomes Cincinnati's coordinator; zone blitz grows"),
    (1985, "", "", "Ryan's 46: Bears allow the fewest points, win Super Bowl XX 46–10"),
    (1986, "", "Limited instant replay (through 1991)", "Taylor: 20.5 sacks, league MVP"),
    (1987, "Washington scores 35 in one quarter of Super Bowl XXII", "24-day strike; replacement games", ""),
    (1989, "", "Plan B: limited free agency", ""),
    (1990, "Run-and-shoot in Detroit, Houston, Atlanta; Bills' no-huddle K-Gun scores 428", "",
     "Belichick's plan holds the K-Gun to 19 in Super Bowl XXV"),
    (1993, "", "Free agency begins March 1; Reggie White signs with Green Bay", ""),
    (1994, "", "Salary cap ($34.6 million); two-point conversion; kickoffs back to the 30; renewed emphasis on downfield chucking",
     "“Blitzburgh”: Steelers lead the NFL with 55 sacks"),
    (1995, "Shanahan and Alex Gibbs bring outside zone to Denver", "", "Capers takes the zone blitz to expansion Carolina"),
    (1998, "Terrell Davis runs for 2,008; Vikings score a record 556", "", ""),
    (1999, "Rams' “Greatest Show on Turf” wins Super Bowl XXXIV", "Replay returns, with coaches' challenges", ""),
]
COLS = [("Offense", style.SERIES[0]), ("Rules and business", style.INK_2), ("Defense", style.SERIES[1])]
WRAP, LINE_H, PAD = 30, 0.118, 0.05
rows = [[textwrap.wrap(c, WRAP) for c in (o, rl, d)] for _, o, rl, d in TIMELINE]
heights = [max(1, *(len(c) for c in row)) * LINE_H + 2 * PAD for row in rows]
H = sum(heights) + 0.32
fig = plt.figure(figsize=(6.5, H))
ax = fig.add_axes([0, 0, 1, 1])
ax.set_xlim(0, 6.5); ax.set_ylim(0, H); ax.axis("off")
x_year, x_cols, col_w = 0.05, [0.58, 2.58, 4.58], 1.92
y = H - 0.05
for (name, col), x in zip(COLS, x_cols):
    ax.text(x, y, name, fontsize=8.6, fontweight="bold", color=col, va="top")
y -= 0.27
for i, ((yr, *_), row, h) in enumerate(zip(TIMELINE, rows, heights)):
    if i % 2 == 0:
        ax.add_patch(Rectangle((0, y - h), 6.5, h, fc=style.GRID, alpha=0.35, ec="none"))
    ax.text(x_year, y - PAD, str(yr), fontsize=8, fontweight="bold", color=style.INK, va="top")
    for lines, (name, col), x in zip(row, COLS, x_cols):
        if lines:
            ax.add_patch(Rectangle((x - 0.06, y - h + PAD * 0.6), 0.025, h - 1.2 * PAD, fc=col, ec="none"))
            ax.text(x, y - PAD, "\n".join(lines), fontsize=7, color=style.INK, va="top", linespacing=1.2)
    if yr == 1978:
        ax.add_patch(Rectangle((0.0, y - h), 6.5, h, fc="none", ec=style.INK_2, lw=1.0))
    y -= h
plt.show()
Figure 55.9: The arms race, 1972 to 1999. Each row is a year with an important change. Read across for what each side, and the league office, was doing at the same time; read down a column to follow one line of thought. The 1978 row is outlined. A few entries (the strikes, instant replay) are context the chapter doesn’t discuss.

Watch for it on Sunday

TipWatch for it: classic film

Find a full game from the 1980s or early 1990s (NFL Films and the league’s own YouTube channel post many; Super Bowls XX, XXII and XXV are easy to find) and chart the first quarter with what you now know.

  • Personnel and formation. Count the backs and tight ends on every snap. How often is it the pro set or the I with two backs? When does a third receiver appear, and does the defense answer with a fifth defensive back? Is anyone lined up as an H-back, a step off the line beside the tackle?
  • The front. Three linemen with hands down and two standing at the ends (a 3-4), or four down (a 4-3)? If you see the center and both guards covered and a safety walked up into the box, you’re looking at the 46.
  • The best pass rusher. Find him before the snap. Which side is he on, and what does the offense do about it: an H-back next to his tackle, a back staying in, a tight end chipping him?
  • Contact on receivers. Watch a receiver past five yards. Does anyone touch him before the ball is thrown? After 1978 that is a foul, but officials let a good deal go until the league ordered strict enforcement in 2004, so expect to see more contact than the rulebook allowed.
  • The clock between plays. Does the offense huddle? If it doesn’t, does the defense manage to substitute?
  • Then flip to a game from this season and run the same list. Note what has faded (the two-back pro set, the 46, the seven-step drop) and what survived (the slant-flat, the counter, the stand-up edge rusher, the zone blitz). The huddle survived too: in 2025, NFL offenses went no-huddle on only about 8 percent of charted plays.37

Predict the play

TipPredict the play 1: where does the H-back go?
Show the Python
# ---------------------------------------------------------------- drill 1: where does the H-back go?
off = line("short") + [O("QB", "QB", -1.9, 0.0, "Q"), O("RB", "RB", -7.0, 0.0, "R"),
                       O("Y", "TE", -0.7, 4.8, "Y"), O("X", "WR", -0.7, -14.0, "X"), O("Z", "WR", -1.5, 13.0, "Z")]
dfn = [D("LDE", "DE", 1.0, T("5", -1), "E"), D("NT", "NT", 1.0, 0.0, "N"), D("RDE", "DE", 1.0, T("5"), "E"),
       D("ROLB", "OLB", 1.2, -6.8, "56"), D("LOLB", "OLB", 1.2, T("9") + 0.3, "B"),
       D("ILB1", "LB", 4.3, -2.2, "L"), D("ILB2", "LB", 4.3, 2.2, "L"),
       D("LCB", "CB", 7.0, -14.0, "CB"), D("RCB", "CB", 7.0, 13.0, "CB"),
       D("FS", "FS", 12.5, -5.5, "FS"), D("SS", "SS", 11.0, 6.5, "SS")]
p = Play(off, dfn, los=40, to_go=10)
p.highlight("ROLB")
fld = draw(p, width_in=6.0, lateral=(-17.5, 16.5), window=(-9.0, 15.0), title=False)
ghost_off(fld, p, -1.5, -4.8)
ghost_off(fld, p, -1.5, 6.4)
say(fld, p, -3.6, -8.4, "H-back here...", color=style.OFFENSE_DARK, fontsize=7)
say(fld, p, -3.6, 9.6, "...or here?", color=style.OFFENSE_DARK, fontsize=7)
say(fld, p, 3.2, -10.8, "the Giants' best\npass rusher", color=style.DEFENSE_DARK, fontsize=7)
gx, gy = (float(v) for v in _P(fld, p, 1.2, 8.6))
fld.ax.add_patch(RegularPolygon((gx, gy), 4, radius=0.95, orientation=np.pi / 4, fc="none", ec=style.DEFENSE,
                                lw=1.3, ls=(0, (2, 1.4)), zorder=8))
fld.ax.text(gx, gy, "56", ha="center", va="center", fontsize=7, color=style.DEFENSE_DARK, fontweight="bold", zorder=9)
dashed(fld, p, [(2.2, -6.8), (6.2, -4.0), (6.2, 5.4), (2.4, 8.4)], color=style.DEFENSE_DARK, lw=1.2)
say(fld, p, 3.6, 12.0, "...or does 56\nshift over here?", color=style.DEFENSE_DARK, fontsize=7)
plt.show()
Figure 55.10: Predict the play 1. 1986: one back, a tight end (Y) on the right, and an H-back who could line up in either dashed circle. The Giants are in a 3-4; their best pass rusher, number 56 (ringed), stands at the end of the line on the offense’s left, and he may walk across to the dashed square outside the tight end before the snap.

It’s 1986, and your right-handed quarterback is about to face the Giants. They are in their 3-4, and their best pass rusher, number 56, is standing at the end of the line on your left. You have one running back, a tight end on the right, and an H-back you can line up on either side. Where do you put the H-back, and what does he do at the snap? And if 56 walks across before the snap to stand outside your tight end, on the side your quarterback faces, what do you do then?

On the left, next to the left tackle. Number 56 is lined up over your quarterback’s blind side, so that is where you need an extra man. At the snap the H-back chips him: hits him as he comes off the edge, then releases into a short route if nothing else comes. That gives the left tackle help against a rusher he can’t block alone, and gives the quarterback a check-down when the H-back releases. This is the job Joe Gibbs created the position for.

If 56 shifts right, the H-back goes with him, in motion across the formation, and sets up beside the tight end. Now your quarterback can see 56 coming, but seeing him isn’t the same as blocking him: he is still the rusher who beats one blocker, and the right tackle with a tight end and an H-back beside him can chip him twice. The left tackle is left alone with the other outside linebacker (B), which is a fair fight. Defenses learned to move their best rusher around for exactly this reason, to make the offense show where its help goes. The rule is the one from Pass Protection: find the best rusher first and put help where he is. The blind side matters because that is where he usually lines up, not for its own sake.

TipPredict the play 2: the K-Gun catches a base defense
Show the Python
# ---------------------------------------------------------------- drill 2: the K-Gun catches a base 3-4
off = line("short") + [O("QB", "QB", -5.0, 0.0, "Q"), O("RB", "RB", -5.0, 1.6, "R"),
                       O("Y", "TE", -0.7, 4.8, "Y"), O("X", "WR", -0.7, -15.0, "X"),
                       O("H", "WR", -1.5, -8.5, "H"), O("Z", "WR", -1.5, 14.0, "Z")]
dfn = [D("LDE", "DE", 1.0, T("5", -1), "E"), D("NT", "NT", 1.0, 0.0, "N"), D("RDE", "DE", 1.0, T("5"), "E"),
       D("ROLB", "OLB", 2.5, -8.0, "B"), D("LOLB", "OLB", 1.2, T("9") + 0.3, "B"),
       D("ILB1", "LB", 4.5, -2.2, "L"), D("ILB2", "LB", 4.5, 2.2, "L"),
       D("LCB", "CB", 7.0, -15.0, "CB"), D("RCB", "CB", 7.0, 14.0, "CB"),
       D("FS", "FS", 13.0, -4.0, "FS"), D("SS", "SS", 12.0, 6.0, "SS")]
p = Play(off, dfn, los=40, to_go=10)
p.highlight("ROLB", "H")
fld = draw(p, width_in=6.0, lateral=(-18.5, 17.5), window=(-7.5, 15.5), title=False)
say(fld, p, 6.0, -10.6, "a linebacker\non the slot", color=style.DEFENSE_DARK, fontsize=7)
say(fld, p, -4.4, -11.5, "no huddle: no time\nto substitute", color=style.INK_2, fontsize=7)
plt.show()
Figure 55.11: Predict the play 2. 1990: Buffalo in the shotgun with three wide receivers (X, H, Z), a tight end and a back, no huddle, against a base 3-4 that was on the field when the drive began. The slot receiver H and the linebacker over him (B) are ringed.

It’s 1990, first-and-10. Buffalo has just picked up a first down and hurried to the line without a huddle, Kelly in the shotgun: three wide receivers (the slot receiver on the left is H, here a receiver, not an H-back), a tight end, one back. The defense had its base 3-4 on the field when the drive started, and the offense hasn’t given it time to change. Where will Jim Kelly look, and what should the defense have done before the drive began?

At the slot receiver on the left (H). The only player to cover him in a base defense is a linebacker, the highlighted B, and a wide receiver against a linebacker in space is the matchup the K-Gun was built to create. On first-and-10 the offense can do anything, so it takes the matchup: expect a quick throw to H, a slant or an option route that breaks away from the linebacker’s leverage. Base 3-4 personnel is built to stop the run, which is exactly why the K-Gun threw against it. Had the defense been in nickel instead, the call flips: Kelly hands to Thurman Thomas, on a draw or a trap, against a lighter box. That is why there was no right package to start the drive in.

The fix had to come before the drive, because once the offense stops huddling, the defense can only substitute when the offense does, and the offense won’t wait. A defense facing the K-Gun had to pick its package before the drive and live with it, and nickel or dime meant accepting the trade: lighter against the run. That is exactly what Belichick’s Giants did in Super Bowl XXV, with extra defensive backs on the field and a promise to let Thurman Thomas run. And the Giants’ offense took away the other ingredient tempo needs: the ball. You can’t hurry the next snap if you aren’t on the field.

TipPredict the play 3: the same coverage, a new rulebook
Show the Python
# ---------------------------------------------------------------- drill 3: 1977 or 1979?
off = line("short") + [O("QB", "QB", -1.9, 0.0, "Q"), O("HB", "RB", -5.0, -2.2, "H"), O("FB", "FB", -5.0, 2.2, "F"),
                       O("Y", "TE", -0.7, 4.8, "Y"), O("X", "WR", -0.7, -13.0, "X"), O("Z", "WR", -1.5, 13.0, "Z")]
dfn = [D("WE", "DE", 1.0, T("5", -1), "E"), D("WT", "DT", 1.0, T("1", -1), "T"), D("ST", "DT", 1.0, T("3") - 0.1, "T"),
       D("SE", "DE", 1.0, T("5") - 0.15, "E"), D("SAM", "LB", 4.0, 6.6, "S"), D("MIKE", "LB", 5.0, 2.0, "M"),
       D("WILL", "LB", 4.5, -3.2, "W"), D("LCB", "CB", 4.5, -13.0, "CB"), D("RCB", "CB", 4.5, 13.0, "CB"),
       D("FS", "FS", 13.0, -8.0, "FS"), D("SS", "SS", 13.0, 8.0, "SS")]
p = Play(off, dfn, los=40, to_go=None)
p.route("Y", r.seam(19))
p.drop("MIKE", (8.5, 3.8))
p.drop("FS", (17.5, -10.0), zone=(8, 14), label="deep half")
p.drop("SS", (17.5, 10.0), zone=(8, 14), label="deep half")
p.dropback(5.0)
p.highlight("MIKE", "Y")
fld = draw(p, width_in=6.0, lateral=(-17.5, 17.5), window=(-8.5, 22.5), title=False)
ruler(fld, p, depths=(5, 10, 15, 20))
say(fld, p, 8.6, -0.8, "M drops to 8 yards", color=style.DEFENSE_DARK, fontsize=7)
say(fld, p, 20.6, 4.6, "Y: seam", color=style.OFFENSE_DARK, fontsize=7, weight="bold")
plt.show()
Figure 55.12: Predict the play 3. 1979: the Cover 2 a defense would have called in 1977, against a two-back pro set. The tight end (Y, ringed) gets a clean release and runs up the seam between the two deep halves as the Mike (M, ringed) drops to about 8 yards in the middle.

It’s 1979, and the defense calls the Cover 2 it played in 1977: two deep safeties and five underneath. The tight end, Y, gets off the line clean and releases up the seam between the two safeties, and the Mike drops straight back to about 8 yards in the middle. In 1977 the Mike would have spent the defense’s one hit on Y right there (the previous chapter’s drill showed why). What can he do now, where is the ball going, and what does the defense have to change?

He can’t touch him. Past five yards the Mike may not initiate contact with Y. He has to turn and run with Y, a linebacker chasing a tight end up the field, or let him go and hope a safety gets there. Neither safety can, because each is responsible for his own half of the field, and the seam is exactly between them. The ball goes to Y at 18 to 20 yards, in the hole that every Cover 2 has in the deep middle.

What the defense has to change: it needs someone in the deep middle. It can play a single safety there (Cover 3, or man coverage with a free safety), put a faster defensive back on the tight end, or, the answer that came to define a style of defense, make the Mike run: in Tampa 2 he sprints to the deep middle at the snap, turning Cover 2 into three deep in the middle of the field (Cover 2 and Tampa 2). That linebacker needed a sprinter’s speed, which is one more way the 1978 rules changed what a defensive player looks like.

Takeaways

  • Two 1978 rules opened the passing game from both ends. The Mel Blount rule stopped defenders from hitting receivers past five yards, which made timed routes possible; open-hand pass blocking gave the quarterback more time. Passes went from 40 percent of plays in 1977 to half of them by the early 1980s, and interceptions fell for twenty years.
  • The offense split into two answers. Air Coryell stretched the field deep with protection and big receivers; Walsh’s West Coast offense stretched it sideways with short, timed throws that worked like runs, living in the 5-to-15-yard band the Blount rule had cleared and behind blockers who could now use their hands. Gibbs’s one-back, two-tight-end offense, the run-and-shoot and the K-Gun built on both.
  • Every defensive answer answered something specific: nickel and dime for the third receiver; the 53 and the 3-4 for disguising who rushes; the 46 for two-back offenses; the zone blitz for hot throws. The 3-4 also made room for a new player, the stand-up edge rusher, and Lawrence Taylor broke protections that blocked linebackers with running backs, until the H-back and slide protections answered him. Each new answer created the next question.
  • The blind side made the left tackle a premium position, because a right-handed quarterback can’t see what comes from behind his left shoulder, and because the best rushers lined up there.
  • The league rewrote the rules again when defenses caught up: the 1994 package added the two-point conversion and moved kickoffs back to the 30.
  • Free agency (1993) and the salary cap (1994) changed how teams are built: positions got prices, systems had to be teachable fast, and cheap drafted players became the most valuable kind.

Connections

Builds on: From the Single Wing to the 1970s Scoring Drought (the problem the 1978 rules solved), Offensive Systems (the languages of Coryell, Walsh, Erhardt-Perkins and the run-and-shoot), Even Fronts (the 46) and Zone Blitzes (safe pressure).

Sets up: The College Laboratory (where the spread, the option and the RPO were being built while the NFL fought this war), Dynasties and Counterpunches (2000–2016), and the case studies of Part 12, starting with Walsh’s 49ers. For today’s contact rules, see Contact Rules and Penalties; for today’s cap economics, Building a Roster. Appendix E has the full rule-change timeline.

NoteGo deeper
  • Tim Layden, Blood, Sweat and Chalk (2010): chapters on Coryell, Walsh, Gibbs’s one-back and H-back, Ryan’s 46 and the zone blitz, with the coaches in their own words.
  • Bill Walsh with Brian Billick and James Peterson, Finding the Winning Edge (1997): Walsh’s own account of his offense and how he built the 49ers.
  • Michael Lewis, The Blind Side: Evolution of a Game (2006): Lawrence Taylor, the left tackle and the economics that followed.
  • Chris B. Brown, The Art of Smart Football (2015): short essays on the arms race, including the zone blitz and the run-and-shoot.
  • Pro Football Hall of Fame, “Chronology of Football” (profootballhof.com): the year-by-year record of rule changes used throughout this chapter.

  1. Pro Football Hall of Fame, Chronology of Football, 1974 (“sweeping rules changes were adopted to add action and tempo to games”: kickoffs moved from the 40 to the 35, goalposts moved to the end lines, “the extent of downfield contact a defender could have with an eligible receiver was restricted”): https://www.profootballhof.com/football-history/football-history/1960-1979/1974 ; 1977 (“Rules changes were adopted to open up the passing game and to cut down on injuries. Defenders were permitted to make contact with eligible receivers only once; the head slap was outlawed”): https://www.profootballhof.com/football-history/football-history/1960-1979/1977 . The 1974 restriction is often called the “Isaac Curtis rule”: “Isaac Curtis,” Wikipedia (Shula’s Dolphins, unable to keep up with him, had their defensive backs “push, bump, and hold him down the field,” and other teams copied it), https://en.wikipedia.org/wiki/Isaac_Curtis . The 1977 averages quoted here (17.2 points per team-game, 40.0% of offensive plays passes, 5.7 interceptions per 100 attempts) are computed from Pro Football Reference’s league averages; see the note on the chart.↩︎

  2. Pro Football Hall of Fame, Chronology of Football, 1977 (October 12: contracts with the three networks to televise all regular-season and postseason games for four years beginning in 1978, “the largest single television package ever negotiated”; March 29: a 16-game regular season adopted to begin in 1978): https://www.profootballhof.com/football-history/football-history/1960-1979/1977↩︎

  3. Pro Football Hall of Fame, Chronology of Football, 1978 (“The NFL continued a trend toward opening up the game. Rules changes permitted a defender to maintain contact with a receiver within five yards of the line of scrimmage, but restricted contact beyond that point. The pass-blocking rule was interpreted to permit the extending of arms and open hands,” March 17; a seventh official, the side judge, added March 14): https://www.profootballhof.com/football-history/football-history/1960-1979/1978 . “1978 NFL season,” Wikipedia (contact “only to a point of five yards beyond the line of scrimmage… usually referred to as the ‘Mel Blount Rule’”; “pass blocking rules were extended to permit extended arms and open hands”; the side judge added “to help rule on legalities downfield”; 16-game schedule; a second wild card): https://en.wikipedia.org/wiki/1978_NFL_season . Today’s rule: NFL Rulebook, Rule 8, Section 4 (inside the five-yard zone a defender may chuck a receiver in front of him and maintain continuous and unbroken contact until the receiver is even with him; beyond it, while the passer is in the pocket with the ball, contact that impedes the receiver is illegal contact; the restriction ends when the passer leaves the pocket, Article 7): https://operations.nfl.com/the-rules/nfl-rulebook/↩︎

  4. “Mel Blount,” Wikipedia (6 ft 3 in; AP defensive player of the year 1975 with a league-leading 11 interceptions; “the rules regarding pass coverage were changed making such harassment of a receiver illegal. The rule would come to be named the Mel Blount Rule”): https://en.wikipedia.org/wiki/Mel_Blount ; “Mel Blount explains play that created Mel Blount rule,” Steelers Depot (Feb. 2024): https://steelersdepot.com/2024/02/mel-blount-explains-play-that-created-mel-blount-rule . On the nickname’s attachment to the 1977 change in some accounts, see Christopher L. Gasper, “How wide receivers have evolved in the NFL,” Boston Globe (Sept. 4, 2013): https://www.bostonglobe.com/sports/2013/09/04/how-wide-receivers-have-evolved-nfl/akAnTGNJaS7OrVnjAbbN6J/story.html↩︎

  5. Pro Football Hall of Fame, Chronology of Football, 1978, cited above (“The NFL continued a trend toward opening up the game”). Pittsburgh, the team Blount played for, won the next two Super Bowls by throwing more: Terry Bradshaw was the 1978 league MVP and threw for 318 yards and four touchdowns in the 35–31 win over Dallas in Super Bowl XIII. Bradshaw’s 1978 MVP and Super Bowl XIII line (17 of 30, 318 yards, four touchdowns, then Super Bowl records): “Terry Bradshaw” and “Super Bowl XIII,” Wikipedia: https://en.wikipedia.org/wiki/Super_Bowl_XIII↩︎

  6. Pro Football Hall of Fame, Chronology of Football, 1979 (rules changes “instructed officials to quickly whistle a play dead when a quarterback was clearly in the grasp of a tackler,” March 16): https://www.profootballhof.com/football-history/football-history/1960-1979/1979 ; for 1978’s 16 games and second wild card, see the 1978 note above.↩︎

  7. Pro Football Reference, “NFL League Year-by-Year Averages” (per team per game and season totals), https://www.pro-football-reference.com/years/NFL/index.htm , as archived by the Internet Archive on Dec. 28, 2024: https://web.archive.org/web/20241228065223/https://www.pro-football-reference.com/years/NFL/index.htm . Points per game and net yards per attempt are PFR’s per-game figures; passes as a share of plays is pass attempts divided by pass attempts plus rushing attempts (sacks are not included, so the true share of dropbacks is a little higher); interceptions per 100 passes is interceptions divided by attempts. Seasons are regular seasons; 1982 (nine games) and 1987 (fifteen, three with replacement players) were shortened by strikes (Pro Football Hall of Fame, Chronology of Football, 1982 and 1987: https://www.profootballhof.com/football-history/football-history/1980-1999/1987). Pro Football Reference blocks automated access; spot-check the figures there before print.↩︎

  8. “Air Coryell,” Wikipedia (the Chargers led the league in passing yards 1978–1983 and in 1985; “The Chargers in 1979 were the first AFC Western Division champion to run more passing plays (541) than rushing (481)”; motion; “Throwing a deep pass was the first option on each play”): https://en.wikipedia.org/wiki/Air_Coryell ; “Dan Fouts,” Wikipedia (4,082 yards in 1979, breaking Joe Namath’s record of 4,007; 4,802 in 1981; first to throw for 4,000 yards in three straight seasons): https://en.wikipedia.org/wiki/Dan_Fouts ; Pro Football Hall of Fame, Don Coryell: https://www.profootballhof.com/players/don-coryell/ . “Don Coryell,” Wikipedia (Tommy Prothro resigned after a 1–3 start and Coryell took over on September 25, 1978; Gibbs became his offensive coordinator): https://en.wikipedia.org/wiki/Don_Coryell ; “Kellen Winslow,” Wikipedia (first round, 1979): https://en.wikipedia.org/wiki/Kellen_Winslow . Coryell’s lineage through Zampese, Turner and Martz: Chris B. Brown, cited in Offensive Systems.↩︎

  9. “The Epic in Miami,” Wikipedia (January 2, 1982; San Diego led 24–0 at the end of the first quarter; Chargers 41, Dolphins 38 in overtime; Fouts 33 of 53 for 433 yards, NFL postseason records; Winslow 13 receptions, a playoff record, for 166 yards and a touchdown, plus a blocked field goal; NFL 100 Greatest Games ranked it fourth): https://en.wikipedia.org/wiki/Epic_in_Miami↩︎

  10. “Bill Walsh (American football coach),” Wikipedia (hired January 1979 after a 2–14 1978 season; 2–14 again in 1979; Joe Montana taken in the third round of the 1979 draft): https://en.wikipedia.org/wiki/Bill_Walsh_(American_football_coach) ; Pro Football Hall of Fame, Chronology of Football, 1982 (San Francisco 26, Cincinnati 21 in Super Bowl XVI): https://www.profootballhof.com/football-history/football-history/1980-1999/1982↩︎

  11. “Roger Craig (American football),” Wikipedia (1985: “Craig became the first in NFL history to run and receive for at least 1,000 yards in the same season,” with a league-leading 92 receptions): https://en.wikipedia.org/wiki/Roger_Craig_(American_football) . Walsh’s own account of the five-step timing game and the backs’ role in the passing game is in Bill Walsh with Brian Billick and James Peterson, Finding the Winning Edge (1997), listed under Go deeper.↩︎

  12. “Wide receiver,” Wikipedia (“An early innovator, coach Sid Gillman used 3+ wide receiver sets as early as the 1960s … but it was not until the 1990s that teams began to reliably use three or more wide receivers,” crediting the run and shoot and the K-Gun): https://en.wikipedia.org/wiki/Wide_receiver↩︎

  13. “Nickel defense,” Wikipedia (Jerry Williams, Philadelphia, 1960; George Allen and the name; “popularized by head coach Don Shula and defensive coordinator Bill Arnsparger of the Miami Dolphins in the 1970s”): https://en.wikipedia.org/wiki/Nickel_defense ; “Dime defense,” Wikipedia: https://en.wikipedia.org/wiki/Dime_defense . The usual account is discussed in A First Look at Defense.↩︎

  14. “Bob Matheson,” Wikipedia (acquired before the 1971 season at Arnsparger’s request; “Matheson’s versatility against both the run and pass was at the heart of the ‘53’ defense, a scheme that was named for his jersey number and devised by Arnsparger. Depending on whether the situation was running or passing, he was a strong-side defensive end and a fourth linebacker respectively”; citing “Matheson Is Key to Miami ‘53’ Defense,” New York Times, Jan. 13, 1974): https://en.wikipedia.org/wiki/Bob_Matheson ; “1973 Miami Dolphins season,” Wikipedia (the “53” defense “devised at the beginning of the 1972 season”): https://en.wikipedia.org/wiki/1973_Miami_Dolphins_season ; “Bill Arnsparger,” Wikipedia (the No-Name Defense; the 1980s “Killer B’s (so named because of the number of surnames beginning with ‘B’ on the Dolphins defense)”): https://en.wikipedia.org/wiki/Bill_Arnsparger ; “No-Name Defense,” Wikipedia (the 1972 Dolphins defense “termed the ‘No-Name Defense’ by Dallas Cowboys head coach Tom Landry, given its lack of high-profile players”): https://en.wikipedia.org/wiki/No-Name_Defense . Arnsparger’s “rush five guys and cover with six” and “safe pressure”: Chris B. Brown, “Controlled Chaos,” Grantland (Sept. 26, 2012): https://grantland.com/features/dick-lebeau-evolution-coverage-tactics-zone-blitz/↩︎

  15. “Lawrence Taylor,” Wikipedia (second overall pick in 1981; Defensive Rookie of the Year 1981; Defensive Player of the Year 1981, 1982, 1986; 20.5 sacks and the first unanimous MVP by a defensive player in 1986; Walsh “assigned guard John Ayers, the team’s best blocker, to block Taylor” in the January 1982 divisional playoff, a 38–24 49ers win; Gibbs developed the two-tight-end offense and the H-back in response): https://en.wikipedia.org/wiki/Lawrence_Taylor ; Pro Football Hall of Fame, Lawrence Taylor (its game listings give his starting position as right outside linebacker, for example in Super Bowls XXI and XXV): https://www.profootballhof.com/players/lawrence-taylor/ .↩︎

  16. “H-back,” Wikipedia (the name from the Q, H and F backs of Gibbs’s notation; the position “was created by Gibbs as a direct response to Lawrence Taylor,” with Gibbs’s quotation): https://en.wikipedia.org/wiki/H-back . Gibbs’s three titles (Super Bowls XVII, XXII and XXVI): Pro Football Hall of Fame, Chronology of Football, 1980–1999: https://www.profootballhof.com/football-history/football-history/1980-1999/1992↩︎

  17. “46 defense,” Wikipedia (Buddy Ryan; named for safety Doug Plank’s jersey number; “most effective against the two back, two wide receiver sets that many teams commonly used in the 1980s”): https://en.wikipedia.org/wiki/46_defense ; Pro Football Hall of Fame, Chronology of Football, 1986 (Chicago 46, New England 10 in Super Bowl XX): https://www.profootballhof.com/football-history/football-history/1980-1999/1986↩︎

  18. “Joe Collier,” Wikipedia (Denver’s defensive coordinator 1972–1988, “the architect of the Broncos’ 3–4 defense”): https://en.wikipedia.org/wiki/Joe_Collier . “Super Bowl XXII,” Wikipedia (Washington 42, Denver 10, January 31, 1988; 35 points in the second quarter; Timmy Smith 204 rushing yards, a Super Bowl record; Ricky Sanders 193 receiving yards): https://en.wikipedia.org/wiki/Super_Bowl_XXII ; “Doug Williams (quarterback),” Wikipedia (18 of 29 for 340 yards and four touchdowns, all in the second quarter; “the first African-American quarterback to both win a Super Bowl and be named its MVP”): https://en.wikipedia.org/wiki/Doug_Williams_(quarterback) . Doug Williams as the first Black quarterback to start a Super Bowl: “Super Bowl XXII,” above (“the first African-American quarterback ever to start in an NFL league championship game, let alone a Super Bowl”). “Timmy Smith,” Wikipedia (204 yards in his first career start): https://en.wikipedia.org/wiki/Timmy_Smith↩︎

  19. “Body Bag Game,” Wikipedia (November 12, 1990; Eagles 28, Washington 14; nine Washington players injured, including quarterbacks Jeff Rutledge and Stan Humphries): https://en.wikipedia.org/wiki/Body_Bag_Game ; “1990–91 NFL playoffs,” Wikipedia (Washington 20, Philadelphia 6 in the wild-card round): https://en.wikipedia.org/wiki/1990%E2%80%9391_NFL_playoffs . “Buddy Ryan,” Wikipedia (fired by the Eagles on January 8, 1991, after going 43–35–1 and 0–3 in the playoffs), cited below; Deseret News/AP, “Buddy Ryan is canned as Eagle coach” (Jan. 8, 1991): https://www.deseret.com/1991/1/8/18899754/buddy-ryan-is-canned-as-eagle-coach/↩︎

  20. “Buddy Ryan,” Wikipedia (as Houston’s defensive coordinator, Ryan called the Oilers’ offense the “chuck and duck” and “attempted to punch” offensive coordinator Kevin Gilbride on the sideline on January 2, 1994, against the Jets): https://en.wikipedia.org/wiki/Buddy_Ryan . The run-and-shoot’s NFL teams and Warren Moon’s passing titles are sourced in Offensive Systems.↩︎

  21. Buffalo Bills, “Dec. 2 in Bills history: the birth of the K-Gun offense” (Buffalo’s attack “most often featured three receivers and a single running back,” with Kelly “in a ‘shotgun’ alignment a few yards behind the center”): https://www.buffalobills.com/news/dec-2-in-bills-history-the-birth-of-the-k-gun-offense-14479530 ; “Hurry-up offense,” Wikipedia (Kelly called and signalled the plays himself): https://en.wikipedia.org/wiki/Hurry-up_offense↩︎

  22. “Super Bowl XXV,” Wikipedia (Giants 20, Bills 19, January 27, 1991; Buffalo’s 13–3 record, 428 points and 51–3 AFC Championship win; the K-Gun’s 95 points in two playoff games; Belichick’s plan to “be physical with Buffalo’s wideouts, and play with extra defensive backs,” and his message that the Giants would win if Thomas ran for more than 100 yards, from David Halberstam’s The Education of a Coach; Thomas’s 135 rushing yards; the Giants’ Super Bowl record 40:33 time of possession; Belichick’s game plan in the Hall of Fame): https://en.wikipedia.org/wiki/Super_Bowl_XXV↩︎

  23. “Zone blitz,” Wikipedia (attributes the zone blitz to Arnsparger’s Dolphins): https://en.wikipedia.org/wiki/Zone_blitz ; “Dick LeBeau,” Wikipedia (Bengals defensive coordinator from 1984): https://en.wikipedia.org/wiki/Dick_LeBeau ; the Steelers’ 55 sacks in 1994 and the “Blitzburgh” nickname are sourced in Zone Blitzes; “1996 Carolina Panthers season,” Wikipedia (12–4, NFC West champions, beat Dallas 26–17, lost the NFC Championship Game 30–13 at Green Bay; Dom Capers head coach): https://en.wikipedia.org/wiki/1996_Carolina_Panthers_season↩︎

  24. Pro Football Hall of Fame, Chronology of Football, 1994 (“In a move to increase offensive production, NFL clubs … adopted a package of changes, including modifications in line play, chucking rules and the roughing-the-passer rule, plus the adoption of the two-point conversion and moving the spot of the kickoff back to the 30-yard line,” March 22): https://www.profootballhof.com/football-history/football-history/1980-1999/1994 ; “1994 NFL season,” Wikipedia (the neutral zone infraction adopted): https://en.wikipedia.org/wiki/1994_NFL_season ; Kevin Craft, “How a series of pass-friendly changes saved a moribund league,” Slate (Sept. 3, 2014) (the changes “included a renewed emphasis on prohibiting ‘downfield chucking,’” so that defensive backs could not jam receivers more than five yards downfield): https://www.slate.com/articles/sports/sports_nut/2014/09/_1994_nfl_rules_how_a_series_of_pass_friendly_changes_saved_a_moribund_league.html . The 1992 and 1993 scoring averages are from the Pro Football Reference table cited with the chart.↩︎

  25. “Two-point conversion,” Wikipedia (the AFL used it from 1960 to 1969; the NFL adopted it in 1994; “Tom Tupa scored the first two-point conversion in NFL history, running in a faked one-point attempt for the Cleveland Browns in a game against the Cincinnati Bengals in the first week” of the 1994 season): https://en.wikipedia.org/wiki/Two-point_conversion . College football adopted the two-point try in January 1958: “Two-point conversion turns 50,” NCAA News (Aug. 28, 2008): https://s3.amazonaws.com/ncaanewsarchive/2008/association-wide/two-point-conversion-turns-50—08-28-08—ncaa-news.html↩︎

  26. Course calculation from nflverse play-by-play (load_pbp), regular seasons 1999–2014: 18,592 extra-point kicks, 98.8% good; 1,041 two-point attempts, 46.9% successful (two_point_conv_result == "success"). The extra-point kick moved from the 2-yard line to the 15 in 2015.↩︎

  27. “Kickoff (gridiron football),” Wikipedia (“In 1994, after only 68% of kicks were returned the prior year, the kickoff was moved to the 30-yard line. This increased returns to 88% during the 1994 season”; the spot moved back to the 35 in 2011): https://en.wikipedia.org/wiki/Kickoff_(gridiron_football) . Return field position: course calculation from nflverse play-by-play, regular seasons 1999–2010 (kickoffs from the 30): of 22,169 returned kickoffs of 40 yards or more with no penalty, fumble or return touchdown, the return reached the receiving team’s 28.6 on average (median 27), against the 20 for a touchback (start = 70 − kick distance + return yards).↩︎

  28. “Free agent,” Wikipedia, section on the NFL (“Plan B free agency … active in the National Football League in February 1989 to 1992 … permitted all teams in the NFL to preserve limited rights of no more than 37 total players”; “Eight players sued … In 1992, a jury found that Plan B violated antitrust laws”; “The NFL’s current free agency system was introduced on March 1, 1993”; unrestricted free agents today have four or more accrued seasons): https://en.wikipedia.org/wiki/Free_agent ; Pro Football Hall of Fame, Chronology of Football, 1989 (229 Plan B free agents signed with new teams) and 1993 (January 6: settlement and “a seven-year deal that included a new player system”): https://www.profootballhof.com/football-history/football-history/1980-1999/1993 . The 1992 verdict (Sept. 10, 1992, McNeil v. NFL, eight plaintiffs including the Jets’ Freeman McNeil): UPI, “Jury rules in favor of NFL players: ‘Plan B is dead’”: https://www.upi.com/Archives/1992/09/10/Jury-rules-in-favor-of-NFL-players-Plan-B-is-dead/7494716097600/ ; the settled class action, White v. NFL, with Reggie White as lead plaintiff: NFLPA, “60 Heroes: Minister of Defense for Free Agency”: https://nflpa.com/posts/60-heroes-minister-of-defense-for-free-agency↩︎

  29. NFL Football Operations, “Types of free agents” (an accrued season requires full-pay status “for at least six regular-season games in a given season”; unrestricted: “four or more accrued seasons and an expired contract”; restricted: “three accrued seasons”; exclusive rights: “fewer than three accrued seasons,” who cannot negotiate with other teams if the old team offers a one-year minimum contract): https://operations.nfl.com/calendar-events/nfl-free-agency/types-of-free-agents↩︎

  30. “Reggie White,” Wikipedia (signed with Green Bay in 1993 for four years and $17 million, then the third-highest-paid player behind John Elway and Dan Marino; three sacks in Super Bowl XXXI, a single-game Super Bowl record): https://en.wikipedia.org/wiki/Reggie_White↩︎

  31. “Salary cap,” Wikipedia, NFL section (“The cap was first introduced for the 1994 season and was expected to be $32 million, but an unexpectedly high bid from Fox and other networks increased the cap to $34.6 million”; a hard cap; signing bonuses prorated over the contract): https://en.wikipedia.org/wiki/Salary_cap ; Pro Football Hall of Fame, Chronology of Football, 1993 (Fox’s new NFC package, December 18), cited above.↩︎

  32. ESPN/AP (Sept. 16, 2004): $950,000 and a 2005 third-round pick for “circumventing the salary cap between 1996-98” through agreements to defer salary with interest; no players named: https://www.espn.com/nfl/news/story?id=1883127 . An earlier penalty over the same years (a 2002 third-round pick and $968,000, under the league’s deferred-compensation rules, in a dispute that began over payments deferred to Terrell Davis and John Elway): UPI, “Broncos lose draft pick” (Dec. 5, 2001): https://www.upi.com/Sports_News/2001/12/05/Broncos-lose-draft-pick/76081007573596/ . Signing-bonus proration: “Salary cap,” Wikipedia, cited above; today’s maximum of five years is in the 2020 NFL–NFLPA Collective Bargaining Agreement, Article 13, Section 6(b)(i) (“The total amount of any signing bonus shall be prorated over the term of the Player Contract … with a maximum proration of five years”): https://overthecap.com/collective-bargaining-agreement/article/13↩︎

  33. “1998 Denver Broncos season,” Wikipedia (14–2; Terrell Davis 2,008 rushing yards; Super Bowl XXXIII, 34–19 over Atlanta, Elway MVP in his last game): https://en.wikipedia.org/wiki/1998_Denver_Broncos_season .↩︎

  34. “1998 Minnesota Vikings season,” Wikipedia (an NFL-record 556 points; rookie Randy Moss): https://en.wikipedia.org/wiki/1998_Minnesota_Vikings_season ; “Dennis Green,” Wikipedia (coached under Walsh at Stanford in 1977–78 and on the 49ers’ staff in 1979 and 1986–88; the 1998 Vikings lost the NFC Championship Game to Atlanta on an overtime field goal): https://en.wikipedia.org/wiki/Dennis_Green↩︎

  35. “Super Bowl XXV,” cited above, notes Super Bowl XXXIV (St. Louis 23, Tennessee 16) as the only other Super Bowl without a turnover; “Super Bowl XXXIV,” Wikipedia: https://en.wikipedia.org/wiki/Super_Bowl_XXXIV . Martz’s Coryell lineage: see the note on Coryell.↩︎

  36. Pro Football Hall of Fame, Chronology of Football, 1980–1999 (the 57-day strike of 1982 and the nine-game season; limited instant replay adopted in 1986 and dropped after 1991; the 24-day strike of 1987 and the replacement games; 229 Plan B free agents signed in 1989): https://www.profootballhof.com/football-history/football-history/1980-1999/1986 ; “Instant replay in American football,” Wikipedia (1986–1991; the current system with coaches’ challenges from 1999): https://en.wikipedia.org/wiki/Instant_replay_in_American_football ; “Dan Marino,” Wikipedia (5,084 passing yards in 1984, a record until 2011): https://en.wikipedia.org/wiki/Dan_Marino ; Fairbanks’s and Phillips’s 3-4s are sourced in Odd and Hybrid Fronts, and the run-and-shoot teams in Offensive Systems.↩︎

  37. Course calculation from FTN charting data via nflverse (load_ftn_charting([2025]), is_no_huddle): 7.8% of 47,316 charted 2025 plays.↩︎