Gap Schemes: Power, Counter, Duo, Trap, Wham, Iso, and the Draw

Why a guard runs sideways at the snap, and how an offense brings more blockers to one hole than the defense has defenders there

Show the Python (shared helpers for this chapter’s diagrams)
import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.patches import Circle, Ellipse, FancyArrowPatch, Rectangle, RegularPolygon
from gridiron import Play, Player, Field, technique, style

GREEN = "#0f7a55"         # darker step of the aqua highlight, for text on the light field
PURPLE = style.SERIES[6]  # a ring colour for pullers: neither offense blue nor defense orange
OL_W = {"LT": -3.2, "LG": -1.6, "C": 0.0, "RG": 1.6, "RT": 3.2}


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():
    """The five offensive linemen, labelled LT, LG, C, RG, RT."""
    return [O(k, k, -0.7, w, k) for k, w in OL_W.items()]


def te(side=1, key=None, label=None, d=-0.7):
    """An in-line tight end: Y on the right, U on the left."""
    key = key or ("Y" if side > 0 else "U")
    return O(key, "TE", d, side * 4.8, label or key)


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 dl(key, t, side, label=None):
    """A defensive lineman in technique t, labelled with the number."""
    return D(key, "DL", 1.0, T(t, side), label or t)


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 or run."""
    start = np.array(p._cur(key))
    pts = [tuple(np.array(q) - start) for q in (*via, end)]
    if kind == "block":
        return p.block(key, pts=pts, delay=delay, speed=speed)
    if kind == "pull":
        return p.pull(key, pts, 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.2, ha="center", weight="normal"):
    """A short on-field label at (d, w)."""
    x, y = _P(fld, p, d, w)
    fld.ax.text(x, y, text, fontsize=fontsize, color=color, ha=ha, va="center", zorder=9, fontweight=weight,
                bbox=dict(boxstyle="round,pad=0.18", fc=style.SURFACE, ec="none", alpha=0.9))


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 pair_oval(fld, p, d, w, width, height=2.5, color=GREEN):
    """A faint oval around a double team (two blockers and their defender)."""
    x, y = _P(fld, p, d, w)
    fld.ax.add_patch(Ellipse((float(x), float(y)), width, height, fc=color, alpha=0.22, ec="none", zorder=1.5))
    fld.ax.add_patch(Ellipse((float(x), float(y)), width, height, fc="none", ec=color, lw=1.6,
                             ls=(0, (4, 2)), zorder=1.6))


def spot(fld, p, d, w, color=style.THIRD, ms=9):
    """Mark a point (the hole, the point of attack) with an X."""
    x, y = _P(fld, p, d, w)
    fld.ax.plot([x], [y], marker="X", ms=ms, color=color, mec="white", mew=0.8, zorder=9)


def shade(fld, p, w0, w1, d0=-0.2, d1=6.5, color=style.THIRD, alpha=0.08):
    """Shade a rectangle from width w0 to w1 and depth d0 to d1 (the box, the play side)."""
    (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=0.9, ls=(0, (3, 2)), zorder=0.8))


def dashed(fld, p, pts, color=style.THIRD, lw=1.6, dash=(0, (3, 2.2)), end="arrow"):
    """A dashed 'option' or 'intent' path through absolute (d, w) points, ending in an arrow or a block bar."""
    xs, ys = _P(fld, p, np.array([q[0] for q in pts]), np.array([q[1] for q in pts]))
    if end == "arrow":
        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)
        v = np.array([xs[-1] - xs[-2], ys[-1] - ys[-2]])
        perp = np.array([-v[1], v[0]]) / np.linalg.norm(v) * 0.75
        fld.ax.plot([xs[-1] - perp[0], xs[-1] + perp[0]], [ys[-1] - perp[1], ys[-1] + perp[1]],
                    color=color, lw=lw + 0.6, zorder=6)


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


def draw(p, width_in=5.8, ax=None, **kw):
    """Play.draw, sized for the page, cleaned for a box-sized window."""
    fld = p.draw(width_in=width_in, ax=ax, **kw)
    clean(fld.ax)
    return fld


def subtitle(ax, text):
    ax.set_title(text, fontsize=9, loc="left", color=style.INK, fontweight="bold")


# --- formations and fronts this chapter keeps coming back to -----------------------------------------
def i_form(side=1):
    """I-formation, 21 personnel, with the tight end on `side` (wide receivers outside the picture)."""
    return line() + [O("QB", "QB", -1.9, 0, "Q"), O("FB", "FB", -4.9, 0, "F"), O("RB", "RB", -7.4, 0, "R"),
                     te(side)]


def pistol(y_side=0):
    """Pistol backfield (QB about 3.5 yards deep, RB behind him) with in-line tight ends:
    y_side=+1 the Y on the right, -1 the U on the left, 0 both."""
    off = line() + [O("QB", "QB", -3.5, 0, "Q"), O("RB", "RB", -7.0, 0, "R")]
    if y_side >= 0:
        off.append(te(+1))
    if y_side <= 0:
        off.append(te(-1))
    return off


def over_front(side=1, safeties=True):
    """A 4-3 Over (named in 05-02), strength toward `side`: on the line a 5, a 1, a 3 and a 5, with the
    Sam standing up in a wide 9 outside the tight end; the Mike over the strong A gap, the Will over the
    weak B gap; two deep safeties."""
    s = side
    out = [dl("WE", "5", -s), dl("NT", "1", -s), dl("DT", "3", s), dl("SE", "5", s),
           D("SAM", "SAM", 1.0, s * 7.0, "S"), D("MIKE", "MIKE", 4.6, s * 0.9, "M"),
           D("WILL", "WILL", 4.6, -s * 2.5, "W")]
    if safeties:
        out += [D("FS", "FS", 10.5, -s * 7.0, "FS"), D("SS", "SS", 10.5, s * 7.0, "SS")]
    return out


def four_three_base(sam=True):
    """A four-man even front, 5-1-3-5 from the offense's left, with the 3-technique to the right."""
    out = [dl("BE", "5", -1), dl("NT", "1", -1), dl("DT", "3", 1), dl("PE", "5", 1),
           D("WILL", "WILL", 4.6, -2.4, "W"), D("MIKE", "MIKE", 4.6, 0.9, "M")]
    if sam:
        out.append(D("SAM", "SAM", 4.2, 6.4, "S"))
    return out


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


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


