The Monday Morning Agent

"You have to establish the run."

So an AI agent went back and counted. Take every team in every NFL game for five seasons, work out what share of its plays were runs, and ask how often the teams that ran most won, against the teams that ran least. The answer depends on which plays you count.

Whole game

It looks like proof.

First half only

"Establish" means early, so count only the first half.

Second half only

The same teams, counting only the second half.

Close at halftime

Teams that are ahead run to use the clock, so a lead can make running look like the cause. Count only the first half, in games within 3 points at halftime.

Each bar is a scale of games won, from 0% at the left to 100% at the right, with a line every ten and a heavy line at 50%. Two markers sit on it. The blue marker is the win rate of the fourth of team-games that ran least. The yellow marker is the win rate of the fourth that ran most. The hatched stretch between the two markers is the gap. When yellow sits to the right of blue, the teams that ran most won more often; in the halftime bar it sits to the left, and the gap is negative. The two colors are the lines a TV broadcast paints on the field, the line of scrimmage and the line to gain. Seasons 2021 through 2025, 710 team-games in each group (188 in the halftime bar).

Same plays, same tool. Each filter changed the story. An agent that reported only the first bar would have been confident, well formatted, and wrong. So this agent is built to show every filter it applies, and this page is how it is set up, for someone who has never built one.

Change the filters yourself

The setup in one minute

You hand the agent a claim. It turns the claim into a question, asks one small tool to count plays under filters it chooses, and writes a short ruling: the answer from five complete seasons, the answer from this season, and how far apart they are. The tool prints every filter it applied, so you can check the agent's work.

The one thing written for this is a policy, a job description the agent follows. A run takes about fifteen seconds. This is episode 1 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 count, and the count uses a few words in a fixed way. Here they are, 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 rush or one pass by the team with the ball. Kickoffs, punts, field goals, penalties, and timeouts are not plays here, and neither are kneel-downs and spikes, which are clock plays rather than play calls. Five seasons hold about 176 thousand of them.
FilterA rule that drops plays, or whole games, before anything is counted: which seasons, which half, which quarter, the score at the snap, the score at halftime. The tool prints every filter in order with the number of plays left after it. Nothing is dropped that is not printed.
Team-gameOne team's side of one game. Every game gives two team-games, one per team, each with its own plays, its own rush share, and its own win or loss. Five seasons hold 1,424 games; four ended tied and are dropped, which leaves 2,840 team-games. "11 team-games per group" means 11 of these rows, so 5 wins out of 11 reads 45.5 percent and one more win would read 54.5.
Rush shareFor one team-game, runs divided by runs plus passes, counting only the plays the filters kept. A team that ran 30 times and passed 30 times has a rush share of 50 percent. Under "first half only" the share comes from first-half plays alone.
Ran most, ran leastAll the team-games sorted by rush share and cut into four equal groups. "Ran most" is the top fourth, "ran least" the bottom fourth. Over five seasons that is 710 team-games in each group: half or more of their plays were runs at the top, about a third or fewer at the bottom. The two groups are not the two sides of the same games: a team that ran most usually played a team from one of the middle groups, so each group's win rate is its own count and the top and bottom rates do not add to 100. What does add up is the whole table. Every game gives one win to one of its two team-games, so the four groups together win exactly half of theirs: over five seasons 77.7, 62.4, 40.7, and 19.2 percent.
Win rateWithin a group, the share of team-games in which the team went on to win the whole game. A group of 710 team-games with 552 wins has a win rate of 77.7 percent.
GapThe win rate of the teams that ran most minus the win rate of the teams that ran least, in percentage points. It is negative when the teams that ran least won more often, as in the halftime bar above.
Close at halftimeA game within a set number of points at halftime, 3 on this page, read from the score at the first play of the second half. This filter drops whole games, so a team that built a lead by halftime is out whatever it did to build it. It asks whether early running paid off after the break.
Score at the snapA filter that keeps only the plays run while the score was within a set number of points. It drops plays, not games, so it asks what teams did while the game was still close, including teams that went on to pull away. It is a row on the explorer.
Small sampleThe tool's warning when a group is small. This season a group may hold only 10 or 11 team-games, and then one game moves a win rate by 9 or 10 points, so a gap of that size is one game's worth.
PolicyThe one file written for this agent, analyst.md: a job description that says how to turn a claim into a question, what to count, what to show, and what it may not say.
RulingThe agent's answer: the claim as a question, 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 350 words.

What already existed

None of this was made by the agent, and most of it was not made for the agent.

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 18 columnsA small script keeps only the columns the question needs. The betting-line columns are not among them, so the agent cannot read one even by mistake. See the cut, column by column.
One read-only toolquery-plays.mjs counts under the filters it is given and prints every filter in order. It answers in a third of a second and changes nothing. It is 224 lines of JavaScript, and 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.

How it fits together

Two kinds of work, kept apart. Counting plays has one right answer, so a small tool does it the same way every time. Deciding what to count, and what the count does and does not show, is judgment, and it follows a written policy. The yellow cell is the only part that had to be written with care.

A claim"You have to establish the run."
The policyanalyst.md: how to ask, what to show, what not to say
The agentClaude Code, allowed to run exactly one script
It chooses the filters. Five calls for this claim.
The toolquery-plays.mjs prints every filter, then the result
It reads, and only reads.
The playsA quarter of a million plays, 18 columns, no betting lines. Read them row by row on their own page.
The filters and results go back up to the agent.
One rulingFive seasons, this season, the gap between them, and the exact commands it ran

