Classic Formations: I, Power I, Pro Set, Singleback, and Their Ancestors

The quarterback under center and the backs behind him: eleven formations, what each one was built to do, why most of them faded, and why a few are coming back.

Show the Python (shared helpers and the formation plates)
import os

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

from gridiron import Play, Player, Field, defense, technique, style, show_animation
from gridiron.formations import LINE_D, OFF_BALL, TE_W, WING_W, OL_SPLIT

style.apply()

RB_RING = style.THIRD          # aqua ring: a running back of any kind (tailback, fullback, halfback, wingback)
TE_RING = style.LINE_TO_GAIN   # gold ring: a tight end
THREAT = "#0f7a55"             # darker aqua for "this back could go here" arrows (safe for text)
FAKE = style.MUTED             # gray for a back's fake in the Wing-T series panels
UC, FB_D, TB_D = -1.9, -4.5, -7.0   # quarterback under center, fullback and tailback depths (yards)
GL_SPLIT = 1.25                # goal-line splits: tighter than the normal OL_SPLIT (1.6)
DL_LABELS = {"SDE": "E", "WDE": "E", "SDT": "T", "WDT": "T"}


def line5(split=OL_SPLIT):
    """The five offensive linemen; only the center is lettered."""
    return [Player(k, k, "off", LINE_D, w, label=("C" if k == "C" else ""))
            for k, w in [("LT", -2 * split), ("LG", -split), ("C", 0.0), ("RG", split), ("RT", 2 * split)]]


def P(key, pos, d, w, label=None):
    """An offensive skill player at (d, w): d = yards from the ball (negative = backfield),
    w = yards to the offense's right."""
    return Player(key, pos, "off", d, w, label=label or key)


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


def ring_by_body(p, skip=()):
    """Ring every back (aqua) and tight end (gold), as in the personnel chapter: count rings = personnel."""
    for k, pl in p.players.items():
        if k in skip or pl.side != "off":
            continue
        if pl.pos in ("RB", "FB"):
            p.highlight(k, color=RB_RING)
        elif pl.pos == "TE":
            p.highlight(k, color=TE_RING)
    return p


def hide_yard_numbers(ax):
    """Drop the faint painted field numbers (they sit where receivers stand in zoomed plates)."""
    for t in list(ax.texts):
        if t.get_text().isdigit() and t.get_alpha() is not None and abs(t.get_alpha() - 0.55) < 1e-6:
            t.remove()


QB = P("QB", "QB", UC, 0, "Q")
Y = P("Y", "TE", LINE_D, TE_W)

# The eleven classic formations, strength to the offense's right. Each is legal: seven men on the
# line (five linemen plus the two ends), only the ends of the line and the backs eligible.
# Letters: R = the running back (tailback), F = fullback, H = halfback (a third back), A/B = the
# flexbone's own back letters, W = the Wing-T wingback; Y and U = tight ends (in the goal-line set the
# third tight end, at the wing, is H, the H-back); X and Z = wide receivers; H in the singleback = slot.
# name: (typical personnel, one-line description, skill players)
FORMS = {
    "T-formation": ("32", "three backs side by side", [
        QB, P("LH", "RB", -4.6, -3.0, "H"), P("FB", "FB", -4.6, 0, "F"), P("RH", "RB", -4.6, 3.0, "H"),
        Y, P("U", "TE", LINE_D, -TE_W)]),
    "Pro set": ("21", "two backs side by side", [
        QB, P("HB", "RB", -5.0, -2.2, "H"), P("FB", "FB", -5.0, 2.2, "F"),
        Y, P("X", "WR", LINE_D, -14.0), P("Z", "WR", OFF_BALL, 13.0)]),
    "I-formation": ("21", "two backs stacked", [
        QB, P("FB", "FB", FB_D, 0, "F"), P("RB", "RB", TB_D, 0, "R"),
        Y, P("X", "WR", LINE_D, -14.0), P("Z", "WR", OFF_BALL, 13.0)]),
    "Offset I": ("21", "fullback cheated to one side", [
        QB, P("FB", "FB", FB_D, 1.6, "F"), P("RB", "RB", TB_D, 0, "R"),
        Y, P("X", "WR", LINE_D, -14.0), P("Z", "WR", OFF_BALL, 13.0)]),
    "Power I": ("31", "an I plus a halfback", [
        QB, P("FB", "FB", FB_D, 0, "F"), P("HB", "RB", FB_D, 2.1, "H"), P("RB", "RB", TB_D, 0, "R"),
        Y, P("X", "WR", LINE_D, -14.0)]),
    "Singleback": ("11", "one back, seven yards deep", [
        QB, P("RB", "RB", TB_D, 0, "R"), Y, P("X", "WR", LINE_D, -14.0),
        P("H", "WR", OFF_BALL, -8.5), P("Z", "WR", OFF_BALL, 13.0)]),
    "Ace": ("12", "one back, a tight end each side", [
        QB, P("RB", "RB", TB_D, 0, "R"), Y, P("U", "TE", LINE_D, -TE_W),
        P("X", "WR", OFF_BALL, -13.0), P("Z", "WR", OFF_BALL, 13.0)]),
    "Wishbone": ("31", "fullback close, halfbacks wide", [
        QB, P("FB", "FB", -3.9, 0, "F"), P("LH", "RB", -5.3, -3.1, "H"), P("RH", "RB", -5.3, 3.1, "H"),
        Y, P("X", "WR", LINE_D, -14.0)]),
    "Flexbone": ("30", "one back, two slotbacks", [
        QB, P("FB", "FB", -4.6, 0, "B"), P("LA", "RB", -1.6, -5.2, "A"), P("RA", "RB", -1.6, 5.2, "A"),
        P("X", "WR", LINE_D, -12.0, "X"), P("Z", "WR", LINE_D, 12.0, "Z")]),
    "Wing-T": ("31", "fullback, halfback, wingback", [
        QB, P("FB", "FB", FB_D, 0, "F"), P("HB", "RB", FB_D, -3.2, "H"), P("WB", "RB", OFF_BALL, WING_W + 1.2, "W"),
        Y, P("X", "WR", LINE_D, -12.0)]),
    "Goal line": ("23", "three tight ends, two backs", [
        QB, P("FB", "FB", FB_D, 0, "F"), P("RB", "RB", TB_D, 0, "R"),
        P("Y", "TE", LINE_D, 3.9), P("U", "TE", LINE_D, -3.9), P("W", "TE", OFF_BALL, 5.2, "H")]),
}
SPLITS = {"Goal line": GL_SPLIT}


def players_of(name, mirror=False):
    pl = line5(SPLITS.get(name, OL_SPLIT)) + [q.moved() for q in FORMS[name][2]]
    return [q.mirrored() for q in pl] if mirror else pl


def check_legal(players):
    """Seven on the line, and every eligible receiver on the line is at an end of it."""
    off = [q for q in players if q.side == "off"]
    on = sorted([q for q in off if q.d > -1.0], key=lambda q: q.w)
    assert len(on) == 7, [q.key for q in on]
    for q in on[1:-1]:
        assert q.pos not in ("WR", "TE", "RB", "FB"), f"covered receiver {q.key}"


for _name in FORMS:
    check_legal(players_of(_name))


def plate(ax, name, lateral=(-16.5, 16.5), window=(-9.0, 2.8), mirror=False, sub=True, title=None):
    """One atlas plate: the formation alone, backs ringed aqua and tight ends gold."""
    code, desc, _ = FORMS[name]
    p = ring_by_body(Play(players_of(name, mirror), None, los=35, to_go=None))
    fld = p.draw(ax=ax, lateral=lateral, window=window, title=False)
    hide_yard_numbers(ax)
    ax.text(0.0, 1.03, title or name, transform=ax.transAxes, ha="left", va="bottom", fontsize=10,
            fontweight="bold", color=style.INK)
    if sub:
        ax.text(1.0, 1.03, f"{code} personnel · {desc}", transform=ax.transAxes, ha="right",
                va="bottom", fontsize=7.2, color=style.INK_2)
    return p, fld


def ring_legend(fig, y=0.0, ncol=3, extra=()):
    h = [Line2D([], [], marker="o", ls="", ms=9, markerfacecolor=style.OFFENSE, markeredgecolor=RB_RING,
                markeredgewidth=2.2, label="aqua ring: a running back"),
         Line2D([], [], marker="o", ls="", ms=9, markerfacecolor=style.OFFENSE, markeredgecolor=TE_RING,
                markeredgewidth=2.2, label="gold ring: a tight end"),
         Line2D([], [], marker="o", ls="", ms=9, markerfacecolor=style.OFFENSE, markeredgecolor="white",
                label="no ring: receiver, QB (Q), linemen")]
    h += list(extra)
    fig.legend(handles=h, loc="lower center", bbox_to_anchor=(0.5, y), ncol=ncol, fontsize=7.3,
               frameon=False, handletextpad=0.3, columnspacing=1.1)


def plate_pair(a, b, mirror=(False, False), height=2.05):
    fig, axes = plt.subplots(1, 2, figsize=(6.6, height))
    out = [plate(ax, n, mirror=m) for ax, n, m in zip(axes, (a, b), mirror)]
    fig.subplots_adjust(left=0.01, right=0.99, top=0.86, bottom=0.16, wspace=0.05)
    ring_legend(fig)
    return fig, out


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


def label(fld, p, text, at, target=None, ha="center", fs=7.3, color=style.INK, va="center"):
    """A short boxed label at (d, w); with `target`, a thin leader line to that spot."""
    x, y = XY(fld, p, *at)
    box = dict(boxstyle="round,pad=0.22", fc=style.SURFACE, ec=style.BASELINE, lw=0.6)
    if target is None:
        fld.ax.text(x, y, text, fontsize=fs, ha=ha, va=va, color=color, zorder=12, bbox=box)
    else:
        tx, ty = XY(fld, p, *target)
        fld.ax.annotate(text, xy=(tx, ty), xytext=(x, y), fontsize=fs, ha=ha, va=va, color=color,
                        zorder=12, bbox=box,
                        arrowprops=dict(arrowstyle="-", color=style.INK_2, lw=0.7, shrinkA=0, shrinkB=7))


def threat(fld, p, pts, color=THREAT, lw=1.7, text=None, text_at=None, fs=7.0, ls=(0, (3, 2))):
    """A dashed 'this back could go here' arrow through absolute (d, w) points."""
    xs, ys = XY(fld, p, np.array([q[0] for q in pts]), np.array([q[1] for q in pts]))
    fld.ax.plot(xs[:-1], ys[:-1], color=color, lw=lw, ls=ls, zorder=6, solid_capstyle="round")
    fld.ax.plot(xs[-2:], ys[-2:], color=color, lw=lw, ls=ls, zorder=6)
    fld.ax.add_patch(FancyArrowPatch((xs[-2] + 0.75 * (xs[-1] - xs[-2]), ys[-2] + 0.75 * (ys[-1] - ys[-2])),
                                     (xs[-1], ys[-1]), arrowstyle="-|>", mutation_scale=10, color=color,
                                     lw=lw, zorder=6))
    if text:
        x, y = XY(fld, p, *(text_at or pts[-1]))
        fld.ax.text(x, y, text, fontsize=fs, color=color, fontweight="bold", ha="center", va="center",
                    zorder=9, bbox=dict(boxstyle="round,pad=0.18", fc=style.SURFACE, ec="none", alpha=0.92))


def base43(off, shell="two_high", fix=None):
    """A base 4-3 (four linemen, three linebackers, four defensive backs) aligned to `off`."""
    dfn = defense("4-3_over", shell, off)
    fix = fix or {}
    dfn = [q.moved(**fix[q.key]) if q.key in fix else q for q in dfn]
    return [q.moved(label=DL_LABELS.get(q.key, q.label)) for q in dfn]


# --- frame strips (PDF) and video (web), cropped to the box so the markers stay legible --------------
# gridiron's frame_strip fits all 22 players and has no rings; these panels zoom on the box, ring the
# backs the reader should follow, and put a one-line note under each frame.
MARK_R = 0.62


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


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: markers, trails of on-screen players, rings on chosen players."""
    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)]
    ids = set(shown["_id"])
    trails = df[(df["frameId"] <= fid) & df["_id"].isin(ids) & (df["side"] != "ball")]
    for (_, side), g in trails.groupby(["_id", "side"]):
        xs, ys = fld.xy(g["x"].values, g["y"].values)
        ax.plot(xs, ys, color=style.OFFENSE if side == "off" else style.DEFENSE, lw=0.9, alpha=0.4, zorder=3)
    ppy = fld.pts_per_yard()
    for _, r in shown.iterrows():
        x, y = (float(v) for v in fld.xy(r["x"], r["y"]))
        if r["side"] == "ball":     # the ball, drawn small and just ahead of whoever holds it
            ax.add_patch(Ellipse((x + 0.75, y + 0.55), 0.6, 0.36, fc=style.BALL, ec="white", lw=0.5, zorder=11))
            continue
        lab = str(r.get("label", "") or "")
        if r["side"] == "off":
            ax.add_patch(Circle((x, y), MARK_R, fc=style.OFFENSE, ec="white", lw=0.6, zorder=8))
            tc = "white"
        else:
            ax.add_patch(RegularPolygon((x, y), 4, radius=MARK_R * 1.3, orientation=np.pi / 4,
                                        fc=style.DEFENSE_TINT, ec=style.DEFENSE, lw=1.0, zorder=8))
            tc = style.INK
        fs = max(4.0, min(8.0, ppy * (0.85 if len(lab) <= 1 else 0.62)))
        ax.text(x, y, lab, ha="center", va="center", fontsize=fs, color=tc, fontweight="bold", zorder=10)
    for key, col in rings:
        r = cur[cur["displayName"] == key].iloc[0]
        x, y = fld.xy(r["x"], r["y"])
        ax.add_patch(Circle((float(x), float(y)), 1.05, fc="none", ec=col, lw=1.7, 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 and a note under each frame."""
    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.6 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:+.1f} s"),
                     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.2, color=style.INK)
    fig.tight_layout(h_pad=1.4 if notes else 0.6, w_pad=0.6)
    return fig


