Methodology

How every number on this site gets made.

28 and Three is opinionated about what’s in the box score. This page is the receipt: data sources, phase definitions, ranking rules, draft grading, coaching tendencies, and the limits we ship honestly.

01

Data sources

Everything on 28 and Three flows from public, attributable feeds. No proprietary PFF or NGS data; no paywalled APIs.

  • nflverse via nflreadpy — play-by-play from nflfastR (2020–current), schedules, rosters, draft picks, participation.
  • nfl4th— Ben Baldwin’s 4th-down win-probability model, used exclusively for the coaching-page 4th-down ledger. Computed in the ETL, never at request time.
  • Public NFL schedule— also via nflverse.

All ingestion runs on a weekly GitHub Actions cron; see refresh cadence.

02

League rankings & EPA

Every phase rank on the site is measured against the full 32-team league, not just the AFC East. Ranks 1–11 are top-third (amber), 12–21 neutral, 22–32 bottom-third (cranberry). Tier colors are stable regardless of how many teams met the small-sample threshold in a given week.

The single-number summary is EPA per play — expected points added, averaged over the plays in a phase. EPA captures down, distance, field position, and game context in a way raw yards don’t. We aggregate directly from nflfastR-computed EPA values; we do not refit the model.

Explosive phases (§06) are the exception: they’re rate phases, not EPA phases, so the stored metric is the explosive-play share (0.0–1.0).

02.1

Rank tiebreaks

When two or more teams have identical EPA/play in a phase, ties break in this order — applied in the ETL aggregation query so ranks are stable across page loads.

  1. More plays in the phase (larger sample is more reliable).
  2. Higher success rate in the phase.
  3. Alphabetical team abbreviation (deterministic final fallback).

EPA values are rounded to six decimals before comparison so floating-point noise from AVG()doesn’t pre-empt the plays-count tiebreak.

02.2

Small-sample rules

Some phases have few plays in a given week — special teams in a clean game, red-zone offense when the team stalls. We never fabricate a number from thin air.

  • Weekly:plays-in-phase < 10 → metric renders as “—” with an n < 10 caveat. No weekly rank computed.
  • Season-to-date:cumulative plays < 30 → no season rank. The team is excluded from the 1–32 denominator for that phase that week.
  • Rolling 4-week averages include only weeks where n ≥ 10.

You will never see NaN, null, undefined, or bare 0when the correct answer is “not enough data” — a dedicated e2e sweep (tests/e2e/no-bad-numbers.spec.ts) enforces this on every build.

02.3

Deltas & trends

Rank deltascompare the season-to-date rank against the same view from the prior season (or prior snapshot). A positive delta (▲) means the rank improved — rose on the board. Negative (▼) means it fell.

EPA deltas are always signed (U+2212 for negatives) and display with two decimals. We use the real minus sign throughout, never a hyphen.

Phase trend charts default to per-game EPA (season-to-date rolling average of per-game phase values), not per-play rolling averages. This smooths noise from 15-play red-zone weeks while keeping a game-by-game cadence.

03

The 12 phases of play

Every home-page tile and phase-detail page aggregates one of twelve phases. Each phase has a fixed filter on the play-by-play dataset; changing a filter is a contract change that triggers a full backfill.

  • Pass offense— EPA per dropback. Sacks + scrambles included.
  • Rush offense— EPA per rush attempt. QB designed runs in; scrambles out.
  • Pass defense, run defense — same filters, grouped by defensive team.
  • Red-zone offense / defense— EPA on plays inside the 20.
  • 3rd-down offense / defense— EPA on 3rd downs only (4th downs live on the coaching page).
  • Explosive offense / defense— rate phase. Pass ≥ 20 yards or run ≥ 15 yards counts as explosive. Metric stored is 0.0–1.0 share, not EPA.
  • Special teams— EPA on punts, kickoffs, field goals, extra points.
  • Overall— team EPA differential (offensive EPA/play minus defensive EPA/play allowed). A pass-offense-first team with average defense lands positive.

The versioned filter contract lives at docs/phase-definitions.md, mirrored into etl/transform/phases.py.

Global rules: regular-season only; garbage plays (kneels, spikes, 2-point attempts, nullified penalties) excluded from averages; no garbage-time filter (aligns with rbsdm / FTN).

04

Quarterback metrics

The QB page headline is EPA per dropback. Alongside it: CPOE (completion percentage over expected from nflfastR), aDOT (average depth of target), pressure rate, and clean-pocket vs. pressured splits on EPA.

Default view is games as primary starter— games where the QB took more than 50% of team dropbacks. A toggle exposes every appearance. A small-sample banner appears below 100 season-to-date dropbacks because a handful of end-of-game snaps will otherwise distort splits.

05

Skill-position metrics

RB / WR / TE pages surface target share, route participation, YAC per reception, EPA per target, aDOT, red-zone usage, and separation where nflverse participation data is available. EPA contribution rolls up to the player’s side of the ball (receiving or rushing EPA), and that rollup feeds into draft grading.