What one run looks like

  1. The claim goes in as one sentence, the way a fan would say it.
  2. The agent restates it as a question. The claim has five meanings, and the plays can test two. "Establish" means early, so it counts the first half, and it holds the halftime score close so that a team already ahead cannot explain the running. Nobody told it that in the claim. The policy did.
  3. Five tool calls. For five seasons: the first half of games close at halftime, the first half of all games, and the second half. Then the first and last of those for this season. Each call's filters appear on screen as it lands.
  4. It compares the two answers and says whether the difference is more than a few weeks of games can support.
  5. One ruling, under 350 words, ending with the commands it ran so anyone can rerun them.
  6. The runner saves the ruling to a file. The agent itself cannot write anything.

The claim. In games within 3 points at halftime, do teams that ran on more of their first-half plays win more often than teams that ran on fewer?

Five seasons. First half, close at halftime: ran most 46.3%, ran least 55.3%, gap -9.0 points, 188 team-games per group. First half, all games: 53.0% against 46.1%, gap 6.9. Second half: 87.0% against 11.7%, gap 75.4. 710 per group.

This season. First half, close at halftime: 45.5% against 54.5%, gap -9.1, 11 team-games per group; one game moves a win rate by 9.1 points. Second half: 84.2% against 15.8%, gap 68.4, 38 per group.

Ruling. Does not hold. Over five seasons, in games close at halftime, the teams that ran most in the first half won less often than the teams that ran least, not more. The strong link between running and winning shows up only in the second half, where the score at that point can explain it.

What these plays cannot tell you. Whether running sets up play-action or wears down a defense, because this file has no data on either.

node ./query-plays.mjs --seasons 2021-2025 --half 1 --halftime-margin 3
node ./query-plays.mjs --seasons 2021-2025 --half 1
node ./query-plays.mjs --seasons 2021-2025 --half 2
node ./query-plays.mjs --seasons 2026 --half 1 --halftime-margin 3
node ./query-plays.mjs --seasons 2026 --half 2

A real ruling from the run on air on October 12, 2026: 16 seconds, five tool calls, abridged to fit. The 2026 season then ran through the October 11 games. The full one is in the repo. In steps 2 and 4, marked yellow, the agent is using judgment; the rest is mechanical.

The answer, on one page

After the episode, the two season sheets went up. Each asks the tool the same nine questions, shows every answer as a bar, and prints a verdict by a rule stated on the page.

Five seasons, 2021 to 2025Does not hold as stated. Running early goes with a small edge across all games, the edge turns to -9.0 points once the halftime score is held within 3, and the large late gap fits teams that are ahead running to use the clock.
This season, 2026Too few games to rule, through the October 11 games: 11 team-games per group in the halftime test, where one game moves a win rate by 9 points. The sheet ends with the ruling the agent gave on air.

The policy, in eight sections

The policy is a Markdown file of about 1,000 words, written like a job description. Its headings run in the order the agent has to work: who it is, how it looks, how it asks, what it shows, what it may not say, and last, what it may run.

Job descriptionNot a pundit, no opinions about teams. The person in the room who went back and counted.
Your one toolThe command and its filters. The filter list it prints is the truth about what was measured. Never open the data file directly.
Turn the claim into a questionSay what would have to be true, including when in the game, and which of the claim's meanings these plays can test. Then run the comparison that could prove it wrong: hold the halftime score close first.
Answer it twiceFive complete seasons, then this season, with the same filters. Repeat any small-sample warning.
Show every filterEach number comes with its filters. End with the exact commands. Never report a number the tool did not print.
What you may not sayNo predictions, no advice to bettors or fantasy players, no claim that running causes winning, and no betting lines.
The output contractOne ruling, under 350 words, in the same seven parts every time.
Tools you may useOne script. No writing, no network. If the tool fails, say so; never invent a number to cover it.

What carries to your own agent

Give the agent one door to the dataIt does not write queries. It picks filters for one fixed tool. So you check the filters it chose, not code it wrote.
Make the tool show its workEvery filter, in order, with the count left after each. A flag the agent forgot is a filter it did not apply, and the printout shows it.
Scope the data, not only the instructionsThe policy says never use betting lines. The file has none. The second one is the guarantee.
Ask for the comparison that could prove it wrongThe whole-game number agrees with the claim. The first-half number in games close at halftime tests it. The policy asks for the test.
Keep the allowlist exactOne script by name. Not "any Node command," which would allow arbitrary code. Asked to open the data file directly, the agent declined.
The numbers are fixed; the sentence is notAcross identical runs the numbers never changed, but the one-line ruling came back worded two different ways, one firmer than the other. Read the numbers.

Try it yourself

With nothing installed, the explorer page shows the tool's real output for every combination of its buttons.

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-1

# the tool on its own: whole game, then first half
node ./query-plays.mjs --seasons 2021-2025
node ./query-plays.mjs --seasons 2021-2025 --half 1

# the whole agent, with any claim about running the ball
./run-analyst.sh "You have to establish the run."
The repositoryThe kit for each episode, the data, and the examples from a real run.
How the tool worksA diagram of query-plays.mjs: what it is written in and its six stages, with one real command followed through.
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 meanings of the claimWhat "establish the run" means to five different coaches, what each meaning would take to test, and the one the agent rules on. One card per keypress.
The policy fileAll eight sections, as the agent reads them.
One real run, file by fileA tool read, the policy, and a ruling on a claim the tool cannot answer, and from the episode on October 12, 2026: the run as it looked on screen, its ruling, and a bet the agent declined.
The live seriesEight episodes on O'Reilly, every other Monday.

The rest of the series

This is episode 1 of eight. Each episode settles one argument and takes away one piece of human oversight, replacing it with something written down. All eight arguments are on the series page. Next, on October 26, 2026: "Ban the tush push."