def panel(ax, play, df, t, lateral, window, rings=()):
    """One moment of a simulated play on `ax`: markers, trails of on-screen players, 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.8, play.los + window[1] - 0.8)
                & cur["y"].between(ylo + 0.8, yhi - 0.8)]              # only players whose marker fits whole
    ids = set(shown["_id"])
    trails = df[(df["frameId"] <= fid) & df["_id"].isin(ids) & (df["side"] != "ball")
                & df["x"].between(play.los + window[0], play.los + window[1])]
    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.6)))
        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)), 0.95, fc="none", ec=col, lw=1.5, zorder=7))
    return fld


def strip(play, times, lateral, window, notes=None, rings=(), ncols=2, width_in=6.5):
    """Numbered frame strip with a fixed, box-sized window, so markers stay legible in print."""
    df = tracking(play)
    nrows = int(np.ceil(len(times) / ncols))
    pw = width_in / ncols
    span_w, span_d = lateral[1] - lateral[0], window[1] - window[0]
    fig, axes = plt.subplots(nrows, ncols, squeeze=False,
                             figsize=(width_in, nrows * (pw * span_d / span_w + (0.55 if notes else 0.25))))
    for ax in axes.flat[len(times):]:
        ax.axis("off")
    for i, (ax, t) in enumerate(zip(axes.flat, times)):
        panel(ax, play, df, t, lateral, window, rings)
        ax.set_title(f"{i + 1}.  " + ("snap" if abs(t) < 1e-6 else f"{t:+.2f} s".rstrip("0")),
                     fontsize=8.5, 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.4, color=style.INK)
    fig.tight_layout(h_pad=1.3 if notes else 0.6, w_pad=0.6)
    return fig


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

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

    anim = animation.FuncAnimation(fig, update, frames=sorted(df["frameId"].unique()), 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, times, **kw):
    """Video on the website; a numbered, captioned frame strip in the PDF."""
    if pdf_build():
        strip(play, times, **kw)
        plt.show()
    else:
        kw.pop("ncols", None)
        kw.pop("width_in", None)
        video(play, times, **kw)

Third-and-1, the offense in a heavy formation with a fullback and a tight end, everyone in the stadium knowing it will run. At the snap the right side of the offensive line fires inward, at an angle, away from where the ball is going. At the same instant the left guard, who should be blocking the man in front of him, turns and sprints sideways behind his own line. The fullback heads for the edge. The running back waits a beat, then follows the guard into a hole just outside the tight end, and the guard turns up into it and meets a linebacker head-on. Four yards, first down. The announcer says the offense “just lined up and ran it right at them.” True, but not the interesting part. Everyone knew where the ball was going, so how did the offense get more blockers to that spot than the defense had defenders? The answer is a family of plays coaches call gap schemes, and the guard who ran sideways is the key to every one of them.

You’ll be able to:

NoteYou’ll need
  • The Language of the Run Game: gaps A to D, technique numbers (a 3-technique on a guard’s outside shoulder, a 5 on a tackle’s outside shoulder, a 1 shaded on the center), covered and uncovered linemen, play side and backside, the point of attack, hat math, and the eight core blocks, especially the down block, the pull, the kick-out and the lead block. This chapter is built from those words.
  • Helpful but not required: Zone Running, the other great family of runs, which this chapter keeps comparing against; the I-formation and the fullback; and the stance tells from How to Watch a Broadcast.

How to read the diagrams. Offense is blue circles, defense orange squares, and the offense moves up the page. Left and right are always the offense’s left and right. LT, LG, C, RG and RT are the five offensive linemen; Q is the quarterback, R the running back (HB a halfback, in the 1960s sweep), F a fullback, and Y and U are tight ends on the right and left. H is the “move” player from Formation Rules: an H-back in some diagrams, a slot receiver in others; each caption says which. Defensive linemen carry their technique number; S, M and W are the Sam, Mike and Will linebackers; FS and SS the safeties; CB a cornerback; NB the nickel back. Lines ending in a short bar are blocks; plain arrows are paths; the thick dark arrow is the ball carrier. A purple ring marks a puller (or another extra blocker), the player this chapter wants you to follow. Most diagrams zoom in on the box, so the wide receivers (who keep the formation legal, with seven men on the line) are often outside the picture.

What makes a run a “gap” run?

In Zone Running the offensive line asked one question after the snap: who comes into my area? A gap scheme asks its question before the snap: which man do I block, and from which angle? That is why gap blocking is also called man or power blocking. A gap scheme (also man/power blocking) assigns each blocker a man or a gap in advance, picks those assignments to give blockers good angles, and brings extra blockers to a hole the coach chose before the snap.

That definition is the whole family resemblance, and it is worth reading twice, because it says nothing about pulling. What makes a run a gap run is that every blocker knows his man before the snap, and the hole is chosen in advance. Some gap runs pull two linemen; duo, iso and the draw pull nobody. They are still gap runs because their blockers are assigned to men, not areas.

The classic gap run (power, counter, the sweep) is assembled from three parts you met in 03-01, and the rest of the family drops or swaps one of them:

  1. Down blocks on the play side. The linemen at the point of attack block the defender inside them, hitting him from the side. A down block is the easiest block in football to win, because the blocker has an angle and the defender is looking straight ahead. Down blocks build the inside wall of the hole.
  2. A kick-out on the end man. Somebody (a fullback, an H-back, a pulling guard) hits the end man, the last defender on the line (the kick-out; Option Football gives the full rule for finding him), from the inside and drives him toward the sideline. That builds the outside wall.
  3. A puller through the hole. A lineman from the backside runs behind his own line, turns up between the two walls and blocks the first linebacker to show. He is the extra man.

Down blocks in, kick-out out, puller up through the middle. The hole is fixed and known to everyone on the offense, including the running back, who does not have to find it; he has to follow someone into it. Contrast zone, where the hole is wherever the wall cracks and the back’s read is half the play.

The lineman who leaves his spot is the puller: the guard (or tackle, or both) assigned to pull on this play. He is the most important player on the field for you to find, because a puller runs to the hole. The rest of this chapter is, in a sense, a catalogue of where pullers go.

ImportantWhy it exists

Gap schemes exist to win the numbers at the point of attack. A defense can always put as many men in the box as the offense has blockers, and usually one more (hat math). It cannot be equally strong everywhere, though, and it has to line up before it knows where the ball is going. A gap scheme picks one spot, then moves blockers there from elsewhere (a backside guard, a fullback) faster than the defense can move defenders there. It pays for those men by leaving someone away from the play unblocked, and by being more predictable: a pulling guard is a signpost. Every gap play in this chapter is a different answer to the same two questions: where do the extra blockers come from, and who is left free?

Power: the play the whole family is built on

Power (often called Power O) is the purest gap run, and the one to learn first. Here it is from the I-formation (a fullback behind the quarterback and the tailback behind him) against a 4-3 Over, a four-man front whose 3-technique lines up on the side of the tight end (fronts are named and explained in Even Fronts; here it is just a set of numbers to block). Read it from the right, the play side, to the left. The hole is off-tackle, the old name for “just outside the tackle”: here that is the D gap, outside where the tight end lined up (with no tight end on that side, the same play hits the C gap).

Walk through Figure 17.1 one man at a time, because each assignment exists for a reason.

The play-side wall: down blocks. The tight end blocks down on the 5-technique inside him, and the right tackle blocks down on the 3-technique inside him. Neither has to beat a defender lined up across from him; each hits a man from the side, which is why gap teams love the down block. The right guard joins the tackle on the 3-technique for a moment, a combo block, and then climbs to the backside linebacker, the Will. Coaches teach these linemen one short rule, usually some version of gap, down, backer: if a defender is in your inside gap, block him; if not, block down on the man over the lineman inside you; if nobody is there, go to a linebacker.1 The rule means a play-side lineman never has to reach a man lined up outside him.

The center blocks back. The left guard is about to leave. The defensive lineman who was across from the gap he leaves, here the 1-technique, would walk into the backfield, so the center blocks back on him, away from the play. Because the 1 is shaded on the center’s backside shoulder, it is another easy angle. This is not a coincidence: coaches like to call power toward a 3-technique and away from a 1-technique for exactly these angles.

Show the Python
def power_play():
    p = Play(i_form(), over_front(), los=35, to_go=None, title="Power right vs a 4-3 Over")
    go_to(p, "Y", (0.5, 4.3), via=[(-0.3, 4.75)])                       # down on the 5
    go_to(p, "RT", (0.4, 2.8), via=[(-0.3, 3.05)])                      # down on the 3 ...
    go_to(p, "RG", (3.6, -1.6), via=[(0.05, 2.0)])                      # ... with the RG, who climbs to the Will
    go_to(p, "C", (0.35, -0.3), via=[(-0.45, -0.15)])                   # back block on the 1
    go_to(p, "LT", (-1.9, -3.7), via=[(-1.0, -2.6)])                    # hinge
    go_to(p, "LG", (2.7, 5.5), "pull", via=[(-1.7, -1.3), (-3.4, 0.2), (-3.4, 3.4), (-1.9, 5.7)])
    go_to(p, "FB", (0.35, 6.45), via=[(-3.6, 5.2), (-2.2, 7.4)], speed=5.0)  # kick out the Sam
    go_to(p, "MIKE", (3.5, 4.9), "path", speed=4.0)                     # the Mike scrapes to the hole
    go_to(p, "RB", (5.0, 4.9), "run", via=[(-5.7, 1.2), (-3.0, 4.6), (0.4, 5.2), (2.0, 4.8)])
    return p


p = power_play()
p.highlight("LG", color=PURPLE); p.highlight("WE", color=style.DEFENSE)
f = draw(p, width_in=5.9, lateral=(-8.8, 11.0), window=(-9.0, 12.0))
pair_oval(f, p, 0.2, 2.35, 3.4, 2.6)
spot(f, p, 1.5, 5.4)
point_to(f, p, (-5.4, -4.6), (-1.7, -1.3), "backside guard\npulls (the puller)", color=PURPLE, fontsize=6.8)
point_to(f, p, (3.4, -5.4), (1.0, -4.0), "unblocked: the LT's\nhinge only gets\nin his way", color=style.DEFENSE_DARK,
         fontsize=6.6)
point_to(f, p, (-3.8, 9.3), (0.35, 6.9), "F kicks out\nthe S", fontsize=6.8)
point_to(f, p, (7.6, 8.2), (2.6, 5.2), "puller leads\nup on the Mike", color=PURPLE, fontsize=6.8)
point_to(f, p, (7.6, 1.6), (1.4, 2.35), "RT + RG double the 3;\nthen the RG climbs to the W", fontsize=6.6, shrink=14)
plt.show()
Figure 17.1: Power right against a 4-3 Over. Three lines leave the backfield and stay separate: the pulling left guard (purple ring) tightest, the fullback widest, kicking out the Sam, and the running back’s thick arrow between them, a step behind the guard. Notice the hole (green X): inside wall from the down blocks, outside wall from the kick-out. The one defender nobody blocks is the backside end (orange ring), the farthest from the ball.

The kick-out. The fullback runs at the end man (here the Sam, standing up on the line outside the tight end in a 9-technique) and hits him from the inside, driving him toward the sideline. The fullback does not need to win big. If the Sam stays outside, the hole is inside him.

The puller. The left guard opens his hips toward the play with a short step back and out (coaches call it a bucket step or a skip pull), sprints flat behind the center and the right side, staying tight to his teammates’ down blocks (“hug the down blocks”), and turns up into the hole, just outside the tight end’s down block and inside the kick-out, with his eyes inside for the first defender who appears. His man is the first linebacker who shows, almost always the play-side linebacker (the Mike here) coming to fill. The running back follows him, aiming his first steps at the tight end’s outside hip and staying a step behind the guard’s back, then cutting off the guard’s block.

The backside. With the guard gone, the left tackle hinges: he steps inside to close the B gap the guard left, then swings back outside like a door closing, to keep the backside end from running straight down the line. He does not try to drive the end anywhere. The end is the one defender power chooses not to block. That is the deal at the heart of the play.

Where power’s extra blockers come from

Count the bodies, as in hat math, and power’s logic becomes arithmetic.

Show the Python
p = Play(i_form(), over_front(safeties=False), los=35, to_go=None, title="Where power's extra blockers come from")
go_to(p, "LG", (-0.6, 5.6), "pull", via=[(-1.7, -1.3), (-3.4, 0.2), (-3.4, 3.4), (-1.9, 5.7)])
go_to(p, "FB", (0.35, 6.45), via=[(-3.6, 5.2), (-2.2, 7.4)], speed=5.0)
p.highlight("LG", color=PURPLE); p.highlight("FB", color=PURPLE); p.highlight("WE", color=style.DEFENSE)
f = draw(p, width_in=5.6, lateral=(-9.2, 10.2), window=(-9.0, 9.0))
shade(f, p, 0.6, 8.8, d0=-6.0, d1=6.4)
say(f, p, 5.4, 7.0, "play side", color=GREEN, fontsize=7.5, weight="bold")
say(f, p, -4.0, 6.9, "before the snap:\n3 blockers (RG, RT, Y)\nvs 4 defenders (3, 5, S, M)", fontsize=6.6)
say(f, p, 5.6, -5.8, "after the snap:\n+ the puller (LG)\n+ the fullback (F)\n= a hat on all four,\nwith one to spare", color=PURPLE,
    fontsize=6.6)
point_to(f, p, (-3.8, -6.2), (1.0, -4.0), "the price: the\nbackside end is\nleft unblocked", color=style.DEFENSE_DARK,
         fontsize=6.6)
plt.show()
Figure 17.2: Power’s arithmetic, against the same 4-3 Over. Before the snap the play side (shaded) has three blockers for four defenders. The pulling guard and the fullback (purple rings) bring it to five for four. The price is the backside end (orange ring).

Figure 17.2 is the reason gap schemes exist. Before the snap, the side the offense wants to run to has three blockers and four defenders. Run zone that way and somebody has to beat a man he is outnumbered against. Run power and two blockers who started on the other side of the ball arrive at the point of attack within a second. Now count the assignments, because that is where the extra man shows up:

  • the Y takes the 5, the fullback takes the Sam, the pulling guard takes the Mike;
  • the right tackle takes the 3, and the right guard helps him: that double team is the spare blocker.

Five blockers for four defenders means one man to spare, and power spends him in two installments: first as half of a double team that drives the 3-technique off the ball, then, once the 3 is moving, as the blocker who climbs off it to the backside linebacker, the Will. The defense cannot match that move, because its players learn where the ball is going only when the snap shows them, while the offense knew before the huddle broke.

Now the whole box. The offense has seven blockers (five linemen, the Y and the fullback) against seven defenders (four linemen and three linebackers). The center takes the 1, the right guard’s climb takes the Will, and the left tackle’s hinge is a hat spent on nobody: he only closes the gap the guard left. So one defender is left over, and power makes sure it is the backside end. Power does not add a blocker to the box. It moves one, and the backside end is the receipt. It is betting that a defender who lines up farthest from the hole, and has to run down the line behind a wall of bodies, will arrive too late. Most of the time he does. When the defense knows that and sends that end screaming down the line at the snap, the offense has answers (a quarterback who keeps the ball and runs where the end left, in Option Football; a bootleg pass behind him, in Play-Action, Boots and Screens).

The rest of the offense has jobs too, small but real. The quarterback opens, hands off and keeps carrying out a fake; on many teams he then sells a bootleg away from the play, which is what keeps the free backside end honest. The wide receivers, out of the picture here, block the men over them (usually a cornerback and a safety) so that the run does not end at the second level. And the defense’s usual answer to power, which Run Fits and Box Math builds in full, is to attack the pullers: an end or linebacker who meets the kick-out or the puller inside, so the ball has to bounce outside to a fast safety, plus that free backside end chasing from behind.

CautionCommon misconception

“Power works because the offensive line is bigger and stronger.” Strength helps, but the play is designed so that nobody has to win a fair fight. The down blocks hit men from the side; the kick-out hits the end man from inside, where he is not looking; the puller arrives as an extra man. What power needs is not the biggest line but a line that can pull: a guard who can run ten yards laterally and still hit a linebacker. That is why gap-scheme teams prize athletic guards as much as heavy ones.

The “O” in Power O is not explained consistently from one coaching tree to the next, so do not read much into it.

The same rules against a different front

The diagrams so far are power against one front, but the line does not memorize a picture; it carries rules. Change the front and the rules redraw the play. Figure 17.3 is power’s call against a defense that puts its 3-technique on the backside, over the guard who was supposed to pull, and it is drawn from the shotgun with an H-back as the kick-out man, the version you will see most on Sunday (only about one NFL snap in ten has a fullback or a second back on the field; see the iso section below).

Show the Python
off = line() + [te(+1), O("QB", "QB", -5.0, 0, "Q"), O("RB", "RB", -5.0, -1.8, "R"), O("H", "TE", -5.0, 2.0, "H")]
dfn = [dl("WE", "5", -1), dl("DT", "3", -1), dl("NT", "1", +1), dl("SE", "5", +1), D("SAM", "SAM", 1.0, 7.0, "S"),
       D("MIKE", "MIKE", 4.6, 1.6, "M"), D("WILL", "WILL", 4.6, -1.6, "W")]
p = Play(off, dfn, los=35, to_go=None, title="Power's rules vs a backside 3: the tackle pulls (dart)")
go_to(p, "Y", (0.5, 4.3), via=[(-0.3, 4.75)])                       # down on the 5
go_to(p, "RG", (0.35, 1.0), via=[(-0.3, 1.3)])                      # the 1 is in his gap: down on him
go_to(p, "RT", (3.7, -1.2), via=[(0.0, 2.6)])                       # nothing in his gap or over the RG: backer
go_to(p, "LG", (0.35, -2.2), via=[(-0.3, -1.9)])                    # stays home on the backside 3
go_to(p, "C", (0.2, -1.4), via=[(-0.45, -0.6)])                     # helps the LG on the 3
go_to(p, "LT", (2.8, 5.0), "pull", via=[(-1.3, -3.6), (-3.0, -2.2), (-3.1, 3.0), (-1.7, 5.6)])   # pulls for the Mike
go_to(p, "H", (0.4, 6.45), via=[(-3.0, 5.4), (-1.4, 6.6)], speed=5.0)   # kicks out the Sam
go_to(p, "MIKE", (3.6, 4.2), "path", speed=4.0)
go_to(p, "RB", (5.4, 5.2), "run", via=[(-4.0, -0.4), (-3.8, 2.6), (-0.4, 5.5)])
p.highlight("LT", color=PURPLE); p.highlight("WE", color=style.DEFENSE)
f = draw(p, width_in=5.8, lateral=(-9.4, 11.0), window=(-8.4, 9.4))
point_to(f, p, (5.6, -6.2), (1.0, -2.35), "backside 3: the C\ncan't reach him, so\nthe LG stays home", fontsize=6.6,
         color=style.DEFENSE_DARK)
point_to(f, p, (-6.6, -3.6), (-2.2, -3.0), "so the LT pulls\ninstead (dart)", color=PURPLE, fontsize=6.6)
point_to(f, p, (-5.4, 8.4), (0.4, 6.6), "H-back kicks\nout the S", fontsize=6.6)
point_to(f, p, (-2.6, -7.8), (1.0, -4.0), "still free:\nthe backside end", color=style.DEFENSE_DARK, fontsize=6.6)
plt.show()
Figure 17.3: Power’s rules against a backside 3-technique, from the shotgun. Play side, gap-down-backer still works: the Y blocks down on the 5, the RG blocks down on the 1 in his gap, and the RT, with nobody to block down on, goes to the backside linebacker. But the center cannot block back on a 3-technique lined up over the guard, so the left guard stays home on him and the left tackle pulls instead, a variant many teams call dart. The H-back kicks out the Sam. The free man is still the backside end.

Walk the rules and the play draws itself. On the play side nothing changes in principle: the Y has a man in his inside gap (the 5), so he blocks down; the right guard has the 1 in his gap, so he blocks down on him; the right tackle has nobody in his gap and nobody over the guard beside him, so the third word of the rule sends him to a linebacker, the backside one. The problem is the backside. The center can block back on a 1-technique shaded on him, but a 3-technique sits outside the guard, two gaps away, and a center cannot get there. If the left guard pulled anyway, the 3 would be loose in the backfield, right in the path of the puller and the back. So the offense keeps the guard home and pulls the tackle, a version many coaches call dart or “tackle power.”2 The price is distance: the tackle has farther to run, so dart needs an athletic tackle. Other answers to the same front are to check to a different run or to run power the other way, at the 3.

Counter: the same blocks, a different first step

Power has one weakness that defenses learn quickly: the running back’s first step points at the hole, and so does the puller. A linebacker who reads both is moving toward the hole before the guard gets there. Counter attacks that reflex. It starts with the back stepping the wrong way, and it pulls two backside blockers the right way: classically the guard, who kicks out the end man, and the tackle, who wraps, swinging around the guard’s kick-out and up through the hole as the lead blocker. (The tackle is not throwing a log block here; “wrap” is a word coaches use loosely, as the log-block section below explains.) The guard-and-tackle version is called GT counter, GT for guard and tackle, and its most famous name is the counter trey of Joe Gibbs’s Washington teams. Where “trey” came from is not well documented; treat it as a name rather than a description.

Compare Figure 17.4 with Figure 17.1. The play side follows the same rules, though the picture differs because the front does: there is no tight end or Sam on the right here, so the right tackle blocks down on the 3-technique, the right guard climbs to the backside linebacker, the center blocks back on the 1, and the end man is the 5-technique himself. What changed is who supplies the extra men. Instead of a fullback for the kick-out, the backside guard does it; instead of the guard leading through the hole, the backside tackle does. Two linemen leave the backside, so something has to fill the space they left: here the U tight end blocks the backside end, and in other versions an H-back fills, or the end is simply left for the quarterback to read.

Count it the way you counted power. The defense has six in the box (four linemen, two linebackers) and keeps two safeties deep. The offense has six blockers: five linemen and the U. RT on the 3, the pulling guard on the 5, the pulling tackle on the Mike, the right guard on the Will, the center on the 1, the U on the backside end: a hat on every defender in the box. Against this two-high front, counter does not even leave the backside end free; the free men are the two safeties, ten yards away, and the back’s job is to make them miss.

And the running back’s first step goes away. That counter step, a single lateral jab in the wrong direction, is the whole trick. Linebackers are taught to read the back and the guards. On counter the back says left while the guards say right, and a linebacker who trusts his eyes takes one false step toward the back, which is all the pulling tackle needs to arrive first. In the simulation the Mike’s first steps go toward the back’s jab (frame 1), and by the time he corrects, the tackle is already in the hole.

Counter has a price too. Two pullers take longer to arrive than one, so the back’s counter step is partly a way to buy time: the ball cannot hit the hole before the blockers do. If a defensive lineman penetrates into the space the pullers must run through, he can wreck both pullers at once. And a defense that keys the guards (watches them for its cue) and ignores the back is not fooled at all, which is why offenses mix counter with power, zone, and fakes of all of them.

Show the Python
def counter_play():
    """GT counter right from the shotgun, U tight end on the left, against a 5-1-3-5 even front."""
    off = line() + [te(-1), O("QB", "QB", -5.0, 0, "Q"), O("RB", "RB", -5.0, -1.6, "R")]
    dfn = [dl("BE", "5", -1), dl("NT", "1", -1), dl("DT", "3", 1), dl("PE", "5", 1),
           D("WILL", "WILL", 4.6, -2.2, "W"), D("MIKE", "MIKE", 4.6, 1.4, "M"),
           D("FS", "FS", 11.0, -7.5, "FS"), D("SS", "SS", 11.0, 7.5, "SS")]
    p = Play(off, dfn, los=35, to_go=None)
    # defense: the end rushes upfield, the tackles fight their blocks, the linebackers read and flow
    go_to(p, "PE", (-0.2, 4.7), "path", speed=2.6)                       # upfield ...
    go_to(p, "PE", (0.6, 7.7), "path", speed=2.6, delay=0.85)           # ... and kicked out
    go_to(p, "DT", (1.0, 1.7), "path", speed=1.2, delay=0.2)             # driven inside by the down block
    go_to(p, "NT", (0.9, -0.9), "path", speed=0.6)
    go_to(p, "BE", (0.6, -4.3), "path", speed=0.8)
    go_to(p, "MIKE", (4.3, -0.5), "path", speed=3.2)                     # first steps follow the back's jab
    go_to(p, "MIKE", (3.2, 3.1), "path", speed=3.6, delay=0.15)          # then fills toward the hole
    go_to(p, "WILL", (3.9, -2.9), "path", speed=2.0)
    go_to(p, "WILL", (3.0, 0.4), "path", speed=3.5, delay=0.2)
    go_to(p, "SS", (7.0, 6.0), "path", speed=3.0, delay=0.6)
    go_to(p, "FS", (9.0, -2.5), "path", speed=3.0, delay=0.6)
    # offense
    go_to(p, "RT", (0.4, 2.9), via=[(-0.4, 3.1)], speed=2.0)             # down on the 3
    go_to(p, "RT", (0.6, 2.3), speed=0.8)
    go_to(p, "RG", (2.2, 0.0), via=[(-0.2, 1.3)], speed=2.4)             # up to the Will
    go_to(p, "C", (0.15, -0.25), via=[(-0.5, -0.3)], speed=1.6)          # back block on the 1
    go_to(p, "U", (0.0, -3.8), via=[(-0.5, -4.6)], speed=1.6)            # fills for the pulled tackle
    go_to(p, "LG", (-0.6, 4.3), "pull", via=[(-1.6, -1.5), (-1.9, 2.8)], speed=5.3)   # kick out the end
    go_to(p, "LG", (-0.1, 6.8), speed=2.4)
    go_to(p, "LT", (2.4, 3.6), "pull", via=[(-1.5, -3.0), (-2.6, -1.6), (-2.6, 2.6), (-0.6, 4.4)], speed=6.0)
    go_to(p, "QB", (-5.2, 0.3), "path", speed=0.5)                       # rides the mesh
    go_to(p, "RB", (-5.2, -2.7), "run", speed=4.0)                       # counter step away
    go_to(p, "RB", (5.4, 5.0), "run", speed=6.0, delay=0.4, via=[(-4.4, -0.1), (-3.0, 2.6), (-0.6, 4.7)])
    p.handoff("RB", t=1.02)
    return p


animation_or_strip(counter_play(), [0.45, 1.15, 1.8, 2.55], lateral=(-6.2, 10.0), window=(-6.4, 6.0),
                   ncols=2, width_in=6.4,
                   notes=["R jabs left; LG and LT pull right;\nthe Mike steps toward the jab",
                          "handoff; the LG nears the end man",
                          "LG kicks the 5 out; LT turns up inside him",
                          "LT meets the Mike; R follows him"],
                   rings=(("RB", style.THIRD), ("LG", PURPLE), ("LT", PURPLE)))
Figure 17.4: GT counter right from the shotgun against an even front (simulated, BDB-format tracking; faint lines are each player’s path so far). The back (green ring) starts offset left with the U tight end on the left. Follow the two purple rings: the left guard kicks the 5 out toward the sideline, and the left tackle swings around him and up onto the Mike, whose first steps went the wrong way, toward the back’s jab.
NoteFilm room: Washington, 1983 season

The play: Gibbs installed the counter trey in his first season, 1981, and ran it for a decade. The Washington version pulled the left guard and left tackle (Russ Grimm and Joe Jacoby, two of the original Hogs) to the right, while the right side blocked down as if the play were going left and the back jabbed left before taking the handoff going right. Gibbs himself credited Tom Osborne’s Nebraska teams: his staff watched Nebraska film, liked what Osborne’s line was doing, “so, we stole it.” (Nebraska’s counter is usually dated to its 1982 season, a year after Gibbs arrived, so accounts of exactly which came first differ.)3

The season: in 1983, behind that line, 34-year-old John Riggins ran for 1,347 yards and 24 rushing touchdowns, then the NFL record, for a team that went 14–2.4

What to notice: on any Washington run from those seasons, ignore the ball and watch numbers 68 and 66 on the left side. If both of them pull right, it is the counter trey, and you can call the hole (just outside the right tackle’s down block) before the back even turns back toward it.

Counter comes in many flavors that keep the same skeleton, and playbooks name them by the pullers: GT counter pulls the guard and tackle; GH or GY counter pulls the guard and an H-back or tight end (Y), which spares the tackle the long trip and leaves him home to block the backside end.5 Some teams run it from the shotgun with the quarterback reading the backside end instead of blocking him (Option Football covers those reads); some run it as the quarterback’s own run. When you see two blockers pull the same way after the back has stepped the other way, think counter first.

New block: the log

Every kick-out has an assumption hidden in it: that the end man will stay outside, where there is room to drive him toward the sideline. Defenses do not always oblige, and Zone Running already gave you their two plans for meeting a blocker. With box (also called squeeze), the end squeezes down inside as the man beside him blocks down, but keeps his outside arm free, so the ball has to go back inside him. With spill, the end attacks the kick-out man’s inside half with his outside shoulder (coaches call this wrong-arming or wrong-shouldering the blocker), giving up the outside on purpose to pile up the hole, so the ball has to bounce outside to a teammate waiting there. Choosing between them is a big part of Run Fits and Box Math.

So the kick-out man reads the end as he arrives. He aims for the end’s inside number. If he can get his head inside the defender, he kicks him out and the ball goes inside. If the end has crashed so far inside (a hard squeeze, or a spill player wrong-arming) that the blocker cannot get his head inside, there is no “out” left to kick him toward, so he throws a log block: he takes the defender’s outside shoulder, gets his head and body outside him, seals him in, and the ball carrier bounces outside the block. Some line coaches call this wrapping or logging the end; others use wrap for any puller who swings around a block in front of him and turns up, like the counter tackle above. Either way, the defender decides where the hole is, and the blockers and the back read him.

Who reads him depends on the play. On power the kick-out man is the fullback or H-back, and the pulling guard turns up off whatever the fullback does; on counter the kick-out man is the pulling guard, and the tackle behind him does the same. The lead puller always goes to the hole the kick-out man leaves.

Show the Python
def ghost(f, p, frm, to, label="5"):
    """The end man's pre-snap spot (dashed outline) and an orange arrow to where he is when the puller arrives."""
    x, y = _P(f, p, *frm)
    f.ax.add_patch(RegularPolygon((float(x), float(y)), 4, radius=0.75 * 1.3, orientation=np.pi / 4, fc="none",
                                  ec=style.DEFENSE, lw=1.0, ls=(0, (2, 1.5)), zorder=5))
    f.ax.text(float(x), float(y), label, ha="center", va="center", fontsize=7, color=style.DEFENSE, alpha=0.7, zorder=5)
    dashed(f, p, [frm, to], color=style.DEFENSE, lw=1.3)


