"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 yourselfThe 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.
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.What already existed
None of this was made by the agent, and most of it was not made for the agent.
query-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.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.
analyst.md: how to ask, what to show, what not to sayquery-plays.mjs prints every filter, then the resultWhat one run looks like
- The claim goes in as one sentence, the way a fan would say it.
- 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.
- 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.
- It compares the two answers and says whether the difference is more than a few weeks of games can support.
- One ruling, under 350 words, ending with the commands it ran so anyone can rerun them.
- 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.
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.
What carries to your own agent
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."
query-plays.mjs: what it is written in and its six stages, with one real command followed through.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."