"Ban the tush push."
of 260,927 play descriptions contain the words "tush push."
tush push0Not once, in any season.
brotherly shove0Not once, either.
sneak2Both in 2021: Herbert in week 1, Brady in week 10.
push16,257As in "pushed ob": a player pushed out of bounds.
Every NFL play from 2021 through the 2026 games of October 11 comes with a one-line description, and not one of them names the most argued-about play in the league. So an AI agent cannot find the play, let alone judge it, until it says what it will count as one. It has to define the play before it can judge it, write that definition down, and use it every time after.
Aired October 26, 2026. Watch the recording and read the recap on O'Reilly Radar, also on Substack.
Corrected November 3, 2026. The tool as aired counted 195 two-point tries as failed conversions, although its filter line said they were out. The aired gap of 8.3 points is 10.1 with them removed, and 7.8 without the Eagles is 9.7. The verdict does not change. The tool, the sheets, and the explorer now use the corrected plays. The ruling below is kept as the agent gave it on air. The full account.
This episode is about that written definition. The agent keeps it in a dictionary, a folder of files it writes and the tool reads. The tool will not measure a play that is not in it, every ruling has to name the entry it used, and every later episode inherits the folder. This page is how that is set up, for someone who has never built an agent.
Change the definition yourselfThe setup in one minute
You hand the agent a claim. It turns the claim into a question and asks one small tool to measure. This time the tool will not measure a play until the play is written down in the dictionary. So the agent searches for the play by name, finds nothing, writes a definition into the dictionary, and measures with it: how often the defined play converts against every other short-yardage rush. Its ruling cites the entry it used.
Since episode 1, the policy gained a section, the tool learned to read the dictionary, and the dictionary started out empty. The entry itself was written by the agent on air, on October 26, 2026. A run with an empty dictionary takes under a minute. On the registration page this episode's capability is called shared data definitions as durable memory: shared, because one folder serves all eight episodes; durable, because it is a committed file and not a context window. This is episode 2 of an eight-episode O'Reilly live series, and every number on this page is real.
The words on these pages
Every number on the site comes from the same tool, and the tool uses a few words in a fixed way. Here they are, roughly in the order the tool applies them. Wherever one of these words appears on a page with a dotted underline, hovering shows its definition and clicking brings you here.
dictionary/ at the root of the repo, one JSON file per entry. An entry is one written definition: a name, the day it was written, the definition in plain words, four rules (who carried, yards to go, formation, downs), what it is compared with, and what it cannot see. The tool measures only by an entry. The agent may add one, never change one.analyst.md: a job description that says how to turn a claim into a question, how to use the dictionary, what to show, and what it may not say.What already existed
None of this was made by the agent. One piece is new since episode 1, and it was empty.
query-plays.mjs, rewritten for this episode: 392 lines of JavaScript. It answers two shapes of question, a search of the descriptions or a defined play against every other short-yardage rush, and it prints every filter in order. It changes nothing. This diagram shows how it works.dictionary/, with a README that gives the shape of an entry and the rules: the agent may add an entry, never change one. It held no entry when the episode began. The first, tush-push, was written on air, and the folder holds it now, exactly as written.How it fits together
Two kinds of work, kept apart, as in episode 1. Counting plays has one right answer, so a small tool does it the same way every time. Deciding what to count is judgment. What is new is where one piece of that judgment lives: the definition of the play is written into a file, once, and the tool reads the file. The yellow cells are the parts written with care: the policy by hand, the dictionary by the agent.
analyst.md, nine sections, one of them new: "Your dictionary"dictionary/tush-push.json: one written definition per file, read by the tool and fed back to the agent before every runquery-plays.mjs prints the definition, every filter, then the resultWhat one run looks like
- The claim goes in as one sentence, and the runner adds the dictionary to the policy. That day it read "Entries on file: none."
- The agent splits the claim. Whether to ban the play is a judgment about safety and the game people want, and the plays cannot settle it. Whether the play converts far more often than every other short-yardage rush, they can. Then it searches the descriptions for "tush push": zero.
- The tool refuses. The agent asks it to measure
--play tush-push. With no entry of that name, the tool stops with exit code 65 and prints the shape an entry takes. - It writes the entry,
dictionary/tush-push.json: a run by the primary passer, with one yard or less to go, not from shotgun, on any down. Its last line says what those rules cannot see: who pushed the runner. - Four reads with that entry. Five seasons; the same five team by team; this season; and five seasons without the Eagles, the read it chose because the team that runs the play most could carry the pooled number.
- One ruling, citing the entry. The runner checks the citation, checks that the new entry is one the tool can use, and saves the ruling. The agent can write nothing else.
Whether the tush push should be legal is a question about safety, fairness, and the game people want to watch, and the plays cannot settle it.
The claim. The play converts so much more often than other short-yardage rushes that it is a different kind of play. For that to hold, the defined play needs a large conversion gap over other rushes at the same distance, and the gap must survive without the team that runs it most.
Definition used. tush-push, dictionary/tush-push.json, written 2026-10-26 by the analyst, episode 2, and no entry was on file before it. A search for "tush push" across 2021 through 2026, 265,845 descriptions, found 0 matches, so the play has no name in the data and the entry defines it by situation.
Five seasons. For 2021 through 2025, regular season and playoffs, all teams and downs, 1 or fewer yards to go: the defined play converted 78.3% of 1,472 plays against 70.0% of 6,282 other short-yardage rushes, a gap of 8.3 points. The read that could prove the claim wrong drops PHI, which ran the defined play most (173 plays): 77.9% against 70.1%, a gap of 7.8 points, almost unchanged.
This season. For 2026, weeks 1 to 7, with the same filters: 82.0% of 128 plays against 67.7% of 477, a gap of 14.3 points. The tool printed no small-sample warning, but 128 plays is about a tenth of the five-season group, so a few conversions either way can move that rate by several points.
The gap between the two answers. The 2026 gap is larger than the five-season gap, but seven weeks of data cannot show that the difference is more than chance.
Ruling. The claim does not hold in its strong form: the defined play converted 8.3 points more often than other short-yardage rushes over five seasons and 7.8 points more without PHI, which is a real edge but not a gap that makes it a different kind of play.
What these plays cannot tell you. Who pushed the runner or whether anyone pushed at all, so this entry counts every under-center sneak by the primary passer at 1 yard or less, and it cannot explain why the play converts.
node ./query-plays.mjs --search "tush push" --seasons 2021-2026 node ./query-plays.mjs --play tush-push --seasons 2021-2025 node ./query-plays.mjs --play tush-push --seasons 2021-2025 --by team node ./query-plays.mjs --play tush-push --seasons 2026 node ./query-plays.mjs --play tush-push --seasons 2021-2025 --not-team PHI
The ruling the agent gave on air, October 26, 2026, with an empty dictionary: 48 seconds, seven tool calls, one of them refused, and one retry for length (425 words down to 397), abridged to fit. The 2026 season had run through the October 25 games. The yellow numbers mark where the agent is using judgment; the rest is mechanical.
The policy, in nine sections
The policy is a Markdown file of about 1,400 words, written like a job description. It is episode 1's eight sections with one added, third, right after the tool: the dictionary.
.json file in the dictionary folder. No reading files, no writing anywhere else, no network.What carries to your own agent
Edit(//<repo>/dictionary/*.json). The agent can write a new entry and nothing else, not even the README beside it. Tested before the show: a write into the folder was allowed, and a write next to it was refused.Try it yourself
With nothing installed, the explorer page shows the tool's real output for 54 definitions of the play, across seven sets of seasons.
To run the agent, you need a Mac or Linux machine with Node, git, and the Claude Code CLI signed in. The data is already in the repo.
# get the kit git clone https://github.com/ismayc/monday-morning-agent.git cd monday-morning-agent/episode-2 # the search by name node ./query-plays.mjs --search "tush push" --seasons 2021-2026 # a play with no entry: the tool stops and prints the shape of one node ./query-plays.mjs --play no-such-play --seasons 2021-2025 # the whole agent, into a scratch dictionary so your copy of the real one stays as it is ANALYST_DICT_DIR=$(mktemp -d) ./run-analyst.sh "Ban the tush push."
Leave out ANALYST_DICT_DIR and the agent reads and writes the repo's own dictionary/. That folder holds the entry written on air, so the agent reads it and measures with it. In a scratch dictionary it starts from nothing and writes its own, which can differ: three rehearsal runs chose two or fewer yards to go, and the run on air chose one yard or less.
query-plays.mjs: its two shapes of question, the dictionary read before any filter, and one real command followed through. Then the runner's nine beats.The rest of the series
This is episode 2 of eight. Each episode settles one argument and takes away one piece of human oversight, replacing it with something written down. Here it is the definition, and from now on every episode that measures a play inherits the dictionary. Episode 1, "You have to establish the run," showed the tool's filters. All eight arguments are on the series page. Next, on November 9, 2026: "Kickers are too good now."
Appendix: the season sheets
Two pages the episode did not reach on air, here to go over at any time. Each asks the tool the same nine questions with the entry written on air, shows every answer as a bar, and prints a verdict by a rule stated on the page. The first ends with the ruling the agent gave on air.