def kl_play(crash):
    """Counter right, the moment the pulling guard reaches the end man: he stayed wide, or he crashed inside."""
    end = (0.45, 4.35) if crash else (-0.4, 5.7)
    off = [O("C", "C", -0.7, 0.0, "C"), O("RG", "RG", -0.7, 1.6, "RG"), O("RT", "RT", -0.7, 3.2, "RT"),
           O("LG", "LG", -0.7, -1.6, "LG"), O("RB", "RB", -5.0, -0.6, "R")]
    dfn = [dl("DT", "3", 1), D("PE", "DL", *end, "5")]
    p = Play(off, dfn, los=35, to_go=None)
    go_to(p, "RT", (0.4, 2.75), via=[(-0.3, 3.05)])                     # RT and RG double the 3
    go_to(p, "RG", (0.3, 1.85), via=[(-0.3, 1.75)])
    if not crash:            # the end stayed outside: hit him from the inside and drive him out
        go_to(p, "LG", (-1.0, 4.75), "pull", via=[(-1.7, -1.0), (-2.1, 1.6), (-2.0, 3.6)])
        go_to(p, "RB", (4.4, 4.3), "run", via=[(-3.8, 0.6), (-2.4, 3.0), (-0.2, 4.0)])
    else:                    # the end crashed inside: get outside him and seal him in (log)
        go_to(p, "LG", (0.3, 5.35), "pull", via=[(-1.7, -1.0), (-2.1, 1.6), (-2.2, 4.4), (-1.0, 6.2)])
        go_to(p, "RB", (4.4, 7.3), "run", via=[(-3.8, 0.6), (-3.0, 3.6), (-2.0, 6.4), (0.4, 7.0)])
    p.highlight("LG", color=PURPLE)
    return p


fig, axes = plt.subplots(1, 2, figsize=(6.4, 3.6))
for ax, crash, ttl in [(axes[0], False, "End stays wide: kick him out"), (axes[1], True, "End crashes inside: log him")]:
    p = kl_play(crash)
    f = draw(p, ax=ax, lateral=(-2.8, 9.0), window=(-6.2, 5.4), title=False)
    ghost(f, p, (1.0, 4.0), (p.players["PE"].d + (0.35 if crash else 0.45), p.players["PE"].w + (0.75 if crash else -0.5)))
    subtitle(ax, ttl)
    if crash:
        say(f, p, 3.2, 3.6, "ball bounces\noutside", color=GREEN, fontsize=6.8)
        say(f, p, -4.4, 5.6, "puller gets his\nhead outside\nand seals in", color=PURPLE, fontsize=6.6)
    else:
        say(f, p, 3.2, 6.9, "ball cuts\ninside him", color=GREEN, fontsize=6.8)
        say(f, p, -4.4, 5.6, "puller hits him\nfrom the inside\nand drives out", color=PURPLE, fontsize=6.6)
fig.tight_layout(w_pad=0.8)
plt.show()
Figure 17.5: Kick or log, on counter, where the pulling guard (purple ring) is the kick-out man. The dashed square is the end’s alignment and the solid one is where he is when the guard arrives. Left: he rushed upfield and stayed wide, so the guard’s block lands on his inside and the back cuts inside him. Right: he crashed inside as the tackle blocked down, so the guard’s block lands on his outside shoulder (a log) and the back bounces outside. Same play, same puller; the defender chose the hole.

This is why gap runs are not as rigid as they look on a whiteboard. The assignments are fixed before the snap; the hole still moves a yard or two depending on what the end man does, and the back’s eyes are on the kick-out man’s helmet. The back runs to the side the helmet is on: head inside the defender (a kick-out), cut inside; head outside him (a log), bounce outside.

Duo: power without a puller

Not every gap run pulls anybody. Duo is the downhill, no-frills member of the family, and the one that manufactures nobody: two double teams (hence the name) drive the two defensive tackles straight back, every other blocker takes the man in front of him, and nobody moves sideways. It is still a gap run, because every blocker knows his man before the snap and the back is aimed at a hole chosen in advance. It looks like inside zone for the first instant, which is part of the point, but the footwork is different: zone linemen step sideways toward the play; duo linemen step forward, into the defenders, and the double teams stay on the defensive tackles longer, trying to move them back a yard or two before anyone climbs.

Show the Python
off = line() + [te(+1), O("QB", "QB", -1.9, 0, "Q"), O("RB", "RB", -7.0, 0, "R"), O("H", "WR", -1.5, -8.5, "H")]
dfn = [dl("BE", "5", -1), dl("NT", "1", -1), dl("DT", "3", 1), dl("PE", "7", 1),
       D("WILL", "WILL", 4.8, -2.2, "W"), D("MIKE", "MIKE", 4.8, 1.2, "M"), D("NB", "NB", 4.5, -8.0, "NB"),
       D("FS", "FS", 12.5, -7.5, "FS"), D("SS", "SS", 12.5, 7.5, "SS")]
p = Play(off, dfn, los=35, to_go=None, title="Duo vs two-high")
for k, end, via in [("LG", (0.35, -1.1), (-0.3, -1.45)), ("C", (0.35, -0.3), (-0.3, -0.2)),
                    ("RG", (0.35, 1.95), (-0.3, 1.7)), ("RT", (0.35, 2.8), (-0.3, 3.05)),
                    ("Y", (0.35, 4.65), (-0.3, 4.8)), ("LT", (0.35, -3.6), (-0.3, -3.4))]:
    go_to(p, k, end, via=[via])
go_to(p, "RB", (-2.6, 0.9), "run", via=[(-4.4, 0.45)])
p.highlight("RB")
f = draw(p, width_in=5.4, lateral=(-10.6, 10.6), window=(-8.6, 14.4))
pair_oval(f, p, 0.2, -0.75, 3.2, 3.0)
pair_oval(f, p, 0.2, 2.4, 3.2, 3.0)
for pts in ([(1.4, -1.0), (4.0, -2.0)], [(1.4, 2.2), (4.0, 1.4)]):
    dashed(f, p, pts, color=GREEN, end="bar", lw=1.4)
for pts in ([(-2.6, 0.9), (2.8, 0.75)], [(-2.6, 0.9), (2.6, 2.4)]):
    dashed(f, p, pts, color=style.OFFENSE_DARK, lw=1.4)