def video(play, times, lateral, window, notes=None, rings=(), width_in=5.2):
    """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].replace("\n", " ")) 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)
        video(play, times, **kw)

Picture a third-and-1 for the 2024 Baltimore Ravens, late in a close game. The Ravens break the huddle and something about the picture looks old. The quarterback walks right up behind the center and puts his hands under him. Behind him, in a straight line, stand a 300-pound fullback and, seven yards deep, a 247-pound running back, hands on knees. One tight end, two receivers. The analyst says “they’re in the I,” and the defense, which has spent most of the afternoon with five defensive backs on the field, is already shouting and pointing and walking a safety down toward the line. This is a formation your grandfather would recognize. So why is one of the best offenses in football still using it, and why does the defense react as if it already knows what’s coming? This chapter is about those old shapes: what each was built to do, how they grew out of one another, why most of them faded from the NFL, and why the ones that survived are making a comeback.

You’ll be able to…

Reading a formation from the back to the front

The personnel told you who is on the field. The formation tells you where they stand. Formation Rules and the Language of Alignment gave you the grammar: seven players on the line of scrimmage, the ends of the line eligible to catch passes, the receiver letters (X, Y, Z, H, F), and the quarterback’s three depths, under center (taking the snap directly from the center’s hands), the pistol (about three to four yards back) and the shotgun (about five yards back). This chapter and the next are the vocabulary: the named formations you’ll actually hear on a broadcast.

The classic formations share one thing: the quarterback is under center. For most of football history that was simply how the game was played, and the formations differ mainly in what stands behind the quarterback. So read them from the back to the front:

  1. Is the quarterback under center? If he is, you’re in this chapter’s world.
  2. How many backs, and how are they arranged? One or two or three; stacked one behind another, side by side, or one shifted to the side.
  3. Where are the tight ends and receivers? A tight end on one side or both, a wing, receivers wide.

One rule settles most arguments about step 2. Name the formation by where players stand; count the personnel by who they are. Anyone a yard or more behind the line and inside the width of the tight ends is in the backfield, so a tight end standing directly behind the quarterback makes the formation an I, whoever he is. The personnel comes from the substitution, as in Personnel: from the couch you can’t tell a tight end from a fullback by where he stands, and often not by his build. When the two disagree, say both: a tight end at fullback is “an I with 12 personnel.” The same rule explains the exceptions you’ll meet below. The Wing-T’s wingback and the flexbone’s slotbacks stand near the line but are running backs, so they count as backs; an H-back is a tight end wherever he stands.

Here is the most famous answer to those three questions, labeled part by part.

Show the Python
p = ring_by_body(Play(players_of("I-formation"), None, los=35, to_go=None))
fld = p.draw(lateral=(-18.5, 18.5), window=(-10.5, 6.5), title=False)
hide_yard_numbers(fld.ax)
label(fld, p, "split end (X):\non the line", (3.6, -13.0), target=(LINE_D, -14.0))
label(fld, p, "seven on the line:\nX, five linemen, Y", (3.6, -2.0))
label(fld, p, "tight end (Y)", (3.6, 6.2), target=(LINE_D, TE_W))
label(fld, p, "flanker (Z): a yard\noff the line", (3.6, 14.0), target=(OFF_BALL, 13.0))
label(fld, p, "quarterback (Q) under center:\nhands under the center", (-3.4, -7.6), target=(UC, 0.0))
label(fld, p, "fullback (F): 4–5 yards deep,\nthe lead blocker", (-4.9, 10.2), target=(FB_D, 0.0))
label(fld, p, "tailback (R): about 7 yards deep,\nsees the blocks, runs downhill", (-7.6, 10.2),
      target=(TB_D, 0.0))
plt.show()
Figure 11.1: Anatomy of a classic formation: the I-formation (21 personnel). The quarterback (Q) is under center; the fullback (F) stands about 4–5 yards deep, directly behind him; the tailback (R, the running back) about 7 yards deep, directly behind the fullback. Seven men are on the line: the split end (X), the five linemen (only the center, C, is lettered) and the tight end (Y). The flanker (Z) stands a yard off the line, so Y, not Z, is the right end of the line and is eligible. Aqua rings mark backs, the gold ring the tight end.

Every formation in this chapter can be described in those same terms, and the names often tell you the shape. The I is a letter. The T is a letter (the quarterback and three backs form the crossbar and stem). The wishbone looks like one. The pro set was what the pros used. The naming isn’t standardized, and every team has its own playbook words, but the broadcast names are stable enough to learn once.

The letters in this chapter’s diagrams. Playbook letters get reused, so here is the key, and it never changes inside a figure. On offense (circles): Q quarterback, C center, R the running back (the tailback), F fullback, H a halfback (a third back in the old formations), X and Z wide receivers, Y and U tight ends. Two letters do double duty, as they do in real playbooks: in the one-back pictures H is the “move” player from Formation Rules, a slot receiver or an H-back, and the option and Wing-T formations bring their own back letters (A, B, W), named where they appear. The ring settles it: aqua is a running back, gold is a tight end, no ring is a receiver. On defense (squares): E end, T tackle, N nose tackle, S, M and W the Sam, Mike and Will linebackers, C cornerback, FS and SS the safeties.

NoteMadden vs. real life

In Madden you pick a formation from a menu (“I-Form Pro,” “Singleback Ace,” “Strong Close”) and then pick a play from the list that belongs to that formation, as if each formation owned its own plays. Real offenses work the other way around. A team has a few dozen run and pass plays and runs most of them from many formations, because a play the defense can predict from the formation is a play the defense can stop. The formation is the first word of the play call (“I Right 26 Power,” as What a Play Really Is spelled out), not the play. The menu names themselves are borrowed from real playbooks.

The ancestor: the T-formation

Almost every formation in this chapter descends from one shape. In the T-formation the quarterback stands under center and three backs line up side by side about four or five yards behind him: a fullback in the middle and a halfback on each side. Seen from the press box, the quarterback and the line of backs make a T.

Show the Python
fig, ax = plt.subplots(figsize=(6.5, 3.0))
p, fld = plate(ax, "T-formation", lateral=(-13.5, 13.5), window=(-9.6, 3.2))
label(fld, p, "full house: three backs plus\nan under-center quarterback", (-7.4, 7.6), target=(-4.6, 3.0))
label(fld, p, "a back in the middle\nand one on each side", (-7.6, -6.6), target=(-4.6, 0.0))
fig.subplots_adjust(left=0.01, right=0.99, top=0.9, bottom=0.03)
plt.show()
Figure 11.2: The T-formation (in modern terms, 32 personnel: three backs, two tight ends). Three backs stand side by side about 4½ yards deep, a halfback (H) on each side of the fullback (F), with the quarterback (Q) under center between them and the line. Four players in the backfield behind an under-center quarterback is a full house. Both ends (Y and U) are tight, as in the 1940s; there is no wide receiver at all.

The backs’ names are older than the T itself, which is why they’re confusing: the fullback is the bigger, blocking-first back, and the halfbacks are the runners. Any backfield with three backs behind an under-center quarterback, four players in all, is called a full house backfield. The T is the original full house; you’ll meet two more in this chapter (the Power I and the wishbone), and you’ll still see one on the goal line most Sundays.

Why it exists: speed to the line

The T’s predecessor was the single wing, the dominant formation of the 1910s to the 1930s, in which the center snapped the ball several yards back, through the air, to a tailback who ran, passed or handed off. The single wing is a power formation, but it’s slow: a direct snap takes time, the runner starts from a standstill several yards deep, and the defense can see who has the ball.

The T fixed all three problems with one change, putting the quarterback’s hands under the center. A hand-to-hand snap is instant and almost never fumbled. The quarterback can turn and hand the ball to a back who is already running, so the ball carrier hits the line of scrimmage at full speed one or two seconds after the snap. And because the quarterback can fake a handoff to one back and give to another with his back to the defense, nobody across the line knows for sure who has the ball. With three backs, all a few strides from the line and facing forward, the T threatens the middle and both flanks on every snap, and the defense has to respect all of them.

The modern T arrived with a bang. Coaches had used a tight T for decades, but in 1940 Clark Shaughnessy’s version of it, with wider splits, quicker hitting plays and a back sent in motion before the snap, went undefeated at Stanford, and George Halas’s Chicago Bears, who had been developing the same ideas with Shaughnessy’s help, used it to beat Washington 73–0 in the NFL Championship Game on December 8, 1940.1 Within a decade almost every team in the NFL had switched; the Pittsburgh Steelers, the last NFL holdout, used the single wing for the last time in 1952 and switched to the T in 1953.2 The Single Wing to the Scoring Drought tells that history in full; what matters here is that the T is the trunk of the tree.

What did the T give up? Width. With both ends tight and three backs packed behind the quarterback, it had no receivers outside the formation, so the defense could pack its own players near the ball too. Most of what happened next is the story of coaches taking the T and pulling one of its players out wide.

The family tree

The diagram below is the map for the rest of the chapter. Each branch is an answer to the question “what should we do with the T’s three backs?” Some coaches stacked them, some split them, some spread them out, some kept all three and taught the quarterback to read the defense instead of blocking it.

Show the Python
from matplotlib.patches import Circle as _C

def glyph(ax, cx, cy, players, s=0.092):
    """A tiny backfield icon: line, quarterback, backs, close tight ends (receivers wider than 8 yd dropped)."""
    for q in players:
        if abs(q.w) > 8.0:
            continue
        x, y = cx + q.w * s, cy + q.d * s
        if q.pos in ("LT", "LG", "C", "RG", "RT"):
            fc, ec = style.BASELINE, style.BASELINE
        elif q.pos == "QB":
            fc, ec = style.OFFENSE_DARK, style.OFFENSE_DARK
        elif q.pos in ("RB", "FB"):
            fc, ec = style.THIRD, style.THIRD
        elif q.pos == "TE":
            fc, ec = style.LINE_TO_GAIN, style.LINE_TO_GAIN
        else:
            fc, ec = style.OFFENSE, style.OFFENSE
        ax.add_patch(_C((x, y), 0.62 * s, fc=fc, ec=ec, lw=0.5, zorder=5))

SINGLE_WING = [Player(k, k, "off", LINE_D, w) for k, w in
               [("LT", -1.6), ("LG", 0.0), ("C", 1.6), ("RG", 3.2), ("RT", 4.8)]] + [
    P("SE", "TE", LINE_D, -3.2), P("TE2", "TE", LINE_D, 6.4),                # seven on the line, unbalanced
    P("BB", "QB", -1.2, 2.6, "B"), P("TB", "RB", -5.0, 0.6), P("FB", "FB", -4.3, 2.6),
    P("WB", "RB", -1.2, 8.0)]   # direct snap to the tailback; the blocking back (dark blue) is not a passer
SHOTGUN = line5() + [P("QB", "QB", -5.0, 0, "Q"), P("RB", "RB", -5.0, -2.1, "R"), Y]
SPLIT_T = line5(2.3) + [P("QB", "QB", UC, 0, "Q"), P("LH", "RB", -4.6, -3.0, "H"), P("FB", "FB", -4.6, 0, "F"),
                        P("RH", "RB", -4.6, 3.0, "H"), P("Y", "TE", LINE_D, 6.9), P("U", "TE", LINE_D, -6.9)]
# the split-T's "split" is the line: splits of roughly a yard or more between linemen

NODES = {  # key: (title, years, x, y, players, still in the NFL?)
    "sw":   ("Single wing", "1900s–1930s", 1.3, 8.35, SINGLE_WING, False),
    "t":    ("T-formation", "modern T, 1940", 5.0, 8.35, players_of("T-formation"), False),
    "splt": ("Split-T", "1941, wide line splits", 3.75, 5.95, SPLIT_T, False),
    "wingt": ("Wing-T", "1950", 1.3, 5.95, players_of("Wing-T"), False),
    "pro":  ("Pro set", "1950s", 6.25, 5.95, players_of("Pro set"), True),
    "i":    ("I-formation", "1950s–60s", 8.7, 5.95, players_of("I-formation"), True),
    "bone": ("Wishbone", "1968, after the veer", 3.75, 3.55, players_of("Wishbone"), False),
    "one":  ("Singleback / ace", "1980s", 6.25, 3.55, players_of("Ace"), True),
    "powi": ("Offset I, Power I", "1960s–70s", 8.7, 3.55, players_of("Power I"), True),
    "flex": ("Flexbone", "1980s", 3.75, 1.15, players_of("Flexbone"), False),
    "gun":  ("Shotgun and spread", "the next chapter", 6.25, 1.15, SHOTGUN, True),
}
EDGES = [("sw", "t"), ("sw", "wingt"), ("t", "splt"), ("t", "wingt"), ("t", "pro"), ("t", "i"),
         ("splt", "bone"), ("bone", "flex"), ("pro", "one"), ("i", "powi"), ("one", "gun")]
BW, BH = 2.2, 1.75

fig, ax = plt.subplots(figsize=(6.6, 6.9))
ax.set_xlim(0, 10)
ax.set_ylim(-0.55, 9.4)
ax.axis("off")
for a, b in EDGES:
    (_, _, xa, ya, _, _), (_, _, xb, yb, _, _) = NODES[a], NODES[b]
    if abs(ya - yb) < 0.01:   # same row: side to side
        start, end = (xa + BW / 2 * np.sign(xb - xa), ya), (xb - BW / 2 * np.sign(xb - xa), yb)
    else:
        start, end = (xa, ya - BH / 2), (xb, yb + BH / 2)
    ax.add_patch(FancyArrowPatch(start, end, arrowstyle="-|>", mutation_scale=10, color=style.MUTED, lw=1.1,
                                 connectionstyle="arc3,rad=0.0", zorder=1, shrinkA=2, shrinkB=2))
for key, (title, years, x, y, pl, nfl_now) in NODES.items():
    ec = style.OFFENSE if nfl_now else style.MUTED
    ax.add_patch(FancyBboxPatch((x - BW / 2, y - BH / 2), BW, BH, boxstyle="round,pad=0.02,rounding_size=0.12",
                                fc=style.SURFACE, ec=ec, lw=1.6 if nfl_now else 1.0, zorder=2))
    glyph(ax, x, y + 0.62, pl)
    ax.text(x, y - 0.32, title, ha="center", va="center", fontsize=8.2, fontweight="bold", color=style.INK,
            zorder=6)
    ax.text(x, y - 0.66, years, ha="center", va="center", fontsize=7, color=style.INK_2, zorder=6)
ax.text(1.3, 3.55, "its series lives on in\njet sweeps and\nmisdirection (Part 3)", ha="center", va="center",
        fontsize=7, color=style.INK_2, style="italic")
ax.add_patch(FancyArrowPatch((1.3, 5.95 - BH / 2), (1.3, 4.15), arrowstyle="-|>", mutation_scale=10,
                             color=style.MUTED, lw=1.1, ls=(0, (3, 2))))
ax.text(8.7, 1.15, "where two-back\nfootball survives:\n21 personnel, short\nyardage, play-action",
        ha="center", va="center", fontsize=7, color=style.INK_2, style="italic")
ax.add_patch(FancyArrowPatch((8.7, 3.55 - BH / 2), (8.7, 1.85), arrowstyle="-|>", mutation_scale=10,
                             color=style.MUTED, lw=1.1, ls=(0, (3, 2))))
# the shotgun's second parent: the single wing's direct snap (Red Hickey's 49ers, 1960)
ax.plot([1.3 - BW / 2, 0.12, 0.12, 6.25, 6.25], [8.35, 8.35, -0.2, -0.2, 1.15 - BH / 2 - 0.12],
        color=style.MUTED, lw=1.1, ls=(0, (3, 2)), zorder=1)
ax.add_patch(FancyArrowPatch((6.25, 0.0), (6.25, 1.15 - BH / 2), arrowstyle="-|>", mutation_scale=10,
                             color=style.MUTED, lw=1.1, zorder=1))
ax.text(3.2, -0.2, "the direct snap returns: the shotgun, 1960", ha="center", va="center", fontsize=7,
        color=style.INK_2, style="italic", bbox=dict(boxstyle="round,pad=0.15", fc=style.SURFACE, ec="none"))
h = [Line2D([], [], color=style.OFFENSE, lw=1.6, label="still seen in the NFL"),
     Line2D([], [], color=style.MUTED, lw=1.0, label="mostly college, high school or history")]
ax.legend(handles=h, loc="upper center", bbox_to_anchor=(0.62, 1.035), ncol=2, fontsize=7.5, frameon=False)
plt.show()
Figure 11.3: The family tree of the classic formations (dates are when each became prominent, not the first time anyone drew it; several are disputed, see the text). Each icon shows the line (gray), the player who takes the snap (dark blue), the backs (aqua) and any tight end or end close to the line (gold). In the single wing the dark-blue dot is the blocking back: the snap went past him, through the air, to the tailback. In the split-T the line itself is spread. Blue boxes are formations you can still see in today’s NFL; gray boxes mostly live on in college, high school, the service academies or the history books (the full-house T survives only as an occasional goal-line look). The shotgun has two parents: the one-back passing sets, and the single wing’s direct snap (dashed).

You don’t need to memorize the dates. The useful thing is the logic of the branches, because each one is a different answer to the same trade: every player you keep in the backfield is a blocker or a runner you gain, and a receiver you lose.

Two names on the tree never get a section of their own, because here they matter only as links. The split-T was Don Faurot’s 1941 Missouri version of the T. Its “split” was the line: wide gaps between the linemen that stretched the defensive front, while the quarterback rode down the line and either kept the ball or pitched it to a trailing halfback, depending on what one unblocked defender did. It may have been football’s first option offense.3 The veer was Bill Yeoman’s triple-option attack at Houston from the mid-1960s, one of the offenses Emory Bellard was trying to improve when he drew up the wishbone.4 Option Football has both.

The pro set: one back goes wide

The first big branch came from the passing game. In 1949 Shaughnessy, by then coaching the Los Angeles Rams, took one of his T-formation halfbacks, Elroy “Crazylegs” Hirsch, and lined him up wide as a receiver: a flanker.5 (Others had split a back wide before, so Hirsch’s claim to be the first flanker is disputed, but he became the model for the position.) Two backs stayed behind the quarterback, side by side. Add a tight end on one side and a receiver split wide on the other, and you have the formation that ran the NFL for the next quarter century.

The pro set, also called split backs, puts the quarterback under center and the halfback and fullback side by side behind him, usually about five yards deep and roughly behind the guards or tackles. Up front there’s a tight end on one side, the flanker (Z) a yard off the line on the tight end’s side, and the split end (X) on the line on the other side. That’s 21 personnel: two backs, one tight end, two receivers.

Show the Python
PRO_WIN = (-10.4, 6.0)
fig, axes = plt.subplots(1, 2, figsize=(6.6, 2.75))
p, fld = plate(axes[0], "Pro set", window=PRO_WIN)
p2, fld2 = plate(axes[1], "Pro set", sub=False, title="What it threatens", window=PRO_WIN)
for sgn in (-1, 1):
    (x0, y0), (x1, y1) = XY(fld2, p2, -0.5, sgn * 9.0), XY(fld2, p2, 4.5, sgn * 16.5)
    fld2.ax.add_patch(Rectangle((min(x0, x1), min(y0, y1)), abs(x1 - x0), abs(y1 - y0), fc=THREAT, alpha=0.10,
                                ec="none", zorder=1))
    threat(fld2, p2, [(-5.0, sgn * 2.2), (-2.6, sgn * 2.5), (1.4, sgn * 2.5)])
    threat(fld2, p2, [(-5.0, sgn * 2.2), (-4.0, sgn * 5.4), (-0.6, sgn * 8.6), (2.0, sgn * 10.4)])
    label(fld2, p2, "the flat", (3.6, sgn * 13.6), color=THREAT, fs=7.0)
label(fld2, p2, "a back each side:\nrun, block or catch", (-8.6, 0.0), color=THREAT)
fig.subplots_adjust(left=0.01, right=0.99, top=0.88, bottom=0.13, wspace=0.05)
ring_legend(fig)
plt.show()
Figure 11.4: The pro set (split backs, 21 personnel). Left: the plate. The halfback (H) and fullback (F) stand side by side about five yards deep; the tight end (Y) and flanker (Z) are on the right, the split end (X) on the left. Right: what the backfield threatens. Each back is close to a hole on his own side and can hit it quickly (the short dashed arrows), or release into the flat, the short area toward the sideline within a few yards of the line (shaded; it runs on to the sideline beyond this picture). The defense can’t tell the play’s direction from the backs’ alignment, and both edges of the pass protection have a back beside them to pick up a blitzer.

Why it exists: balance

The pro set’s virtue is balance. With a back on each side of the quarterback, the offense can run either way with a lead blocker, throw to either back in the flat, or keep both in to block a blitz on either side. The defense gets almost no clue from the backfield, because the backfield looks the same whichever way the play goes. Meanwhile the flanker and split end give the passing game two real receivers outside, which the T never had. That combination, a credible run game both ways plus two wide receivers and a tight end, made the pro set the standard NFL formation from the late 1950s into the 1980s. Bill Walsh’s early San Francisco offenses, the original West Coast offense, was built on split backs and threw many of its short passes to backs releasing from them.6

What does it give up? The deep tailback. Split backs can hit a hole fast: each is only about five yards deep and close to the line, and split-back dives and traps are among the quickest runs in football. What they lose is the luxury of a back seven yards deep, directly behind the quarterback, who has time to watch the blocks form and can cut to either side. And there’s no lead blocker lined up in front of the runner: if the play wants one, he has to come from the other side and cross the ball carrier’s path, which costs a beat and has to be timed so the two don’t collide. For power running straight at the defense, the next branch was better.

NoteFilm room: Green Bay Packers, 1959–1967

Vince Lombardi’s Packers won five NFL championships in seven seasons (1961, 1962, 1965, 1966 and 1967, the last two followed by wins in the first two Super Bowls), and they did it mostly from the pro set.7 Fullback Jim Taylor and halfback Paul Hornung lined up side by side behind Bart Starr, and the signature play was the power sweep: both guards (Jerry Kramer and Fuzzy Thurston) pulled toward the sideline, the fullback blocked the defensive end, and the halfback took the handoff wide behind a wall of blockers. Lombardi’s name for the formation was “Red”: split backs, set wide apart. The runner didn’t aim for a fixed hole; he followed his blockers and “ran to daylight,” the title of Lombardi’s 1963 book.

What to notice: the split backs are what made the sweep hard to diagnose. The same backfield ran the sweep, the fullback’s runs inside and the plays that punished defenses for chasing the sweep, and the defense couldn’t tell which from the backfield. (The sweep itself is drawn block by block in Gap and Power Runs.)

The I-formation: stacking the backs

If you want the ball carrier running straight at the defense, put him directly behind the quarterback, and put the blocker in front of him. That is the I-formation: quarterback under center, the fullback directly behind him about four to five yards deep, and the tailback directly behind the fullback about seven yards deep. Three players in a straight line make the I. With one tight end and two receivers it’s 21 personnel, and “I-formation” and “21 personnel” were close to synonyms for a generation.

The I is usually credited to Tom Nugent at the Virginia Military Institute in 1950 (stacked backfields appear in older playbooks too, so “invented” is disputed). It became famous at USC in the 1960s under John McKay, who got it from his assistant Don Coryell; McKay’s I-formation tailbacks (Mike Garrett, then O.J. Simpson) won Heisman Trophies and gave USC the nickname “Tailback U.”8 By the 1970s and ’80s it was everywhere, college and pro.

The deep tailback is the whole point. Seven yards is a long way back, and it buys three things.

A running start. The tailback takes the handoff already moving at speed, straight toward the line: running downhill, as Formation Rules put it. A runner who meets a linebacker at full speed going forward wins more collisions than one who meets him moving sideways.

Time to see. From seven yards the tailback can watch the blocks form in front of him before he commits. If the hole he was promised closes, he can see the one that opened instead. Because he’s centered, that includes the other side of the formation: he can press the play side and then cut back against the grain (turn back across the formation into a lane the over-running defense left), which is why zone-running teams kept the I.

A lead blocker. The fullback is between the tailback and the line, so on a run he goes first, into the hole, and blocks the first defender who fills it, usually a linebacker. That’s a lead block, and the simplest I-formation run of all, the iso (short for “isolation”), is built on it. The diagram below draws it against a base 4-3 defense: four defensive linemen, three linebackers and four defensive backs, the defense’s traditional starting lineup.

Count before you look at the arrows, because this is the arithmetic of every running play. The offense’s possible blockers are everyone except the quarterback and the ball carrier: here the five linemen, the tight end and the fullback, seven. The defenders who matter are the ones close enough to the ball to tackle the runner in the first second, the ones in what A First Look at Defense calls the box (roughly, from just outside one tight end to just outside the other, and back about five to seven yards). The two cornerbacks are out covering the wide receivers and the two safeties are 10 or more yards deep, so they don’t count yet. That leaves the four linemen and three linebackers: seven. Seven blockers for seven defenders means every defender near the ball can be blocked, and the runner meets nobody unblocked until the safeties arrive. Coaches call that a hat on a hat. When the defense has one more player in the box than the offense has blockers, one defender is free, and the runner has to beat him. Keep that count in mind; the rest of the chapter keeps using it.

In the iso, four linemen and the tight end block the man in front of them, the left guard climbs to the Mike linebacker, and the fullback leads through the gap between the left guard and left tackle onto the Will, “isolating” him, one on one. The tailback reads that block and runs off it. The iso and its relatives are taught properly in Gap and Power Runs; here it’s the cleanest picture of why the I exists.

Show the Python
def iso_play(moving=False):
    """moving=True adds the blocked defenders' movement (the end driven out, the 1-technique driven
    off the ball) for the frame strip; the static diagram leaves them standing."""
    off = players_of("I-formation")
    dfn = base43(off, fix={"MIKE": dict(w=0.4), "SAM": dict(d=4.0, w=6.4), "WILL": dict(w=-3.0)})
    p = Play(off, dfn, los=35, to_go=10)
    p.path("WILL", [(1.6, -2.9)], absolute=True, delay=0.35)          # the Will fills the hole
    p.path("MIKE", [(3.4, 0.6)], absolute=True, delay=0.35)           # the Mike steps up inside it
    if moving:
        p.path("WDE", [(1.6, -5.6)], absolute=True, delay=0.3, speed=1.5)  # the end, driven out by the tackle
        p.path("WDT", [(1.4, 0.5)], absolute=True, delay=0.3, speed=1.5)   # the 1-technique, driven by the center
    p.block("LT", target="WDE")
    p.block("C", target="WDT")
    p.block("RG", target="SDT")
    p.block("RT", target="SDE")
    p.block("Y", target="SAM")
    p.block("LG", target="MIKE", speed=3.4, delay=0.15)              # the left guard climbs to the Mike
    p.block("FB", pts=[(1.9, -1.9), (5.1, -2.85)], speed=6.0)         # the fullback leads to the Will
    p.path("QB", [(-3.0, 0.2)], absolute=True)                        # reverse out to hand off
    p.run("RB", [(-3.6, -1.0), (-0.5, -1.5), (2.5, -1.5), (9.0, -1.6)], absolute=True, delay=0.2)
    p.handoff("RB", t=0.75)
    p.highlight("FB", "RB", color=RB_RING)
    p.highlight("WILL", color=style.DEFENSE)
    return p

iso = iso_play()
fld = iso.draw(lateral=(-17.5, 17.5), window=(-9.0, 15.0), title=False)
hide_yard_numbers(fld.ax)
label(fld, iso, "fullback leads,\nblocks the Will", (5.2, -8.6), target=(0.6, -2.85))
label(fld, iso, "tailback follows,\nreads the block", (-5.8, -7.4), target=(-3.6, -1.0))
label(fld, iso, "7 blockers vs\n7 in the box", (-5.0, 8.5))
plt.show()
Figure 11.5: Why the I exists: the iso (isolation) run against a base 4-3. Seven blockers (five linemen, the tight end Y and the fullback F) for seven defenders in the box (four linemen and three linebackers): a hat on a hat. Four linemen and Y block the man in front of them; the left guard climbs to the Mike (M); the fullback (aqua ring) leads through the gap between the left guard and left tackle and blocks the Will (W, orange ring). That gap is the spot to attack: in this front no defensive lineman stands in it, only the Will. The tailback (R) takes the handoff about four yards deep, already moving forward, aims just inside the fullback and reads his block. The cornerbacks (C) and safeties (FS, SS) are too far away to count in the first second.

Watch the same play in motion. Notice how far the tailback has to travel before he gets the ball, and how that distance is what lets him arrive at the line of scrimmage at full speed, a split second after the fullback.

Show the Python
animation_or_strip(iso_play(moving=True), [0.0, 0.85, 1.35, 2.2], lateral=(-11.0, 11.0), window=(-8.5, 9.5),
                   rings=(("FB", RB_RING), ("RB", RB_RING)),
                   notes=["snap: F is closest to the line", "F arrives at the line; R gets the ball",
                          "F meets the Will; LG is on the Mike", "R is through, past the linebackers"])
Figure 11.6: The iso in motion (simulated, BDB-format tracking), zoomed on the box; the fullback (F) and tailback (R) are ringed in aqua, the ball is the small brown oval. 1: at the snap the fullback is already the closest back to the line. 2: he arrives at the line as the tailback takes the handoff about four yards deep. 3: the fullback has met the Will (W) in the hole and the left guard is on the Mike (M); the tailback, now at full speed, is right behind them. 4: the tailback is through the hole and past the linebackers, with only the safeties left. The faint trails show where everyone has been.

What the I gives up

Every strength of the I has a price.

  • It’s slow to the edge. A tailback seven yards deep has a long way to go to get around the end. Outside runs from the I take time, and a fast defense can beat them to the sideline.
  • The backs are slow to get into routes. The fullback is in the middle of the formation and the tailback is deep; neither can get into a pass route quickly. On a straight dropback the I has really only three quick receivers (the two wideouts and the tight end), and the defense knows it. The exception proves the rule: on play-action, the fullback who “should” be blocking becomes a fourth receiver precisely because nobody is watching him.
  • It’s obvious. Two backs stacked behind an under-center quarterback says “run” loudly. In neutral situations (first and second down, game still close) from 2022 to 2025, NFL offenses lined up under center with two backs threw on only about 27% of plays, roughly three runs in four. With one back under center they threw about 38% of the time; from the shotgun with one back or none, about 71%.9 That’s the price, and also, as you’ll see, the opportunity.

Offset I: cheating the fullback

A fullback directly behind the quarterback has to choose a side after the snap, and the defense can’t tell which side. That’s good for disguise but bad for geometry: if the play goes wide, he has to run sideways before he can block anyone. The offset I moves the fullback a yard or two to one side, behind a guard or tackle, so he starts closer to where he’s needed.

Show the Python
fig, out = plate_pair("Offset I", "Power I")
plt.show()
Figure 11.7: Two variations on the I. Left: the offset I, here offset to the strong (tight end) side, with the fullback (F) behind the right guard instead of directly behind the quarterback (a ‘Strong I’). Right: the Power I, which adds a third back, a halfback (H), beside the fullback, so the tailback (R) has two lead blockers in front of him. Both are under center; the Power I gives up a receiver to do it (31 personnel).

Coaches say the fullback is offset strong (toward the tight end) or weak (away from it). Offset strong, he’s in position to lead on runs to the tight end side, where the offense has an extra blocker. Offset weak, he’s in position to lead on runs away from the tight end, or to block a blitzing linebacker coming from the weak side on a pass. The cost is a clue. A fullback offset to one side tilts the offense toward that side, and defensive coaches study which way each opponent offsets on which plays. Smart offenses run plays both ways from both offsets so the tilt means nothing.

Playbooks and broadcasts have their own words for these. An I offset strong is often a Strong I and offset weak a Weak I (Madden uses both). And a classic formation’s full name is usually the backfield plus the receivers: “I Pro” is the I with the tight end on one side and a receiver on each side, as drawn here; “I Twins” puts both wide receivers on the side away from the tight end; “I Slot” puts the flanker in the slot. When an analyst says “I-formation twins,” he has told you the backfield and then the receivers, back to front, exactly the order this chapter reads them. The receiver sets get their own chapter: Spread Formations.

Power I: two lead blockers

The Power I adds a third back beside the fullback, so the tailback has two blockers leading him: usually 31 personnel (three backs, one tight end, one receiver), another full house. It’s a short-yardage and goal-line formation, built for the moment when the offense needs one yard and the defense knows it.

Do the count. The Power I has eight blockers (five linemen, the tight end and two lead backs), one more than a base 4-3 has in the box. So the defense answers the way defenses always answer an extra blocker: it brings a safety down, and it’s eight against eight again. The extra back’s job is to make sure that eighth defender gets blocked too, by a player who arrives with a running start.

Show the Python
def power_i_play():
    off = players_of("Power I")
    dfn = base43(off, shell="single_high", fix={"SS": dict(d=5.0, w=8.6), "RCB": dict(d=6.5, w=11.5)})
    p = Play(off, dfn, los=35, to_go=None)
    p.path("SAM", [(2.6, 5.5)], absolute=True, delay=0.3)
    p.path("SS", [(3.4, 7.6)], absolute=True, delay=0.3)
    p.path("MIKE", [(3.4, 1.8)], absolute=True, delay=0.3)
    p.path("WILL", [(3.8, -0.4)], absolute=True, delay=0.3)
    p.block("LT", target="WDE")
    p.block("C", target="WDT")
    p.block("LG", target="WILL", speed=3.2)
    p.block("RG", target="MIKE", speed=3.2)
    p.block("RT", pts=[(1.1, -0.7)])                                 # down on the 3-technique
    p.block("Y", pts=[(1.2, 0.3)])                                   # turn the end out
    p.block("FB", pts=[(3.0, 2.9), (6.1, 4.6)], speed=6.0)           # through the hole onto the Sam
    p.block("HB", pts=[(3.0, 1.9), (6.9, 4.6)], speed=6.0)           # onto the safety
    p.path("QB", [(-3.0, 0.9)], absolute=True)
    p.run("RB", [(-3.6, 1.3), (0.0, 3.2), (5.0, 3.3), (9.5, 3.3)], absolute=True, delay=0.25)
    p.handoff("RB", t=0.8)
    p.highlight("FB", "HB", "RB", color=RB_RING)
    p.highlight("SS", color=style.DEFENSE)
    return p

pwr = power_i_play()
fld = pwr.draw(lateral=(-15.0, 17.0), window=(-9.0, 15.0), title=False)
hide_yard_numbers(fld.ax)
label(fld, pwr, "two lead blockers:\nF on the Sam,\nH on the safety", (-5.4, 11.6), target=(-4.5, 2.1))
label(fld, pwr, "8 blockers vs 8 in the box", (9.0, -8.0))
plt.show()
Figure 11.8: The Power I’s arithmetic: eight blockers for eight defenders in the box (the 4-3’s seven plus the strong safety, SS, walked down outside the tight end). The run goes off right tackle. The right tackle blocks down on the tackle (T) inside him, the tight end (Y) turns the end (E) out, the right guard climbs to the Mike (M) and the left guard to the Will (W), who is chasing from the far side. The two lead backs (aqua rings) go through the hole first: the fullback (F) onto the Sam (S), the halfback (H) onto the safety. The tailback (R) follows them. Every defender near the ball has a blocker; the only free defenders are the deep safety (FS) and the cornerbacks (C).

The price is visible in the picture: one wide receiver. The defense, seeing three backs and one receiver, can bring everyone near the line, and often does.

Singleback and ace: trading the fullback for a tight end

Through the 1960s and ’70s, defenses got better at stopping two-back formations, and in 1978 the NFL changed its rules to help the passing game (pass blockers could extend their arms, and defenders could contact receivers only within five yards of the line;10 1978 and the Passing Revolution has the story). Offenses wanted more receivers on the field. The simplest place to find one was the backfield.

A singleback formation keeps the quarterback under center but uses only one running back, directly behind him, usually about seven yards deep. The second back is gone: his spot on the field goes to a third receiver or a second tight end. With three receivers it’s 11 personnel, the NFL’s most common grouping; with two tight ends it’s 12.

The two-tight-end version has its own name. The ace formation is a singleback formation with a tight end on each side of the line and two wide receivers (12 personnel). (Some teams say “ace” for any one-back look; the broadcast usage is the two-tight-end one.)

Show the Python
fig, out = plate_pair("Singleback", "Ace")
plt.show()
Figure 11.9: The one-back family. Left: singleback with 11 personnel, a tight end (Y) on the right and three receivers (X on the line, H in the slot, Z off the line). Right: the ace, 12 personnel, a tight end on each side (Y and U) and both receivers a yard off the line, so the formation is the same on both sides. In both, the lone running back (R) is about seven yards deep, directly behind the quarterback, which lets him start toward either side.

Why it exists: a tight end does a fullback’s job, and more

Taking the fullback off the field sounds like giving up the lead blocker. The insight of the one-back coaches was that a tight end can do most of a fullback’s job from a different spot, and a lot more besides. A tight end next to the tackle can block the same linebacker a fullback would have led on, or he can run a pass route down the middle, which a fullback almost never does. A second tight end on the other side makes the formation balanced: the same on both sides. A defense usually sets its strong side to the tight end (its biggest linebacker and a safety go there), but with a tight end on each side there isn’t one, and the offense can run either way with an extra blocker.

The lone back benefits too. Seven yards deep and directly behind the quarterback, he can start toward either side and see the whole line. That’s exactly what the zone running schemes of the 1990s onward wanted, a back who reads the blocks and picks his hole, and it’s why one-back, two-tight-end sets became a main home of zone running, alongside the I (Zone Running draws it).

What did it give up? The fullback’s head start. A tight end blocking from the line meets the linebacker sooner, but with less of a running start, and the tailback no longer has a blocker leading him into the hole. The ace’s balance has a cost of its own, too: with a tight end on each side and the receivers tight, it has only two wide receivers, so it can’t stretch the coverage the way three-receiver sets can. One-back offenses answered the lead-blocker problem with motion: move a tight end or an off-the-line “H-back” across the formation before the snap so that he ends up where the lead blocker is needed.

NoteFilm room: Washington, 1981–1992

Joe Gibbs, a Don Coryell assistant who became Washington’s head coach in 1981, built the most influential one-back offense in NFL history, and won three Super Bowls with it, after the 1982, 1987 and 1991 seasons, with three different starting quarterbacks (Joe Theismann, Doug Williams and Mark Rypien).11 The story Gibbs told was about one player: the Giants’ Lawrence Taylor, a linebacker so fast off the edge that a running back couldn’t block him. Gibbs’s answer was to take the second back out of the backfield and put a second tight end, often a smaller, quicker one who lined up off the line beside the tackle or went in motion (the H-back, a version of the H, or move player), where he could get his hands on Taylor before Taylor got going.

The H-back became the one-back offense’s Swiss army knife: he could block like a fullback, release like a tight end, or move across the formation before the snap. Behind him, Washington’s huge line (the “Hogs”) ran the plays that made the era famous, including the counter trey, in which two linemen pulled the opposite way from the backfield’s first step.

What to notice: the H-back is a fullback and a tight end in one body, and he forces the defense to decide which he is on every snap.

Watch how one H-back changes the picture before the snap. The offense starts with both tight ends on the right: Y on the line and the H-back (H) a step behind the right tackle. The defense sets its strength there: its 3-technique tackle, its Sam linebacker and its strong safety go to the right. Then the H-back moves.

Show the Python
def hback_play():
    off = line5() + [QB, P("RB", "RB", TB_D, 0, "R"), Y, P("H", "TE", -2.4, 3.6),
                     P("X", "WR", LINE_D, -13.0), P("Z", "WR", OFF_BALL, 13.5)]
    dfn = base43(off, fix={"SAM": dict(d=4.0, w=6.6), "MIKE": dict(w=1.0), "WILL": dict(w=-2.8)})
    p = Play(off, dfn, los=35, to_go=10)
    p.motion("H", pts=[(-1.0, -2.4), (0.0, -6.0), (0.8, -8.7), (0.8, -9.6)], speed=5.5)  # ends moving sideways
    p.motion("WILL", pts=[(0.0, -1.8)], speed=1.2)        # the linebackers bump a step toward the motion
    p.motion("MIKE", pts=[(0.0, -1.2)], speed=0.9)
    p.path("WILL", [(3.4, -4.6)], absolute=True, delay=0.3, speed=4.5)
    p.path("MIKE", [(3.6, -1.6)], absolute=True, delay=0.3, speed=4.5)
    p.path("WDE", [(1.5, -5.4)], absolute=True, delay=0.3, speed=1.6)
    p.path("WDT", [(1.4, 0.0)], absolute=True, delay=0.3, speed=1.4)
    p.block("H", target="WDE", speed=4.0)
    p.block("LT", target="WILL", speed=3.0, delay=0.1)
    p.block("LG", target="MIKE", speed=3.0, delay=0.1)
    p.block("C", target="WDT")
    p.path("QB", [(-2.8, -0.9)], absolute=True)
    p.run("RB", [(-4.8, -1.3), (-1.5, -3.2), (2.6, -3.4), (8.0, -3.6)], absolute=True, delay=0.25)
    p.handoff("RB", t=0.6)
    return p

animation_or_strip(hback_play(), [-2.0, -0.6, 0.0, 1.2], lateral=(-11.5, 11.5), window=(-8.5, 9.0),
                   rings=(("H", TE_RING), ("RB", RB_RING)),
                   notes=["both tight ends right; defense strong right", "H motions across; LBs bump, line stays",
                          "snap: a tight end each side, defense still right", "run left: H on the end, R behind him"])
Figure 11.10: One-back motion (simulated, BDB-format tracking), zoomed on the box; the H-back (H) is ringed gold, the running back (R) aqua. 1: 12 personnel with both tight ends on the right, so the defense sets its strength there: the 3-technique tackle (T) and the Sam (S) are on the right. 2: H motions across behind the quarterback. The linebackers bump over a step but the defensive line doesn’t move. 3: at the snap H is off the line outside the left tackle: now there’s a tight end on each side, balanced like an ace, but the defense is still set to the right, so the left is where its strength isn’t. 4: the run goes left. H blocks the end (E), the left tackle climbs to the Will (W), the left guard to the Mike (M), the center takes the 1-technique tackle, and R runs off H’s block with a blocker for every defender on that side.

After the motion the formation is balanced, like an ace, but the defense isn’t: its line set to the right and didn’t flip, so the offense runs at the 1-technique side with a blocker it didn’t have two seconds ago. That front-against-formation mismatch is why the motion works. Most defenses bump their linebackers a step, as here; some send the Sam across with the tight end, and then the H-back has to block him. Motion and Shifts as Weapons tells the rest.

The option branch: wishbone and flexbone

The other way to use the T’s three backs is to keep all three and let the quarterback choose who gets the ball after the snap. That’s option football: the offense leaves a defender unblocked on purpose, the quarterback reads what he does, and gives the ball to whichever back the defender didn’t take. Option football has its own chapter. Here we only need the two formations it made famous.

Show the Python
fig, out = plate_pair("Wishbone", "Flexbone")
plt.show()
Figure 11.11: The option formations. Left: the wishbone (31 personnel), a full house: the fullback (F) close behind the quarterback, and two halfbacks (H) a yard deeper and wider, behind the tackles, so the backs form an upside-down Y. Right: the flexbone (usually 30 personnel): one back (B) behind the quarterback, two slotbacks (A) standing a yard and a half off the line just outside the tackles, and two wide receivers (X and Z) both on the line, which makes the seven on the line legal without a tight end. A and B are the flexbone’s own letters: A-backs and the B-back.

The wishbone

The wishbone was drawn up at the University of Texas in 1968 by offensive coordinator Emory Bellard, who moved the T’s fullback up close behind the quarterback and set the two halfbacks deeper and wider, one on each side. A Houston sportswriter, Mickey Herskowitz, said it looked like a “pulley bone” (an old Southern name for a chicken’s wishbone), and head coach Darrell Royal turned that into “wishbone.”12 Texas won 30 straight games with it, Oklahoma and Alabama adopted it, and through the 1970s the wishbone was the most feared offense in college football.

The geometry is built for the triple option, the play that gives the formation its purpose: three possible ball carriers, and the quarterback decides who gets the ball by reading two unblocked defenders after the snap. The fullback, close to the line, is the first threat (the “dive”), straight ahead. The quarterback is the second, running along the line. The third is the halfback from the other side, who starts away from the play and sprints across behind the quarterback as the pitch man; that’s why the halfbacks line up deeper than the fullback, so he has room to get across. The playside halfback leads around the edge and blocks the defender who would tackle the pitch man. So every back has a job on every play, dive, lead or pitch, toward either side; that is what a full house buys an option team. (Option Football draws the reads.)

The flexbone

The wishbone’s weakness was width. With all three backs bunched behind the quarterback and only one receiver, defenses could crowd the line and outnumber the option. The flexbone, which grew out of the wishbone in the late 1970s and 1980s, takes the two halfbacks out of the deep backfield and stands them just off the line, outside the tackles, as slotbacks. A fullback stays behind the quarterback, and there are two wide receivers on the line, usually with no tight end. Who invented it is disputed: Bellard himself (at Mississippi State in 1979), Fisher DeBerry’s Air Force teams and Paul Johnson at Georgia Southern all have a claim.13

Why there? A slotback just off the line is three things at once. He can block a defender on the edge from a short distance. He can go in motion before the snap and arrive at the pitch man’s spot just as the ball is snapped, so the defense doesn’t know which side the option is going. And he can run a pass route immediately, because he’s already past the line’s congestion. The two receivers outside force the defense to keep two defenders wide, which takes them out of the box, the area near the ball where the run is defended (roughly tight end to tight end, five to seven yards deep). The flexbone spreads the defense like a passing formation while keeping three runners near the ball.

What does it give up against the wishbone? Inside power. With the halfbacks moved up to the edges, the flexbone has no lead blocker lined up behind the quarterback for a run between the tackles, and no tight end; it beats the defense with angles and width, not with bodies at the point of attack.

NoteFilm room: Navy and Georgia Tech, Paul Johnson’s flexbone

No coach is more closely tied to the flexbone than Paul Johnson. He won two Division I-AA titles with it at Georgia Southern (1999 and 2000), took over a Navy team that had gone 0–10 in 2001 and had it winning eight games within two seasons, then ran the same offense against Atlantic Coast Conference defenses at Georgia Tech from 2008 to 2018.14 Why would an undersized team choose an old formation? Because it changes the problem. The service academies can’t recruit 310-pound linemen; they can recruit disciplined players who block quickly at defenders’ legs and carry out fakes on every play, and the flexbone makes the defense play assignment football for sixty minutes, something defenses that see it once a year rarely practice. (Even Navy has since moved much of its option game into the shotgun.15)

What to notice: when you see a flexbone team on a Saturday, watch the slotbacks before the snap. The one who goes in motion is usually telling you which way the option is headed, and the other one is often a blocker.

You won’t see either formation in the NFL. Option football needs a quarterback who takes a hit on most plays, and NFL teams won’t spend their most expensive player that way; NFL defenders are also fast enough to cover the width the option relies on. But the idea, a quarterback who reads a defender instead of blocking him, came back to the NFL from the shotgun, as the zone read: the quarterback reads one unblocked defender and either hands off or keeps the ball himself. The College Laboratory traces that lineage, from the wishbone and veer to the spread option.

The Wing-T: misdirection

The last classic branch crossed the T with its ancestor. Around 1950 Dave Nelson, at Maine and then Delaware, combined the quick-hitting T backfield with the single wing’s wingback, a back lined up just outside and a yard behind the tight end.16 The Wing-T puts the quarterback under center, a fullback directly behind him, a halfback beside the fullback on the side away from the tight end, and the wingback outside the tight end on the other side, with a split end on the halfback’s side. Counted as backs, the wingback and halfback make it 31 personnel; teams that use a receiver at wingback call it 21.

Show the Python
WT_WIN, WT_LAT = (-8.2, 3.0), (-13.6, 13.6)
BUCK = [(-4.5, 0.0), (-2.6, 0.9), (1.4, 0.9)]
SWEEP = [(-4.5, -3.2), (-5.5, -1.0), (-5.3, 2.0), (-3.7, 6.0), (-0.6, 10.6)]
COUNTER = [(-1.5, 7.4), (-3.0, 4.0), (-3.3, -3.0), (-1.2, -8.2)]
WAGGLE = [(-1.9, 0.0), (-3.0, 0.7), (-5.8, -2.0), (-6.4, -7.6)]
SERIES = [("1. Buck: the fullback", BUCK, [SWEEP]),
          ("2. Buck sweep: the halfback", SWEEP, [BUCK]),
          ("3. Counter: the wingback", COUNTER, [BUCK, SWEEP]),
          ("4. Waggle: the quarterback", WAGGLE, [BUCK, SWEEP])]
fig, axes = plt.subplots(2, 2, figsize=(6.6, 3.9))
for ax, (title, real, fakes) in zip(axes.flat, SERIES):
    p, fld = plate(ax, "Wing-T", sub=False, title=title, window=WT_WIN, lateral=WT_LAT)
    for f in fakes:
        threat(fld, p, f, color=FAKE, lw=1.3, ls=(0, (2, 2)))
    if real is SWEEP:      # both guards pull toward the wing side, in front of the quarterback
        for g0, dd, w1, end in [(1.6, -1.5, 5.6, (0.8, 8.4)), (-1.6, -1.5, 3.6, (0.4, 6.4))]:
            xs, ys = XY(fld, p, np.array([LINE_D, dd, dd, end[0]]), np.array([g0, g0 + 0.6, w1, end[1]]))
            ax.plot(xs[:-1], ys[:-1], color=style.OFFENSE_DARK, lw=1.6, zorder=9)
            ax.add_patch(FancyArrowPatch((xs[-2], ys[-2]), (xs[-1], ys[-1]), arrowstyle="-|>", mutation_scale=9,
                                         color=style.OFFENSE_DARK, lw=1.6, zorder=9))
    threat(fld, p, real, color=THREAT, lw=2.1)
fig.subplots_adjust(left=0.01, right=0.99, top=0.94, bottom=0.13, wspace=0.05, hspace=0.24)
ring_legend(fig, extra=[Line2D([], [], color=THREAT, lw=2.1, ls=(0, (3, 2)), label="ball carrier"),
                        Line2D([], [], color=FAKE, lw=1.3, ls=(0, (2, 2)), label="a fake"),
                        Line2D([], [], color=style.OFFENSE_DARK, lw=1.6, label="pulling guard")], ncol=3)
plt.show()
Figure 11.12: The Wing-T’s buck sweep series: one backfield action, four endings. The formation in every panel: fullback (F) directly behind the quarterback, halfback (H) behind the left tackle, wingback (W) just outside and behind the tight end (Y) on the right, split end (X) on the left. In each panel the bold green arrow is the back who gets the ball and the gray dashed arrows are the backs faking; for the first second all four plays look alike. 1: the fullback hits straight up the middle (the buck, or a trap). 2: the buck sweep: the halfback runs to the wing side behind both guards, who pull (dark blue). 3: the wingback comes back the other way on a counter while everyone else flows toward the sweep. 4: the waggle: the quarterback fakes to both backs, then rolls out the other way to run or throw.

Why it exists: making the defense guess

The Wing-T’s purpose is misdirection: making the defense commit to one direction and then going the other. With three backs placed so that each can carry the ball in a different direction, and a quarterback who turns his back to the defense and fakes to each of them in turn, every play looks the same for its first second. The Wing-T is organized in series: groups of plays that start with the same backfield action and end differently. The famous one is the buck sweep series in the figure. Its base play is the sweep: the line blocks down (each blocker hits the defender inside him, from the side) while both guards pull, running sideways behind the line to lead the halfback around the wing. When the defense starts chasing the sweep, the same first second becomes the fullback’s buck up the middle or a trap (a defensive lineman is let through unblocked and then hit from the side by a pulling lineman), a wingback counter back the other way, or the waggle, the Wing-T’s bootleg: the quarterback fakes, rolls out the other way behind a pulling guard and runs or throws. Defenders who flow (run toward the side the play seems to be going) with the first thing they see get punished; defenders who wait get blocked.

The trade is complexity and, again, width. A misdirection offense needs a lot of practice time to run its fakes well, and its backs are runners and blockers, not receivers. You’ll rarely see a true Wing-T on Sunday, but you’ll see its children every week: the jet sweep, in which a receiver sprints across behind the line just as the ball is snapped, the down-block-and-pull schemes of the NFL’s gap runs, and the NFL bootleg are Wing-T ideas in an NFL uniform (Perimeter Runs and Misdirection traces them).

The goal-line formation: everyone in close

Near the goal line the field gets short and narrow at the same time. There’s no room behind the defense to throw deep, and the offense needs a yard or two, not twenty. So every team keeps a goal-line formation: the quarterback under center, two backs stacked behind him, three tight ends (or a sixth lineman, the jumbo grouping), and no wide receivers at all. Everyone lines up tight to the ball. In personnel terms that’s 23, or 14 with a tight end standing at fullback, or a jumbo grouping.

Show the Python
gl_def = [D("LE", "DE", 0.5, -4.65, "E"), D("DLT", "DT", 0.5, -1.9, "T"), D("NT", "NT", 0.5, 0.0, "N"),
          D("DRT", "DT", 0.5, 1.9, "T"), D("RE", "DE", 0.5, 4.6, "E"),
          D("WILL", "WILL", 2.0, -3.3, "W"), D("MIKE", "MIKE", 2.0, 0.8, "M"), D("SAM", "SAM", 1.8, 6.6, "S"),
          D("LCB", "CB", 1.8, -6.6, "C"), D("SS", "SS", 4.2, 4.0), D("FS", "FS", 4.6, -2.4)]
p = ring_by_body(Play(players_of("Goal line"), gl_def, los=109, to_go=None))
fld = p.draw(lateral=(-13.0, 13.0), window=(-9.0, 8.5), title=False)
hide_yard_numbers(fld.ax)
label(fld, p, "9 blockers: 5 linemen,\n3 tight ends, fullback", (-5.6, -8.3))
label(fld, p, "11 defenders,\nall in the box", (6.6, -8.9))
for i, w in enumerate([-4.55, -3.2, -1.9, -0.62, 0.62, 1.9, 3.2, 4.55, 6.3]):   # the nine gaps
    x, y = XY(fld, p, -3.15, w)
    fld.ax.text(x, y, str(i + 1), fontsize=6.4, ha="center", va="center", color=style.INK_2, zorder=12,
                bbox=dict(boxstyle="circle,pad=0.12", fc=style.SURFACE, ec=style.BASELINE, lw=0.5))
label(fld, p, "nine gaps to fill\n(numbered below them)", (-5.6, 8.4))
plt.show()
Figure 11.13: Second-and-goal at the 1: the goal-line formation (23 personnel) against a goal-line defense (five linemen, three linebackers, three defensive backs). Offense: three tight ends (Y and U on the line, H a wing just behind and outside Y), a fullback (F) and a tailback (R), with the linemen’s splits narrowed to about a yard and a quarter. Defense: the linemen (E = end, T = tackle, N = nose) crowd the ball in the gaps, the linebackers (S/M/W) stand about two yards off it, and even the cornerback (C) and safeties (SS, FS) are within five yards. Count: nine blockers against eleven defenders, every one of them in the box.

Why it exists: shrink the field, pick the spot

Do the count from the iso. The offense has nine blockers: five linemen, three tight ends and the fullback (the quarterback and the tailback don’t block). The defense has eleven players, and at the goal line all eleven are in the box, because there’s no deep field left to protect. Eleven against nine: on paper the defense wins the count by two, and down here it always will. So the goal-line formation isn’t trying to win the count. It’s trying to make the count matter less, in two ways.

First, it shrinks the space. Runs are aimed at gaps, the spaces between blockers, and every defender near the ball is assigned one to fill. Tight splits (here about a yard and a quarter between linemen, against the usual yard and a half or more) and everyone close to the ball leave narrow gaps with little room to slip through. Count them in the figure: the seven players on the line make eight gaps, and the wing makes a ninth. The defense needs a player in each of the nine before it has anyone left over. Second, the offense picks the spot. It needs one yard, not ten, so it can pour extra bodies into a single gap: a double team on the line, the fullback leading into the hole, and a tailback who only has to fall forward. The defense’s two spare players are somewhere on a crowded line, and they may never reach the one gap that matters. The defense answers by bringing its own heavy package and crowding the line, so the goal line is the one place in football where both sides deliberately give up all their space.

The price is that a defense that knows you’ll run can commit everyone to stopping it. That’s why the goal-line formation is also where a lot of short play-action touchdowns come from: the quarterback fakes the handoff, every defender bites, and one of the three tight ends, who looked like a blocker, slips into the end zone alone. In 2022–2025, about three of every four NFL plays inside the 2-yard line that came from under center with two or more backs were runs; when they were passes, about four in five used a play fake.17 (The quarterback sneak starts here too, and so does its push-assisted version, the tush push, in which teammates shove the quarterback forward from behind, still legal in 2026.) Red Zone, Goal Line, and Short Yardage is where that fight gets its full treatment.

Matching formations to personnel

Personnel comes first, so the formation is usually a short list once you’ve counted the backs and tight ends. The table below is the cheat sheet. The pairings are typical, not laws: a team can line up 21 personnel in the shotgun, or 12 personnel in an I with a tight end at fullback.

Formation Typical personnel Backfield Built for Where you’ll see it now
T-formation 32 Three backs side by side Quick hitting runs to either side Goal line (as a full house), rarely
Pro set (split backs) 21 Two backs side by side Balance: run either way, backs in the flats Occasionally, mostly play-action
I-formation 21 (or 22) Two backs stacked Lead blocker, downhill tailback 21-personnel teams; short yardage
Offset I 21 (or 22) Fullback a yard or two to one side Better angles for the lead block Same as the I
Power I 31 I plus a halfback Two lead blockers Goal line and short yardage
Singleback 11 One back at ~7 yards Three receivers with an under-center run game Every NFL team, every week
Ace 12 One back at ~7 yards Balance, a tight end blocker on both sides Every NFL team, every week
Wishbone 31 (or 32) Fullback close, halfbacks deep and wide The triple option History, some high schools
Flexbone 30 One back, two slotbacks Option with width Service academies, high schools
Wing-T 31 (or 21) Fullback, halfback, wingback Misdirection, series football High school; its ideas in the NFL
Goal-line 23 (or 14, or jumbo) Two backs stacked Narrow gaps, extra blockers at one spot Every NFL team, inside the 3

And the reverse direction, from what you count to what you should expect:

  • One back, quarterback under center: singleback (11) or ace (12).
  • Two backs, quarterback under center: I, offset I or pro set (21 or 22). Look at whether they’re stacked, offset or side by side.
  • Three backs: Power I, wishbone or T (31 or 32), almost always short yardage in the NFL.
  • No wide receivers and three tight ends: goal-line.
  • Quarterback in the shotgun: you’re in the next chapter’s world, even with two backs.
CautionCommon misconception

“Formation names are universal.” They’re universal enough for broadcasts, but not in playbooks. One team’s “ace” is another’s “Deuce” or “Tiger”; Lombardi called split backs “Red,” and other systems call two-back looks “Near,” “Far” and “Split.” Even the broadcast names blur: an offset I with a tight end at fullback, or a one-back set with the quarterback in the pistol, may be called three different things by three analysts. Learn the shapes, not just the words: under center or not, how many backs, where they stand, where the tight ends are. The shape is what tells the defense, and you, what’s possible.

Why the classic formations faded

For most of the twentieth century, the quarterback took the snap under center on nearly every play. Today he does it on about a third of them. Here’s what that decline looks like in the data.

Show the Python (load play-by-play 2006-2025 and FTN charting 2022-2025)
from gridiron.data import nfl, pbp

COLS = ["season", "season_type", "game_id", "play_id", "posteam", "down", "ydstogo", "yardline_100",
        "play_type", "pass", "shotgun", "wp", "half_seconds_remaining", "epa"]
plays = pbp(range(2006, 2026), columns=COLS)
plays = plays[(plays.season_type == "REG") & plays.play_type.isin(["pass", "run"]) & plays.down.notna()].copy()

ftn = nfl().load_ftn_charting([2022, 2023, 2024, 2025]).to_pandas()
ftn["qb_loc"] = ftn["qb_location"].astype(str).str.strip()
ftn = ftn[["nflverse_game_id", "nflverse_play_id", "qb_loc", "n_offense_backfield", "is_play_action"]]
recent = plays[plays.season >= 2022].merge(ftn, how="left", left_on=["game_id", "play_id"],
                                            right_on=["nflverse_game_id", "nflverse_play_id"])
recent["two_back"] = recent["n_offense_backfield"] >= 2     # two or more players in the backfield besides the QB
recent["neutral"] = (recent.down.isin([1, 2]) & recent.wp.between(0.2, 0.8)
                     & (recent.half_seconds_remaining > 120))
print(f"{len(plays):,} regular-season runs and passes 2006-2025; {len(recent):,} of them 2022-2025")

# reason 1: EPA per dropback (pass = 1 includes sacks and scrambles) vs per designed run
epa_pass = plays[plays["pass"] == 1].groupby("season")["epa"].mean()
epa_run = plays[plays["pass"] == 0].groupby("season")["epa"].mean()
assert 0.02 < epa_pass[2025] < 0.07 and -0.07 < epa_run[2025] < -0.02
assert (epa_pass - epa_run).min() > 0      # dropbacks out-gained runs on average in every season

# neutral-situation pass rates by backfield (quoted under "What the I gives up")
nt = recent[recent.neutral]
uc2 = nt[(nt.qb_loc == "U") & (nt.n_offense_backfield >= 2)]
uc1 = nt[(nt.qb_loc == "U") & (nt.n_offense_backfield == 1)]
gun01 = nt[(nt.qb_loc == "S") & (nt.n_offense_backfield <= 1)]
pa = lambda x: x[x["pass"] == 1].is_play_action.astype(float).mean() * 100   # noqa: E731
assert 0.25 < uc2["pass"].mean() < 0.30 and 0.35 < uc1["pass"].mean() < 0.41 and 75 < pa(uc1) < 82
assert 0.68 < gun01["pass"].mean() < 0.74 and 82 < pa(uc2) < 88
648,482 regular-season runs and passes 2006-2025; 133,636 of them 2022-2025
Show the Python
gun = plays.groupby("season")["shotgun"].mean() * 100
loc = (recent.assign(U=recent.qb_loc == "U", P=recent.qb_loc == "P", S=recent.qb_loc == "S")
       .groupby("season")[["U", "P", "S"]].mean() * 100)

fig, (a1, a2) = plt.subplots(1, 2, figsize=(6.6, 3.1), gridspec_kw=dict(width_ratios=[2.1, 1]))
a1.plot(gun.index, gun.values, color=style.OFFENSE, marker="o", ms=3.2, lw=2.2)
a1.plot(gun.index, 100 - gun.values, color=style.DEFENSE, marker="o", ms=3.2, lw=2.2)
a1.text(2025.3, gun.loc[2025], f"shotgun\n{gun.loc[2025]:.0f}%", va="center", fontsize=7.5, color=style.INK)
a1.text(2025.3, 100 - gun.loc[2025], f"not shotgun\n{100 - gun.loc[2025]:.0f}%", va="center", fontsize=7.5,
        color=style.INK)
a1.text(2006, gun.loc[2006] - 6.5, f"{gun.loc[2006]:.0f}%", ha="center", fontsize=7.5, color=style.INK_2)
a1.text(2006, 100 - gun.loc[2006] + 3.5, f"{100 - gun.loc[2006]:.0f}%", ha="center", fontsize=7.5,
        color=style.INK_2)
a1.set_xlim(2005.2, 2028.6)
a1.set_xticks([2006, 2010, 2014, 2018, 2022, 2025], ["2006", "2010", "2014", "2018", "2022", "2025"], fontsize=8)
a1.set_ylim(0, 100)
a1.tick_params(axis="y", labelsize=8)
a1.set_ylabel("share of plays (%)", fontsize=8)
a1.set_title("Shotgun vs not, 2006–2025 (pbp)", fontsize=9.5)

cols = {"U": style.DEFENSE, "P": style.THIRD, "S": style.OFFENSE}
names = {"U": "under center", "P": "pistol", "S": "shotgun"}
bottom = np.zeros(len(loc))
for k in ["U", "P", "S"]:
    a2.bar(loc.index, loc[k], bottom=bottom, color=cols[k], width=0.7, edgecolor=style.SURFACE, label=names[k])
    for x, b, v in zip(loc.index, bottom, loc[k]):
        if v >= 7:
            a2.text(x, b + v / 2, f"{v:.0f}", ha="center", va="center", fontsize=7.2, color="white")
    bottom += loc[k].values
a2.set_xticks(loc.index, [f"'{y % 100:02d}" for y in loc.index], fontsize=8)
a2.set_ylim(0, 100)
a2.set_yticks([])
a2.grid(False)
a2.spines["left"].set_visible(False)
a2.set_title("QB location (FTN)", fontsize=9.5)
a2.legend(loc="upper center", bbox_to_anchor=(0.5, -0.1), ncol=2, fontsize=7, frameon=False, handlelength=1.0,
          columnspacing=0.8)
fig.tight_layout(w_pad=1.0)
plt.show()
Figure 11.14: The quarterback moves back. Left: share of NFL regular-season runs and passes snapped to a quarterback in the shotgun, 2006–2025 (nflverse play-by-play shotgun flag; the rest are under center or, in recent seasons, a few percent from the pistol). Right: where the quarterback lined up, 2022–2025, from FTN’s play-by-play charting (which records under center, shotgun and pistol separately). The shotgun peaked in 2023 and fell back in 2025, when under center rose to about a third of plays. Different sources, so different panels.

In 2006 offenses were in the shotgun on about one play in five. By 2023 it was about 72%. Over the same years the I-formation’s share of plays fell from about 11% in 2016 to about 6% in 2022, as far as the formation labels in the public data go.18 The causes overlap, but there are five worth knowing.

  1. Passing became more valuable than running. After the 1978 rule changes, and again as offenses learned to throw efficiently, a pass gained more on average than a run. In the EPA terms you met in Downs, Distance, and Field Position, NFL dropbacks (sacks and scrambles included) averaged about +0.04 expected points per play in 2025 and designed runs about −0.05; across 2006–2025 it was about +0.03 against −0.07, and dropbacks came out ahead in every one of those seasons.19 Expected Points and Success Rate shows how analysts measure that gap, and why it’s smaller than it looks (runs are less risky, and they set up the pass). An offense that passes more wants more receivers, and the second back is the first player to go.
  2. The shotgun is a better place to pass from. Five yards back, the quarterback takes a shorter drop and never has to turn his back on the defense. He sees the coverage from the snap and has more time before the rush arrives. The shotgun was used in the NFL as early as 1960 and revived by Tom Landry’s Cowboys in 1975, but for decades it was a third-down formation;20 the history chapters follow it.
  3. Spreading the defense makes running easier, too. Three or four receivers pull defensive backs out wide, which leaves fewer defenders near the ball. An offense in the shotgun with 11 personnel can often run against six defenders in the box instead of seven or eight: the same count you did for the iso, now tilted toward the offense. Spread formations are the next chapter.
  4. College stopped producing under-center quarterbacks. By the 2010s most college offenses, and many high schools, played almost entirely from the shotgun. Quarterbacks arrived in the NFL having rarely taken a snap under center, and NFL coaches built around what their quarterbacks did best.
  5. A fullback is an expensive specialist. A roster spot used on a lead blocker is one not used on a receiver or tight end who can play every down. Many NFL teams stopped carrying a true fullback at all.
ImportantWhy it exists

The shotgun won the passing game; the classic formations kept the running game’s advantages. Under center, the quarterback can hand off to a back already running downhill, toward the line, and fake a handoff with his back to the defense. In the shotgun, many runs start sideways, and a play fake is less convincing because the defense can see the ball the whole time. Each formation is a bundle of trade-offs, and the NFL’s long move to the shotgun traded the run game’s angles for the passing game’s vision. The 2025 turn back toward under center is offenses deciding they gave up too much.

Where the classic formations survive

The I-formation isn’t dead. It has retreated to the places where its advantages matter most, and in 2025 it started coming back out. Look at what lining up under center tells you now:

Show the Python
s = recent[recent.season == 2025]
locs = [("U", "under\ncenter"), ("P", "pistol"), ("S", "shotgun")]
pass_rate = [s[s.qb_loc == k]["pass"].mean() * 100 for k, _ in locs]
drop = s[s["pass"] == 1]
pa_rate = [drop[drop.qb_loc == k]["is_play_action"].astype(float).mean() * 100 for k, _ in locs]
uc = lambda x: (x.qb_loc == "U").mean() * 100   # noqa: E731
situ = [("all plays", uc(s)), ("1 yard or\nless to go", uc(s[s.ydstogo <= 1])),
        ("inside the\nopp. 2", uc(s[s.yardline_100 <= 2]))]

fig, axes = plt.subplots(1, 3, figsize=(6.6, 2.7))
colors = [style.DEFENSE, style.THIRD, style.OFFENSE]
for ax, vals, title in [(axes[0], pass_rate, "Pass rate"), (axes[1], pa_rate, "Play-action share\nof dropbacks")]:
    ax.bar(range(3), vals, color=colors, width=0.62)
    for i, v in enumerate(vals):
        ax.text(i, v + 2, f"{v:.0f}%", ha="center", fontsize=8, color=style.INK)
    ax.set_xticks(range(3), [n for _, n in locs], fontsize=7.5)
    ax.set_title(title, fontsize=9)
axes[2].bar(range(3), [v for _, v in situ], color=[style.MUTED, style.DEFENSE, style.DEFENSE], width=0.62)
for i, (_, v) in enumerate(situ):
    axes[2].text(i, v + 2, f"{v:.0f}%", ha="center", fontsize=8, color=style.INK)
axes[2].set_xticks(range(3), [n for n, _ in situ], fontsize=7.5)
axes[2].set_title("Snapped under center", fontsize=9)
for ax in axes:
    ax.set_ylim(0, 100)
    ax.set_yticks([])
    ax.grid(False)
    ax.spines["left"].set_visible(False)
fig.tight_layout(w_pad=1.2)
plt.show()
Figure 11.15: What lining up under center means in the 2025 NFL (regular season, FTN charting via nflverse). Left: how often the offense passed from each quarterback location. Middle: of the dropbacks from each location, the share that used a play-action fake. Right: the share of plays snapped under center, overall and on short yardage (1 yard or less to go) and inside the opponent’s 2-yard line. Under center is a running alignment, it is the home of play-action, and it is the default when the offense needs a yard.

Three things stand out, and they’re where the classic formations live now: two situations (short yardage and play-action) and one kind of team (the few that still build around a fullback).

Short yardage. With a yard or less to go, NFL offenses lined up under center on about 63% of plays in 2025, nearly twice their overall rate. When the offense needs one yard, the quick snap, the downhill handoff and the extra blockers of the I and the goal-line formation are worth more than the quarterback’s view of the coverage. (The sneak and the tush push start from under center too.)

Play-action. About four of every five dropbacks from under center in 2025 used a play fake, against about one in ten from the shotgun. That’s no coincidence. A quarterback who turns his back to the defense and puts the ball in a running back’s belly is selling the run with his whole body, and a two-back formation that usually runs is the best advertisement for a fake. The formation’s predictability is the bait. Play-Action, Bootlegs, and Screens shows what the fake does to the defense.

Notice the middle bar in each panel, too. The pistol isn’t under center, so the next chapter files it with the shotgun, but in 2025 it behaved like a cousin of this chapter’s formations: offenses passed on only about 29% of pistol snaps, and about half of those dropbacks used a play fake. That’s what you’d expect from an alignment built to keep the running back directly behind the quarterback: a downhill run and a believable fake, from a few yards back.

21 personnel. A few NFL teams still build around a fullback, and they’re among the most interesting offenses in the league.

Show the Python
t = (recent[recent.season == 2025].groupby("posteam")
     .agg(uc=("qb_loc", lambda x: (x == "U").mean() * 100), two=("two_back", lambda x: x.mean() * 100)))
lg = recent[recent.season == 2025]
lg_uc, lg_two = (lg.qb_loc == "U").mean() * 100, lg.two_back.mean() * 100
fig, ax = plt.subplots(figsize=(6.5, 3.9))
hot = {"LA": "Rams", "SEA": "Seahawks", "BUF": "Bills", "SF": "49ers", "BAL": "Ravens", "MIA": "Dolphins",
       "NE": "Patriots", "WAS": "Commanders", "KC": "Chiefs", "CIN": "Bengals", "DET": "Lions", "PHI": "Eagles"}
ax.scatter(t.uc, t.two, s=[34 if k in hot else 18 for k in t.index],
           color=[style.OFFENSE if k in hot else style.BASELINE for k in t.index], zorder=3,
           edgecolor="white", lw=0.6)
OFFS = {"LA": (-0.8, 0.0, "right"), "SEA": (0.0, 1.2, "center"), "BUF": (0.0, -1.3, "center"),
        "SF": (-1.4, 0.0, "right"), "BAL": (0.9, 0.0, "left"), "MIA": (-0.9, 0.0, "right"),
        "NE": (0.0, 1.2, "center"), "WAS": (0.0, 1.0, "center"), "KC": (0.9, 0.0, "left"),
        "CIN": (0.0, -1.1, "center"), "DET": (0.9, 0.0, "left"), "PHI": (0.9, 0.0, "left")}
for k, name in hot.items():
    dx, dy, ha = OFFS[k]
    ax.text(t.loc[k, "uc"] + dx, t.loc[k, "two"] + dy, name, fontsize=7.5, ha=ha, va="center", color=style.INK)
ax.axvline(lg_uc, color=style.INK_2, lw=0.9, ls=(0, (4, 3)), zorder=1)
ax.axhline(lg_two, color=style.INK_2, lw=0.9, ls=(0, (4, 3)), zorder=1)
ax.text(lg_uc + 0.4, 34.6, f"league {lg_uc:.0f}%", fontsize=7, color=style.INK_2, va="top")
ax.text(63.5, lg_two + 0.5, f"league {lg_two:.0f}%", fontsize=7, color=style.INK_2, ha="right", va="bottom")
ax.set_xlim(4, 64)
ax.set_ylim(8, 35)
ax.set_xlabel("snapped under center (% of plays)", fontsize=8)
ax.set_ylabel("two or more backs (% of plays)", fontsize=8)
ax.tick_params(labelsize=8)
ax.set_title("Under center and two-back usage by team, 2025", fontsize=10)
plt.show()
Figure 11.16: Who still plays classic football: each NFL team’s 2025 share of plays snapped under center (across) against its share with two or more players in the backfield besides the quarterback, usually two backs (up). Dashed lines are the league rates. The Rams, Seahawks and Bills led the under-center revival; the Dolphins, Ravens, Seahawks, Bills, Patriots and 49ers used the most two-back sets. Regular season, runs and passes; FTN charting via nflverse.

The two axes don’t always go together, which is the interesting part. The Rams were the league’s most under-center team in 2025 (about 59% of plays) but used two backs only a little more than average; their under-center snaps were mostly one-back looks with two or three tight ends. The Dolphins were the opposite: more two-back plays than anyone, mostly from the shotgun and pistol. The teams in the top right, the Seahawks, Bills, 49ers and Patriots, with the Ravens just over the under-center line, are the ones still playing something close to classic football, a fullback and a tailback behind a quarterback under center, on a quarter of their snaps or more.

NoteFilm room: San Francisco 49ers, 2017–2025

Kyle Shanahan’s 49ers have been the NFL’s leading 21-personnel team for most of his tenure, with fullback Kyle Juszczyk (Personnel has the numbers). Much of it comes from the I and offset I: Juszczyk lines up behind the quarterback, leads on a linebacker or the edge defender on running plays, and on play-action slips out into the flat as the defense crashes on the run. In 2025 the 49ers were under center on about 46% of plays, well above the league’s 34%, and had two backs on the field on about a quarter.21

The 49ers’ version of the I isn’t the 1970s version, though. Juszczyk motions out of the backfield, lines up as a wing or in the slot, and returns to the I on the next play, so the defense can’t key on where he stands. The formation is classic; the way it’s used is modern.

What to notice: when the 49ers line up in the I, watch where the fullback’s path ends. His first steps are designed to look the same on the run and on the fake. If he hits someone, it’s a run; if he crosses the formation as if to block the backside end, brushes past him and keeps going to the flat, it’s the bootleg, and the defense has been fooled by its own expectations.

NoteFilm room: Baltimore Ravens 2024, Patrick Ricard and Derrick Henry

The 2024 Ravens (head coach John Harbaugh, offensive coordinator Todd Monken, an era that ended after 2025) paired Lamar Jackson with Derrick Henry, who ran for 1,921 yards, second in the league, behind Patrick Ricard, an undrafted defensive tackle from Maine turned 300-pound fullback.22 Baltimore had two or more backs on the field on about a quarter of its 2024 plays, against a league rate of about 18%. A defense built to stop Jackson’s passing sits in nickel; the Ravens line up with two backs, and the nickel back suddenly has a 300-pound fullback coming at him. If the defense answers with linebackers, Jackson throws over them: the personnel dilemma, delivered from a formation that has been around since the 1950s.

What to notice: in a classic two-back formation, find the fullback and do the count: blockers against defenders in the box. If the defense matched the count with a defensive back where a linebacker should be, the offense has the matchup it wanted; if it matched it with a linebacker, look for the throw over him.

The 2025 under-center revival

The shotgun’s share fell from 72% in 2023 to 66% in 2025, and FTN’s charting has offenses under center on 33.6% of plays in 2025, up from 27.3% in 2023.23 The reason is the same arms race that sent personnel heavier (Personnel told that half): defenses spent the early 2020s getting lighter and playing more two-deep safety looks to stop the pass, which left fewer big bodies near the line. Offenses answered by getting bigger and putting the quarterback back under center, where the run game has its best angles and play-action its best disguise. The offensive side of the ledger pushed the same way. Wide zone and play-action from under center, the Shanahan and McVay style, kept producing: in 2024 and 2025, dropbacks from under center averaged about +0.14 expected points per play against about +0.03 from the shotgun.24 (That gap flatters under center, whose passes come on downs when the defense is braced for a run, but that is exactly the point of the formation.) And the quarterbacks who run those offenses are comfortable under center. Sean McVay’s Rams were under center on about 59% of their 2025 snaps, the most in the league, and their quarterback, Matthew Stafford, was the league’s MVP. The champion Seahawks, under offensive coordinator Klint Kubiak in 2025, were second, at about 53%.

Whether the turn lasts depends on the defense’s answer, and in 2025 defenses were already answering by playing more base. The old formations didn’t come back because they were old. They came back because, for now, they’re the right answer to what defenses are doing. That’s the pattern of this entire book.

The classic formations on one page

Here are all eleven, reduced to what you’ll actually see on a broadcast: the line, the quarterback and the backfield. The backfield is the fingerprint, so it’s what to memorize.

Show the Python
names = ["T-formation", "Pro set", "I-formation", "Offset I", "Power I", "Singleback", "Ace", "Wishbone",
         "Flexbone", "Wing-T", "Goal line"]
fig, axes = plt.subplots(3, 4, figsize=(6.6, 4.2))
for ax, name in zip(axes.flat, names + ["Shotgun"]):
    pl = SHOTGUN if name == "Shotgun" else players_of(name)
    pl = [q for q in pl if abs(q.w) <= 8.0]
    p = ring_by_body(Play(pl, None, los=35, to_go=None))
    p.draw(ax=ax, lateral=(-8.6, 8.6), window=(-8.6, 1.6), title=False)
    hide_yard_numbers(ax)
    sub = "11 · gun" if name == "Shotgun" else FORMS[name][0]
    ax.set_title(f"{name}  ({sub})", fontsize=7.6, color=style.INK, loc="left", pad=2)
fig.subplots_adjust(left=0.01, right=0.99, top=0.95, bottom=0.01, hspace=0.32, wspace=0.06)
plt.show()
Figure 11.17: The eleven classic backfields, with the shotgun for comparison (last panel). Only the players within about eight yards of the ball are shown: the line, the quarterback (Q), the backs (aqua rings) and any tight ends or wings (gold rings). Read them back to front: under center or not, how many backs, stacked, side by side or offset. Two spots look identical here and differ only in who stands there: the Wing-T’s wingback (W, a running back) and the goal-line set’s wing (H, a tight end). On a broadcast the picture can’t tell you which; the personnel can.

What the backfield looks like on TV

Every diagram in this chapter is drawn from above, the way coaches draw them and the way the All-22 film shows them. The broadcast mostly isn’t. The main sideline camera sits high on one side of the field, looking across it, so the direction the offense is moving runs left to right across your screen and the width of the field is squashed into the up-down direction. That flips the picture in a way worth knowing before you try to name a backfield live.

Show the Python
CAM = np.array([-1.0, -52.0, 24.0])      # (d, w, height) in yards: high on the offense's left sideline
LOOK = np.array([-2.5, 0.0, 0.0])


def tv_project(pts):
    """Pinhole projection of (d, w, z) points onto the camera's screen; returns screen (x, y), depth."""
    f = LOOK - CAM
    f /= np.linalg.norm(f)
    r = np.cross(f, [0.0, 0.0, 1.0])
    r /= np.linalg.norm(r)
    u = np.cross(r, f)
    v = np.atleast_2d(pts) - CAM
    depth = v @ f
    return np.c_[(v @ r) / depth, (v @ u) / depth], depth


