"Kickers are too good now."
Same five numbers. Two pictures.
Drawn to make a point refused
Drawn under the standard rule by rule
Every NFL field goal in six seasons went through the uprights 84 to 86 percent of the time, and a chart can make that climb a mountain or lie flat, depending on where it starts. The argument this episode is about the long ones, the kicks from 50 yards and beyond that seem to go in every week now, and a claim about a trend needs a picture. A picture is a set of choices: which seasons, where the axis begins, which line gets the bright color. So this episode the agent gets written rules for its charts, and it does not draw. It writes down the question and the command, and a renderer draws the rows the tool printed, the same way every week.
This page is how that is set up, for someone who has never built an agent. The eight rules are the chart standard, a file at the root of the repo that every later episode inherits, as episode 2's dictionary is. New to football? The game, explained has what you need. The room votes during this episode's Q&A on the claim episode 4 audits: the four candidates.
Read the eight rules, one per keypressThe setup in one minute
You hand the agent a claim. It turns the claim into a question and asks one small tool to measure. Since episode 2 the tool will not measure a play until the play is written down in the dictionary, and this episode the dictionary learns a second kind of entry: a kick, from one distance to another. The tool learns a third question, a trend: season by season, how often the defined kick was made, against every other field goal attempt, and how often it was tried per game. Then the new part. The agent writes a chart spec, one small file naming the question and the command, and runs the renderer, which draws the rows under the standard or refuses with the rule named. The ruling cites the entry and the chart.
On the registration page this episode's capability is called consistent visualizations: charts that look the same week to week, from rules written down once, so a reader of episode 5 recognizes episode 3's chart. The standard is quoted in full below. This is episode 3 of an eight-episode O'Reilly live series, and every number on this page is real. The long-kick numbers, and the chart the agent draws from them, arrive after the show on November 9, 2026.
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.
field-goal, has an empty comparison group, and the tool says so.--bands the tool splits the defined kicks by band, so one distance cannot hide behind the others.dictionary/ at the root of the repo, one JSON file per entry. Since this episode an entry is one of two kinds: a rush (episode 2's) or a kick, with a distance from and a distance to, 18 to 70 yards. field-goal, every distance, was committed before the show; the long kick's entry is written by the agent on air. The agent may add an entry, never change one.charts/STANDARD.md: eight rules for every chart the agent draws, about the window, the axes, the counts, the colors, the title, the source line, what may appear, and the template. Written once, enforced by the renderer, inherited by every later episode.charts/NAME.json, with a name, a date, the question as the title, the tool, and the command. Nothing about colors, axes, or labels, because those are the standard's.charts/render-chart.mjs. It reads a spec, runs the spec's command itself with --json, and draws the rows that come back as one SVG under the standard. It checks the window and the title, fixes everything else by its template, and refuses a spec that breaks a rule with the rule named. It cannot draw a number the tool did not print.analyst.md: a job description that says how to turn a claim into a question, how to use the dictionary and the charts, what to show, and what it may not say.What already existed
None of this was made by the agent. Two pieces are new since episode 2: the standard, and the renderer that enforces it.
query-plays.mjs, extended for this episode. It answers three kinds of question now: a search, episode 2's comparison, and the trend. It prints every filter in order and the entry it applied, quoted. It changes nothing.dictionary/ holds episode 2's tush-push, untouched, and field-goal, every attempt from 18 to 70 yards, committed before the show as the first kick entry. The entry for the long kick is written by the agent on air.charts/STANDARD.md, eight rules, version 1, dated October 26, 2026. Quoted in full below. A change is a new version, and every chart carries the version it was drawn under.charts/render-chart.mjs, about 200 lines. One spec in, one SVG out, or a refusal with the rule named. It runs the tool itself for the rows.The standard, in eight rules
As the agent reads it, appended to its policy before every run. Each rule says how it is held: the renderer checks it on every spec, the template fixes it so there is no way to break it, or it holds by how the renderer is built. The same rules, one per keypress, with the pictures.
The spec the renderer refused on air
Before the agent runs, a spec that breaks rule 1 is handed to the renderer by hand: the same question, with the trend starting in 2023. It is the chart crime of picking the window, and it is episode-3/bad-chart.json in the repo.
{
"name": "bad-chart",
"question": "Are kickers making more of their long field goals than they used to?",
"tool": "episode-3/query-plays.mjs",
"command": "--trend field-goal --seasons 2023-2026"
}
What came back, exit code 65, and no file written:
render-chart: REFUSED by rule 1: the command says --seasons 2023-2026; a trend starts at 2021, the first season on file, and ends at 2026, the current one: --seasons 2021-2026. The window is not a choice. Nothing was drawn. The rules are in charts/STANDARD.md, version 1 (October 26, 2026).
The agent gets the same sentence when it breaks a rule, fixes what the sentence names, and runs the renderer again. A refusal is a sentence, not a crash.
How it fits together
Two kinds of work, kept apart, as in episodes 1 and 2. Counting plays has one right answer, so a small tool does it the same way every time. Deciding what to count is judgment, and since episode 2 the definition lives in a file. What is new is that drawing is taken out of the agent's hands too: it chooses the question and the command, which are judgment, and a renderer makes every other choice the same way every week. The yellow cells are the parts written with care: the policy and the standard by hand, the entry and the spec by the agent.
analyst.md, ten sections, one of them new: "Your charts"charts/STANDARD.md, eight rules, appended to the policy before every rundictionary/long-field-goal.json, the entry it writes on air, beside the two already therecharts/NAME.json: the question, the tool, and the command, and nothing about how to draw itquery-plays.mjs prints the definition, every filter, then one row per seasoncharts/NAME.svg, under the standard: the window, the axes, the counts, the colors, the title, and the source line, none of them chosen by the agentWhat one run looks like
- The claim goes in as one sentence. The runner adds the dictionary, the standard, and the specs on file to the policy. Before the show the specs read "none."
- The agent splits the claim. Whether kickers are "too good" is a judgment about the game people want to watch; the plays cannot settle it. Whether they make more of their long kicks than they did, by enough that the kick is a different play, they can. It searches the descriptions: "field goal" is in thousands, "long field goal" in none.
- The tool refuses. The agent asks for the trend of
long-field-goal. With no entry of that name, the tool stops with exit code 65 and prints an example kick entry, with a note on each line. - It writes the entry,
dictionary/long-field-goal.json: a field goal attempt from 50 yards or more, compared with every other attempt, with what the rules cannot see in its last line: the wind, the surface, the hold, whether a timeout iced the kicker. - Two reads with that entry. The trend over every season on file, then the same trend by distance band, the read it chooses because one rate can hide a change at one distance.
- It writes the spec,
charts/NAME.json, with the question as its title and the trend command. Then it runs the renderer, which runs that command again and draws the rows, or refuses with the rule named. - One ruling, citing the entry and the chart. The runner checks both citations, checks that the new entry is one the tool can use and the new spec one the renderer accepts, and saves the ruling. The agent can write nothing else.
Monday, November 9, 2026, 8:00 a.m. Pacific. The agent runs on air with the dictionary as it stands, writes the long kick's entry and the chart spec, and rules. This box then holds the ruling as it gave it and the chart as the renderer drew it, both committed to the repo exactly as written. Until then the page carries no long-kick number, so the room sees the answer when the agent does.
The steps on the left are from the rehearsal runs of October 26, 2026, eight claims in parallel into scratch folders: the same path every time, about 30 seconds and seven tool calls. The yellow steps mark where the agent is using judgment; the rest is mechanical.
The policy, in ten sections
The policy is a Markdown file of about 1,700 words, written like a job description. It is episode 2's nine sections with one added, fourth, right after the dictionary: the charts. Three other sections changed, and the table says where.
--bands for the four distances. The printout is the truth about what was measured. Never open the data file, the dictionary folder, or the charts folder directly..json file in the dictionary folder, and writing a new .json file in the charts folder. No reading files, no writing anywhere else, no network.What carries to your own agent
--json, and draws what comes back. Rule 7, nothing the tool did not print, holds by construction, not by asking nicely.Try it yourself
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. The renderer needs only Node.
# get the kit git clone https://github.com/ismayc/monday-morning-agent.git cd monday-morning-agent/episode-3 # the trend of every field goal, by distance band: the entry committed before the show node ./query-plays.mjs --trend field-goal --seasons 2021-2026 --bands # a kick with no entry: the tool stops and prints an example kick entry node ./query-plays.mjs --trend no-such-kick --seasons 2021-2026 # a spec that starts the trend in 2023: the renderer names rule 1 and draws nothing node ../charts/render-chart.mjs ./bad-chart.json # the whole agent, into scratch folders so your copy of the real ones stays as it is ANALYST_DICT_DIR=$(mktemp -d) ANALYST_CHART_DIR=$(mktemp -d) ./run-analyst.sh "Kickers are too good now."
Leave out the two variables and the agent reads and writes the repo's own dictionary/ and charts/. After the show those folders hold the entry and the spec written on air, so the agent reads them and measures with them. In scratch folders it starts from the two entries on file and writes its own.
The rest of the series
This is episode 3 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 picture: from now on every chart the agent draws follows the standard. Episode 1, "You have to establish the run," showed the tool's filters. Episode 2, "Ban the tush push," gave the agent a dictionary it must cite. All eight arguments are on the series page. Next, on November 23, 2026: the pundit audit, with a second agent that checks the first, on the claim this room votes for.
Appendix: the season sheets
Two pages for after the show, to go over at any time, published once the agent has written its entry on air. Each asks the tool six situations with that entry, one row per season: every game, the regular season, the playoffs, the four distance bands, every field goal at any distance, and the five teams that tried the long kick most. Each carries the chart drawn by the renderer under the standard, and prints a verdict by a rule stated on the page. The first ends with the ruling the agent gave on air.