shade(f, p, -5.6, 5.8, d0=-0.2, d1=6.6)
say(f, p, 8.6, -1.0, "6 in the box vs 6 blockers", color=GREEN, fontsize=7.0, weight="bold")
say(f, p, 9.4, 7.0, "two deep safeties:\na light box", fontsize=6.8)
point_to(f, p, (-3.6, 4.6), (-2.9, 0.9), "R presses the doubles\nand reads the Mike", color=GREEN, fontsize=6.8)
say(f, p, -4.6, -6.6, "doubles drive the tackles\nback, then one man climbs\nto whichever LB fills",
    color=GREEN, fontsize=6.4)
plt.show()
Figure 17.6: Duo against a two-high nickel defense (H is the slot receiver): six in the box against six blockers. Two double teams (green ovals) drive the tackles straight back, and the double teams own the linebackers: whichever backer attacks decides which man comes off (green dashes). The back presses the doubles and reads the Mike: the A gap if the Mike fills outside, or bounce to the B gap, off the double on the 3, if he fills inside.

Where do duo’s extra blockers come from, if nobody pulls? From the defense’s own choice. Look at the box in Figure 17.6: six defenders against six blockers, with two safeties sitting 12 yards deep. Against a defense that keeps two safeties high to protect against the pass (a light box), the offense already has a hat for every hat, and it does not need to manufacture one. What it needs is movement, someone driven backward so the back can fall forward for four yards, and two double teams on the two biggest defenders are the most direct way to get it. Duo does not fool anyone. It is a bet that your five linemen and a tight end can move their six, and that your running back can make the last man miss.

The running back’s job is the subtle part. Since the linemen block the defensive linemen first and climb late, the linebackers are, for a beat, unaccounted for, and the back is the one who “blocks” them with his path. The double teams own them: the double on the 1 owns the Will, the double on the 3 owns the Mike, and whichever way a backer attacks decides which lineman comes off to meet him. The back presses the double teams, aiming at the A gap between them, and watches the Mike. If the Mike fills the A gap, the back bounces to the B gap off the double on the 3; if the Mike fills outside, the back stays in the A gap. It is a read, like zone’s, but a vertical one: the back is choosing which side of a double team to run past, not whether to cut back across the field.

That difference is also how you tell duo from inside zone on the broadcast, where the two look alike for a heartbeat (both start with double teams and no pullers). Watch the line’s first step from the high end-zone camera: on inside zone every lineman steps sideways toward the play together, so the whole line drifts; on duo the linemen step straight ahead and the double teams stay on the tackles longer, so the line surges without drifting. Then watch the back: on duo he runs straight downhill at the doubles; on inside zone his path angles toward the play side before he reads.

Duo’s trade is plain. It needs blockers who can move people straight back, and it does nothing to the numbers: against a seventh or eighth defender in the box, there is nobody to block him. That makes duo a two-high play, and its rise in the last decade tracks the rise of two-high defenses: when defenses take a safety out of the box to stop the pass, offenses answer by running straight at the six who are left. NFL Next Gen Stats measured split-safety coverage on 42% of plays in 2025, the most since its tracking began in 2018, which tells you how many light boxes NFL offenses now see.6

NoteFilm room: Tennessee Titans 2020

The season: Derrick Henry carried 378 times for 2,027 yards and 17 touchdowns, all league highs, and became the eighth player to run for 2,000 yards in a season. The offense, coordinated by Arthur Smith, mixed outside zone with a heavy diet of duo, often from two- and three-tight-end sets.7

What to notice: Henry is listed at 6-foot-2 or 6-foot-3 and about 250 pounds, and, by every account, at his best running downhill, building speed straight at the defense rather than stopping and starting. Duo gives him exactly that: on the snap, watch the two double teams surge forward, then watch Henry press between them, find the linebacker, and run through the gap the linebacker did not fill. Count how often his first contact comes four or five yards past the line.

Trap: let him in, then hit him from the side

Trap is one of the oldest plays in football and still one of the most satisfying to watch, because it uses a defender’s aggression against him. The offense leaves a defensive lineman unblocked at the snap. He feels nobody in front of him and does what he is paid to do: he charges across the line. Then a pulling lineman, usually the backside guard on a short pull, hits him from the side, where he is not looking, and the ball carrier cuts just inside him.

Show the Python
def trap_play(wham=False, static=False):
    """Trap right (the LG pulls) or wham right (an H crosses the formation), from the pistol.
    static=True: blocks drawn to the defenders' pre-snap spots, for the assignment diagram;
    static=False: the simulated play, with blockers and defenders meeting where they really would."""
    off = pistol(y_side=1 if wham else -1) + ([O("H", "TE", -1.5, -6.4, "H")] if wham else [])
    p = Play(off, four_three_base(sam=wham), los=35, to_go=None)
    t_hit = 1.45 if wham else 0.9
    trapper = "H" if wham else "LG"
    pull_via = [(-1.8, -4.4), (-1.9, 0.6)] if wham else [(-1.6, -1.2), (-1.9, 0.6)]
    if static:
        go_to(p, "DT", (-0.6, 2.6), "path", speed=2.0)                    # the 3 is let through
        go_to(p, trapper, (0.15, 1.9), "pull", via=pull_via, speed=6.0)   # ... and trapped from the inside
        mike, will, rg, lg_or_lt = (3.9, 0.9), (3.9, -2.2), (3.9, 0.9), (3.9, -2.2)
    else:
        go_to(p, "DT", (-0.9, 2.55), "path", speed=1.95 / (t_hit - 0.1))  # the 3 is let go and comes upfield
        go_to(p, "DT", (-0.05, 4.45), "path", speed=1.75, delay=0.1)       # ... until he is hit from the side
        go_to(p, trapper, (-1.3, 1.85), "pull", via=pull_via, speed=6.0 if wham else 5.0)
        go_to(p, trapper, (-1.0, 3.2), speed=1.5)                         # drive him out
        go_to(p, "MIKE", (3.75, -0.1) if wham else (3.7, 0.4), "path", speed=2.5, delay=0.3)
        go_to(p, "PE", (1.3, 5.6), "path", speed=1.0, delay=0.2)
        go_to(p, "WILL", (4.1, -1.9), "path", speed=2.5, delay=0.3)
        mike, will, rg, lg_or_lt = None, None, ((2.5, 0.1) if wham else (2.45, 0.7)), (2.8, -1.45)
    go_to(p, "C", (0.35, -0.3), via=[(-0.45, -0.15)])                     # back block on the 1
    go_to(p, "RG", rg, via=[(-0.2, 1.1)])                                 # inside release to the Mike
    go_to(p, "RT", (0.4, 4.2) if static else (0.5, 4.75), via=[(-0.3, 3.35)], speed=1.6)   # base the 5
    if wham:
        go_to(p, "LG", lg_or_lt, via=[(-0.2, -1.4)])                      # climbs to the Will
        go_to(p, "LT", (0.35, -3.6) if static else (0.0, -3.45), via=[(-0.3, -3.35)])    # the backside end
        go_to(p, "Y", (0.6, 6.2) if static else (3.3, 6.2), via=[(0.2, 5.3)] if not static else [(-0.2, 5.6)])  # the Sam
    else:
        go_to(p, "LT", lg_or_lt, via=[(-0.2, -2.9)])                      # inside release to the Will
        go_to(p, "U", (0.35, -4.4) if static else (0.05, -4.7), via=[(-0.3, -4.75)])     # down on the end
    go_to(p, "RB", (6.0, 1.4), "run", delay=0.55 if wham else 0.15, speed=6.0,
          via=[(-4.3, 0.5), (-1.7, 0.95), (0.6, 1.25)])
    p.handoff("RB", t=0.95 if wham else 0.5)
    p.highlight(trapper, color=PURPLE); p.highlight("DT", color=style.DEFENSE)
    return p, trapper, t_hit


T_TRAP = {False: 1.5, True: 1.9}          # the moment the right-hand panel shows


def trap_figure(wham=False):
    """Left: the static assignments. Right: the simulated play just after the trap block lands."""
    p, trapper, t_hit = trap_play(wham)
    ps, _, _ = trap_play(wham, static=True)
    fig, axes = plt.subplots(1, 2, figsize=(6.6, 4.1))
    lat, win = ((-8.0, 8.0) if wham else (-7.6, 7.6)), (-7.9, 6.6)
    f = draw(ps, ax=axes[0], lateral=lat, window=win, title=False)
    point_to(f, ps, (-4.6, 3.6), (-1.4, 0.9), ("H" if wham else "LG") + " crosses and\ntraps the 3\nfrom inside",
             color=PURPLE, fontsize=6.6)
    point_to(f, ps, (3.0, 4.9), (1.0, 2.35), "3: left\nunblocked", color=style.DEFENSE_DARK, fontsize=6.6)
    subtitle(axes[0], "The assignments")
    t = T_TRAP[wham]
    panel(axes[1], p, tracking(p), t, lat, win,
          rings=((trapper, PURPLE), ("DT", style.DEFENSE), ("RB", style.THIRD)))
    subtitle(axes[1], f"{t:.1f} s after the snap")
    fig.tight_layout(w_pad=0.8)


trap_figure(wham=False)
plt.show()
Figure 17.7: Trap right against a 3-technique, from the pistol. Left, the assignments: nobody blocks the 3-technique (orange ring); the right guard and left tackle release inside him to the linebackers, the center blocks back on the 1, and the left guard (purple ring) makes a short pull behind the center and traps the 3 from the inside. Right, the simulated play 1.5 seconds after the snap: the 3 has charged a yard into the backfield and been driven back out toward the sideline, and the back (green ring) is through the hole inside him.

Why would anyone invite a defender into the backfield? Because of what it does to the rest of the line. With the 3-technique left alone, the right guard does not have to block him and can go straight to the Mike, and the left tackle can go straight to the Will: in Figure 17.7 both linebackers are blocked within a second, which is hard to do on most runs. And the defender who was left alone is beaten by geometry rather than strength. A lineman charging upfield has his shoulders pointed at the quarterback; a guard arriving from the side hits him where he cannot anchor, and the harder he charged, the farther past the hole he ends up.

Trap is a counter-punch to penetration. It is most dangerous against an aggressive, one-gap defensive tackle, the kind of 3-technique who lives in the backfield, and against defenses that slant hard at the snap. It is least dangerous against a disciplined lineman who reads the guard: if the guard in front of him releases inside instead of blocking him, a well-coached tackle knows the trap is coming, squeezes down, and closes the hole before the trapper gets there. Coaches answer with constraint plays (plays designed to punish a defender for doing his job too well) such as the influence trap, in which the lineman in front of the trapped man pretends to pass-block, inviting the defender upfield, before the trap hits him.

The trap’s pedigree runs back to the earliest days of the T-formation. Paul Brown’s Cleveland teams of the late 1940s, with quarterback Otto Graham and fullback Marion Motley, were famous for two plays that turn a defense’s aggression against it: the trap and the draw (which closes this chapter).8

Wham: the trap a tight end throws

Wham is the same idea with a different trapper. The line leaves a defensive tackle unblocked, the guards climb to the second level, and a tight end or H-back comes across the formation and hits the tackle from the side.

Show the Python
trap_figure(wham=True)
plt.show()
Figure 17.8: Wham right: a trap thrown by an H-back. Left, the assignments: again nobody blocks the 3-technique. The H, lined up off the line on the left, runs flat across the formation and hits him from the inside. Because no guard pulls, both guards climb to the linebackers, and the Y goes out to the Sam. Right, the simulated play 1.9 seconds after the snap: the 3 has been whammed out of the hole, both guards and the Y are on linebackers, and the back is through the hole inside the block.

Swapping a guard for a tight end does not change the head count; it changes who is left on the line. Compare the two figures (ignore the wham’s extra Sam and the Y who blocks him, which only reflect the different personnel). On the trap, one of the five linemen is the trapper, so the line has a hole in it where the guard used to be, and a linebacker who watches the guards sees one pull and knows where the ball is going. On the wham, the trapper comes from outside the line, so all five linemen stay home or go straight ahead: no gap is vacated for a backside defender to shoot through, both guards can climb to the linebackers at once, and a linebacker reading the guards sees them come straight at him, as on a base run. The obvious objection is size: a 250-pound tight end against a 300-pound tackle. The answer is the angle. The tackle is charging upfield, looking at the quarterback, and the tight end has a running start into his hip. It is, as Chris B. Brown put it, a surprisingly simple block, because the defender is so focused on getting into the backfield that he never sees it coming.9

NoteFilm room: San Francisco 49ers 2011

The play: in Week 6 of the 2011 season at Detroit, Jim Harbaugh’s 49ers (offensive coordinator Greg Roman) faced Ndamukong Suh, one of the most destructive interior linemen in football. Their plan was to not block him: on wham runs, the line left Suh alone and released to the linebackers, and tight end Delanie Walker came across and hit him from the side as he charged into the backfield, with Frank Gore running past.10

What to notice: wham is easiest to spot from the end-zone replay. Look for a defensive tackle who comes free through the line untouched, too free, and then a tight end arriving at his hip from the other side of the formation. Then look at the second level: on a well-blocked wham, every linebacker has a blocker on him.

Roman took the same toolkit (power, counter, trap and wham, plus fullbacks and extra tight ends) to Baltimore, where it became half of the most productive rushing offense in NFL history; the film room on the 2019 Ravens is below.

Iso: the fullback against the linebacker

Iso, short for isolation, is the simplest run in this chapter. Every lineman blocks the defensive lineman on him, the uncovered lineman takes the backside linebacker, and the fullback runs through the hole and blocks the play-side linebacker: one man, alone, against a fullback with a running start.