def tv_panel(ax, name):
    pl = [q for q in players_of(name) if abs(q.w) <= 9.0]
    for d in range(-15, 11, 5):                      # yard lines, and the line of scrimmage
        xy, _ = tv_project(np.array([[d, -20.0, 0.0], [d, 20.0, 0.0]]))
        ax.plot(xy[:, 0], xy[:, 1], color=style.BASELINE, lw=0.8, zorder=1)
    xy, _ = tv_project(np.array([[0.0, -20.0, 0.0], [0.0, 20.0, 0.0]]))
    ax.plot(xy[:, 0], xy[:, 1], color=style.OFFENSE, lw=1.2, zorder=1)
    cols = []
    for q in pl:
        foot, dep = tv_project(np.array([q.d, q.w, 0.0]))
        head, _ = tv_project(np.array([q.d, q.w, 2.0]))
        cols.append((dep[0], q, foot[0], head[0]))
    for dep, q, foot, head in sorted(cols, key=lambda c: -c[0]):      # far players first
        wid = 0.75 * (head[1] - foot[1]) / 2.0
        ring = RB_RING if q.pos in ("RB", "FB") else TE_RING if q.pos == "TE" else "white"
        ax.add_patch(FancyBboxPatch((foot[0] - wid / 2, foot[1]), wid, head[1] - foot[1],
                                    boxstyle=f"round,pad=0,rounding_size={wid * 0.45}", fc=style.OFFENSE,
                                    ec=ring, lw=1.8 if ring != "white" else 0.6, zorder=3))
        if q.label:
            ax.text(foot[0], foot[1] + 0.62 * (head[1] - foot[1]), q.label, ha="center", va="center",
                    fontsize=6.5, color="white", fontweight="bold", zorder=4)
    ax.set_facecolor(style.TURF)
    xs = [c[2][0] for c in cols]
    ys = [c[2][1] for c in cols] + [c[3][1] for c in cols]
    return (min(xs), max(xs), min(ys), max(ys))


