Twenty-nine interactive activities, one classroom server, and a small editing desk that hands all of it to the person who teaches it. One file each. No build step. No accounts.
A student should never have to learn a new interface to learn a new idea.
Week 1 of MATH 170 puts twenty rows of numbers in front of a student — four columns, no column names — and asks them to write a rule that says healthy or not healthy. It is a good hour. What it is not is an hour that survives being handed off to five different websites, each with its own buttons, its own colours, and its own idea of what a slider looks like.
So the brief was one visual language for the whole semester: black text, white paper, one spot colour, the way a two-colour textbook is printed. Every activity a single HTML file that opens from a double-click. And every one of them owned, afterwards, by the professor rather than by us.
This doesn't replace the paper. Each page runs after the worksheet, as the reveal or the discussion engine.
Built in one pass from the professor's own Fall 2025 worksheets.
The first build read the course materials and produced thirty-two activities covering weeks 1 through 14 — sorting learning types, drawing a decision line, stepping k-means, reading a truth table, walking one honest forward pass of word2vec — plus one thing that could not be a static file: a coordinate plane on the projector where every student in the room is a randomly named cursor, moving in real time.
The data came out of the worksheets verbatim wherever the worksheets had data. Where they only had a picture — a scatter, a bitmap, a graph — the numbers were reconstructed, flagged on the page, and pinned in the source so they can be swapped and re-verified.
This doesn't mean it was right. It means it was checkable, which is the part that mattered next.
The professor opened every activity and wrote down what was wrong with it.
Not a rating. A verdict per page — keep, edit, rework, replace, split, remove — with the specific sentence to change, the specific bug to fix, and the reason. The clause selector on the sandwich page could not toggle back to zero at its minimum threshold. The k-NN page mentioned the worksheet when it should have just let you drag. Seven pages were removed outright, because a whiteboard and a conversation did the job better.
One line reorganised a whole page. On the truth tables, students had been clicking buttons that revealed answers; the note said they should type T or F themselves and be corrected: “It should be earned not given.” That is a pedagogy decision no amount of engineering produces on its own.
This doesn't happen without a reviewer who opens all thirty-two.
The fixes were the easy half. The other half was making us unnecessary.
Round two implemented all of it: the edits, the reworks, the removals, the Markov page split in two, the norm page replaced with something that doesn't hand out the worksheet's answers. Two new games against the computer joined week 9 — the Shannon switching game and Cliquer — both with the opponent's engine mirrored in Python and swept exhaustively before shipping.
Then the part that changes who owns the course. The Studio is a small web app the professor runs on their own laptop: click any sentence on any activity and rewrite it, edit the numbers behind it in a spreadsheet-like grid, generate or import a fresh dataset, make a second exercise from any template, choose what students see and when — and publish a folder of plain HTML. In the coordinator's words, it is “turning it around and giving the keys to the front line.”
This doesn't call anything over the network, and it doesn't touch the original files: your edits live beside them as small JSON files you can delete.
Counted from the repository on 27 July 2026, not rounded up.
Twenty-nine activities live in the gallery, each a single self-contained file with its own teaching spec, its own worksheet attachment, and a keyboard route through everything you can do with a mouse. Seven more sit in the archive in case the professor wants them back. The classroom server has three modes now; the last one clusters the whole class by their movie ratings, in all eight dimensions, with no scatterplot anywhere — because the point of that lesson is that you can cluster what you cannot plot.
Serial phases, each with exit criteria someone checked before the next one started.
A Fable 5 orchestrator held the plan, the contracts and the verification; seven Opus 5 phase agents did the building, one at a time, each finishing to a written exit criterion — linter clean, tests green, every item in the professor's document accounted for — before the next was allowed to start. One design agent ran in parallel at the beginning and produced the colour system: seven hues, every contrast ratio computed rather than eyeballed.
The two people are the reason it points anywhere. The professor drove the pedagogy: what to teach, what to cut, what students should have to earn. The coordinator drove the architecture: static files, a Python back end, one spot colour, and the Studio itself, which was their idea before it was anyone's code.
This doesn't scale by adding agents. The serial order is what made each phase's output checkable.
Measured per agent by the harness. Where a number does not exist, we say so.
Round two ran in a single session on 27 July 2026. Every figure below is the harness's own reading for that agent's run — tokens consumed, tool calls made, wall-clock elapsed. The design phase and the first build phase overlapped; the rest ran one after another.
| Phase | Agent model | Tokens | Tool uses | Wall time |
|---|---|---|---|---|
| D — design system, palettes, gallery specs | Opus 5 | 120,247 | 31 | 13m 40s |
| P1 — professor pass A + removals + gallery | Opus 5 | 277,046 | 76 | 23m 05s |
| P2 — professor pass B + markov split | Opus 5 | 411,222 | 144 | 39m 37s |
| P3 — Shannon/Cliquer games + movies mode | Opus 5 | 291,804 | 80 | 33m 24s |
| P4 — contract retrofit + lint v2 | Opus 5 | 208,402 | 128 | 26m 34s |
| P5 — Studio core CMS | Opus 5 | 124,143 | 64 | 15m 15s |
| P6 — Studio data tools | Opus 5 | 260,237 | 126 | 29m 04s |
| P7 — this page and its siblings | Opus 5 | 187,984 | 75 | 20m 10s |
| Orchestrator — planning, contracts, phase gating, verification | Fable 5 | not measurable from inside the session — see the note below | ||
| All eight phase agents | Opus 5 subagents | 1,881,085 | 724 | ~3h 21m |
Bar length is the token count; the shade is the same number, stepped. The numbers are printed because the bars are not the evidence.
Three honest gaps. The orchestrator's own consumption cannot be read from inside its own session, so it is not in the table; its share went to planning documents, contracts, gating and verification runs, and the coordinator can read the exact figure from their plan's usage meter. Round one's per-agent telemetry was not retained, so it has no row here at all — only a shape: a thirty-two page build, one server app, two interruptions when the session ran out of room. And there is no cost column, because this work ran on a subscription rather than metered billing, and a dollar figure we cannot defend would be worse than none.
Written down in full, with effort estimates, in NEXT.md.
Everything here is a file. Nothing needs permission to look at it.
The gallery — twenty-nine activities, sorted by topic.
What kinds of pages this makes — for a colleague with five minutes and a
projector.
None of this has been in front of a class yet. The mathematics has been checked twice, by hand and in Python; the structure has been checked by a linter that reads every file; the games have been solved exhaustively so the computer opponent cannot blunder. What has not happened is thirty students at once, on their own devices, in a room with imperfect wifi and eleven minutes left. That is the only test that counts, and it is the professor's to run.
Built for MATH 170 · Math of AI, from the Fall 2025 worksheets.