Show the Python
p = Play(i_form(), over_front(safeties=False), los=35, to_go=None, title="Iso right vs a 4-3 Over")
go_to(p, "LT", (0.3, -4.2), via=[(-0.3, -3.6)])            # the 5
go_to(p, "LG", (3.6, -2.3), via=[(-0.2, -1.7)])            # uncovered: up to the Will
go_to(p, "C", (0.3, -0.95), via=[(-0.3, -0.45)])           # the 1, turned left
go_to(p, "RG", (0.3, 2.65), via=[(-0.3, 2.05)])            # the 3, turned right
go_to(p, "RT", (0.3, 4.3), via=[(-0.3, 3.75)])             # the 5
go_to(p, "Y", (0.3, 6.0), via=[(-0.3, 5.35)])              # the Sam
go_to(p, "MIKE", (2.6, 0.85), "path", speed=4.0)            # the Mike fills the A gap ...
go_to(p, "FB", (1.7, 0.85), via=[(-2.5, 0.85)], speed=5.0)  # ... and meets the fullback
go_to(p, "RB", (5.6, 2.8), "run", via=[(-3.6, 0.9), (0.4, 1.0), (1.8, 1.4)])
p.highlight("FB", color=PURPLE); p.highlight("MIKE", color=style.DEFENSE)
f = draw(p, width_in=5.6, lateral=(-8.6, 9.6), window=(-9.0, 8.8))
spot(f, p, 0.1, 0.8)
point_to(f, p, (-3.6, -6.0), (-4.9, 0.0), "F leads through\nthe A gap...", color=PURPLE, fontsize=6.7)
point_to(f, p, (6.4, -4.8), (4.6, 0.9), "...onto the Mike:\nthe 'isolated' man", color=style.DEFENSE_DARK, fontsize=6.7)
say(f, p, -4.0, 6.4, "every lineman blocks\nthe man on him", fontsize=6.6)
plt.show()
Figure 17.9: Iso right against the same 4-3 Over: no pullers, no double teams. Each lineman blocks the man on him, turning him away from the hole, and the uncovered left guard goes to the Will. That leaves the Mike (orange ring) ‘isolated’: the fullback (purple ring) leads through the strong-side A gap (green X) and meets him as he fills. Two deep safeties, not shown, are the only defenders nobody blocks.

Iso’s logic is a clean version of hat math. Against a seven-man box (four linemen, three linebackers), the offense has seven blockers: five linemen, a tight end and a fullback. Every defender gets a hat, and the one matchup the play depends on is the fullback against the Mike. Where it hits is decided by the front: iso usually aims at a bubble, an open gap or an uncovered lineman where the nearest defender is a linebacker rather than a defensive lineman, so the fullback can get to him. In Figure 17.9 the strong A gap is open because the 1 is shaded to the other side of the center and the 3 lines up outside the right guard; the center and guard only have to turn their men away from it. Against this front the offense could also run iso weak, over the uncovered left guard, at the Will.

The trade is that iso gains nothing in the numbers and moves nobody sideways; it is a straight contest. Its virtues are speed and simplicity: the ball hits fast, and the back has one read (which side of the fullback’s block to take). Iso was a staple of the I-formation era, and it has faded with the fullback. In 2025 only about one NFL snap in ten came from personnel with two backs (a fullback or a second running back), so most teams now lead a tight end or H-back through the hole instead, either as a true iso from two- and three-tight-end groupings or as the insert block on inside zone (zone insert, where the line zone-blocks instead of blocking the man on it).11

Toss, sweep and pin-and-pull: power goes outside

Everything so far hit between the tackles or just outside them. The gap family also has outside runs, and they are built from the same parts: block down, pull, lead.

A toss is the quarterback pitching the ball underhand to a back who is already moving toward the sideline; a sweep is any outside run with blockers leading the back around the corner, whether the ball is pitched or handed off. The toss saves time: the back catches the ball two or three yards wider and already at speed, instead of waiting for a handoff and then turning the corner.

The ancestor: Lombardi’s sweep

The most famous sweep in football is the Packers sweep of Vince Lombardi’s Green Bay teams of the 1960s.

Show the Python
off = line() + [te(+1), O("QB", "QB", -1.9, 0, "Q"), O("HB", "RB", -5.0, -2.2, "HB"), O("FB", "FB", -4.4, 2.2, "F"),
                O("Z", "WR", -1.5, 10.5, "Z")]
dfn = [dl("LE", "5", -1), D("LDT", "DL", 1.0, -1.6, "2"), D("RDT", "DL", 1.0, 1.6, "2"), dl("RE", "5", 1),
       D("SAM", "SAM", 2.6, 5.6, "S"), D("MIKE", "MIKE", 4.4, 0.0, "M"), D("WILL", "WILL", 4.0, -4.8, "W"),
       D("RCB", "CB", 6.0, 11.0, "CB"), D("SS", "SS", 9.5, 6.5, "SS")]
p = Play(off, dfn, los=35, to_go=None, title="The Packers sweep (1960s)")
go_to(p, "Y", (1.8, 5.4), via=[(0.4, 5.2)])                                # the Sam
go_to(p, "RT", (0.35, 1.95), via=[(-0.3, 2.6)])                            # down on the tackle over the RG
go_to(p, "C", (0.35, -1.25), via=[(-0.4, -0.7)])                           # back on the tackle over the LG
go_to(p, "LT", (0.3, -3.55), via=[(-0.3, -3.3)])                           # cut off the end
go_to(p, "FB", (0.3, 3.75), via=[(-2.2, 3.0)], speed=5.0)                  # the end
go_to(p, "RG", (5.2, 10.4), "pull", via=[(-1.6, 2.4), (-2.3, 7.0), (1.0, 9.4)])          # first puller
go_to(p, "MIKE", (3.9, 3.0), "path", speed=4.0)
go_to(p, "LG", (3.1, 3.7), "pull", via=[(-1.7, -1.0), (-3.0, 1.0), (-2.7, 5.2), (0.4, 6.0)])  # second puller
go_to(p, "Z", (8.6, 7.2), via=[(3.4, 9.8)])                                # the safety
go_to(p, "HB", (0.4, 6.9), "run", via=[(-5.6, 0.6), (-4.6, 4.0), (-2.2, 6.6)])
p.highlight("RG", color=PURPLE); p.highlight("LG", color=PURPLE); p.highlight("HB")
f = draw(p, width_in=5.6, lateral=(-7.6, 14.0), window=(-8.6, 12.6))
point_to(f, p, (8.0, -2.4), (3.1, 3.7), "LG (second puller)\nturns up inside\nfor the pursuit", color=PURPLE,
         fontsize=6.6)
point_to(f, p, (-4.6, 11.0), (-2.3, 7.0), "RG (first puller)\ntakes the first\ndefender outside", color=PURPLE,
         fontsize=6.6)
point_to(f, p, (-6.6, 5.6), (2.0, 5.6), "HB reads the Y's\nblock on the S", color=GREEN, fontsize=6.6)
plt.show()
Figure 17.10: The Packers sweep, as Lombardi’s 1960s teams ran it (an illustrative reconstruction against a 4-3 of that era; landmarks varied). Both guards pull (purple rings): the right guard takes the first defender outside (here the cornerback), the left guard turns up inside for the pursuit (the Mike). Down blocks inside, the fullback on the end, the flanker (Z) on the safety. The halfback (HB, green ring) runs to daylight off the Y’s block on the Sam: inside it if the Sam is driven out, outside it if he fights in.

Guards Jerry Kramer and Fuzzy Thurston pulled in tandem, leading Paul Hornung or Jim Taylor around the end, and the play was the cornerstone of an offense that won five NFL championships in seven seasons (1961, 1962, 1965, 1966 and 1967, the last two including Super Bowls I and II).12 Lombardi’s own phrase for the back’s job became the title of his 1963 book, Run to Daylight: the back did not run to a spot drawn on the card; he read the tight end’s block on the outside linebacker and went wherever the defender was not. Lombardi drilled the sweep endlessly precisely because everyone knew it was coming, and the answer to “everyone knows” was perfect execution plus a back who could choose his hole late.

Look at Figure 17.10 with this chapter’s vocabulary and you can see it is power stretched sideways: down blocks inside, pullers leading, a fullback on the end, the backside left to chase. Why pitch or hand the ball wide at all, instead of running power off-tackle? Because some defenses are strongest inside, and the sweep makes every defender run. The price is time: the back is in the backfield longer, so a defender who beats a down block gets to him. The modern descendant is pin-and-pull.

Pin-and-pull

Outside zone (03-02) has a problem against wide fronts, defenses whose ends line up well outside the tackles and tight ends. To run outside zone, the play-side blockers must reach the defenders in front of them, getting their heads to the outside, and a defender lined up two yards outside you is almost impossible to reach. Defenses that play wide (a wide-9 end, an end in a wide 5, an outside linebacker walked out over the tight end) are partly built to kill the reach.

Pin-and-pull gives up on reaching. Each lineman, backside ones included, asks one question about the gap on his backside, the side away from the play:

  • Is a defender in it (or shaded into it)? Pin him. Block down on him, which is an easy angle because he is inside you.
  • Is it empty? Pull. Run around the blocks outside you and lead.

In Figure 17.11 that sorts the whole line. The left tackle has the wide 5 in his backside gap and the center has the 1 shaded on his backside, so both pin; the right tackle has the 3 in his, so he pins; both guards have nobody in theirs, so both pull. The tight end is the usual exception: in most versions he does not pull even with an empty backside gap (somebody has to stop the play-side linebacker from running straight to the ball), so he goes inside to the Mike.

The beauty of the rule is that it turns the defense’s alignment into the offense’s advantage. The wider the defenders line up, the more of them end up inside an offensive lineman, where he can pin them, and the more linemen are left uncovered, free to pull. Every block in Figure 17.11 is either a down block or a block by a puller with a running start, and nobody has to reach anyone. The rules adjust to the front without a new call, the way zone rules do, which is why some coaches describe pin-and-pull as a gap scheme that thinks like zone.13

Show the Python
off = line() + [te(+1), O("QB", "QB", -1.9, 0, "Q"), O("RB", "RB", -6.6, 0, "R"), O("Z", "WR", -1.5, 12.0, "Z")]
dfn = [D("LE", "DL", 1.0, -4.8, "5w"), dl("NT", "1", -1), dl("DT", "3", 1), D("RE", "DL", 1.0, 7.0, "9"),
       D("WILL", "WILL", 4.8, -2.2, "W"), D("MIKE", "MIKE", 4.8, 1.6, "M"),
       D("RCB", "CB", 6.5, 12.5, "CB"), D("SS", "SS", 11.0, 7.0, "SS")]
p = Play(off, dfn, los=35, to_go=None, title="Pin-and-pull toss right vs a wide front")
go_to(p, "C", (0.35, -0.3), via=[(-0.45, -0.15)])                          # pin the 1 (on the C's backside)
go_to(p, "RT", (0.4, 2.8), via=[(-0.3, 3.05)])                             # pin the 3
go_to(p, "Y", (3.7, 2.9), via=[(-0.2, 4.4)])                               # TE: inside to the Mike
go_to(p, "LT", (0.3, -4.0), via=[(-0.3, -3.6)])                            # pin the wide 5
go_to(p, "RG", (0.25, 6.35), "pull", via=[(-1.6, 2.3), (-1.7, 5.4)])       # first puller: kick out the 9
go_to(p, "LG", (4.2, 5.0), "pull", via=[(-1.7, -1.0), (-2.9, 0.8), (-2.8, 4.6), (0.2, 5.6)])  # second: lead
go_to(p, "MIKE", (4.3, 3.1), "path", speed=4.0)                            # the Mike scrapes ...
go_to(p, "WILL", (5.0, 5.4), "path", speed=4.0, via=[(6.3, 1.4)])          # ... the Will flows over the top
go_to(p, "Z", (5.6, 11.6), via=[(1.0, 12.2)])                              # the corner
go_to(p, "QB", (-2.4, 0.9), "path", speed=4.0)                             # reverse out and toss
go_to(p, "RB", (7.0, 6.2), "run", via=[(-5.6, 2.2), (-3.6, 5.0), (-0.6, 5.6)])
p.pitch("RB", t=0.25)
p.highlight("RG", color=PURPLE); p.highlight("LG", color=PURPLE); p.highlight("SS", color=style.DEFENSE)
f = draw(p, width_in=5.6, lateral=(-7.6, 14.0), window=(-8.2, 12.4))
for k in ("LE", "NT", "DT"):
    say(f, p, 2.35, p.players[k].w, "pinned", color=style.OFFENSE_DARK, fontsize=6.4, weight="bold")
point_to(f, p, (-5.0, -4.6), (-1.0, -1.6), "empty backside\ngap: both guards\npull", color=PURPLE, fontsize=6.6)
point_to(f, p, (-5.4, 10.0), (-1.7, 5.4), "first puller kicks\nthe end man; second\nleads up inside", color=PURPLE,
         fontsize=6.6)
point_to(f, p, (8.6, 2.0), (11.0, 7.0), "SS: unblocked,\nthe back's to beat", color=style.DEFENSE_DARK, fontsize=6.6)
say(f, p, 8.0, -3.6, "wide 5 and 9: too\nwide to reach,\nso pin and pull", color=style.DEFENSE_DARK, fontsize=6.6)
plt.show()
Figure 17.11: Pin-and-pull toss right against a wide front (a wide 5 on the left, a wide-9 end on the right). The three pinned defenders are labelled; both guards pull (purple rings). The first kicks out the 9, the second leads up inside him for the Will, who is flowing over the top (running behind the Mike to get to the outside). The Y goes inside to the Mike. The back catches the toss (dashed brown line) and turns up inside the kick-out, with the strong safety (orange ring) left for him to beat.

The 2024 Washington Commanders, with Kliff Kingsbury calling plays for rookie Jayden Daniels, leaned on pin-and-pull as the gap-scheme partner to their outside zone; one film breakdown summarized their rule against a front with a 1-technique as “pull both guards: first guard kicks, second guard leads,” which is exactly Figure 17.11.14

The draw: a run disguised as a pass

The last member of the family barely looks like a run at all. On a draw play (or simply a draw), the offensive line sets up as if to pass-protect, the quarterback shows a drop, the pass rushers are allowed to run upfield, and the ball is handed to the back late, after the linebackers have turned their backs to run to their pass-coverage zones. The rush has drawn the defenders out of the play.