def tv_frame(ax, ext, title):
    x0, x1, y0, y1 = ext
    padx, pady = 0.12 * (x1 - x0), 0.25 * (y1 - y0)
    ax.set_xlim(x0 - padx, x1 + padx)
    ax.set_ylim(y0 - pady, y1 + pady)
    ax.set_xticks([])
    ax.set_yticks([])
    for sp in ax.spines.values():
        sp.set_visible(False)
    ax.set_title(title, fontsize=9.5, fontweight="bold", color=style.INK, loc="left")


fig, axes = plt.subplots(1, 2, figsize=(6.6, 2.4))
exts = [tv_panel(ax, n) for ax, n in zip(axes, ["I-formation", "Pro set"])]
ext = (min(e[0] for e in exts), max(e[1] for e in exts), min(e[2] for e in exts), max(e[3] for e in exts))
for ax, t in zip(axes, ["I-formation: a row", "Pro set: a stack"]):
    tv_frame(ax, ext, t)
fig.subplots_adjust(left=0.01, right=0.99, top=0.88, bottom=0.03, wspace=0.05)
plt.show()
Figure 11.18: The same backfields as the broadcast’s sideline camera sees them (a simple perspective sketch: camera high on the offense’s left sideline, near the line of scrimmage, offense moving left to right; bodies are drawn as plain columns). The offensive line, which runs across the field, is squashed into a column at the right of each panel. Left: the I-formation. The stacked backs, one directly behind another from above, become a row strung out across the screen: quarterback, fullback, tailback, each farther from the line. Right: the pro set. The side-by-side backs are at the same depth, so they stand at the same spot left to right, one nearer the camera (lower on the screen and bigger) and one farther (higher and smaller), and they can hide behind each other. From the sideline, an I looks like a row and split backs look like a stack.

