"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.
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 yourself: the explorer page, the tool's real output for 54 definitions of the play, goes up after the episode airs on October 26, 2026.
The 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 is written by the agent, on air. 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 is written on air.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 two or fewer yards to go, not from shotgun, on any down. Its last line says what those rules cannot see: who pushed the runner. - Three reads with that entry. Five seasons; five seasons without the Eagles, the read it chose because the team that runs the play most could carry the pooled number; and this season.
- 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 judgment about safety and the game people want, and the plays cannot settle it.
The claim. The quarterback sneak from under center with two or fewer yards to go converts far more often than every other rush at the same distance, enough to be a different kind of play.
Definition used. tush-push, dictionary/tush-push.json, written 2026-10-12 by the analyst, episode 2, written in this run because the dictionary was empty. Plain words: a quarterback run with two or fewer yards to go, taken from under center rather than shotgun, on any down. The entry cannot see who pushed, whether anyone pushed, or how the line blocked. The search by name found no match: not one of the 260,927 descriptions from 2021 through 2026 contains "tush push".
Five seasons. This season. The gap between the two answers. Left off this page until the episode airs, with the explorer page that holds the tool's numbers for this definition and 53 others.
Ruling. Held back until the episode airs on October 26, 2026.
What these plays cannot tell you. Whether anyone pushed the runner, how the line was blocked, whether anyone was hurt, or what the rule should be.
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 --not-team PHI node ./query-plays.mjs --play tush-push --seasons 2026
A real ruling from a run on October 12, 2026, with an empty dictionary: 48 seconds, six tool calls, one of them refused, abridged to fit. The 2026 season then ran through the October 11 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
After the episode airs on October 26, 2026, the explorer page shows, with nothing installed, the tool's real output for 54 definitions of the play, across seven sets of seasons. Until then it is held back with the answer.
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/. Until October 26 that folder is empty, so the agent writes the first entry in your copy. After the episode, the entry written on air is in the repo, and the agent uses that one.
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."