Show the Python
def draw_play():
    """A shotgun draw against a four-man rush with the linebackers dropping into zones."""
    off = line() + [te(+1), O("QB", "QB", -5.0, 0, "Q"), O("RB", "RB", -5.0, 1.6, "R"),
                    O("X", "WR", -0.7, -15.0, "X"), O("H", "WR", -1.5, -9.0, "H"), O("Z", "WR", -1.5, 14.0, "Z")]
    dfn = [D("LE", "DL", 1.0, -5.0, "E"), dl("LT3", "3", -1), dl("RT3", "3", 1), D("RE", "DL", 1.0, 6.0, "E"),
           D("WILL", "WILL", 5.0, -2.2, "W"), D("MIKE", "MIKE", 5.0, 2.0, "M"),
           D("NB", "NB", 5.0, -9.0, "NB"), D("LCB", "CB", 7.0, -15.0, "CB"), D("RCB", "CB", 7.0, 14.0, "CB"),
           D("FS", "FS", 13.0, -7.0, "FS"), D("SS", "SS", 13.0, 7.0, "SS")]
    p = Play(off, dfn, los=35, to_go=11)
    # defense: four rush upfield, the linebackers drop to their zones
    go_to(p, "LE", (-3.6, -5.6), "path", speed=4.6)                    # wide, upfield rushes ...
    go_to(p, "RE", (-3.6, 6.2), "path", speed=4.6)
    go_to(p, "LT3", (-1.6, -2.7), "path", speed=2.6)                   # ... and the tackles get walled outside
    go_to(p, "RT3", (-1.6, 2.7), "path", speed=2.6)
    go_to(p, "WILL", (9.5, -3.6), "path", speed=4.4)                   # zone drops, backs to the ball
    go_to(p, "MIKE", (9.5, 3.4), "path", speed=4.4)
    go_to(p, "WILL", (8.6, -1.6), "path", speed=4.0, delay=0.25)       # ... then react, too late
    go_to(p, "MIKE", (8.6, 1.4), "path", speed=4.0, delay=0.25)
    go_to(p, "NB", (8.5, -9.5), "path", speed=4.0)
    for k in ("FS", "SS"):
        go_to(p, k, (14.5, p.players[k].w * 1.1), "path", speed=2.0)
    # offense: the line sets as if to pass, then rides the rushers past the ball
    go_to(p, "LT", (-3.0, -4.3), speed=3.0, via=[(-1.8, -3.9)])        # kick slide, ride him deep
    go_to(p, "RT", (-3.0, 4.4), speed=3.0, via=[(-1.8, 3.9)])
    go_to(p, "LG", (-2.0, -1.9), speed=2.2, via=[(-1.6, -1.6)])        # set, then turn the 3 out
    go_to(p, "RG", (-2.0, 1.9), speed=2.2, via=[(-1.6, 1.6)])
    go_to(p, "C", (-1.4, 0.0), speed=2.0)                              # sets, nobody comes ...
    go_to(p, "C", (7.5, -0.9), speed=5.0, delay=0.3)                   # ... so he climbs to the Will
    go_to(p, "Y", (7.9, 2.2), speed=4.2, via=[(1.5, 4.6)])             # releases, then blocks the Mike
    for k in ("X", "Z", "H"):
        p.route(k, [(0, 0), (13, 0)])
    go_to(p, "QB", (-6.2, 0.2), "path", speed=3.0)                     # sells the drop
    go_to(p, "RB", (-5.5, 0.9), "run", speed=1.5)                      # steps up as if to protect
    go_to(p, "RB", (8.0, -0.4), "run", speed=6.2, delay=0.55, via=[(-5.9, 0.55), (-2.0, 0.2), (1.5, 0.0)])
    p.handoff("RB", t=0.95)
    return p


animation_or_strip(draw_play(), [0.0, 0.8, 1.45, 2.45], lateral=(-8.6, 8.6), window=(-7.4, 11.6), ncols=2,
                   width_in=5.4,
                   notes=["3rd and 11: four rushers, two LBs, two deep", "pass set; LBs turn and run to their zones",
                          "handoff behind the rushers' backs", "guards wall off the tackles; through the A gap"],
                   rings=(("RB", style.THIRD), ("MIKE", style.DEFENSE), ("WILL", style.DEFENSE)))
Figure 17.12: A shotgun draw on third-and-11 against a four-man rush (simulated, BDB-format tracking; the yellow line is the line to gain; two safeties are 13 yards deep, above the picture). Watch the two linebackers (orange rings) run away from the ball while the line sets as if to pass. By frame 4 the guards have walled the 3-techniques outside, the center has climbed toward the Will and the Y toward the Mike, and the back (green ring) is through the A gap at linebackers nine yards deep.

The draw belongs in a gap chapter because it is built on the same principle as the trap: let the defender go where he wants to go, then block him there. The guards in Figure 17.12 do not try to stop the 3-techniques from rushing; they let them come upfield and then turn them outward, away from the A gaps. The tackles ride the ends wide and deep, the way they would on any pass. The more eagerly the defense rushes the passer, the bigger the hole in the middle gets. And the linebackers, who on a normal run would be the problem, have spent the first second running away from the ball to cover receivers.

That tells you when to expect it: on passing downs, against a four-man rush with linebackers who drop. Third-and-long is the classic draw situation, and a defense with two deep safeties and two linebackers dropping into zones is the classic draw defense.

Be honest about what it buys, though, because you have the tools from Downs, Distance and Field Position. A six-yard gain on third-and-11 is a failed play by success rate: the offense punts anyway. In the 2023–2025 regular seasons, NFL designed runs on third-and-10 to -12 converted about 12% of the time and averaged about −0.29 EPA a play; dropbacks in the same spot converted about 27% and averaged about −0.11.15 Some of that gap is selection (offenses that have already given up on the down, late in a half or protecting a lead, call runs), but the point stands: a third-and-long draw is usually a deliberate conservative choice. Coaches call it to avoid a sack or an interception, to shorten the punt or set up a field-goal try, and to make the pass rush hesitate a half-step on the next third down. Against a defense that drops its linebackers it is also, now and then, a long run. It is rarely the best way to get eleven yards.

The trade: the draw is helpless against interior pressure. If a linebacker comes forward at the snap instead of dropping, or walks up into an A gap before the snap, he is standing exactly where the play needs to go, and nobody is assigned to him because the line is busy pretending to pass-block. A defense that sits a linebacker in the middle as a spy on a running quarterback ruins it for the same reason. Pressure off the edge is a different story: an outside blitzer runs himself past the play, which is exactly what the draw wants.

Paul Brown’s Browns made the draw famous in the late 1940s with Marion Motley, a fullback of about 232 to 238 pounds who could also pass-block, which made the fake believable. One story says it began by accident, with Otto Graham improvising a handoff on a broken pass play; another has Brown already experimenting with a delayed handoff to Motley in 1945. Either way it was a Cleveland staple by the time the Browns joined the NFL in 1950.16 Its descendants, the quarterback draw and the run-pass option, belong to Option Football and RPOs.

The family on one page

Every play in this chapter answers the same two questions, where do the extra blockers come from, and who is left free?, and each carries a rule the line can apply to whatever front it sees. Table 17.1 puts them side by side, with the holes in 03-01’s gap letters. To draw any of these plays against a new front, start from its rule column, not from a remembered picture.

Table 17.1: The gap family on one page.
Play Where it hits The line’s rule Extra blockers Left free
Power off-tackle: the C gap, or the D gap outside a tight end gap, down, backer on the play side; center blocks back backside guard leads; fullback or H-back kicks out the backside end
Counter off-tackle, like power the same play-side rules; center blocks back backside guard kicks out; tackle (or H-back) leads the backside end, unless a tight end or H-back fills
Duo A or B gap, decided by the Mike doubles on both tackles, everyone else man-on; the doubles own the linebackers none nobody in a six-man box; the extra man in a bigger one
Trap B gap, just inside the trapped tackle let one lineman through; the man in front of him releases inside to a linebacker backside guard, on a short pull nobody, if the trap lands
Wham like trap like trap, but the guards climb a tight end or H-back crossing like trap
Iso a bubble: an open gap with a linebacker behind it block the man on you; the uncovered lineman takes the backside linebacker fullback leads onto the play-side linebacker the safeties
Sweep, pin-and-pull outside the end man pin the man in your backside gap, or pull if it is empty both guards usually a safety, and the backside chase
Draw A gaps pass set; wall the rushers away from the middle; center and tight end climb none: the rushers take themselves out any linebacker who does not drop

Gap or zone? How coaches choose

Almost every NFL team runs both families, so the real question is when each one is the better call. Five things push a coach one way or the other.

The front. Gap schemes need angles, so they like fronts that give them: a 3-technique to block down on, a 1-technique to block back on, an end man who can be kicked out. They are vulnerable to movement, since a defender who slants into the space a puller is running through can blow up two blockers at once. Zone, built to absorb movement, is the natural answer to slanting fronts. Wide fronts, as you saw, push teams toward pin-and-pull and kick-outs; a penetrating 3-technique invites the trap or the wham; linebackers who flow fast to stop outside zone invite counter. Defenses know this too, and some fronts are built partly to take the angles away: a lineman on a blocker’s inside shoulder (a 4i on the tackle, say) leaves that blocker no down block to make, and if he penetrates he is standing in the lane the pullers run through. Odd and Hybrid Fronts shows those fronts.

The defense’s shell. Against a light box (two deep safeties, six in the box), the offense already has its hats and wants movement: duo and inside zone. Against a seven-man box, power and counter win the point of attack by moving hats there. Against eight, even they leave a defender free (the backside end and the safety who came down), which is when offenses read one of them with the quarterback (Option Football) or stop running and throw, which is the point of loading the box.

The personnel. Power wants a kick-out blocker: a fullback, an H-back, a second tight end. Iso needs a fullback. Wham needs a tight end who can trap. A team with no fullback on the roster runs a different gap game from one that has an All-Pro at the position.

The offensive line. Zone wants linemen who can move laterally and stay on their feet, and has made a home for lighter, quicker linemen. Gap schemes want linemen who can drive a man off the ball on a down block and guards (or tackles) who can pull and hit on the move. Teams draft and coach their line for the run game they want, and their run game also bends toward the line they have.

The situation and the sequence. Short yardage favours the known hole and the extra hat of a gap scheme. Long yardage favours the draw. And every run sets up another: counter exists because power exists, the trap because 3-techniques penetrate, the bootleg because the backside end chases (Constraint Theory and Sequencing is the full version of that idea).

Table 17.2: Gap and zone, side by side.
Gap schemes Zone schemes
Blockers are assigned… men and gaps, before the snap areas, by rule after the snap
The hole is… chosen in advance (it can move a yard: kick or log) wherever the wall cracks
Extra blockers come from… pullers, fullbacks, tight ends moved across double teams; a quarterback who reads the backside end
The back’s job follow the puller, read one block press the aiming point, read the defense
Beats… big, static fronts; seven-man boxes (moves hats to the hole); aggressive penetrators (trap) slants and stunts; fast-flowing linebackers (cutback)
Struggles against… movement into the pullers’ path; defenders who read the guards penetration; wide fronts (outside zone)
Tell on the broadcast a lineman pulls the whole line steps the same way

In 2019 Kyle Shanahan, the most famous wide-zone coach in football, surprised people by adding more power and counter to his 49ers’ run game; he told his team he had called such plays only about seven times in more than a decade as a play-caller.17 That is the modern consensus in one decision: a scheme is a menu, not an identity.

How do the two families compare league-wide? The public numbers come from charting services, since play-by-play data does not record the blocking scheme. Pro Football Focus’s charting had inside and outside zone together making up nearly half of all NFL running plays in 2022, with draws only about 3%. Over 2020–2022 it had power averaging 4.53 yards a carry, inside zone 3.90, counter 3.90, outside zone 3.78 and duo 3.71 (and draws, called against defenses set for a pass, 5.95).18 Treat those as rough. Yards per carry is a crude measure, and each play is called in the situations it suits: duo against light boxes on early downs, power in short yardage, the draw on third-and-long. No family dominates, which is why almost every team runs both. The Go Deeper box at the end shows how to count the concepts yourself in tracking data.

NoteMadden vs. real life

In the game, “HB Power” is a play in the menu that either works or doesn’t, and the defense picks a play without seeing yours. In a real NFL game the line coach has decided during the week which gap runs fit this opponent’s front, the play-caller sequences them so that each one sets up the next (power, then counter off the same look; trap after the 3-technique has been penetrating all half), and the linemen still adjust after the snap: the center makes a call on the front, the puller decides kick or log, the back decides which side of a double team to take. There is no best run, only a best run against this on this down.

NoteFilm room: Baltimore Ravens 2019

The season: the Ravens ran for 3,296 yards, breaking the NFL single-season team record the 1978 Patriots had held for 41 years, and Lamar Jackson ran for 1,206 of them.19 Coordinator Greg Roman’s menu mixed nearly every play in this chapter (power, counter, trap and wham, pin-and-pull) with outside zone and Jackson’s option reads, often from formations with an extra tight end or fullback Patrick Ricard, and used motion and a changing mix of personnel groups to keep defenses from settling into the right numbers.20

What to notice: the quarterback is part of the blocking arithmetic. On a Ravens power play, the end left unblocked on the backside is often read by Jackson instead of ignored, so he cannot chase the back without giving Jackson the edge. That is the gap scheme’s price (the free backside defender) being paid by the option, which is the subject of the next chapter. The full case study is The Ravens’ Lamar Jackson Run Game.

NoteFilm room: Philadelphia Eagles 2024

The season: Saquon Barkley ran for 2,005 yards in 16 games, the ninth 2,000-yard season in NFL history, and the Eagles beat Kansas City 40–22 in Super Bowl LIX. A Philadelphia Inquirer film study that November described an offense that alternated zone and gap runs “noticeably,” using gap-scheme changeups with pulling linemen to balance its zone game, behind a line coached by Jeff Stoutland.21

What to notice: this is the team to practise the zone-or-gap call on. Pick one Eagles drive and, before every run, guess zone or gap from the formation; then, on the snap, check your guess against the line: does everyone step the same way, or does somebody pull? Keep score. Because the Eagles alternated the two families from the same looks, a good score means you are reading the line, not the formation. The full case study is The Eagles: Trenches and the Tush Push.

Spotting a puller before the snap

Because a puller runs to the hole, finding him early is the single most useful habit in watching gap runs. Defenses know this too: many linebackers are taught to read the guards, and a pulling guard is their signal to run with him. So both sides are looking for the same tells, and offenses work to hide them.

Before the snap, look for:

  • The backfield, and which guard to watch. The guard to watch is the backside one, the guard away from where the play is likely to go, so first guess the direction. In the shotgun, gap runs, like zone runs, usually send the back across the quarterback’s face, so a back offset to the left usually runs right, and the backside guard is the one on the same side as the back (in Figure 17.4, the back is offset left and the left guard pulls). Under center, a fullback or H-back offset to one side is often the kick-out man, and power usually goes toward him, so watch the guard away from him. With nothing to go on (an I-formation, a back directly behind the quarterback), watch both guards: on the high end-zone replay they are side by side, and the one that moves first tells you. A back set deeper than usual needs time, which counter and the sweep require (the pullers have to get there first).
  • The guards’ stance. A lineman about to pull often has less weight on his hand, his feet a little more staggered, his hips ready to turn. This is the heavy hand tell in reverse: a puller is going sideways, not forward, and many give it away with a light hand or a slight cheat backward off the ball, since depth gives him room to clear his teammates’ heels. The best pullers hide it, and some offenses deliberately line up their guards the same way on every snap.
  • The formation and the tendency. Certain personnel groups and formations are gap-heavy for every team (two tight ends with one off the ball, the I-formation, an H-back on the wing); the broadcast graphics and your prediction log will teach you which.