So on the live shot, a row of helmets behind the quarterback is an I, one helmet seven yards back is a singleback, and two backs stacked one above the other on screen are split backs. An offset fullback is the second helmet sitting a little above or below the tailback’s. The end-zone replay or the skycam behind the offense shows the backfield the way this chapter draws it; use it to check your call.

Watch for it on Sunday

TipWatch for it: name that formation

For ten snaps in a row, before the ball is snapped, say three things out loud and then a name.

  • Under center or gun? Look at the quarterback’s hands. Under center means this chapter’s formations; pistol or shotgun means the next chapter’s.
  • One back or two (or three)? Count the players strung out behind the quarterback (on the sideline camera, a row is an I and a stack is split backs). Name the shape by where they stand: a tight end directly behind the quarterback still makes it an I. A tight end off the line beside a tackle (an H-back) is a tight end for the personnel count.
  • Stacked, split or offset? Two backs in a line is an I; side by side is a pro set; one a yard to the side is an offset I. Three backs is a Power I, a wishbone or a T, and in the NFL that means short yardage.
  • Where are the tight ends? One on each side with one back is an ace. Three tight ends and no receivers is goal line.
  • Count. Blockers (linemen, tight ends and any back who isn’t getting the ball) against the defenders in the box. One more defender than blockers says the defense is braced for the run.
  • Name it, then guess. Under center with two backs: lean run (about three plays in four), and if it’s a pass, expect a play fake. Under center with one back: still run-leaning (about three passes in eight in neutral situations) and still play-action heavy. Note which way an offset fullback points and whether the play went that way.
  • Log it. Add a formation column to your prediction log next to personnel: “21, I, UC” or “12, ace, UC.” After ten snaps, check how often your run/pass guess was right from under center versus from the gun.