06

Why individual defense is deferred

We do not ship per-defender EPA ratings. Computing individual defensive value from nflverse alone is unreliable: participation data starts 2016 and is spotty; without PFF grades (out of scope) or premium NGS advanced-defense data, per-player numbers would be misleading more often than useful.

The defense section instead publishes team-unit metrics: pressure rate, coverage EPA allowed, run-stop rate, explosive plays allowed. Honest callouts appear on the defense unit page where a reader might expect a per-player leaderboard.

When a credible public data source appears, we’ll revisit. Until then, shipping nothing beats shipping bad.

07

OL, DL & secondary units

The three unit pages surface aggregate EPA and proxy rates:

  • Offensive line— pass-block / run-block win-rate proxies, pressures allowed, EPA on designed runs.
  • Defensive line— pressure rate, run-stop rate, explosive runs allowed.
  • Secondary / defense— coverage EPA allowed, explosive passes allowed.

Pressure and block-rate proxies are derived from nflverse participation and play-result fields; they align with but are not identical to ESPN’s published win-rate stats.

08

Draft ROI grading

Every Patriots pick 2021–2025 gets one of four grades:

  • HIT— actual / slot-expected value ≥ 1.25.
  • FAIR— ratio between 0.75 and 1.25.
  • MISS— ratio < 0.75.
  • PENDING— pick is too recent (< 2 seasons), is a specialist (K / P / LS), was traded out, or has missing inputs.

Slot-expected valueis a per-slot × position-bucket curve fit against league-wide 2015–2024 outcomes. The curve uses isotonic (monotone) regression so later-round picks never exceed earlier-round picks in expected value.

Skill positions (QB / RB / WR / TE) grade on EPA-weighted career contribution to date. Trenches and secondary(OL / DL / LB / DB) grade on a unit-proxy tier — the team unit’s league rank during the player’s active seasons. The unit-proxy modifier shows as an asterisk next to the grade so the reader can tell the grading surface apart.

09

Coaching tendencies

The coaching page renders weekly rollups per HC / OC / DC:

  • Play-call mix— pass rate across a 3×3 grid of down × distance buckets (short 0–3, mid 4–7, long 8+).
  • Situational rates— shotgun alignment, play-action, pre-snap motion, no-huddle.
  • Score-state pass rate— five bands from trailing 9+ through leading 9+. Expected pattern: pass-heavy when trailing, run-heavy when leading big.
  • Personnel groupings— top-5 by share. 11-personnel typically dominates; the long tail (12, 21, 22, 13) colors the playbook’s identity.
  • Blitz rate— defensive 5+ rushers on the snap. NFL average is roughly 25%.
  • 4th-down ledger— week-by-week compare of each 4th-down decision against the nfl4th model’s recommendation. Rows are bordered amber when the team agreed, cranberry when they diverged.

09.1

Mid-season coaching changes

When a coordinator changes mid-season, tendency rollups attach to the coach of record at the time of each play (SPEC §3.5a). The coaching page renders a segment per (role, continuous coach identity) — e.g., “OC Weeks 1–6 · Coach A” then “OC Weeks 7–18 · Coach B”. The “changed” pill on the coach card flags the split.

Segment identity prefers coach_idfrom the source, falling back to a normalized name so a rename (e.g., capitalization drift) doesn’t produce phantom splits.

10

Limitations

  • No individual defender ratings. See §06.
  • No garbage-time filter. A 4th-quarter collapse is legitimate signal for a fan site. Peers (rbsdm / FTN / Sumer) take the same stance.
  • No playoff games in team-phase aggregates. Samples too small, opponent-skewed. Playoffs load to the raw plays table and feed player pages but sit out the 1–32 rankings.
  • Seasons 2020–current.Earlier seasons aren’t backfilled; nflverse drift (column renames, participation data gaps) makes the multi-era stitching a larger project than v1 warrants.
  • No PFF or premium NGS feeds. Public data only.

11

Refresh cadence

The ETL runs on GitHub Actions crons:

  • Tuesday 14:00 UTC— primary refresh, loads the previous week’s play-by-play.
  • Tuesday 18:00 + 22:00 UTC— retry windows if the primary run fails or nflverse hasn’t published yet.
  • Wednesday 06:00 UTC— watchdog. Opens an issue if no status=‘ok’ row has landed since Monday 00:00.

Every run writes a row to meta_refresh with status (running / ok / failed / heartbeat), row counts per table, and source version. The footer’s “Last refresh” pulls from the latest ok row.

Pages are ISR-cached with a 1-hour TTL as fallback, but the ETL also calls an on-demand revalidation webhook after a successful run so fresh data appears within seconds of the backend update.

12

Attributions

28 and Three is an independent fan project. It is not affiliated with, endorsed by, or sponsored by the New England Patriots, the NFL, or any of its teams.

Play-by-play data and rosters: nflverse, specifically nflfastR and nflreadpy.

4th-down model: nfl4th by Ben Baldwin.