At the snap, the first step settles it. A pulling lineman’s first step is backward and sideways, opening his hips toward the play (the bucket step; some coaches call it a drop step); a zone lineman’s first step is sideways and forward; a pass-blocking lineman’s first step is straight back with his shoulders still square to the defense. One look at the backside guard tells you which. One exception to keep in mind: on dart (Figure 17.3) the guard stays home and the tackle pulls, so if the guard blocks but the run still looks like power, check the backside tackle.

Offenses exploit the defenders who read guards. A pulling guard on a play-action pass pulls linebackers toward the fake, and a “false pull” on a run sends them the wrong way; counter itself is a lie told with the back’s first step. Those plays exist precisely because the tell is so reliable. Trust the guard, but notice when the offense is using your trust against you.

Watch for it on Sunday

TipWatch for it

Follow the guard. For one quarter, on every run, watch the backside guard instead of the ball. In the shotgun that is usually the guard on the same side as the offset back; under center, the guard away from an offset fullback; if you cannot tell, watch both and see which one moves.

Before the snap

  • Count the box and find the extra blockers: a fullback, an H-back, a second tight end. Where would a kick-out come from?
  • Check the guards’ stance and depth. Is one a little off the ball, weight back?

The first half-second

  • Does a guard pull? If yes, call “gap” and say the direction out loud: the play is going where he is going.
  • Does a second blocker pull with him? Two pullers with the back stepping away first means counter. Two guards pulling wide with the back flowing the same way means a sweep or pin-and-pull. Any pull with the back stepping the other way means counter.
  • The guard blocks, but the backside tackle pulls? Dart: power with a tackle as the puller.
  • Nobody pulls, but the line fires straight ahead in double teams? Duo. The whole line steps the same way? Zone.
  • A defensive tackle comes through untouched? Look for the trap (a guard) or the wham (a tight end) arriving at his hip.
  • The line drops back as if to pass, and the back gets the ball late? Draw.

After the play (on the replay)

  • Find the kick-out. Did the kick-out man kick the end out or log him in, and did the back go to the side of his helmet?
  • Find the free defender: on power, the backside end. Did he make the tackle?

In your prediction log, add one letter after each run: G (gap) with the play’s name if you can (P, C, D, T, W, I, S for power, counter, duo, trap, wham, iso, sweep) or Z (zone). After a quarter, look at how often the guard told you the truth.

Predict the play

TipPredict the play

Drill 1. One puller: which play? Second-and-7, shotgun, the back offset to the right. Figure 63.9 shows the first half-second. One guard is pulling. Is this power, counter or trap? Say which defender the offense is letting through on purpose, who will block him, and where the back will run.

Show the Python
off = line() + [te(+1), O("QB", "QB", -5.0, 0, "Q"), O("RB", "RB", -5.0, 1.8, "R")]
dfn = [dl("PE", "5", -1), dl("DT", "3", -1), dl("NT", "1", +1), dl("BE", "5", +1),
       D("MIKE", "MIKE", 4.6, -1.2, "M"), D("WILL", "WILL", 4.6, 2.4, "W"),
       D("FS", "FS", 11.0, -5.0, "FS"), D("SS", "SS", 11.0, 5.0, "SS")]
p = Play(off, dfn, los=40, to_go=7, title="Drill 1: one puller. Which play?")
go_to(p, "LG", (1.3, -1.0), via=[(-0.1, -1.2)])                   # releases inside, past the 3
go_to(p, "C", (0.3, 0.45), via=[(-0.45, 0.15)])                   # back block on the 1
go_to(p, "RT", (1.3, 2.3), via=[(-0.1, 2.7)])                     # releases inside
go_to(p, "LT", (0.3, -4.1), via=[(-0.3, -3.6)])                   # the 5
go_to(p, "Y", (0.35, 4.35), via=[(-0.3, 4.75)])                   # down on the end
go_to(p, "RG", (-2.3, -0.9), "path", via=[(-1.6, 1.3), (-2.3, 0.4)])   # pulls left, flat and short
go_to(p, "DT", (-1.0, -2.4), "path", speed=3.0)                   # nobody touches him
go_to(p, "RB", (-4.3, 0.2), "run", via=[(-4.8, 1.2)])             # across the quarterback's face
p.highlight("RG", color=PURPLE)
f = draw(p, width_in=5.0, lateral=(-7.6, 7.6), window=(-7.0, 12.8))
plt.show()
Figure 17.13: Drill 1: the first half-second (shotgun, the back offset right). Look at the left side of the defensive line.

Trap left. The 3-technique on the left is being let through on purpose: the left guard in front of him has released inside him, toward the Mike, without touching him, and nobody else is coming at him from the front. The right guard’s pull is the giveaway that he will be trapped: it is short and flat, aimed at the space behind the center, not a long run to the edge. The guard will hit the 3 from the inside, where he is not looking, and the back will cut just inside the trap block, through the B gap on the left, with the left guard and right tackle already climbing to the two linebackers.

How to rule out the others: on power the 3 would get a down block (here nobody touches him), and a fullback or H-back would be heading for the edge to kick out the end man (nobody is). On counter the back would step away from the play first and two blockers would pull; here the back goes straight across the quarterback’s face, to the left, and only one guard pulls. The one thing that beats this call is a disciplined 3-technique who reads the guard’s inside release and squeezes down into the hole before the trapper arrives.

TipPredict the play

Drill 2. Third-and-long. Third-and-11 from midfield. The offense is in the shotgun with three receivers and a tight end split out; the defense shows a dime package (six defensive backs) with two deep safeties, four linemen in wide alignments, and one linebacker seven yards deep (Figure 63.10). The offense is going to hand the ball off. Which run from this chapter has the best chance, and what would ruin it?

Show the Python
off = line() + [O("QB", "QB", -5.0, 0, "Q"), O("RB", "RB", -5.0, 1.6, "R"), O("X", "WR", -0.7, -15.0, "X"),
                O("H", "WR", -1.5, -9.0, "H"), O("Y", "TE", -1.5, 9.0, "Y"), O("Z", "WR", -0.7, 15.0, "Z")]
dfn = [D("LE", "DL", 1.0, -5.6, "E"), dl("LT3", "3", -1), dl("RT3", "3", 1), D("RE", "DL", 1.0, 5.6, "E"),
       D("MIKE", "MIKE", 7.0, 0.5, "M"), D("NB", "NB", 6.0, -9.0, "NB"), D("DB", "DB", 6.0, 9.0, "DB"),
       D("LCB", "CB", 8.0, -15.0, "CB"), D("RCB", "CB", 8.0, 15.0, "CB"),
       D("FS", "FS", 14.0, -8.0, "FS"), D("SS", "SS", 14.0, 8.0, "SS")]
p = Play(off, dfn, los=60, to_go=11, title="Drill 2: 3rd and 11. Which run?")
f = draw(p, width_in=6.2, lateral=(-17.6, 17.6), window=(-7.6, 16.6))
plt.show()
Figure 17.14: Drill 2: third-and-11 (yellow line). Shotgun, the back beside the quarterback, the tight end (Y) in the slot; a dime defense with four rushers aligned wide, one linebacker (M) about seven yards deep, and two safeties 14 yards deep.

The draw. Everything in the picture is a draw invitation. The defense has five men in the box against five offensive linemen, the rushers are lined up wide so they can get to the quarterback, and the only linebacker will drop into a zone at the snap. If the line sets up to pass, the wide ends will rush upfield and outside, the 3-techniques will rush through the B gaps, and the middle of the field, the A gaps, will be empty except for the linebacker, who will be backpedalling. Hand the ball off late, after the rush has committed, and the back is running at a linebacker who is turned the wrong way and safeties 14 yards deep.

Why not duo, which this chapter called a two-high play against light boxes? Because duo needs the linebacker to fill: the back reads him and the double teams come off onto him. On third-and-11 this linebacker will be running backward at the snap, and a play built to catch a man running away from it is the draw.

Will it get 11 yards? Probably not, and the offense knows it: as the draw section showed, third-and-long runs rarely convert and usually lose expected points. A draw here is a conservative call (no sack, no interception, a shorter punt) and a warning shot to the pass rush.

What would ruin it: the linebacker coming forward at the snap, a blitz up the middle, or a “spy” assigned to sit in the middle and watch the back. Any defender who stays home in the A gaps is standing exactly where the draw needs to go, and nobody is assigned to block him.

TipPredict the play

Drill 3. Two pullers, one decision. Counter right. Figure 63.11 freezes the play as the two pullers arrive: the left guard, whose job is the end man, and the left tackle behind him, who was going to turn up inside the kick-out. The end has crashed hard inside as the right tackle blocked down, and the Mike is scraping outside. What should the guard do, what should the tackle behind him do, where should the back go, and who is left for the back to beat?

Show the Python
off = [O("RG", "RG", -0.7, 1.6, "RG"), O("RT", "RT", -0.7, 3.2, "RT"), O("LG", "LG", -1.6, -0.6, "LG"),
       O("LT", "LT", -2.9, -2.4, "LT"), O("RB", "RB", -4.8, -0.6, "R")]
dfn = [dl("DT", "3", 1), D("PE", "DL", 0.45, 4.35, "5"), D("WILL", "WILL", 4.6, 0.2, "W"),
       D("MIKE", "MIKE", 4.6, 2.8, "M"), D("SS", "SS", 7.0, 9.0, "SS")]
p = Play(off, dfn, los=40, to_go=None, title="Drill 3: two pullers, one decision")
go_to(p, "RT", (0.4, 2.8), via=[(-0.3, 3.05)])
go_to(p, "RG", (3.7, 0.6), via=[(-0.2, 1.6)])
go_to(p, "MIKE", (3.6, 5.6), "path", speed=4.0)
go_to(p, "SS", (4.4, 8.0), "path", speed=4.0)
go_to(p, "LG", (-1.7, 3.0), "path", via=[(-1.9, 1.4)])
go_to(p, "LT", (-2.8, 1.0), "path", via=[(-3.0, -0.4)])
go_to(p, "RB", (-3.4, 1.4), "run")
p.highlight("LG", color=PURPLE); p.highlight("LT", color=PURPLE)
f = draw(p, width_in=4.8, lateral=(-4.4, 12.4), window=(-7.0, 9.6))
ghost(f, p, (1.2, 5.2), (0.8, 4.85))
plt.show()
Figure 17.15: Drill 3: the moment of decision on counter right. The right tackle has blocked down on the 3; the end (5) has crashed inside behind him from his alignment (dashed square); the pulling left guard and left tackle (purple rings) and the back are arriving. The right guard is climbing to the Will. Outside, the Mike is scraping and the strong safety (SS) is coming down.

Log him and bounce, and the tackle follows the log outside. The end has taken away the inside: there is no room to kick him out, because he is already standing where the hole was supposed to be, and the guard cannot get his head inside him. So the guard takes his outside shoulder, gets his head and body outside him and seals him in (a log block). The pulling tackle, who was going to turn up inside the kick-out, now has no inside to turn up into, so he follows the log outside and takes the first defender to show, usually the Mike scraping over the top. The back, reading the guard’s helmet, bounces outside the log behind the tackle.

The defender left over is the strong safety, coming down outside, and he is the back’s to beat. That is not an accident: a defense that tells its end to spill the ball outside is counting on a fast defender outside to meet it there, the alley player (Run Fits and Box Math explains who that is and why). The offense’s counter-move is to block that man, often with a wide receiver’s crack block (a receiver cutting back inside to block a defender from the side, which Perimeter Runs and Misdirection covers).

Takeaways

  • A gap scheme blocks men, not areas, and aims at a hole chosen in advance. The core gap run is down blocks (the inside wall), a kick-out (the outside wall) and a puller through the middle; the rest of the family drops or swaps one part. The hole moves only as far as the end man forces it, and the back runs to the side of the kick-out man’s helmet (kick or log).
  • Power is the template. Block down, kick out with the fullback, lead with the backside guard, hinge the backside, and leave the backside end unblocked. It turns a play side of three blockers against four defenders into five against four, with the spare man doubling the 3 and then climbing. It does not add a blocker to the box; it moves one.
  • The rest of the family varies one thing. Counter changes the back’s first step and pulls two (guard kicks, tackle wraps). Duo pulls nobody and drives two double teams into a light box. Trap and wham leave a lineman unblocked and hit him from the side, with a guard or a tight end. Iso sends a fullback at one linebacker. Pin-and-pull and the sweep take the same blocks outside. The draw blocks the rush where it wants to go.
  • Every gap run names who is left free. Usually it is a defender far from the hole (the backside end); the offense bets he arrives late, or reads him with the quarterback.
  • Coaches choose by front, shell, personnel and line. Gap schemes like angles, seven-man boxes and big static fronts; zone likes movement; duo and zone like light boxes; most teams run both from the same looks. The rules travel from front to front, which is why a backside 3-technique turns power into dart.
  • Follow the guard. A puller runs to the hole. Find the backside guard on every run (in the shotgun, usually the one on the back’s side), and you will call the direction of most gap plays before the back gets there.

Connections

Builds on: The Language of the Run Game (down blocks, pulls, kick-outs, lead blocks, hat math) and Zone Running (the other family, and the contrast that runs through this chapter); Classic Formations (the I-formation and the fullback) and How to Watch a Broadcast (stance tells and the prediction log).

Sets up:

  • Option Football: the quarterback who reads the defender power leaves unblocked, plus QB power and QB counter, where the quarterback carries the ball behind these same blocks.
  • Perimeter Runs and Misdirection: crack and seal blocks on the edge, jet sweeps, and the Wing-T’s buck sweep, a gap-scheme cousin of the Lombardi sweep.
  • Play-Action, Boots and Screens: pulling guards on pass plays, and why linebackers who read guards are vulnerable to them.
  • Run Fits and Box Math: the defense’s half of this chapter: who fills which gap against power, and the spill-or-box decision that decides kick or log.
  • Constraint Theory and Sequencing: power, counter, trap and the boot as a sequence in which each play punishes the defense’s answer to the last.

See also (case studies): The Ravens’ Lamar Jackson Run Game and The Eagles: Trenches and the Tush Push.