Predict the play

TipPredict the play 1: the offset fullback

Second-and-4 at your own 40, first quarter, tied. The offense has come out like this against a base 4-3:

Show the Python
off = players_of("Offset I")
off = [q.moved(w=-1.6) if q.key == "FB" else q for q in off]
dfn = base43(off, fix={"MIKE": dict(w=0.6), "SAM": dict(d=4.0, w=6.6)})
q1 = ring_by_body(Play(off, dfn, los=50, to_go=4))
fld = q1.draw(lateral=(-17.5, 17.5), window=(-9.0, 14.5), title=False)
hide_yard_numbers(fld.ax)
plt.show()
Figure 11.19: Drill 1: second-and-4. Offense: tight end Y (gold ring) on the right, backs ringed aqua, receivers X and Z. Defense: E = end, T = tackle, S/M/W = linebackers, C = cornerbacks, FS/SS = safeties.

What formation and personnel is this? Run or pass? And which side is the fullback set up to lead to?

An offset I, offset weak (a “Weak I”), with 21 personnel. Two backs (fullback and tailback) and one tight end, so two receivers. The fullback is offset to the left, away from the tight end: that’s “weak.”

Run or pass: lean run. Two backs stacked behind an under-center quarterback ran about three times in four in neutral situations, and second-and-4 is a comfortable running down. If it’s a pass, expect a play fake.

