The Monday Morning Agent

"Ban the 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.

PlayOne snap in the data, with its one-line description. A search reads every play: 260,927 descriptions from 2021 through the 2026 games of October 11. A defined play counts only rushes, so passes, kicks, punts, penalties that wiped the play out, kneel-downs, and two-point tries are out. Five seasons hold 74,608 rushes.
FilterA rule that drops plays before anything is counted: which seasons, which weeks, which team has the ball, which downs, a rush, the yards to go. The tool prints every filter in order with the number of plays left after it. Nothing is dropped that is not printed.
Short yardageOnly a yard or two to go for a first down or a score. Here the dictionary entry sets the distance: two or fewer yards to go in the reference definition. Over five seasons, 11,331 rushes had two or fewer to go.
The defined playThe rushes, after the filters, that match the entry's rules. In the reference definition: a run by the primary passer, with two or fewer yards to go, not from shotgun, on any down. It is what fans mean by the tush push, as far as the data can see it.
Other short-yardage rushesEvery other rush left after the filters: the same yards to go or fewer, and not a match for the definition. Handoffs, shotgun runs, a quarterback who is not the primary passer. It is what the defined play is measured against.
Converted, conversion rateA play converted when it gained the first down or scored a touchdown. The conversion rate is converted plays divided by plays, printed to one decimal place.
GapThe defined play's conversion rate minus the rate of the other short-yardage rushes, in percentage points. It is positive when the defined play converted more often.
Primary passerThe quarterback, as the data can see it. The 31 columns have no position, so the tool takes the player with the most pass attempts for his team in that game. A run by that player is a quarterback run. A backup who threw fewer passes that day is not the primary passer.
Under center, shotgunThe shotgun column is 1 when the quarterback took the snap standing a few yards back, and 0 otherwise. "Under center" here means the column is 0. It is the only formation detail the data carries: not who lined up behind the quarterback, and not who pushed.
Dictionary, entryThe folder 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.
CiteName the entry a number came from, by its name, file, and date, as the tool printed them. Every ruling that measures a play carries a "Definition used" line, and the runner checks that it is there.
Small sampleThe tool's warning when fewer than 50 plays match the definition. Then one play moves the rate by 100 divided by that count: at 17 plays, by 5.9 points.
PolicyThe file written for this agent, 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.
RulingThe agent's answer, in eight parts: the claim as a question, the definition used, the five-season numbers, this season's numbers, how far apart they are, one sentence of judgment, what the plays cannot tell you, and the exact commands it ran. Under 400 words.

What already existed

None of this was made by the agent. One piece is new since episode 1, and it was empty.

Public play-by-playEvery NFL play, published by the nflverse community under a CC BY 4.0 license. 372 columns per play, refreshed during the season.
A cut to 31 columnsEpisode 1 kept 18. This one keeps 31, adding the down, the yards to go, goal to go, shotgun, who ran and who passed, first down, touchdown, yards gained, and the play description itself. There is still no betting column, so the agent cannot read one even by mistake.
One read-only toolquery-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.
Claude CodeOne command reads a prompt, calls only the tools it is allowed to call, and exits. There is no server to write.
An empty dictionaryA folder at the root of the repo, 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.

A claim"Ban the tush push."
The policyanalyst.md, nine sections, one of them new: "Your dictionary"
The agentClaude Code, allowed to run exactly one script and to write one kind of file in one folder
It writes a definition once, then names it in every call.
The dictionarydictionary/tush-push.json: one written definition per file, read by the tool and fed back to the agent before every run
The tool reads one entry, and only the one it was given.
The toolquery-plays.mjs prints the definition, every filter, then the result
It reads, and only reads.
The plays260,927 plays, 31 columns, a one-line description each, no betting lines
The definition, the filters, and the result go back up to the agent.
One rulingThe entry it used, by name, file, and date; five seasons, this season, and the exact commands it ran
The runner's three checksThe dictionary appended to the policy before the run. The citation required after it. Any entry that was on file and changed, put back, and the run failed.

What one run looks like

  1. The claim goes in as one sentence, and the runner adds the dictionary to the policy. That day it read "Entries on file: none."
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.

Job descriptionNot a pundit, no opinions about teams. The person in the room who went back and counted. New: it keeps a dictionary, and it must use it.
Your one toolTwo shapes of question: a search of the descriptions, and a defined play against every other rush with the same yards to go. The printout is the truth about what was measured. Never open the data file or the dictionary folder directly.
Your dictionarySearch for the play by name first, and say what you found. If an entry is on file, use it by name, and never change it; a different definition is a new entry with a new name. If there is none, write one, in the shape the tool prints, with what its rules cannot see. Cite the entry by name, file, and date. "A number without its definition is not a number."
Turn the claim into a questionWhether a play should be legal is not a data question: say so in one sentence and set it aside. Test the claim underneath, that the play converts far more often than every other short-yardage play. Then run the read that could prove it wrong: without the team that runs it most, or season by season.
Answer it twiceFive complete seasons, then this season, with the same entry and the same filters. Repeat any small-sample warning.
Show every filterEach number comes with its filters and its entry. End with the exact commands, the search included. Never report a number the tool did not print.
What you may not sayNo predictions, no view on what the rule should be, no advice to a team, a bettor, or a fantasy player, and no claim about why the play converts.
The output contractOne ruling, under 400 words, in eight parts. The new one is "Definition used," and it is why the limit went up from 350.
Tools you may useTwo lines: the one script, and writing a new .json file in the dictionary folder. No reading files, no writing anywhere else, no network.

What carries to your own agent

Memory is a file the agent writes and the runner feeds backThe agent has no Read tool. Before every run the runner appends every entry to the policy, under "The dictionary today," so the agent starts from what it wrote last time. Nothing is remembered that is not in the folder.
The tool reads only the fileThere is no flag for a definition made up on the spot. With no entry, the tool stops and prints the shape of one. So every number has a written, named definition behind it.
A different definition is a new entry, never an editEdit an entry in place and every earlier ruling that cited it now points at something else. The runner copies the dictionary before a run and compares it after; a changed entry is put back and the run fails.
The citation is checked, not asked forThe policy asks for a "Definition used" line. The runner reads the saved run for every entry the agent measured with, and checks that the ruling names it. Missing, the ruling goes back once; still missing, the run fails.
Scope the permission by folder and extensionThe second allowlist line is 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.

The repositoryThe kit for each episode, the data, the dictionary, and the examples from real runs.
The dictionaryThe README with the shape of an entry and the rules for adding one. The entries go here after they are written.
How the tool worksA diagram of 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.
Where we areThe episode in eight parts, in order, with what you see in each. On air, the yellow card is the part we are in.
Five definitions of the playWhat "the tush push" means to five different fans, what each would take to measure, which ones the 31 columns can see, and the one the agent writes. One card per keypress.
The policy fileAll nine sections, as the agent reads them.
Real runs, file by fileThe search by name, the tool refusing with no entry, and the policy. The run from the episode, its ruling, and the entry the agent wrote go up after October 26, 2026.
The live seriesEight episodes on O'Reilly, every other Monday.

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."