If you want to go deeper: Chris B. Brown’s The Art of Smart Football and his Grantland “Draw It Up” columns (the wham piece cited here is a model of the form); Vince Lombardi and W. C. Heinz, Run to Daylight! (1963), for the sweep in its inventor’s words; and any coaches’ clinic talk on “gap, down, backer” rules, which are the grammar of every play in this chapter.

NoteGo deeper

Finding gap runs in real tracking data. The play diagrams and both animations here are gridiron simulations written in NFL Big Data Bowl coordinates. The 2025 Big Data Bowl release (2022 season, weeks 1–9) labels every run with PFF’s primary run concept, so you can count how often each concept was called (the first print below), pull every power or counter play, find the pulling guard by his first-second movement, and draw the real version of Figure 17.4. The data needs a free Kaggle login, so this code (in the web edition, under “Show the Python”) is not run when the book is built.

Show the Python (real Big Data Bowl tracking; not run in the build)
import pandas as pd
from gridiron import bdb, show_animation

plays = pd.read_csv("data/bdb/plays.csv")
print(plays["pff_runConceptPrimary"].value_counts().head(12))      # how often each concept was called

counters = plays[plays["pff_runConceptPrimary"].astype(str).str.upper().str.contains("COUNTER")]
g, pl = counters.iloc[0][["gameId", "playId"]]
trk = bdb.load_tracking("data/bdb/tracking_week_*.csv")
one = bdb.prepare(trk, plays, game_id=g, play_id=pl)

# the puller is the offensive lineman who moves farthest sideways in the first second after the snap.
# BDB tracking has no position column, so take the linemen from players.csv first.
players = pd.read_csv("data/bdb/players.csv")
linemen = set(players.loc[players["position"].isin(["T", "G", "C"]), "nflId"])
snap = one[one["frameType"] == "SNAP"]["frameId"].min()
ol = one[one["nflId"].isin(linemen) & one["frameId"].between(snap, snap + 10)]
print(ol.groupby("displayName")["y"].agg(lambda s: abs(s.iloc[-1] - s.iloc[0])).sort_values().tail(2))
show_animation(one, times=[0.0, 0.6, 1.3, 2.3])                    # the same moments as the simulated counter

  1. “Gap, down, backer” (sometimes “gap, down, linebacker” or “GDL”) is the standard play-side rule for power and counter in coaching manuals and clinic talks. One coaching write-up states it as: gap, “if there is somebody in your immediate backside gap, block them”; down, “if there is somebody over or inside shoulder of the linemen in your backside gap, block them”; backer, “if there is nobody in the gap or down, head to the linebacker”: Chris Haddad, “How To Install Gap Scheme Runs Into Your Offense,” Viqtory Sports, https://www.viqtorysports.com/the-gap-scheme-how-its-run-in-every-offense/. For power’s assignments in general, see Chris B. Brown, The Art of Smart Football (2015).↩︎

  2. Jonny Page, “Eagles Concepts: Dart,” Bleeding Green Nation (Jul 21, 2023): dart “is a gap scheme run, that looks a lot like one-back power but with a pulling tackle instead of a pulling guard,” also called “one-back power or tackle power”; it “allows your interior lineman to stay inside,” protecting against “quick interior penetration from the opposing defensive tackle,” but “the tackle has further to travel so he needs to be very athletic”: https://www.bleedinggreennation.com/2023/7/21/23790118/eagles-concepts-dart.↩︎

  3. “Counter run,” Wikipedia (Washington’s counter trey of the 1980s and early 1990s, “modeled from the Nebraska Cornhuskers”; the left guard and left tackle pull while the right side blocks down; the back steps left, then takes the ball right): https://en.wikipedia.org/wiki/Counter_run. Gibbs on Nebraska (“We saw some film on Nebraska, and Tom Osborne was doing some really innovative things with his line up front…. So, we stole it.”), and Nebraska’s counter dated to 1982: Dave Feit, “Greatest Huskers by the Numbers: 6,” Sports Illustrated (All Huskers), https://www.si.com/college/nebraska/football/dave-feit-s-greatest-huskers-by-the-numbers-6-keith-jones-darin-erstad-tom-osborne-national-champions. The counter trey as “the Redskins’ signature running play that Gibbs implemented his first season,” with Grimm and Jacoby pulling: Associated Press, “Gibbs expected to use same bag of tricks” (2004), https://www.nbcnews.com/id/wbna5946857; Rick Gosselin, “State Your Case: Joe Jacoby”: https://rickgosselin.com/state-your-case-joe-jacoby/. Jersey numbers (Grimm 68, Jacoby 66): Pro Football Hall of Fame, https://www.profootballhof.com/players/russ-grimm/; Hogs Haven, “Redskins by the (Jersey) Numbers: #66 - Joe Jacoby,” https://www.hogshaven.com/2017/8/9/16105032/redskins-by-the-jersey-numbers-66-joe-jacoby. Washington’s 14–2 record in 1983: “1983 Washington Redskins season,” Wikipedia, https://en.wikipedia.org/wiki/1983_Washington_Redskins_season.↩︎

  4. John Riggins, 1983: 1,347 rushing yards and 24 rushing touchdowns, then an NFL single-season record (broken in 1995): Pro Football Hall of Fame, https://www.profootballhof.com/players/john-riggins/; “John Riggins,” Wikipedia, https://en.wikipedia.org/wiki/John_Riggins; Pro Football Reference, https://www.pro-football-reference.com/players/R/RiggJo00.htm.↩︎

  5. Counter is “named after who is pulling. For example, GH Counter (the guard and H-back pull) is essentially the same as GT Counter (the guard and tackle pull)”: Jonny Page, “Eagles Film Room: Concept of the Week - GH Counter,” Bleeding Green Nation (Sep 21, 2024), https://www.bleedinggreennation.com/2024/9/21/24249061/eagles-film-room-concept-of-the-week-gh-counter. Counter trey, GT counter and counter as names for the same guard-and-tackle play, and leading an H-back instead so teams can “keep the backside tackle in to block”: Chris Haddad, “How To Install The Counter Play,” Viqtory Sports, https://www.viqtorysports.com/how-to-run-counter-in-football-complete-guide/.↩︎

  6. NFL Next Gen Stats: split-safety coverage on 42.0% of plays in 2025, the highest since tracking began in 2018 (32.9%): https://www.nfl.com/news/the-coverage-that-turned-the-seahawks-into-super-bowl-winners-and-is-taking-the-nfl-by-storm.↩︎

  7. Henry’s 2020 season (“a league-high 378 times for a league-high 2,027 yards and a league-high 17 touchdowns”): CBS Sports, https://www.cbssports.com/nfl/news/falcons-coach-arthur-smith-well-use-multiple-backs-trust-scheme-to-replicate-derrick-henrys-success; the eighth 2,000-yard season in NFL history: Tennessee Titans, https://www.tennesseetitans.com/news/dh2k-titans-rb-derrick-henry-eclipses-2-000-yard-mark-in-win-over-texans. Henry’s listed height differs by source (6-2 on the Ravens’ roster, 6-3 elsewhere). Tennessee’s duo run game (“multiple double-teams along the interior,” the line working “directly upfield”), Arthur Smith’s system from 2019, and the Titans leading the league in 13 personnel in 2019: Ben Solak, “Without Derrick Henry, the Titans Offense Is Losing Its Identity,” The Ringer (Nov 19, 2021), https://theringer.com/2021/11/19/nfl/titans-offense-derrick-henry-identity.↩︎

  8. Pro Football Hall of Fame biography (“Motley, with his powerful running on Cleveland’s famed trap and draw series, made the Browns’ ground game go”): https://www.profootballhof.com/players/marion-motley/biography/; “Marion Motley,” Wikipedia (“His forte was the trap play”): https://en.wikipedia.org/wiki/Marion_Motley.↩︎

  9. Chris B. Brown, “Draw It Up: The 49ers and the ‘Wham’ Play,” Grantland (Oct 17, 2011): the wham is “similar to a traditional trap play, except the trap block comes from the H-back, not a guard,” and is “a surprisingly simple block”: https://grantland.com/the-triangle/draw-it-up-the-49ers-and-the-wham-play/.↩︎

  10. Same Grantland column (the 49ers’ 25–19 win at Detroit on Oct 16, 2011, Week 6; the plan to leave Ndamukong Suh unblocked; Delanie Walker’s wham blocks; Frank Gore). On Roman’s role in the 49ers’ run game: NBC Bay Area, “Roman Is 49ers’ Genius Behind Innovative Running Attack”: https://www.nbcbayarea.com/news/local/roman-is-49ers-brain-behind/1954545/.↩︎

  11. This book’s calculation from nflverse play-by-play and participation data (load_participation), 2025 regular season, pass and run plays with a down: 10.3% of 32,813 plays had two or more running backs and fullbacks on the field (21 personnel alone was 7.0%). Reproduced in nflverse in Python.↩︎

  12. “Sweep (American football),” Wikipedia (the Packers sweep; Kramer and Thurston pulling; Hornung and Taylor; “an offense that won five NFL titles in seven years”): https://en.wikipedia.org/wiki/Sweep_(American_football); Green Bay Packers, “Fuzzy Thurston a guardian angel on famous power sweep”: https://www.packers.com/news/fuzzy-thurston-a-guardian-angel-on-famous-power-sweep. Vince Lombardi with W. C. Heinz, Run to Daylight! (Prentice-Hall, 1963).↩︎

  13. The covered/uncovered pin-and-pull rule (“If there is a defender in their gap they are going to block down on this defender. If there is not a defender … they are going to pull”): Youth Football Online, “Simple Rules for the Pin and Pull Play”: https://youthfootballonline.com/simple-rules-for-the-pin-and-pull-play; Chris Haddad, “How To Install The Pin & Pull Play,” Viqtory Sports (covered linemen “gap block in the back-side gap,” uncovered linemen “pull to the play-side”): https://www.viqtorysports.com/pin-pull-what-is-it-and-how-is-it-run/.↩︎

  14. Alert the Post, “Cutup Friday: 2024 Commanders Pin Pull RPO’s” (May 16, 2025): “Pin Pull is a gap compliment for Outside Zone”; “Against Over fronts with a 1-technique nose, the Commanders will pull both guards most of the time. First guard kicks, second guard leads”: https://alertthepost.substack.com/p/cutup-friday-2024-commanders-pin. Kingsbury was the Commanders’ offensive coordinator in 2024; for 2026 he is the Rams’ assistant head coach (planning/FACTS-current.md §9).↩︎

  15. This book’s calculation from nflverse play-by-play (load_pbp), 2023–2025 regular seasons, third down with 10 to 12 yards to go, run and pass plays: 162 designed runs (runs that were not quarterback scrambles) converted 12.3% and averaged −0.29 EPA; 2,748 dropbacks (passes, sacks and scrambles) converted 26.6% and averaged −0.11 EPA. “Converted” uses nflverse’s first_down flag.↩︎

  16. “Draw play,” Wikipedia (the botched pass play on which Otto Graham improvised a handoff to Motley, after which Brown “began to work it in as a regular play”): https://en.wikipedia.org/wiki/Draw_play; “Marion Motley,” Wikipedia (at Great Lakes in 1945, “Brown’s experimentation with a new play: a delayed handoff later called the draw play”; “listed at 238 pounds”): https://en.wikipedia.org/wiki/Marion_Motley; Pro Football Hall of Fame biography (6-1, 232 pounds): https://www.profootballhof.com/players/marion-motley/biography/.↩︎

  17. Nick Wagoner, ESPN, “49ers, Ravens use highly effective, but very different, rushing attacks to excel” (Nov 29, 2019): “the Niners have incorporated more power (or gap) blocking into the mix, something that was previously unheard of for a Shanahan offense”; Shanahan told his team he had used such plays about seven times in his play-calling career before 2019: https://www.espn.com/nfl/story/_/id/28178795/49ers-ravens-use-highly-effective-very-different-rushing-attacks-excel.↩︎

  18. Jonathon Macri, “Fantasy Football: Finding an edge in offensive run concepts,” PFF (May 19, 2023): inside and outside zone “accounted for nearly 50% of all running plays in the league” in 2022; draws were “3.04% of rushing plays” in 2022; three-year (2020–2022) yards per carry of 4.53 (power), 3.90 (inside zone), 3.90 (counter), 3.78 (outside zone), 3.71 (duo) and 5.95 (draw): https://www.pff.com/news/fantasy-football-finding-an-edge-in-offensive-run-concepts-2023.↩︎

  19. “Ravens break single-season team rushing record,” NFL.com (Dec 2019; 3,296 yards for the season, breaking the 1978 Patriots’ 3,165): https://www.nfl.com/news/ravens-break-single-season-team-rushing-record-0ap3000001092761; Jackson’s 1,206 yards: https://en.wikipedia.org/wiki/2019_Baltimore_Ravens_season. The era is closed: Roman left Baltimore after the 2022 season, and John Harbaugh was fired in January 2026, after the 2025 season (planning/FACTS-current.md §0, C3).↩︎

  20. USA Football, “How Greg Roman’s schemes revitalized the Baltimore Ravens’ rushing attack” (power, outside zone, pin-pull and counter/trap/wham as the core, with tight ends and fullbacks as extra blockers): https://blogs.usafootball.com/blog/6397/how-greg-roman-s-schemes-revitalized-the-baltimore-ravens-rushing-attack. The Ravens “keep defenders thinking with their array of motion and personnel groupings”: Wagoner, ESPN (Nov 29, 2019), cited above.↩︎

  21. Barkley, 2,005 yards in 16 games, the ninth 2,000-yard season: NFL.com, https://www.nfl.com/news/saquon-barkley-becomes-ninth-player-to-rush-for-2000-yards-in-a-season; Pro Football Reference, https://www.pro-football-reference.com/players/B/BarkSa00.htm. EJ Smith, “Eagles film review: How Saquon Barkley became the NFL’s most explosive running back behind Birds’ O-line,” Philadelphia Inquirer (Nov 6, 2024; “the Eagles alternate between the two noticeably”; “the gap-scheme changeups the Eagles are so adept at calling to balance out the zone runs”): https://www.inquirer.com/eagles/saquon-barkley-explosive-eagles-runs-offensive-line-film-room-20241106.html. Kellen Moore, the Eagles’ 2024 offensive coordinator, left to become the Saints’ head coach (hired Feb 11, 2025), and the line and staff have turned over since: https://www.inquirer.com/eagles/eagles-kellen-moore-hired-saints-coach-20250211.html. Super Bowl LIX, Eagles 40, Chiefs 22, Stoutland as the Eagles’ line coach and his departure after the 2025 season: planning/FACTS-current.md §1, §9.↩︎