Which side: the left. The offset fullback is already behind the left guard, in position to lead on a weak-side run (an iso into the bubble over the Will, as in the iso diagram) or to pick up a blitzing linebacker from that side on play-action. Whether this offense actually runs toward its offset is a tendency, not a rule, and smart offenses break it on purpose. There’s no league-wide number to look up: the public charting data records how many backs there are, not which way the fullback is offset; that takes tracking data (Tracking Data and the Big Data Bowl works with it). Log it for the team you’re watching instead.

TipPredict the play 2: second-and-goal at the 1

The offense has the ball on the defense’s 1-yard line, second down. It sends in three tight ends, a fullback and a tailback; the defense answers with its goal-line package.

Show the Python
q2 = ring_by_body(Play(players_of("Goal line"), gl_def, los=109, to_go=None))
fld = q2.draw(lateral=(-13.0, 13.0), window=(-9.0, 8.5), title=False)
hide_yard_numbers(fld.ax)
plt.show()
Figure 11.20: Drill 2: second-and-goal at the 1. The offense is in its goal-line formation; the tight end H is a wing behind and outside Y. The defense has five linemen, three linebackers and three defensive backs; its two safeties (SS, FS) are only about four yards deep.

Count the blockers and the defenders in the box. Who wins the count, and so how does the offense try to score? If it throws, who is the likeliest target?

The defense wins the count, eleven to nine, and at the goal line it always will: nobody has to stay deep. The offense’s blockers are the five linemen, the three tight ends and the fullback; the quarterback and the tailback don’t block.

So the offense doesn’t try to block everyone. It tries to win one gap. Expect a run aimed at a single spot with extra bodies there (a double team and the fullback leading into the hole) or a quarterback sneak behind the center. A tailback who needs one yard only has to fall forward.

If it throws: a play fake and a tight end, because eleven defenders committed to the run is exactly what the fake exploits. The likeliest target is the wing (H) or the tight end on the side away from the fake: he blocks for a count, as he would on a run, then slips into the end zone while the linebackers and safeties step up. Watch the two safeties: if both crash at the snap, the tight end is alone.

TipPredict the play 3: the I against eight in the box

First-and-10 at midfield, second quarter. The offense is in the I with 21 personnel. The defense, in its base 4-3, has walked the strong safety down beside the linebackers, leaving one safety deep.

Show the Python
off = players_of("I-formation")
dfn = base43(off, shell="single_high", fix={"SS": dict(d=5.5, w=8.8), "SAM": dict(d=4.0, w=5.6),
                                            "MIKE": dict(w=0.6), "FS": dict(d=13.5)})
q3 = ring_by_body(Play(off, dfn, los=60, to_go=10))
q3.highlight("SS", "FS", color=style.DEFENSE)
fld = q3.draw(lateral=(-17.5, 17.5), window=(-9.0, 16.0), title=False)
hide_yard_numbers(fld.ax)
plt.show()
Figure 11.21: Drill 3: I-formation (21 personnel) against a base 4-3 with the strong safety (SS) walked down outside the Sam linebacker on the tight end’s side, leaving one deep safety (FS) in the middle of the field. The cornerbacks (C) are about seven yards off the two receivers.

Do the count. Why did the defense bring the safety down, and what is the offense likely to try?

The count is eight against seven. The offense has seven blockers (five linemen, the tight end and the fullback). In the box the defense has four linemen, three linebackers and the strong safety: eight. The I’s whole advantage was a hat on a hat with a lead blocker; the safety takes that away by giving the defense one more player than the offense can block. It came down because the formation says run.

What the offense is likely to try: the run is still the most common call. If it runs, it often runs away from the extra man, to the left here: the safety walked down on the tight end’s side, so a run the other way makes him chase across the formation, and he arrives late. But this is also the picture play-action was invented for. Single-high, with the safety in the middle, means each cornerback is alone on his side, with no safety beside him. If the defense is playing man coverage behind the safety (Cover 1), that’s a one-on-one outside; if it’s zone with the corners dropping deep (Cover 3), the fake pulls the linebackers up and opens the window behind them for a crossing route. Either way, the run fake is what moves the eight defenders.

Takeaways

  • The classic formations are defined by the backfield. Read them back to front: quarterback under center or not, how many backs, and whether they’re stacked (I), side by side (pro set), offset (offset I) or three wide (T, wishbone, Power I).
  • Each formation is an answer to a problem, and every answer has a price. The I gives the tailback a lead blocker and a running start but is slow to the edge and obvious; the pro set is balanced and quick-hitting but has no deep tailback; the singleback and ace trade the fullback for a tight end or receiver; the wishbone and flexbone are built to read a defender instead of blocking him; the Wing-T lives on misdirection; the goal-line formation trades all its space for blockers.
  • They’re one family. The T’s three backs were stacked (I), split (pro set), spread (flexbone), scattered for misdirection (Wing-T) or traded for receivers (singleback). Knowing the tree helps you name the shape.
  • Count, every time. Blockers (everyone but the quarterback and the ball carrier) against defenders in the box. A hat on a hat favors the run; one extra defender is the defense’s answer; at the goal line the defense always wins the count, so the offense picks one gap instead.
  • Formation follows personnel. 21 usually means an I, offset I or pro set; 12 an ace; 11 a singleback or a shotgun look; three backs or three tight ends mean short yardage. Name the shape by where players stand, the personnel by who they are.
  • Two-back, under-center football faded because passing won, and it survives where running and faking matter most. In 2025, under center meant run about 70% of the time, play-action on about four of five dropbacks, and it was the default on short yardage. The under-center share rose to about a third of plays as offenses got bigger against lighter defenses.

Connections

Builds on: Personnel (who is on the field, and why 21 and 12 personnel matter), Formation Rules and the Language of Alignment (seven on the line, the X/Y/Z letters, under center, shotgun and pistol, strong and weak side), and The Twenty-Two (running backs, fullbacks and tight ends).

Sets up: Spread Formations (the shotgun branch of the tree), A First Look at Defense (the box and base defense, the defense’s answer to these formations), and Motion and Shifts as Weapons (what the H-back’s motion becomes). Later: The Language of the Run Game and Gap and Power Runs (the lead block, iso, counter trey and Lombardi’s sweep, drawn block by block), Option Football (the split-T, the veer and the triple option from the wishbone and flexbone), Perimeter Runs and Misdirection (the Wing-T’s series), Play-Action, Bootlegs, and Screens, and the history in The Single Wing to the Scoring Drought, 1978 and the Passing Revolution and The College Laboratory (the wishbone and flexbone lineage).

Case studies: the Shanahan tree (the 49ers’ fullback and the under-center revival) and the Ravens with Lamar Jackson.

NoteGo deeper
  • Tim Layden, Blood, Sweat and Chalk (2010): readable chapters on the T, the wishbone, the one-back offense and the Wing-T, built from interviews with the coaches who drew them.
  • Vince Lombardi with W. C. Heinz, Run to Daylight! (1963): a week inside the Packers, with Lombardi explaining his sweep in his own words.
  • Chris B. Brown, The Art of Smart Football (2015) and his Smart Football site (https://smartfootball.com): essays on the I, the flexbone and the shotgun’s takeover.
  • The nflverse FTN charting dictionary, for the quarterback-location and backfield fields used in this chapter’s charts: https://nflreadr.nflverse.com/articles/dictionary_ftn_charting.html.

  1. “1940 NFL Championship Game,” Wikipedia: https://en.wikipedia.org/wiki/1940_NFL_Championship_Game (Bears 73, Washington 0, Dec. 8, 1940); “1940 Stanford Indians football team,” Wikipedia: https://en.wikipedia.org/wiki/1940_Stanford_Indians_football_team (9–0 in the regular season, then a 21–13 Rose Bowl win over Nebraska on Jan. 1, 1941, a year after going 1–7–1); “1941 Rose Bowl,” Wikipedia: https://en.wikipedia.org/wiki/1941_Rose_Bowl (Shaughnessy had worked informally with George Halas on the Bears’ T and was still a Bears consultant when he helped prepare them for the 1940 title game).↩︎

  2. “1952 Pittsburgh Steelers season,” Wikipedia: https://en.wikipedia.org/wiki/1952_Pittsburgh_Steelers_season (“the last year the Steelers used the single-wing formation on offense, switching to the T formation the following year”; the last NFL team to use it as their primary formation).↩︎

  3. “Split-T formation,” Wikipedia: https://en.wikipedia.org/wiki/Split-T_formation (Don Faurot, Missouri, first used in 1941; “the offensive line was spread out over almost twice as much ground”; the quarterback ran toward the unblocked defender and pitched to the trailing halfback if he closed; “what may have been the first option offense in football, which was a precursor of the wishbone, veer, and some modern run-first spread offenses”).↩︎

  4. “Veer,” Wikipedia: https://en.wikipedia.org/wiki/Veer (Bill Yeoman ran it at Houston “beginning in the mid-1960s”; a triple option with a dive course, a pitch course and a lead blocker); “Wishbone formation,” Wikipedia: https://en.wikipedia.org/wiki/Wishbone_formation (Bellard “tried to merge his old high school tactics with Stallings’ triple option out of the Slot-I formation and Homer Rice’s variations of the Veer, an offensive formation created by Bill Yeoman”).↩︎

  5. “Elroy Hirsch,” Pro Football Hall of Fame: https://www.profootballhof.com/players/elroy-hirsch/ (66 catches, 1,495 yards and 17 touchdown catches in 1951); “Elroy Hirsch,” Wikipedia: https://en.wikipedia.org/wiki/Elroy_Hirsch (Shaughnessy, the Rams’ head coach, moved Hirsch to end after he signed in 1949; the Rams often split him wide and later moved him permanently to end, “the first flanker”; the article also notes the dispute, since Don Hutson’s Packers and the 1940s Bears and Washington had split backs wide before).↩︎

  6. “West Coast offense,” Wikipedia: https://en.wikipedia.org/wiki/West_Coast_offense (“originally the offense used two split backs,” with the backs’ check-release and free-release rules that sent them into short routes).↩︎

  7. Pro Football Hall of Fame, “Vince Lombardi”: https://www.profootballhof.com/players/vince-lombardi/ (Packers 1959–1967; NFL championships 1961, 1962, 1965, 1966, 1967; Super Bowls I and II). Vince Lombardi with W. C. Heinz, Run to Daylight! (Prentice-Hall, 1963). The formation and blocks: Cliff Christl, “Red Cochran on Lombardi and Hall of Fame backs Hornung, Taylor,” Packers.com, March 15, 2018: https://www.packers.com/news/red-cochran-on-lombardi-and-hall-of-fame-backs-hornung-taylor-20452981 (“Red Right 49”; “the red was the formation with a wide split between the backs”; the fullback on the defensive end; Kramer and Thurston pulling).↩︎

  8. “I formation,” Wikipedia: https://en.wikipedia.org/wiki/I_formation (Tom Nugent credited with developing it at VMI in 1950; possible earlier sources include Charles Hollister at Northwestern, 1900, and Bob Zuppke, 1914; Don Coryell used the I before joining McKay’s USC staff in 1960, and John Madden credited Coryell with bringing it to McKay); “Tom Nugent,” Wikipedia: https://en.wikipedia.org/wiki/Tom_Nugent ; Heisman Trophy winners Mike Garrett (1965) and O. J. Simpson (1968): https://www.heisman.com/heisman-winners/ .↩︎

  9. Course calculation from nflverse play-by-play joined to FTN charting, regular-season runs and passes in 2022–2025, first and second down, win probability 20–80%, outside the last two minutes of each half: under center with two or more players in the backfield besides the quarterback, 27% passes (8,579 plays), of which 85% used play-action; under center with exactly one, 38% passes (14,501 plays), 78% play-action; shotgun with one or no back, 71% passes. Backfield counts are FTN’s n_offense_backfield.↩︎

  10. “1978 NFL season,” Wikipedia: https://en.wikipedia.org/wiki/1978_NFL_season (defenders may contact receivers only within five yards of the line of scrimmage, the “Mel Blount Rule”; pass-blocking rules extended to permit extended arms and open hands).↩︎

  11. Pro Football Hall of Fame, “Joe Gibbs”: https://www.profootballhof.com/players/joe-gibbs/ (Washington head coach 1981–1992 and 2004–2007; wins in Super Bowls XVII, XXII and XXVI); “Joe Gibbs,” Wikipedia: https://en.wikipedia.org/wiki/Joe_Gibbs (Coryell’s offensive coordinator in San Diego, 1979–1980). The H-back and the one-back, two-tight-end offense as Gibbs’s answer to Lawrence Taylor: “H-back,” Wikipedia: https://en.wikipedia.org/wiki/H-back (Clint Didier was Gibbs’s H-back), and Tim Layden, Blood, Sweat and Chalk (2010).↩︎

  12. “Wishbone formation,” Wikipedia: https://en.wikipedia.org/wiki/Wishbone_formation (Emory Bellard, Texas offensive coordinator under Darrell Royal, 1968; Houston sportswriter Mickey Herskowitz said it looked like a “pulley bone,” and Royal changed the name to “wishbone”; Texas then won 30 straight games and two national championships; Royal showed it to Bear Bryant in 1971; in the triple option “the lead halfback is a lead blocker usually looking to block the outside defensive player, a safety or corner,” and the trailing halfback takes the pitch; Bellard drew on Gene Stallings’s triple option and on Homer Rice’s variations of Bill Yeoman’s veer); Texas Longhorns lettermen’s history, “1968–1970: 30 straight wins and two national championships”: https://www.texaslsn.org/football-dkr-1968-1970 .↩︎

  13. “Option offense,” Wikipedia: https://en.wikipedia.org/wiki/Option_offense (the flexbone “invented by Emory Bellard at Mississippi State in 1979”; also “origins attributed to Paul Johnson while at Georgia Southern in the mid-80s”; Fisher DeBerry of Air Force “welcomed the name flexbone,” while Johnson rejected it); “Wishbone formation,” Wikipedia: https://en.wikipedia.org/wiki/Wishbone_formation (Bellard’s “wing-bone” at Mississippi State); “Paul Johnson,” Wikipedia (Georgia Southern offensive coordinator under Erk Russell, I-AA champions 1985 and 1986).↩︎

  14. “Paul Johnson (American football coach, born 1957),” Wikipedia: https://en.wikipedia.org/wiki/Paul_Johnson_(American_football_coach,_born_1957) (Georgia Southern head coach 1997–2001, I-AA titles 1999 and 2000; Navy 2002–2007; Georgia Tech 2008–2018); “2001 Navy Midshipmen football team,” Wikipedia: https://en.wikipedia.org/wiki/2001_Navy_Midshipmen_football_team (0–10); “2003 Navy Midshipmen football team,” Wikipedia: https://en.wikipedia.org/wiki/2003_Navy_Midshipmen_football_team (8–5).↩︎

  15. “Refined Navy offense emerging under Newberry,” Stars and Stripes, Aug. 16, 2023: https://www.stripes.com/sports/2023-08-16/refined-navy-offense-emerging-newberry-10996804.html (under-center and shotgun formations, the triple option still the base); “Yes, Navy has an undefeated record, and one of the nation’s most explosive offenses,” Fox Baltimore, Oct. 24, 2025: https://foxbaltimore.com/sports/sports-unlimited/navy-football-undefeated-explosive-offense-wing-t (Drew Cronic hired after the 2023 season; the “millennial Wing-T,” with the option, RPOs and shotgun snaps).↩︎

  16. “David M. Nelson,” Wikipedia: https://en.wikipedia.org/wiki/David_M._Nelson (head coach at Maine 1949–1950, where he began developing the Wing-T, and Delaware 1951–1965); “Tubby Raymond,” Wikipedia: https://en.wikipedia.org/wiki/Tubby_Raymond (Delaware head coach 1966–2001); Harold R. Raymond, The Delaware Wing-T: An Order of Football (Prentice Hall, 1986); Raymond’s longtime assistant Ted Kempski co-wrote later Delaware Wing-T books.↩︎

  17. Course calculation from nflverse play-by-play joined to FTN charting, regular season 2022–2025, plays with the ball at the opponent’s 1 or 2: under center with two or more players in the backfield besides the quarterback, 23% passes (825 plays), and 79% of those passes used play-action (73% of all under-center passes inside the 2).↩︎

  18. Course calculation from nflverse participation data (offense_formation, supplied by Next Gen Stats through 2022), regular-season runs and passes: I_FORM 10.7% of plays in 2016, 6.2% in 2022. From 2023 the source changes to FTN, which records only SHOTGUN, UNDER CENTER and PISTOL, so the series can’t be extended. The shotgun shares in the chart are from the nflverse play-by-play shotgun flag; the quarterback-location shares from FTN charting (qb_location), joined to play-by-play: https://nflreadr.nflverse.com/articles/dictionary_ftn_charting.html↩︎

  19. Course calculation from nflverse play-by-play, regular-season runs and passes 2006–2025: mean epa on dropbacks (pass = 1, which includes sacks and scrambles) +0.043 in 2025 and +0.033 over 2006–2025; on designed runs (pass = 0) −0.046 in 2025 and −0.071 over 2006–2025. Dropbacks had the higher mean in every season.↩︎

  20. Pro Football Hall of Fame, “The Shotgun Formation”: https://www.profootballhof.com/news/the-shotgun-formation (Red Hickey’s 49ers first used it on Nov. 27, 1960, against the Colts; Tom Landry’s Cowboys revived it in 1975 to protect Roger Staubach); “Shotgun formation,” Wikipedia: https://en.wikipedia.org/wiki/Shotgun_formation .↩︎

  21. Course calculation from nflverse play-by-play joined to FTN charting, 2025 regular season: 49ers under center on 45.8% of runs and passes, two or more backs on 25.7%; league 33.6% and 18.5%. Juszczyk’s role and record: see The Twenty-Two.↩︎

  22. Pro Football Reference, Derrick Henry: https://www.pro-football-reference.com/players/H/HenrDe00.htm (1,921 rushing yards in 2024, second to Saquon Barkley’s 2,005; listed at 247 lb); “Patrick Ricard (American football),” Wikipedia: https://en.wikipedia.org/wiki/Patrick_Ricard_(American_football) (listed at 300 lb; undrafted from Maine in 2017 as a defensive lineman; with Baltimore 2017–2025, then the Giants). Two-back shares (Ravens 24.3%, league 17.7%, 2024 regular season, two or more players in the backfield besides the quarterback) are a course calculation from FTN charting via nflverse. The 2024 staff and its end after 2025 are from the course fact sheet (Harbaugh fired January 2026).↩︎

  23. Shotgun share from nflverse play-by-play (72.2% in 2023, 66.2% in 2025) and under-center share from FTN charting (27.3% in 2023, 33.6% in 2025), regular-season runs and passes, as checked in the course fact sheet (FACTS-current §10); the team figures are the course’s own calculation from the same data (Rams 59.1%, Seahawks 53.4% under center in 2025). Stafford’s MVP (AP, Feb. 5, 2026) and Seattle’s 2025 offensive coordinator are from the same fact sheet.↩︎

  24. Course calculation from nflverse play-by-play joined to FTN charting (qb_location), regular seasons 2024–2025, dropbacks (pass = 1): mean epa +0.14 under center, +0.03 from the shotgun (2024 alone: +0.14 and +0.03; 2025: +0.14 and +0.02).↩︎