From a goal-line dive on a canvas to a college football coaching game at simcfb.com
Written on 10 October 2026, the day SimCFB went public. This story covers the whole project: the step-function simulator Nick started in July, ten weeks of neural-network experiments, the switch back to hand-written football logic, the 3D players, and the career game that shipped.
Opening
The project's codename was "foosball" (Nick's word for football). It produced SimCFB: a free, single-player college football coaching and career game that runs in a web browser. You pick one of 68 Power Four schools and run it for as many seasons as you like: recruiting, the transfer portal, NIL money, staff, practice and the weekly game plan. Every game is played by a real play-by-play football simulation, and you can watch any snap in 3D.
The roots go back to November 2025, when Nick wrote a small text-based college football simulator in Python. The real work started on the evening of Tuesday 28 July 2026 and ended with the public release on Saturday 10 October 2026. That is 75 calendar days. 59 of them have commits: 693 in total.
The arc is simple to tell and was hard to live. It began as a hand-written, deterministic simulation of one goal-line run. Within two weeks that grew into a full football game with a career mode. Then Nick tried to make the players learn to play instead of following written rules. That meant real NFL tracking data first, then neural networks trained on a GPU, then a long series of small "drill labs" trained with reinforcement learning on rented cloud GPUs. The neural work produced real insights and some genuinely lifelike running. It never produced a full team that looked like football and that Nick could trust. On 30 September Nick asked: "am I wayyyyyyyyyyy over engineering this?" Within a day, a new hand-written simulator (the "better oracle") had replaced training. It used everything the neural work had taught about leverage, commitment and reading the field. A 3D presentation was built around it. After a short detour into a phone arcade game, Nick decided on 5 October to build a coaching and management game on top of the finished simulation. SimCFB went live on Amazon Web Services on 7 October, was hardened by swarms of AI playtesters, and went public on 10 October.
Almost all the code was written by AI coding agents: mainly Anthropic's Claude Code, and OpenAI's Codex (which Nick called "Astra"), with Grok and Kilo used briefly. Nick was the designer, tester, judge and project manager. Nick watched the film, wrote the bug lists, set the rules and decided what to keep and what to throw away.
The project at a glance
| # | Era | Dates | What it was | How it ended |
|---|---|---|---|---|
| 0 | Pre-history | Nov 2025 to Jul 2026 | A Python text sim (cfb); the "foosball" name in December |
Ideas carried over: 0-100 ratings per skill, "simulate one play from ratings" |
| 1 | The step-function game | 28 Jul to 12 Aug | Goal-line dive simulator in TypeScript, grown into a full game: passing, kicking, formations, many coverage labs, a Play Maker | Grew into Era 2 without a break |
| 2 | Career mode and parallel agents | 12 to 16 Aug | Real college rosters, recruiting, progression, momentum; the code split into four "owned domains" so several AI agents could work at once | Overtaken by the physics push |
| 3 | Learned physics from NFL data | 16 to 21 Aug | Big Data Bowl tracking data, five learned contact models, a "NEW PHYSICS MODEL" | Rolled back on 21 Aug; "physics is deterministic" became a standing rule |
| 4 | GPU simulator and neural players | 22 Aug to 15 Sep | A CUDA copy of the engine; imitation learning, CEM, ES; versions 3.x and 4.x; passing and coverage models; guided labs v5 and v6 | Nick's retrospective on 15 Sep: "a spaceship with the tools to make a bicycle" |
| 4b | The coverage-lab oracle | 9 to 12 Sep | A hand-written zone-coverage algorithm, versions 1.0 to 1.8 | Survived everything; became the zone logic of the final game |
| 5 | Drill labs and reinforcement learning | 15 to 30 Sep | Tiny deterministic worlds (3v2, 3v3, 5v5, then 11v11); PPO and CEM; rented GPUs on RunPod and Google Cloud; run lab, zone lab, read lab | Training paused on 30 Sep; never resumed |
| 5v | The visual track ("design astra") | 24 to 30 Sep | Sprites, then Unity, then 1990s-style poses, then a Three.js 3D viewer | The 3D viewer became the game's film room |
| 6 | Back to step functions: the better oracle | 30 Sep to 5 Oct | A hand-written JavaScript simulator with neural-like decisions; 46 plays against 40 defences; sweeps of tens of thousands of plays | "The simulation is finished", 5 Oct 14:16 |
| 6b | The 3D athlete build | 30 Sep to 4 Oct | A Blender-built pro athlete, broadcast look, angular motion, wraps, takedowns, piles | Shipped as SimCFB's 3D film |
| 7 | Game layers | 3 to 5 Oct | Game Day (full games), Coach Mode (you call the plays), a phone arcade game | Arcade idea dropped on 4 to 5 Oct in favour of a coaching game |
| 8 | SimCFB | 5 to 10 Oct | A React career game on the finished sim; NIL, portal, playoff; live at simcfb.com on 7 Oct; AI tester swarms | Public release, 10 Oct |
Pre-history (November 2025 to July 2026)
The cfb text simulator (11 to 14 November 2025)
The first football code sits in a folder called python\cfb, with files dated 11 to 14 November 2025. It is a Python text simulator of a college football game. Players and teams are simple records with 0-100 ratings (QB accuracy, RB power, WR route running, pass rush, coverage and so on). Plays, drives and whole games are settled with dice weighted by those ratings. A small web page, "College Football Text Sim", shows the result. A second script, oneplay.py, simulates one pass play from a spreadsheet of position ratings: route running, catching, pass accuracy, spatial awareness, pass block, run block, break block, tackling, coverage, play recognition, run power, elusiveness, kicking. A third, grid.py, models how far a pass misses its target, with the miss growing with distance and shrinking with accuracy.
Nothing from this code was reused. Its ideas were: one 0-100 rating per skill, "ratings are the difficulty", and "simulate one play from the ratings". Most of the rating names in the July game come from this list.
The name, December 2025
A file called foosball3.txt (22 December 2025) in an unrelated folder is a short list of real NFL players with a rating, a position and a contract figure. It shows that "foosball" was already the project's name in December 2025.
gridiron and gridiron2 (side projects, 13 and 18 to 20 August 2026)
Two untracked folders inside the workspace hold side projects that come up later in this history:
gridiron(created the morning of 13 August): "a standalone Exact Situation football play simulator", a separate copy of the app with only the one-play view. It was used to tune the feel of one snap. On 14 August its tackling and blocking "snap feel" was ported back into the main simulation.gridiron2(18 to 20 August): "a standalone physics extract and isolated-collision tuner". It held a physics model called V2, about 1,246 classified collisions from NFL tracking data, a 700 KB dump of motion code and a Python tuner. The learned contact models V2N to V5 were tried here (see Week 4). On 20 August Nick ruled that these models would never be used: "WE WILL NOT USE these models". From then on the notes callgridiron2"reference only. Never build on it."
The goal-line dive spec and the rule that governed everything
The repository was created at 19:40 on Tuesday 28 July 2026. Its first file was a README that just said "# foosball". The first real commit came 22 minutes later, and it was built from a written specification, SPEC.md, titled "Goal-Line Dive Simulator - Build Spec". The spec described ONE football play: the offence at the 3-yard line hands the ball off up the middle against a goal-line defence. The 22 players are circles on a canvas, and each one should behave like a football player. A text recap describes what happened.
The spec set hard rules:
- React, Vite and strict TypeScript, with the simulation kept separate from the screen;
- a deterministic, seeded simulation, so the same seed always gives the same play;
- no physics library;
- player decisions made by hand-written scoring rules: each option gets a score and the best one wins;
- "No LLM or ML model anywhere in the simulation loop".
It also laid out a build order of 23 milestones ("do not skip steps"). Milestone 1 was the field and 22 circles, milestone 4 ("the hard milestone") was block engagement and the gap model, and milestone 23 was the kicking game.
Above everything, in capitals, sat the rule that the project would keep coming back to:
"TEACH THE PLAYERS HOW TO PLAY. DO NOT CHASE METRICS."
The spec explained it. If smart defenders hold the offence to a 5% completion rate, that is a success, because "ratings are the difficulty dial, and they are the only difficulty dial". Correct behaviour is cheap to weaken; stupid behaviour is expensive to teach. Never choose between two versions by their average numbers: watch the film. Nearly every later brief, to every AI tool, quotes this rule. The project's biggest swings, into neural training and back out of it, were both attempts to honour it.
A note on words used throughout this history:
- Step function. The code that moves the simulation forward one small tick (here 1/60 of a second at first, later 1/10). "Step-function players" means players driven by hand-written rules inside that loop, as opposed to a trained network.
- Oracle. A hand-written algorithm that "knows" what a player should do. Early on, the oracle was the teacher the neural nets copied. Later "oracle" meant the hand-written simulator itself.
- Seed. The number that fixes all the dice in a play. Same seed, same play: this is what made replays, tests and "run it 1,000 times" possible.
The chronology
Weeks run from Tuesday 28 July, the first day, in seven-day blocks. The last block is five days long. Times are US Eastern. A note in brackets says which tool did the work where the sources say so: "Claude" means Claude Code, "Codex" means OpenAI Codex (called "Astra" by Nick from 9 September).
Week 1 · 28 Jul – 3 Aug
One goal-line run becomes a football game. Claude Code builds the first milestones in an evening. Codex then takes over and grows the simulator, at a furious pace, into passing, formations, full games and kicking. Nick tests every build by watching replays and writes numbered bug lists.
Era begins: the step-function TypeScript game.
Tue 28 Jul. At 19:40 the repository is created. Between 20:02 and about 21:43, Milestones 1 to 6 land on a branch called milestone-1-field-render, each with a long design-note commit message (Claude, "Claude Opus 5"; commit 523adcd is Milestone 1).
- Milestone 1 draws the field and 22 circles from a formation file.
- Milestone 2 adds a fixed-timestep loop and steering, plus a determinism test: the same seed must give the same frame hash.
- Milestone 3 adds the decision system. Each player makes slow decisions on his own timer from a slightly stale view of the world, and fast steering carries them out. This "decide slowly, move quickly" split stays in the design to the end.
- Milestone 4 adds block engagement and the A/B/C/D gap model.
- Milestones 5 and 6 add the tackle contest, the ball carrier reading gaps, and a batch harness that runs many seeds.
The branch was merged into main at 22:20.
Wed 29 Jul. At 07:30, Milestone 7 adds a recap generator that reads only the event log, plus a debug overlay. In the evening (Claude) come a playbook of 3 runs against 3 fronts and a "many plays" mode. That mode runs 25 to 1,000 seeds with yardage histograms, and any row loads that exact play into the viewer. The touchdown target was rebalanced from 50-60% to 35-45%, defenders got real attributes, and defenders now pile on a wrapped runner. Commit 65a3fe1 adds the passing game and "the run/pass conflict": every defensive assignment carries two jobs (against the run, against the pass), and a defender keeps doing the job he expects until he diagnoses the truth.
At 20:45 Nick opens the first Codex session with a pasted status report: "Half of it works; half doesn't ... The pass side is broken ... the pocket never breaks." Codex overhauls the pass rush and rewrites man coverage. The corner's distance to his man at the throw drops from 2.13 to 0.81 yards. Nick asks for "ALL STATS to every player ... The numbers actually mean something" and gets 16 ratings per player. The last two commits of the day are titled "added lots of stuff": the start of two weeks of terse commit messages.
Thu 30 Jul. Nick to Codex: "add to SPEC.md all the stuff you added for the passing plays. going to hand it off to claude code for a little bit". From day two, SPEC.md is how two AI tools share one project. That evening (Codex):
- block shedding gets a "defender access-corridor" rule: a block only matters if the defender has no clear angle to the runner;
- tackles get an angle map: from behind is strongest, from 90 degrees weakest;
- four defensive fronts (3-4, 4-3, Nickel, Dime) each get Man, Cover 2, Cover 3, Cover 4 and Blitz calls;
- four new offensive formations arrive, with "a madden style play selection";
- man coverage is calibrated to target open rates (press about 32%, off about 48%);
- and the first full game: kickoffs, punts, field goals, specialist ratings, a "rattle" stat for nerves, four 15-minute quarters, fumbles and interceptions with returns, 53-man teams (commit
a1faa7f,src/game).
Fri 31 Jul. Nick plays a game and returns a play-by-play: "WAYYY too many touchdowns. The defense in general is just awful ... Where on earth is the secondary lining up?" Codex fixes alignment at the root. Pursuit is recomputed every 200-380 ms depending on awareness. Every play can be replayed from its seed, and play diagrams appear on the call screen. A test from the 50 shows an absurd 80.5% completion rate, which leads to a coverage overhaul at the catch point and a new WR vs CB lab (12 routes, 4 man techniques, 6 zones, batches of 100 to 1,000). The ball no longer homes in on the receiver; accuracy places it. Then: "I want you to come up with a way to simulate entire games." The result is coordinator game plans (50% pass on 1st-and-10, 93% pass on 3rd-and-long, 4th-down choices) and a "Vs computer" mode.
Sat 1 Aug. Beta-test notes ("notes 8-1"): the QB throws the ball away for no reason, the back picks the wrong lane, a CB blitz is "really stupid", games are too long. Three roster tiers arrive (mediocre, SEC starter, elite). Nick defines the Formation Matrix, 1,000 random plays per pairing: "In no universe would a dime defense work better against a goal line run". Many results come out reversed, and Nick reads each test: "Redo them so they are not stupid. Look at every single one and ask 'does this make sense'." Nick asks for the first time whether the tests could run on the GPU ("Don't change anything just let me know if its possible"). The answer is only with a rewrite. Five full games per tier pairing give Elite 89, Mediocre 0.6: "I dont think an elite cfb team would beat a mediocre one 100-0." Late at night, after four angry messages about scrolling, the play-call screen becomes Madden-style: four plays a page. At 23:53, "added real play and kicking" (8e32e25).
Sun 2 Aug. Nick pastes a 16,000-character brief: a player-mechanics overhaul, not metric tuning, covering QB pocket/scramble/run modes, the scramble drill and linebacker and safety choices. "Passing has become completely broken" (58% of completions went 20+ yards). Codex finds six root causes, and Nick says: "I approve all changes." At 22:31: "completely nuke [CONDENSED_BEHAVIOR.md] and remake it". CONDENSED_BEHAVIOR.md is a generated, plain-language dump of every behaviour rule, written for other AIs to read. It was regenerated again and again as a handover ritual (02d2c2a).
Mon 3 Aug. A new brief sets the design principle for all later behaviour work: "Players should normally choose the best football action they can perceive. Ratings should limit recognition, timing, technique, accuracy ... not randomly make players choose obviously stupid actions." Linebackers, backs, tight ends, QB and special teams are reworked. The WR vs CB lab is made to use exactly the production code, with tests to prove it (Codex).
Week 2 · 4 – 10 Aug
Coverage becomes the obsession. Nick builds lab after lab to measure it (Play Lab, SMART LAB, Zone Logic B) and then a Play Maker that makes plays a single source of truth. Codex does nearly all of this; Claude Code works in the same folder at times, and the two occasionally undo each other's work.
Tue 4 Aug. "build a whole new lab. This one will run ALL OFFENSIVE plays against all defensive plays": the Play Lab, 50 offensive plays against 40 defensive calls at 100 reps each, on parallel workers, with CSV export and a "godlike defenses" ceiling for tests. From 15:33 Nick's prompts become long specs that open "Read the latest SPEC.md first ... Check git status and preserve unrelated work". Zone defenders keep ownership of a receiver until a safe handoff, zone calls become coordinated "shells" with named roles, and a Levels-vs-Cover-3 failure is traced (Codex; eight commits with short imperative titles).
Wed 5 Aug. Four "massive coverage changes" commits. Linebackers finally follow their zones. "claude code made some changes then reverted them. Please bring them back": both tools were editing the same tree. A revert at 21:41 accidentally removes an unrelated route-awareness feature and blanks the app. It is restored at 22:05, with the lesson written into the commit: the earlier commit had included "whole dirty files rather than a scoped diff" (593c42d, 09d6912). Nick starts asking for evaluation-only answers ("Do not modify code").
Thu 6 Aug. SPECNEW.md is born (3,176 lines of design notes). The 28 July spec is renamed SPECOLD_Obsolete.md, and SPECNEW becomes the authoritative spec. Codex runs a temporary A/B/C/D zone-handoff experiment. It finds that the front compiler capped non-blitz rushers at four, which had left a Nickel defensive end covering the third receiver.
Fri 7 Aug. SMART LAB: pass plays against every defence with no QB, line or pass rush, measuring receiver separation at 0.5 to 2 seconds. Nick reasons it through with Codex ("why would it do all 22 players?"). Ten reps per pairing turn out to be enough, at 30 seconds against 239.
Sat 8 Aug. At 07:33 a decision to rebuild zone coverage: "The current zone system has become overcomplicated and is built around the wrong abstraction ... essentially man coverage with extremely complicated handoff rules." Zone Logic B (zoneRules.ts) is built on pre-snap relationships and route-specific rules. It is the first time a whole subsystem is replaced instead of patched. Receivers' after-catch running is reworked twice ("now they are just running STRAIGHT UP"). The evening is spent on "DO NOT CHANGE CODE: trace tick by tick" sessions. One finds a Bear 46 Cover 2 shell-compilation bug. Commit dbcd219 adds 14,000 lines (Codex).
Sun 9 Aug. A 14,500-character spec for the Play Maker ("THE PLAY MAKER IS THE AUTHORITATIVE PLAY DATABASE"). The first build was cosmetic ("Are we actually reading the plays?"; "He just stands there"). It was rebuilt so the editor uses the same renderer as the game and drawn blitz paths override old assignments. In the afternoon Codex builds an image-to-play importer that sends play diagrams to the Anthropic API. At 16:47 Nick drops it: "I think it's too expensive to do this with anthropic AI. I'll just do it with regular chat." It is replaced by a copy-paste prompt, IMPORT_PROMPT.md, that any chat can use. The commit 0599552 adds a 66,000-line playbook file.
Mon 10 Aug. No recorded work.
Week 3 · 11 – 17 Aug
The biggest growth spurt. Hundreds of imported plays, a "perfect coverage" engine, real college rosters, and then, on 13 August, a career mode with recruiting and progression. On 14 August the code is split into four domains and four AI agents work in parallel for the first time. A calibration lab and an Opus "repair day" follow. 74 commits this week.
Tue 11 Aug. "added tons of plays": a bulk import of college football play diagrams from the CFB.FAN playbook (08bb7d2, about 148,000 lines). Later notes record 300 plays and 10 formations loading at startup. The idea behind it: a FORMATION is where 11 slots line up, and a PLAY is what the slots do after the snap. The zone matrix gets every coverage.
Wed 12 Aug. 21 commits (Codex). In the morning, a bounded autonomous "Zone Matrix repair loop" runs on its own branch. Nick wants it back in main at once and warns about Claude's uncommitted UI work there. Receivers were "running backward" after finishing routes: the cause was an end point behind the receiver in 47 routes across 30 plays ("scan all plays for these bugs"). Nick's coverage rule: "If NOBODY is covering a guy screw the zone and go cover that guy." When Codex changes only the lab: "you always have to fix both man!" 66007fb and df377bf add a shared perfect coverage engine and make it the default. In the evening Nick drops in a Big Ten roster file (18 teams, 1,890 players with scouting notes and recruiting stars) and asks for a roster explorer. The SEC follows in a commit titled "going to sleep" (34c1678). This is the start of the real-roster line that feeds the career mode. Nick's notes from around this date compare a "grok build" with the "regular build", which shows Grok was being tried on the simulation too.
Era change: career mode and parallel agents.
Thu 13 Aug. At 06:28 the folder gridiron is created, a standalone one-play copy of the app. Then six Codex sessions build a game around the simulation:
- College Game (10:47): 68 programmes, a real US map, box scores;
- Career (12:42, from a 55,000-character brief): coach and management, a recruiting map and player dossiers;
- the regular season (14:38): the in-game play-call screen was redesigned three times and was still "totally busted". Nick: "You failed last attempt. Im just going to have another LLM give it a try";
- weekly practice, fatigue, substitutions and a deterministic quick sim, a fast way to settle a game without simulating every snap in full ("Please I beg you. Actually fix what Im asking you to fix.");
- the stats archive, development and visible "+1 rating" badges.
The ACC and Big 12 rosters arrive in commit 86e50f7 "adding game". The career design in SPECNEW: 68 programs (67 Power Four plus Notre Dame), 105-player rosters, one budget paying the head coach and coordinators and player NIL, "Clout", and a head coach's recruiting "magnetism". This August career code is the direct ancestor of SimCFB's career eight weeks later.
Fri 14 Aug. Momentum (one value from -100 to +100) arrives at 06:28, with an anti-snowball fix at 08:25. At 09:25, fb5404e "Move source into four owned domains" moves 283 files into src/simulation, src/cpu, src/career and src/ui. A test now walks every import and fails if one domain reaches into another, and ARCHITECTURE.md is "written for agents as much as for people". Its rule: "The CPU proposes; career disposes." At 10:33 four branches and worktrees (separate checkouts of the same repo) are cut for four agents. Codex's integration brief names them: "agent/simulation - Grok simulation work, agent/ui - Claude UI work, agent/career - Codex Career work". A Kilo Code agent-manager file created the same morning suggests Kilo was used to launch them (a guess). The simulation agent ports the Gridiron "snap feel" (phased tackling, block contests, cut plants, jams at the line). The UI agent adds a post-game report and a recruiting map, and the career agent adds progression. From 13:09 to 15:55 Codex, "now the integration engineer", merges everything (540f427). It is the project's first multi-agent workflow. In the evening come bye-week and postseason fixes.
Sat 15 Aug. Long, careful commit messages return (Claude Opus 5, 12 of 19 commits): a repair day. The trench contest turned out not to be symmetric: the defence won every rep by a third of the threshold. The run game, the clock and fatigue are fixed using seeded-game measurements, and two tuning changes are retracted because they rested on a sample of four. Recruiting becomes a race, with commitment thresholds, CPU schools and class rankings. On the Codex side: "We have identified a structural zone-coverage problem, not a statistical tuning problem." A Play Forensics command-line tool and a calibration lab replace the Formation Matrix (ac1f94c). They exist "to let Codex/Claude/Grok evaluate football behavior from compact structured data instead of repeatedly running the game and visually inspecting plays". An audit of the "Football Constitution" follows. Nick at 19:52: "the coverage improvements have been MASSIVE." The last commit is titled "coverage starting to look like coverage finally".
Sun 16 Aug. One mega-commit at 23:07 (5a9532f, 75 files) lands a day of work. Contact becomes impulse and footing, "the end of the binary tackle". Carrier vision becomes a path rollout. And GAPWAR.md appears: one symptom, the back who would not run outside ("it's like he has this allergy towards cutting outside"), had nine causes in four layers. The biggest was that the open-field read only switched on 4 yards past the line, so on goal-line snaps it never ran. The lesson: always check the snap you are actually watching.
Era change: learned physics from NFL tracking data.
Mon 17 Aug. "improved physics", then "starting to use real data" (c5af0ae). The NFL Big Data Bowl 2024 tracking data (weeks 1-9, 1.4 million rows a week) is copied in at 18:32. It goes into a SQLite database behind a new Tracking Lab and Divergence Lab, which compare the simulation's motion with real NFL motion. A quick Codex fix the same afternoon: a recruiting validator had wiped out a whole career over one bad value ("Is it really necessary to nuke an entire career over a stup[id check]").
Week 4 · 18 – 24 Aug
The attempt to learn physics from real NFL data, and its failure. A learned contact model makes the line move like "synchronized swimming", and the hand-written physics is restored on 21 August. Then a copy of the whole simulator is rewritten for the GPU, and on the evening of 24 August the project turns to neural players. Mostly Codex; only 7 commits this week, because most of the work happened in untracked folders.
Tue 18 Aug. At 14:44, collision detection and replay from the tracking data (fb549ce). At 16:14, 82c2781 "NEW PHYSICS MODEL": a new contact system with bodies and a multi-pass contact solver. At 18:39 the untracked gridiron2 folder is created to tune contact in isolation.
Wed 19 Aug. No commits. Work goes into gridiron2. At 20:25 Nick gives Codex a "spaghetti" summary of the learned-motion family:
- V2: the mature hand-written physics;
- V3: stripped physics plus a small neural net, where learning contact mostly failed;
- V4: next-frame prediction from one second of history plus an inferred "intent". This was circular: the intent came from the future NFL motion;
- V5: no traditional physics at all. All 22 players' last second goes in, and the next half-second comes out through spatial attention.
They were trained on Big Data Bowl tracking from 2019 to 2024 (about 18,000 clips). The conclusion at the time was that data can teach "nudges", not replace physics. Codex builds V2N: V2 plus a small learned correction for each contact. Nick's complaint: blockers and linemen look stuck together. A contact audit against real NFL clips shows V2 contact was already sticky, and V2N amplified it.
Thu 20 Aug. No commits. Nick rules on the gridiron2 models: "WE WILL NOT USE these models". Their write-ups can be read as prior art, but nothing gets imported. At 20:11 a new Codex session starts over: "We are rebuilding the physics model from scratch". The plan was simple deterministic movement plus a neural CONTACT residual (a small correction added on top) trained on 305,552 NFL collision episodes (Python 3.12, NumPy and PyArrow, on Nick's RTX 4070). Throughput went from 35.7 to 580.9 episodes a second once the data was packed for the GPU. Nick insisted on running the long training personally.
Fri 21 Aug. The live results are bad. In Nick's words: "new physics has no concept of blocking ... the dline just bum rushes right past", "synchronized swimming", "a giant pile up the middle ... 14 players", "after 2 seconds they just fly all over the place". At 14:14: "i think we'll run one final epoch before i just completely nuke this nfl physics idea". At 16:03: "as usual the blocks dont work right off the bat. is it even worth fixing at this point?" The neural contact model comes out of the interface. Then a worse discovery at 17:09: the production physics itself had become "JUST GARBAGE". The regression traced back to the 18 August "NEW PHYSICS MODEL". Nick runs the current build and a pre-V2 recovery copy side by side, on ports 5173 and 5174: "yes yes yes 5174 is a milion times better. Revert the physics completely from it."
Era ends: the learned-physics line is rolled back.
At 17:30 everything is preserved on a branch, archive/neural-contact-experiment (924aada, 64 files). At 17:31 the physics commit is reverted (3588c39). At 20:28, "Restore deterministic contact physics and add tuning lab" (ab10bba) adds physics.md and three optional contact settings (Glance, Grapple, Fall, each OFF to HIGH). Run-block engagements become independent, with each block's edge re-drawn every 280-520 ms, which ends the "coordinated scrums". The calibration-lab branch is merged with a true merge commit (da901ba, 20:39), and the code is pushed to GitHub for the first time in a while ("we haven't done so in forever"). From here on, a standing rule: the physics is simple and deterministic. On 11 September Nick repeated it to a Claude chat that had mixed things up: "we completely blew up the big data bowl stuff cause it ended up being useless. Please dont mix things up."
Sat 22 Aug. A full code review file (112 source files) is written to study how the CPU and a GPU version would differ. It finds a "livelock" in which a pile never ended, and a receiver "broke eight tackles" and scored after 25 seconds. A GPU feasibility test (experiments/gpu-batch) ports the whole simulation to tensors (large arrays processed in parallel). It is exact, but 1.54 times slower than a 16-core CPU. That leads to gpu-native: a rewrite of the engine in CUDA (NVIDIA's language for GPU programs). The pieces of GPU code that run in parallel are called "kernels". Matching the TypeScript engine exactly took care. For example, JavaScript's Math.hypot is not the same as sqrt(x*x+y*y) to the last bit, and drift over many ticks had to be judged against how much the CPU itself drifts when nudged. At 22:59 the chat becomes an autonomous loop with the goal "Continue the GPU-native football simulation migration autonomously ... until an explicit stop condition". It runs until 10:15 the next morning, using 6.5 million tokens over about 11 hours (Codex).
Sun 23 Aug. A handoff for another agent: "Use GPT-5.6 Sol Medium efficiently. We have a limited remaining usage budget." By 14:57: coverage targeting, route perception and decisions are "GPU-owned and exact" (132,000 player-ticks with a maximum error of about 1e-14 yards). The migration is not fully closed (Codex).
Era change: the GPU simulator and neural players.
Mon 24 Aug. At 18:11 the GPU simulator lands in git as one 148,980-line commit (8490544, branch gpu-native-lean-engine). At 18:45 Nick opens a Codex session: "We are starting a NEW phase of the football project: neural player policies." The simulator is declared "FROZEN FOR TRAINING". The first experiment is imitation learning (also called behavioural cloning): show a neural network millions of situations and the decisions the hand-written "teacher" made in them, and train it to make the same choice. It ran on one goal-line run matchup. Accuracy plateaued near 87%. The cause was the teacher itself: it picked from a weighted random "ballot" that the network could not see. With the teacher forced to always take its top choice, the copy reached 98.06%. A narrow "GPU policy ABI" (a fixed interface for the network to read the game state and send decisions) was authorised at 21:26. This was a direct reversal of the 28 July rule "No LLM or ML model anywhere in the simulation loop".
Week 5 · 25 – 31 Aug
The neural players come to life inside the GPU, and the first big lesson arrives: a bug in the simulator can look exactly like a failure to learn. Codex and Claude Code take turns, handing over through written handoff files when one runs out of tokens. 42 commits.
Tue 25 Aug. Codex moves on to a passing matchup, two zone defences, then five passing plays against Cover 2 and Cover 3 with ONE shared network and no play or defence label ("Yes. One shared policy adapts"). A token outage mid-day: "please make sure nothing got corrupted due to token outage." At 14:32 Codex writes GPU_TRAINING.md "for handing the project to a fresh Claude Code chat". That evening Claude (six commits, all with Claude trailers) adds experiments/neural-policy. It is a cloning setup over the frozen GPU simulator: "Context + Assignment + Previous Token -> Next Token; no RL, no reward, no play or defense ID". It uses a DeepSets network, a kind that treats the other players as an unordered set. Also added: a "film room" that runs whole plays under neural control next to the authored simulation, and Imitate V1.0, one shared policy over 20 validated matchups. A 4-hour data collection died when OneDrive and Windows Defender locked a file during a rename, so file writes now retry.
Wed 26 Aug. In eight hours the live neural snap goes from 10.4 seconds to 2.4 (Claude, 11 commits):
- the network's forward pass is rewritten in CUDA;
- its 596-number view of the field is built on the GPU;
- the whole policy runs inside one kernel launch (
55316e0); - one kernel is compiled for every matchup, so a new play no longer takes minutes to compile (
f194fa6).
Imitate V2 begins. At 15:25 a branch called grok-time is cut; it carries the work for the next two weeks. The origin of the name is unknown.
Thu 27 Aug. V2 is trained from per-matchup shards, which avoids a 33 GB in-memory merge, and served live. An alternating training loop starts: improve one player at a time by search, anchored to the frozen V2 so it cannot drift too far. The first attempt made the running back stop taking the handoff on all 32 seeds.
Fri 28 Aug. No commits. Codex: "We've tried the current RB<->MLB fan-out training approach and it has not produced useful learned behavior". It is replaced by CEM search. The cross-entropy method is a simple way to search: try many random variations of a plan or of the network's weights, keep the best few, centre the next batch on them, and repeat. Codex used it here in a trajectory-planning form (MPPI). By 13:58 the running back "jukes, searches for space, and reacts dynamically", but "Defenders often look like toddlers playing tag". At 17:38 comes the first small lab: one running back against two defenders in the open field. Three versions of DAgger, a method where the student plays and a teacher labels the situations the student actually gets into, all stopped 0% of held-out runs. That lab had a roster-slot bug (the left corner sat in the slot meant for the weak-side linebacker). At 20:51: "Im running out of tokens ... how I can instruct Opus to continue". Claude takes the next session.
Sat 29 Aug. The tackle bug (Claude, 16 commits). A lone defender could not finish an open-field tackle: 0 tackles in 24 plays, with the runner wrapped for 289 of 360 ticks. Every path to the whistle needed two free tacklers or a stall in forward progress that never came. The fix made a solo tackle end the play after 0.9 seconds of control, and 20 of 24 plays then ended (bf63d94). It affected every snap in the project, and the "transfer problem" the team had been chasing turned out to be this bug. The defence was then trained alone against a frozen ball carrier (cb9a61e), because alternating had made every result impossible to attribute. Late in the afternoon came something worse: the GPU tackle code never assigned the order in which tacklers wrapped, so the first contact was permanent. The 124,793-row training corpus contained zero touchdowns in 9,216 plays. After the fix there were 688 (57b7fe1). The notes say: "Everything before this is a measurement of a different game." Codex, in a short read-only session, found six passing paths that worked on the CPU but did nothing on the GPU. Tools were built so this could not recur: a verifier that refuses mis-set runs, a check for "dead cues" (written behaviour that never executes), and the rule "audit before re-imitation, never after". Imitate V3 was trained from scratch (3.5 million decisions, about 6.9 hours).
Sun 30 Aug. The viewer can load V3. A half-shed blocker gets partial tackle credit. And f9b3c05 measures the hand-written teacher through the same program as the clone. That revealed that an earlier "five times better" defence was only better against its own co-trained running back. At 15:36 Codex starts "rabid dog" defenders from V3: a crude pursuit reward that makes defenders converge on the ball. Nick: "The rabid dogs still 'float away' from the play from time to time. But they converge much better. It is a far more football like behavior. lets double down." At 21:39 the first mention of renting cloud GPUs ("runpods or EC2").
Mon 31 Aug. No commits. Nick sets the version naming: "The 3 is the very first base ... 3.2.1 is the dagger". So 3 is the plain imitation, 3.2 the rabid-dog CEM, 3.2.1 DAgger on top, and so on to 3.2.4. DAgger "degraded" the defence. After one bad example was promoted as good: "How do you figure this passed as a good example???"
Week 6 · 1 – 7 Sep
Versions 3.2.6 to 3.5.x. The run defence finally looks like football. The training was mostly fine, and a single aiming defect had been ruining it. Then the long, painful attempt to teach a neural quarterback to throw. Claude Code's surviving transcripts begin on the night of 6 September. Only 7 commits: most work landed in big catch-up commits.
Tue 1 Sep. The original V3 corpus is found (36 shards, 9,216 teacher plays, 3.5 million rows). Version 3.2.6, "adversarial yards-only", is the breakthrough. Every proxy reward was dropped: the defence is scored on the carrier's lost yards, the back on his gained yards, and the two take turns for eight sessions. On the results table it looked "worse on every column". On film, the defence blocked, fit gaps and "looks like football for the first time in six siblings". The table had graded each defence against its own co-trained back, a harder opponent. With the carrier held fixed, 3.2.6 allowed 0.418 yards against 3.2's 1.286. This became a written rule: never compare co-trained checkpoints on the standard table; pin the carrier.
Wed 2 Sep. No commits. ES (evolution strategies) is tried. It is like CEM but over the network's weights: perturb all the weights at once many times, score the whole team, and move the weights toward the better perturbations. Version 3.2.6.5 climbed from -5.7 to +4.4 over 107 generations, but the offence found a "stall" exploit (run backwards and let the clock die). 3.2.6.8 settled the format: ONE shared network, sides taking turns on a schedule, a 15-second cap on plays, and skill randomised every play. The randomised skill "bought the second defender": piles grew by 131%. The 3.3.x series follows: 3.3.1's "three plays" were really two, 3.3.4 pinned awareness at 99 and regressed, and 3.3.5 added a force player (the defender who keeps the runner inside) and was the first defence that resolves. The tool for this stretch is not recorded (no Codex sessions on 2 and 3 September; Claude's transcripts from before 6 September are not available).
Thu 3 Sep. No commits. 3.3.6 moves the play to the offence's own 25 (75 yards to go), and the offence runs away with it.
Fri 4 Sep. At 16:23 one commit lands 3.3.1 to 3.3.10 (5ef38a5, 79 files): "One commit because the runs interleave across these files and splitting them now would be reconstruction, not history." The finding: four runs had changed the world (a touchdown cliff, a pile curve, drag, a drop guard) to make defenders converge. The real cause was that defenders were aiming a median 8.4 yards away from the ball carrier, against 2.5 for the teacher. One condition in the GPU decision code (keepAuthoredAim) cut yards allowed from 9.49 to 1.86 without any training. 3.3.11 becomes the run reference: 576 combinations, 1.92 yards allowed, nearly every play tackled. At 19:08 Nick opens a long Codex chat that runs to 8 September: "do not make any file changes please as Claude code is working in another window. I want you to evaluate the current code". At 19:37 comes a reflection on why the project went neural: "I struggled mightily with zone defense and getting the running backs to naturally want to go to the side. The latter got fixed by neural networks. Because with step functions the players didn't have enough understanding of the field". At 21:01, on 3.3.11: "It looks amazing. So much better than the trash I was dealing with before. I think the training was always fine. It was those aiming defects that caused all sorts of poor behavior." At 21:43 passing begins: 3.4.0, "teach the QB to throw", with the 3.3.11 defence frozen. At 23:15: "He really really sucks at throwing lol."
Sat 5 Sep. No commits. 3.4.1 to 3.4.10 (Codex). Placement exploration, then a "coach" that searches for good throws and teaches them: "he still cant throw worth a shit". On interceptions: "I dont want to nerf the defenses ability to catch those" (a pet peeve: Madden defenders dropping easy interceptions). A reward bug made receivers run backwards after the catch, because yards were counted from 75 to go. Nick: "Just need to retrain it with logical incentives." A publication gate refuses a model that is more explosive but not safer, and 3.4.9 is stopped because its playback checks failed.
Sun 6 Sep. 3.4.11 switches to Levels against Dime Cover 2, after it turned out that outside receivers never got open against Smash in Cover 2. The QB finds a "cheat code" throw. Nick relays Claude Opus's analysis ("OPus said: ... the oracle truncates the QB's candidate list to five ... no legal wait"). Codex fixes a ball-tracking asymmetry (67 ms against 183 ms) and a safety who "over runs the spot where the ball is arriving". Versions 3.4.16 to 3.4.18 add -40/+40 turnover rewards. At 23:13 a backup commit (2d92a89). At 22:24 the first surviving Claude Code transcript (VS Code extension): "how do you teach the QB where and when to throw". The QB "seems to get stuck on 1-2 different receivers", and Nick's instinct is a simulator defect, "much like we eventually after many iterations of testing found the defense tracking bugs". Nick puts "Opus 5 on max" for a deep dive with no code changes.
Mon 7 Sep. The day the neural QB was shown to be partly hand-written (Claude, with Codex in parallel). Nick shows two screenshots: "I think RB is by far the easiest throw to make ... RB is wide open", yet "the QB always chooses WR3". Then: "Why does he always throw to WR3? Why never to RB? ... you way over complicate things when the solution is actually pretty simple." The answer:
- WR3 was the play's authored primary target, and the clone copies the teacher;
- the back was suppressed by an old
downfieldWeight: 0.9term written to stop dump-offs; - a simple formula in elapsed time explained 83-85% of the receiver choice: "a clock, not a read".
3.5.3 forces throws to each receiver in turn. Then: "nuke it completely. fuck it. no progression." (3.5.4.) At 15:57: "We're making massive progress." At 16:40, when told the defenders had been "never trained": "so what the hell were we training when we did the oracle transfer?" Codex rebutted with four citations and Claude retracted. Nick: "those .md docs exist for intra agent communication." Codex's 3.5.5 frees the defence and the QB, with "Woeful regressions all around". To Codex at 17:04, Nick explains why the neural work exists: the old oracle "was pretty good at producing football like behavior 90-95% of the time". In the evening Claude traces a deeper flaw. One constant, a 20-yard aim reach that was also used to scale the inputs, served 22 roles whose natural scales differed 2,700-fold. Nick at 20:50: "it honestly sounds like Version 4 is going to have to happen. Cause version 3 is full of holes we may not be able to unlearn." At 21:14: "What idiot level of thinking lead to this architecture in the first place? Why on earth would you cap everything at 20 yards." Codex, 22:48: zones were "Always intended as responsibilities, should have never been strict walls". At 23:45 version 4.0.0 adds a separate coverage head (a second output section of the network). A measurement the same week: "The secondary IS trainable; the defensive line is not": every pass rusher had exactly one option, because the choice system was built for the run game.
Week 7 · 8 – 14 Sep
The most commits of any week (159). Learned coverage fails again and again. On 9 September Nick has Claude build a hand-written coverage algorithm, the coverage lab. It quickly beats every network and becomes the zone "oracle" for the rest of the project. Two "guided" neural labs follow (v5 for the run game, v6 for passing). On 14 September Nick concludes that pass coverage will not be neural.
Tue 8 Sep. Codex, from 00:33: version 4.1.0 gives the QB his own head, trained against the coverage head. In 4.1.1 the QB threw 50 yards the wrong way from the snap ("This was really silly and should have been caught"). A penalty for straying from the teacher was teaching the defender to retreat: "how is that even possible. The head should be deciding". Nick: "this should probably be a single player single position model ... I'm toying with the idea of completely redoing it all from scratch anyway." At 13:08: "this training has been SO POOR for the last 5-6 rounds." At 15:08: "god damnit. now the QB is just running forward without passing." In the Claude chat, Nick proposes "one for each assignment": not thousands of models, but one per job (a right slant, a specific zone) reused across plays. Nick also asks for a much richer view: every player's recent positions, speeds, assignment and past decisions. At 17:48 the decision: "we're just going to do cover 3, with the 3 models we decided on. Against 3 different offensive plays: Levels, Four Verticals, Double slants." At 17:59: "build all of it. no need to ask me step by step unless a decision needs to be made." Claude builds four Cover 3 models with history and attention (e2f1f0b). Zone coverage has no "right answer" label to copy, so it is trained against a computed coverage cost instead. The models beat six random starting points, the first defensive learning to clear its own noise floor. A commit sweeps in Codex's 4.0.0-4.1.7 work by accident, and Nick accepts it: "Lets make it real now." Run inside the simulator, the models cover worse than the oracle (4.2.1), and three silent defects turn up. Rolling the whole shell out together beats the oracle on Double Slants. In the evening: "it goes to total shit when the ball is released ... but VERY GOOD considering what an early model it is." Nick's idea to "forgive the known weak points of each zone" ("A good QB will rip apart a zone if he has time") becomes the experimental 4.2.4. The first build penalised the holes instead of forgiving them.
Wed 9 Sep. Claude, early morning. A viewer naming mix-up ("Model says 4.2.2, secondary drop down says 4.2.3 ... This is stupid"). At 07:11: "Fundamentally football is not scored on how far you are away from the receiver. Its scored on yards and eventually touchdowns." Priced in yards per play, the authored oracle gives up 21.9 and the learned versions 29.3 to 52.6, so every version was worse than the oracle. At 10:21 Nick sets the goal that would govern the rest of the project:
"This is a video game. I want the user to feel like selecting cover 2 versus cover 3 actually makes a difference. That the little billiard ball looking players behave SOMEWHAT like a real person ... defenders who KNOW what they are supposed to be doing and we dumb them down with ratings ... Cover 3 needs to look like Cover 3."
At 10:55: "THE FUNDAMENTAL PROBLEM IS THEY ARE NOT LEARNING HOW TO COVER ... we're largely where we were 5 trainings ago." Then the point Nick had pressed from the start: "We needed a separate model for EACH ASSIGNMENT." A check proved it. The pre-snap alignments for Cover 2, 3 and 4 were byte-identical, so a model could not tell which coverage it was playing. All seven defenders had been getting the same cost signal. At 12:12: "I'm a CB assigned to Deep. How are you grading me precisely?"
Meanwhile, in Codex through the ChatGPT app at 13:15: "This is for a college football coach simulator. it by no means needs to be perfect. but it needs to be believable." The Codex weekly limit stood at 99% used. Codex, now called "Astra", runs 4.4.1 to 4.4.3: assignment models, an adversarial critic, then ONE outside deep-zone corner. A helper agent called "Luna" wrote that code from an agent_instruction.md and Astra reviewed it. Nick had Codex use the computer directly: "open the only browser window and press play. observe the result." At 22:38: "that was an absolute disaster ... Im having claude code build an oracle that decides which man the guy should guard. Then the neural net will just decide HOW to guard the person."
Era change: the coverage-lab oracle.
At 22:33 a new Claude session. Nick pastes a long spec for a standalone "coverage geometry lab": a hand-written zone algorithm that uses only what a defender could see (positions, speeds, recent history, ratings, alignment), with its own viewer. Nothing trains, and it lives in a new folder only. In its finished form, every 0.6 seconds each defender:
- builds a picture of the threats from the receivers' paths;
- works out how long each defender would take to contest each receiver, using real movement;
- solves "who owns whom" across all assignments at once, so carries and handoffs between zones emerge on their own;
- picks one of 49 paths and plays it through the physics.
Thu 10 Sep. 21 commits. Nick's first review at 06:00: "nice first attempt but clearly some serious flaws". The men underneath "just sit there", and a safety "decided to give up on life". Nick asks for research into what real zone defenders do. At 09:12: "the oracle seems fine up to 2.5 seconds then completely stops functioning." Next round, from a brief that came from another AI: alignment is computed from the offensive formation (it now separates the shells), coverage is graded in expected yards conceded, pre-snap motion is handled, and every pass play in the playbook is read in. At 11:45: "We don't start training neural on it until we have it right." The lab is committed at 10:32 (e852de1). Codex takes it from midday ("commit and push the changes claude made"), adds all offensive and defensive plays and runs an overnight audit of 22,320 matchups (a power cut at 21:30, resumed). Versions 1.1 to 1.4 land as large data commits.
Fri 11 Sep. Codex finishes the audit, which flagged 2,807 moments, before running out ("need you to finish up im almost out of credits"). The long Claude session that will run to 24 September starts at 12:10. Separating real bugs from legitimate zone weak spots shows only 20 of 12,400 realistic matchups (0.16%) with a receiver truly unclaimed and open. At 13:59: "Remember perfection is an uttainable goal ... the OVERALL goal is to make the game presentable and feel like real football." Versions 1.6 and 1.7 follow. At 17:33: "Let's just ship it. It's not perfect but it will never be. It's pretty good." Claude builds an open-field lab next. At 19:54: "why on earth are we using 1.4?? we were on 1.7??". The answer was a stale baseline. Version 1.8 (1,906 films, 126 tests) fixes a "blocker help" bug: a defender freed from blocking duty had picked the unclaimed receiver 0 times in 315. At 21:34 Nick suspects the celebrated 3.3.11 was partly hand-written "oracle cheats". The data agrees: on held-out plays the authored oracle allowed 0.818 yards to 3.3.11's 1.677, and aimed far better. At 22:00 the decision: "run offense neural decisions but guided vs run defense neural decisions but guided. use our old and proven inside zone vs dime cover 3." At 23:53: "build them. Go ahead and run the first training. Commit and push everything."
Sat 12 Sep. 31 commits. At 00:04 coverage lab 1.8 ships, and from now on it is the zone oracle (0f26c81). The same minute, neural-lab v5 starts (865debd): "The oracle decides what to do and where to go; a small network emits two numbers that bend the result". Before any training the network outputs nothing, so the player behaves exactly like the oracle; this is called a residual or "guided" setup. Nick rejects the first viewer twice ("horrible and i mean HORRIBLE interface"; "why the fuck is it flipped like this") and notices the oracle itself juking: it dithered between two lanes every 14 ticks. At 08:07, a key correction: "neither A or B were the correct answer". The net should output an offset in yards that moves the spot the oracle steers at: 80-90% of the time up the middle, but free to break for a big hole. Runs 001 to 006 learn constants, such as "always shade 5 yards toward the sideline". One fixture cannot teach leverage, and the net even used the distance to the sideline to detect mirrored plays. A shared-weight leak made the defence bunch left. Nick's critique at 13:17 becomes a rebuild list: separate nets per position group; varied, position-appropriate skills ("sometimes the RB is ... barry sanders"); five runs against five defences; stop grading against the oracle; and an o-line that knows where it is pushing ("the oline knows which way it wants to push and the dline doesn't"). An engine fix lets a won block actually move the defender out of the hole (e1251b1). At 17:19 a standing rule is born: "you murdered my memory doing that. computer was running super slow. dont forget we're still training so dont run a second heavy python process." At 19:32: "alright i want it all trained. QB throw, qb roll/scramble, pass coverage and catching. For now we'll keep oline vs dline oracled". Claude writes a 20,000-character brief for Codex Astra: neural-lab v6, the guided passing game ("build, prove, do not train"), with seven position-group networks deviating from the coverage-lab oracle (2e44076). At 21:58: "if just a small combo of plays takes what 4 hours to train. Whats a whole slew of plays going to take a whole week? thats no good." Past midnight, to Codex: "I want to wake up and be ready to train all of them. No more stopping half way."
Sun 13 Sep. The busiest day: 65 commits, all Codex. Overnight (00:51 to 09:26) Astra builds v6 from the brief: tested building blocks, QB controls, a throw catalogue, GPU stages and an installed engine passing eleven acceptance checks. At 09:26: "Save full V6 acceptance and user-requested clean stop." At 09:35: "lets do one demonstration - Levels vs Dime Cover 2. I want all models working in unison". At 10:49 a 15-hour test run had been launched by mistake: "If I didn't stop you you would have wasted the entire day". The coverage oracle had been an expensive CPU search inside the movement loop, so it was moved to the GPU while Codex's weekly allowance fell to 13% and then 2%. At 18:25: "I'm setting Astra to Ultra. The goal is very important to state. We want a 'Realistic looking simulation'. It doesn't have to be super accurate. It just has to look like real football." Then ONE left receiver against ONE left corner, which beat the 66% target with 42.9% completions on fresh seeds. A route-tree run was stopped at 23:55 after the deep routes regressed. No Claude transcripts survive for this day.
Mon 14 Sep. Codex extends the corner work to the whole route tree with an oracle-guided underneath corner and safety: better overall, worse deep. On reaction times: "Real football players react much faster than that." At 06:23 Nick explains the original point of the neural work: the run offence and defence "never understood the concept of leverage ... the runner never kicked it out towards the sideline like they do in real game". Codex writes the v6 handoff (a8b2877). In Claude, from 10:00: "before i throw in the towel I want one last experiment. Lets go back to 1 vs 1." At 12:28: "get rid of the stupid leash entirely. This is a constant problem with these neural trainings ... of course he'll never jump a route if we never let him." The leash was real. A cap in the GPU code halved any move until the corner's position one second later was within 2 yards of the oracle's. So every corner experiment had measured a player who could stray from the oracle by at most 2 yards a second. A "privileged coach" that knew the receiver's real route, copied by a small network, did beat the oracle (6.9 against 12.0 yards per throw), but more data did not help a corner who could not see the route. At 13:07: "so..... oracle it is then right? I can see this being yet another rabbit hole ... Probably a bridge too far."
At 13:16 the scope shrinks:
"ok so we finally concluded that passing coverage is not something we will use a neural net to do. The only thing that will be neurally learned is the runner vs run defense relationship."
That also covered catches in space, kick returns and turnovers. The afternoon goes on making training faster (68 seconds per generation down to 14-18), rebalancing the run game ("oline doesnt get enough push consistently, tackling is too sure"), and closing gaps between the GPU and CPU engines: the GPU named the QB as ball carrier for 0.43 seconds after every handoff, and 19.5% of sacks were bogus. On 4.3 yards a carry and 23% stuffed: "These are perfect". The memory note from this day: tune close to real football, then train. The goal is written down as "A college football sim where players behave somewhat like real players. Aesthetics is the key - they only have to fool the eye." At 22:16: "why the hell is RB not his own model???? We're giving way too much power to the oracle." The running back gets his own network and his own read (c3729be), with at most a tiny lean toward the called hole.
Week 8 · 15 – 21 Sep
The turning week of the neural era. On 15 September Nick stops fighting the 11-on-11 GPU engine and builds a tiny deterministic "drill lab" to find out whether the learning itself is the hard part. The lab produces the project's real training methods: leagues, per-player CEM, reward "circles", the reader network. Then it scales back up to 11 on 11 and moves to rented GPUs. Claude Code does the main work, with Codex Astra running parallel copies. Only 23 commits; most work landed later.
Tue 15 Sep. Nick's busiest day in the Claude transcripts (89 messages). It opens at 05:58: "i went to bed asking you to make him bounce to the outside ... THEY NEVER DO THAT. In real football it happens a lot. This is the reason neural networks were introduced in the first place." On film: "that may be the worst runner ive ever seen." At 10:21, on learning the defence was only a correction on top of the oracle: "are you telling me they don't control their movements either? oh boy". With full control, at 11:59: "calculating angles will not work. That was the problem with the oracle to begin with ... What we get by giving them full authority is missilies that constantly miss." At 13:16 a deep fix (8169fea "Addressed rolls"): every random roll had come from one shared stream, so any change re-rolled the whole play. Moving one defender for 0.1 seconds changed the yards by a median of 7.1. Each roll is now keyed to the play, tick and player. At 13:25: "Seems to me like AI may just not be this good at coding something this complex". At 13:31: "my intuition initially was 22 separate models on every play ... I almost wonder if I had the right intuition all along and got misguided." A new standing rule: preflight checks before any training, covering standing still, leash audit, one-player credit and determinism, after three runs were lost to silently invalid setups. A running-back run found a sideline exploit in 25 generations (median 1.7 to 19.2 yards). The rule from that: a too-good jump means stop and watch the film. The last v5 commit (14:01) shows that a hole that opens is worth about 5 yards to a back who takes it. The environment could teach; the back just did not go.
Era change: the drill labs.
Around 14:00 the pivot:
"2 defenders and 3 attackers. one has the ball the other 2 are blocking ... very simple physics ... NO RNG WHATSOEVER ... train 5 separate models ... My gut says that SIM faults are only part of the problem. That fundamentally what we're teaching is much harder to teach."
The drill lab is touch football in a box: a runner and two blockers against two defenders, no dice, running about 300,000 plays a second on the 4070. The training is reinforcement learning: no teacher, just a score for each outcome, and the network adjusts toward what scored well. Two methods are compared.
- PPO (proximal policy optimisation) is the standard method. After each batch of plays it nudges the network toward actions that did better than expected, limiting how far one update can move it.
- CEM tries many random variations of the network's weights and keeps the best.
By night the findings are clear:
- self-play against one rival cycles forever: each side learns to beat the other's latest version and forgets the older ones;
- a league (training against a pool of past opponents) fixes it;
- CEM beats PPO for new behaviour: one CEM round found 10+ yards where 25-68 PPO rounds did not, and PPO is better for polishing;
- the replay-based DAgger teacher hurt.
At 15:01: "2.46 million plays NEVER changed anything?" At 17:51: "we're getting some real emergent behavior ... they figured out that he goes left every time and the shooter can steer him." At 20:14 a trap was found where defenders harvested points without tackling: "score the trap as 0 ... yes im sorry i meant 15" (an untouched play now pays 15). At 20:32 Nick asks for a single latest.html film page ("I have no idea what you're training"). At 21:57: "make sure CEM works on each player. No wonder they never learn." At 22:53: "give the blockers 10 points for touching a defender. just a one time bonus. they can get a max of 20."
That evening in Codex, Nick asks for "a small report on why everything we've done to this point has been proven to be extremely feeble minded by this simple drill exercise", and adds: "why did both astra and opus 5 fail to say 'hey you're trying to build a spaceship with the tools to make a bicycle'". Three sub-agents write the retrospective: "we repeatedly optimized a substitute for the behavior we actually wanted"; "execution failures repeatedly masqueraded as learning failures"; "local success often failed to compose".
Wed 16 Sep. At 00:29 a Windows Update reboot killed the overnight run at round 400 of 500 ("you did nothing wrong"). The block points had worked: "Its the best football of them all. the blockers now chase the defenders." A deeper lesson that morning: "Everything we've done eventually collapses ... we need innovation to move forward from every collapse." Random team sizes arrive (an extra blocker, extra defenders, cloned models), then individual rather than team rewards, then a memory against forgetting: "suppose we kept 1000 of the last checkpoints and forced them to BEAT THEM ALL". The long-standing rule "never change the scoring, only yards works" was reversed. Those earlier failures had come from the oracle leash, simulator defects and team-level credit. The new rule: pay for the event once, capped. From 13:08, authoring a play through rewards: yellow circles on the field pay the runner to go a certain way. Three small circles did nothing, and neither did +7 to +1. With +20, +20, +10, +10, +10, a mirror-image twin and a three times wider CEM search: "ok he found it ... so much higher rewards and wider CEM was the trick." At 15:46: "all these tests are making me realize just how futile our previous attempts were (with 22 vs 22) ... just getting the RB to run a simple route is hard." At 18:26, the model fight: "ok me and you are going to play a game. You're going to devise a new model type and new training type. 3 vs 3 ... I'll let you go first." Nick's design ("NICK") sees every body as a token with absolute position, speed and angle, has six attention heads, remembers the whole play and plans ahead. Claude's ("CLAUDE") sees each body relative to itself. Nick discussed the idea with Codex too ("Me and Claude are playing a game"). At 19:43: "my model is finally done with round one and its way too slow. would take us a month". At 20:54: "well yours surely appears a lot more functional."
Thu 17 Sep. At 06:00: "Claude2 is most definitely the winner over Nick4." The relative-geometry "reader" gives blockers something to climb toward, and absolute coordinates do not. Nick's planner needed two rebuilds and three times the wall-clock time. The reader becomes the model for everything that follows. At 07:21: "Claude3 is truly impressive ... he's learning leverage." The CLAUDE runs then climb through the day:
- play calls that only the offence knows (CLAUDE4);
- role speeds;
- the "anchor": a target measured from a body the player picks. It unlocked holds, double teams and gap fits;
- o-line strength (an engaged defender held to his blocker's speed). At 10:43: "This ended up being a 25 yard run ... I've never seen a hard cut like that before";
- at 13:33, the move to 5v5. There the o-line "has no idea what to do ... clumping in the middle pointlessly". Fixes were a body-spacing rule, "the flip" (which took the runner from 1.5 to 6.8 yards a play) and drive pay to stop the line sinking (CLAUDE17).
At 18:38 the drill lab is committed (ed3f66b, 82 files). CLAUDE18 is "the most consistent model. the rb plows right up the middle every single time ... exactly where he should go because that is where the oline is pushing for him." At 21:26: "Its almost like they have discovered the screen." At 22:08, Nick's conclusion about the past: "I think trying to run a whole offense with 50 plays baked in with 22 players controlling was madness. in fact I think you need a separate QB model for EACH PLAY." In parallel Codex Astra copies the lab (drill-lab-astra) to make it faster. Nick creates a RunPod account with a $10 spending cap. The first rented GPU pod runs 13 rounds in 6.6 minutes for about $0.14, and Astra's version is 2.7 times faster after a rounding bug is fixed. Nick to Codex: "Claude ended up having the better idea", and "please keep replies shorter. cause i almost barreled right through it reading your novel".
Fri 18 Sep. No commits. At 05:57: "CLAUDE20 result is outstanding". The runner "genuinely climbs the ladder and follows his blockers ... exactly how a good run looks in real game". CLAUDE21 to 31 try to author plays with leashes ("why would you ever make the leash so long in the first place?"), then make blocks hold, then legality (no holding). At 16:26: "Ok then next task is to build out 11v11. I think its time." It is a goal-line run from the 5 with the QB only handing off. The viewer was too small ("Why is it so god damn tiny?") and the back too deep ("WAYYYYYYYYYY too far behind"). A fast path makes the physics 13-17 times faster while giving identical results. At 21:28: "he basically NEVER runs in the middle". The cause was that the handoff always fell back to a default. At 21:33 Nick hands Claude a RunPod key: "create a 4090 secure pod". CLAUDE35 runs for 30 minutes for $0.45. At 22:51: "ok that showed me we can do 11v11 ... Next I want to attack the big scary elephant in the room. Zone coverage. I actually suspect it may not be so bad with neurals. Because we can just use the drawn zones as rewards." ZONE1 (a QB at the 50 throwing at random times against a neural Cover 2) trains overnight on Nick's GPU.
Sat 19 Sep. At 09:01: "RB catching the ball is not necessarily a cover 2 failure ... We need to be careful not to metric and especially not to punish proper behavior." At 10:26: "This image highlights a problem in our methodology". The defenders had memorised routes: "This is not coverage." Through ZONE2 to ZONE7, defenders breaking on the ball went from 9% to 53% in ten turns, after a sign error and other pay bugs were fixed. One net carried both Cover 2 and Cover 3 when told the call, and a neural catcher was added. At 19:14, Google Cloud: "Im an AWS guy im new to gcloud ... I authorize whatever spend. They gave me $300 credits". Then "i dont want to use a $3.70hr". An L4 GPU proved slower than the laptop, and the first downloads failed silently before the machine was deleted, which led to a rule: verify downloads before deleting a VM. At 20:33: "should we author the passing game or make that neural as well". The answer was FULLPASS1: 11 neural defenders against 10 neural offensive players, with only the QB written by hand. At 23:56 a commit adds the zone drill, a batched physics engine 14 times faster, and PPO (ececcb7).
Sun 20 Sep. No commits. At 00:10: "I do want a neural QB after all. I hate this stationary version." On film the pass rush loops round the line and leaves the middle open, and the safeties abandon their posts. Google's G4 GPU (RTX PRO 6000) on the cheap "Spot" tier measures 4.7-5 times Nick's 4070 ("for the spots we could outbid people": there is no bidding, it was corrected). "four nets? wait what? When we first started this each player was his own net". Sharing by job was measured to be fine. "Receivers need to be taught WITHOUT a defense for like 10 rounds"; "why are we running routes at .88? shouldn't it be as fast as possible like a real player?". Fixing the coach's labels took receivers from 73% to 89%. At 19:19: "im going to have astra work on my local GPU so make sure all the training you work on gets done on gcloud". Astra copies the 11-on-11 code into drill-lab-astra2 and tries pursuit drills, then stops at 22:24: "that wasnt very productive because the main trainer is so far ahead". At 21:34: "Yes lets do pursuit credit. I noticed the pursuit is dreadful".
Mon 21 Sep. At 06:01: "In real football when a team rushes the ball the oline PUSHES. When a team passes the ball the oline drops to form a pocket ... a pocket is typically an upside down U".
Standing rule: "no teachers".
At 08:06 to 08:25 Nick stops a pursuit coach:
"we never had this issue in 3v3 and 5v5, the players learned how to pursue properly with no leash or teacher whatsoever. Something else is up. Leashes and teachers that do stuff like that always end up breaking things in the end."
From now on, when a skill fails to appear, ask two questions first. (1) Is the incentive broken? (2) Is a mechanic, skill or physics rule throwing the players off? Only after that ask about a teacher. The audit found the real culprits: a forced full-speed sprint after the throw, and a 1-yard tag radius. Later that day a defender's view was found to have no "has the ball" marker. For about 500 rounds the defence had to infer the ball carrier from rewards alone. At 14:53: "of course they have to see who has the ball. they cant just infer based on rewards. that would take 10,000 rounds". At 15:40: "this is why I wanted separate models." From 17:07 come back-to-basics coverage drills with the line frozen and throws spread evenly across 100 spots. "when the fuck did the catch depth creep back into the picture. NUKE IT FOREVER". At 18:41: "Why the fuck would we make a person who was not responsible for the ball receive negative points for being far away from the ball?" Team-wide penalties go. Then 40 rounds on Google Cloud ("make sure not to touch the local GPU i got that reserved for another agent"), and ideas mined from a Grok copy of the lab (drill-lab-grok).
Week 9 · 22 – 28 Sep
Zone coverage defeats the all-neural approach for good. On 24 September Nick splits the work for good: authored passing (zone, man and the QB are written by hand), and a neural run game for the running back and the second-level defenders. Menus replace free aiming, and the run lab produces its first trustworthy model. Meanwhile Codex Astra starts the visual track: sprites, then Unity, then poses, then the first 3D viewer. On 27 September Nick moves from the VS Code extension to the Claude Code desktop app.
Tue 22 Sep. At 06:35 Claude commits the coverage drill and "the honest ledger" (e3968c3). Every body now carries a "has the ball" bit, and credit goes only to the man responsible. Nick on handoffs between zones: "The small bump would be an anchor. precisely what we aim to avoid", and a request: "speak plainly you're way over complicating it". At 13:14: "this is opus 5.5 a slightly smarter model. look through our notes ... lets see if you can figure out what we're missing." The new model finds it. CEM had been silently switched off. A safety margin copied from the full game rejected 93 of 93 candidates, so nine different reward and rule changes had all looked flat. Nick: "now we know that happened because we weren't allowing the CEM to make any changes". At 15:46: "zoom out ... see VISUALLY what the players are doing". Film shows "we had built man coverage": linebackers chase crossing routes to the far sideline. Several authored assignment "boards" are rejected ("think in an algorithm what a defender does in a zone"). At 18:26: "Look at our previous work here experiments\coverage-lab. I think we already figured out a lot of these issues there." At 19:51 Nick restates the plan:
"A 99 CB has perfect awareness of what he should be doing in any situation ... 1) make a perfect or near perfect oracle 2) train a neural net to perfectly match the Oracle AND produce an incentive structure that matches 3) train against live opponents"
At 21:21: "perfect is the enemy of good. I like these rules." Imitation of the coverage-lab rules ("imitate1") runs for 12 rounds on Google Cloud, then on the local GPU overnight ("Don't over write any previous work"). At 22:21 a Codex worktree is created for "GPT-6 Sol" to propose better Cover 2 and Cover 3 rules (drill-lab-astra3). Shown five defenders standing still: "Just answer me why it is so pathetic". That commit never reached main as such.
Wed 23 Sep. The overnight net matched the oracle closely on its own states (0.53 yards), but lost the break on the ball after the throw: 90% of passes caught for 17 yards a play. At 06:39: "The rules are the scoring. You're supposed to be matching the rewards with the oracle's rules ... On what planet would we score 1+1=3 as correct?" At 08:29, the reframing:
"I think I figured out why this has failed repeteadly ... the dataset and the expected result has always been wrong."
A Cover 2 gives up certain throws by design, and "we are grading it on a blind sample of every throw. Regardless of whether its possible." That is why it could look great on film and poor on paper. Big Data Bowl data is considered as a source of truth and rejected again ("I spent like 3 days trying to copy physics from big data bowl"). At 09:09 the "c2 slider": "FOR ONE COMBO. Cover 2 dime vs shotgun 4wr four verticals. Use a standardized rule set." It is a rule spec with a time slider that ignores physics, grown to 88 combinations through checks of 300, 600 and then 1,000 screenshots ("does this look like proper football"). At 13:10: "this is probably the cleanest ive seen". At 14:32: "for the love of god stop changing the filename. Just call it c2-slider-latest". At 17:10 another experiment, the emerge lab: three nets (corner, linebacker, safety), no play call at all, rewarded only on catches and catch yards. It produced corners in the deep halves and eyes on the QB, and a "wall" that Nick mocked ("I should apply to be a DC immediately ... Just build a wall!"). At 22:46: "yeah just forget it. another failed experiment." Codex runs a parallel 7-on-6 Dime Cover 2 CEM experiment the same day. Its first version let defenders see the ball after release, which "revealed the chosen throw". At 18:19 a 407-file commit lands the emerge lab and the parallel lab copies (da0d8c1). It is the first commit credited to "Claude Opus 5.5".
Thu 24 Sep. No commits.
The split: authored passing, neural run game.
At 06:35:
"I tried to make it all neural but I just can't figure out the zone. So I'm just going to have to do that with an oracle."
Zone coverage, man coverage and QB decisions are authored. Neural is narrowed later that day to the running back plus linebackers, safeties and corners against the run ("No need for a neural dline/oline. They largely do predictable stuff every play anyway"). A real play set is curated: 46 plays (23 runs and 23 passes) in 7 formations, against 4-3, 3-4, nickel, dime, 4-6, goal line and 3-3-5 fronts. The draw and RPOs are cut. Nick: "We want to train our neural nets on a wide net of possibilities. And the training is somewhat n^n by default." The first real run-lab training goes to Google Cloud ("use gcloud. change the notes that is old"), which becomes the standing choice. Old lessons keep being re-derived. At 13:14: "look at our previous drill notes. we've solved a lot of these problems already". At 13:19: "why would we start from claude35?? start fresh. Look we're not actually training the final game here. Were learning HOW TO do it." At 17:02: "why on earth wasnt the credit per defender to begin with?" At 17:19: "why do we even have targets? ... This is oracle crap all over again." At 18:27: "do a thorough 'what else lesson did I decide to skip' check of all our code. Cause that's been at least 3-4 times now". This produced a 14-item lessons checklist. Pursuit appears once defenders can choose between two targets (himself or the ball). At 22:37: "STOP EVERYTHING immediately. The QB not handing off is only getting worse ... we're wasting gcloud credits."
The visual track begins ("design astra").
At 17:57 in Codex: "Build me a bunch of sprites for a college football simulation game. I want to make sure the sprites don't move too slow." Nick scores each animation from 0 to 10 ("I'd give this one about a 3"). At 21:29 the camera must be Madden-98-style, 35 degrees behind the offence, with 56 sprite clips and 10 by 10 line contact pairings. At 22:31: "lets rebuild this in unity. we need to make them smaller." At 23:29 a phased Unity plan (phases 0 to 10) runs overnight with "STOP if you run into an issue".
Fri 25 Sep. Claude, run lab. At 05:58: "when I said 120 I meant sets not rounds". At 07:09: "for gods sake how many times are we going to solve a problem we already fixed". At 08:02, the key idea of the week:
"real neural experiments present the player with a list of choices and all the neural net does is choose one. I think we're slowly recreating that."
So menus replace free aiming. The back picks one of 8 football options, and a linebacker, safety or corner one of 9, every 0.1 seconds ("just make 'stay in your zone' as the option. And have oracle decide what that means"). At 09:36: "can we just have a CLAUDE-latest.html or something so i dont have to chase it down", which became the single film page. At 10:17: "why did the RB decide every .1 and the defense every .3 ???????? They were both supposed to be .1." In the afternoon come two kinds of back (power and scat), harder tackling for men engaged in blocks, and at 22:52: "Author gap control for the defenders ... Make it so they technically CAN CHOOSE to get off their gap. But it costs them so much that they almost never do." A probe shows the defence could tell the play 0.1-0.2 seconds after the snap from the line and fullback, so play families (Iso, Counter, QB keep) now share the same opening. The run lab is committed at 18:22 (9bf907c).
In Codex, Unity phases 0 to 10 had finished by 07:54, with zero non-engaged overlaps across 172,559 collision samples. Nick's verdict: "How am I supposed to see anything here?", "not even a 2. maybe a 1.5 ... like two of those rag dolls filled with cotton", later 4.5 out of 10. The rule from this: "the underlying simulator determines position and action. the animation should not determine anything". Unity's ready-made mannequin is tried at 17:35. At 20:10 a new direction: "a deliberately low-fidelity, Madden 97-style pose set", a small vocabulary of single-player poses where "Contact is never drawn as a paired animation." At 19:45 the whole visual project, 2,098 files, lands in git as design astra (2820e92). At 23:17 the pose viewer baseline is tagged astra-poses-v1 (12bb041).
Sat 26 Sep. 15 commits. Claude, run lab, at 09:54: "next I want to do a full blown capability test ... perfect is the enemy of good." The hit tackle model (5f11295) replaces the old all-or-nothing tackle dice. The chance of a first hit depends on angle, closing speed and size, every contact slows the carrier, and a tackled carrier falls forward. Runs stop being "boom or bust": 4.5 yards average, 2.9 median, 10% of runs over 10 yards. At 11:41: "We're also not necessarily chasing some magic 4 yards a play ... It's meant to train INTELLIGENT players. Later we can nerf or strengthen players." At 13:17: "commit and push and note that this is a model we can REVERT TO if things go south". The model is tagged runlab-cap1-baseline: 3.9 yards a carry, median 2.7, and 18 of 19 on the capability test (only "reading" failed). At 14:53 one more try at zone: "We'll try it one last time. This time they are guided by the zone oracle we already built". That is the zone lab, where seven coverage men choose from a menu (follow the zone, sit, crowd, rush, jump, sink, play the ball). At 17:44: "We want to train the zone to defend in a zone. Not just devolve into man instantly". Nick asks again and again to keep latest.html current. Late: "Holy god the safeties are STILL DOING IT".
On the visual side, a Claude Opus session working on branch design-astra-polish builds "Opus sprites": a new player renderer with a 25-pose vocabulary, signature moves (stiff-arm, spin), 19,248 frames and a zoom-and-follow camera. The same branch adds three throw types (regular, lofted, bullet) to the TypeScript simulator (cfb50e2). Codex later calls this "the work that claude code cloud did".
Sun 27 Sep. At 10:10: "wipe it and use REAL PLAYS this time", the game's own 23 pass plays rather than prototypes. At 10:59 Nick specifies throw types (normal, lofted, bullet) and catch types (regular, a leaping "Moss" catch, over the shoulder, leading). At 13:43: "We keep hammering our head against cornerbacks that just leave guys wide open perpetually. especially on the outside." The cause was a pay rule that measured straight-line distance and so paid corners to close their cushion, plus Cover 3 lining up in a Cover 2 shell. At 14:27, a mix-up surfaces:
"THAT IS NONSENSE!!!!! ... Stop everything immediately ... my bad its probably this one: experiments\coverage-lab ... Yes that was always supposed to be 'the oracle' ... man that invalidates almost everything we did yesterday."
The zone lab had been built on the slider rules, not on the coverage lab. It is switched to tracks recorded from coverage lab v1.8 and retrained. At 17:27, pay by the odds: charge a defender by the catch chance times the value at arrival, not by whether the dice said caught. At 19:23: "we're gonna cheat. we know the matchup before the snap." The resulting nets, zonelab-015, give up 4.3-4.8 yards a play and about 3% touchdowns, the tightest zone shape yet (6416eab, 1c659e7).
At 20:20 the move to the desktop app: "Is it possible for you to transfer ALL context into an .md file? I want to keep using Opus 5.5 but I want to switch from visual studio to claude code native app." SESSION-HANDOFF-2026-09-27.md is written, and a fresh session at 20:28 takes over ("Read this you're taking over this session"). At 20:53: "We are training models for 99 awareness players ... we're going to nerf their reaction once the training is complete." At 22:41: "We're building a 99 awareness defense here. Not a perfect machine ... The eye test is arguably more important than what it gives up." At 23:24: "If Cover 2 turns into man coverage that is not good even if it gets better yard numbers."
The first 3D viewer.
At 22:31 in Codex: "ok major project for you. build an entirely new branch. Try to build a 3d version of this ... stylized low-poly / cartoon 3D ... prioritizes readability and responsiveness". At 23:05, 6e2e75d on branch codex/astra-arcade-3d is the first Three.js 3D football viewer (Three.js is a library for 3D graphics in the browser). At 23:12: "its actually not bad at all. im quite impressed ... I love how they are blended in that the same general motions work for a lot of different scenarios."
Mon 28 Sep. 20 commits. Claude: the read lab (9375afe), ONE defence facing both run and pass plays with the call hidden. At 06:33: "A 99 awareness defender in real life will not know right away if its a rush or a pass. Thus him sprinting to the gap on every snap is just wrong. But they don't necessarily need to 'guess' either." At 06:41: "This is college football too not NFL." Linebackers and defensive backs get a natural 0.4-second read before their key shows. At 11:22 comes one ball-carrier network for the back, the receiver after the catch and the QB who tucks it: "make sure they use leverage. The whole reason we started with neural nets is because they never ran to the sideline. The game will have spins and stiff arms but they will be mostly visual." Its first offence learned to bounce outside (runs from 3.8 to 18.5 yards), and the defence closed that hole by itself in the next set. Then the scramble drill. On cloud costs: "We don't have to do any actual training. our goal is to make sure we CAN do the training", and "4 hours for a feasibility test??". At 22:38: "work on this while I sleep agentically." In Codex all day: athletic proportions, helmets with "no neck", 50 and then 100 contact animations, full games in the 3D viewer with clock, downs and automatic kicks, and team rating presets. At 12:56: "What would really help massively is if they could move in angled direction with their legs."
Week 10 · 29 Sep – 5 Oct
The pivotal week. Neural training reaches "real" runs on Google Cloud, finds money plays and a hidden learning-rate leak, and is paused for good on 30 September. The same afternoon a hand-written simulator, the "better oracle", is wired into the 3D viewer, and within four days it holds every play and every defence. A designer agent rebuilds the 3D athletes in Blender. The work splits into a sim chat and a game chat. Game Day, Coach Mode and a phone arcade game are built, and the week ends with Nick choosing a coaching game: SimCFB. 131 commits.
Tue 29 Sep. Man coverage (Cover 1) goes in as neural with a simple man rule as its default option. On film: "They let their man run right by them. Then chase after them. They are supposed to stay on top of them." On jukes: "We want jukes ... all done in one motion. Not back n forth ... stop, shake one way, maybe another way, like a soccer player doing the step over. then explode." Blitzes come next (Cover 1 blitz, Cover 0, a back who checks for a blitzer before releasing, the hot throw): "We don't have any pre-snap routines and I dont think we will for this version of the game". At 08:29 the budget: "we have used $158 out of $300. We probably will need $100 for the real training. So we gotta start wrapping things up." At 09:06: "ohhh i know what we havent done. down and distance." Fourth-and-1 must be crowded without giving up a free touchdown, though "giving up SOME big plays is fine on 4th and 1". At 12:54: "This will actually have a 3d visual gui when done ... I kind of want to get this thing shipped". At 15:14 Claude writes HANDOFF-3D.md for the 3D agent, and real-001 and real-002 launch on Google Cloud with a guard that throws away any set that makes a side worse. Nick's first look at the neural plays in 3D, at 17:46: "wayyyy too many dives. And they are way too far. he just glides in the air". At 20:22, on a play-action bootleg that beat almost every front: "the whole point of neural training is NOT to have money plays. There should never be a play wide open every fucking time." "Money-play breakers" were designed and deliberately not built: "I really don't want to add too many layers to this. We keep slapping stuff on top." At 21:09 the QB "looooooooves to throw to covered deep outside wide receivers". At 22:35: "we are training a super 99 level defense against a super human QB. We can always dumb them down later." In Codex: all 100 contact animations in full games, diving catches, and a Neural Lab mode in the 3D viewer that replays and then generates read-lab plays from Claude's checkpoints ("Why does changing the seed change the play???"). Nick asked Codex to have "Dottie" review the plays, but "Dottie wasn't available as a callable agent", so a sub-agent reviewed them instead.
Wed 30 Sep. 24 commits. At 05:51 Codex wires the real-004 set-6 checkpoint into the viewer and pushes 423c6f5. It is the last Codex commit, and Codex activity ends at 06:46. In the Claude neural chat, at 06:38: "we gotta fix the issue of RB almost never going inside." At 08:02: "didnt we already fix this issue like twice before?" Forcing the back's choice showed that inside runs simply did not pay (2.8 yards forced inside against 5.3 bouncing). Fixes to blocked men tackling through blockers and to slow pullers brought it to 4.0 against 4.4. Another discovery: a launcher script had leaked a learning rate of 3e-5 for the ball carrier, so in every read-lab run the carrier had learned 33 times slower than the defence (53e24c1).
Era change: back to step functions ("the better oracle").
At 14:08, in a new fork of the conversation:
"While the other model is working on the neural nets. I watched a youtube video yesterday where a guy had Opus 5.5 one shot a bot that controlled a little tank ... it won 100-0. And it wasn't neural. just a ton of different angle algorithms. ... am I wayyyyyyyyyyy over engineering this and could it have been done 10 times over by now if we just improved our initial algorithms?"
At 14:13 the assignment: "write two complicated algorithms that can react to what each is doing. But most importantly that looks like real football. JUST ONE PLAY COMBO ... singleback run against a dime Cover 2 ... I want them to behave like neurals. Meaning in any situation they are looking at different solutions." Nick names the two old failures. The early step functions "would oscillate constantly", and "their decision trees were very thin ... no concept of leverage, something our neurals figured out very quickly." The result is experiments/better-oracle: sim.js, plain JavaScript that runs on the CPU in the browser. Every tenth of a second each player weighs many options: about 96 paths for the back and about 47 for a defender, scored by how much open space he would still own. He commits to a choice for a while, so nothing flickers. It is deterministic like the July engine, and it carries the neural lessons: leverage, cutbacks, reading blockers.
At 15:11: "Read this branch. make a new branch from it. wire this new 'model' into it and lets see what it looks like with real 3d objects." At 15:14, 5b16301 "Add Oracle mode: authored inside zone vs dime Cover 2 in the 3D viewer ... No server, model or GPU needed", on a new branch claude/better-oracle-3d cut from Codex's 3D branch. The first five commits carry "Claude Sonnet 5.5" trailers. Nick at 15:45: "sonnet 5.5 (this model) is much stronger than Astra at 3d modeling". Meanwhile, in the neural chat at 15:49: "man its as if we've done nothing last 3 days ... I feel like we've accomplished nothing in the last few days." At 18:24: "stop the training. i want to pause it completely." The neural training was never resumed.
The rest of the evening grows the oracle fast:
- 17:39: pass defence. "we have a whole zone coverage lab you can work with";
- 19:03: "go ahead and add every play ... on running plays make sure the oline know who they are supposed to block". All 46 plays arrive with scheme blocking (
89fadbd); - 19:51, when hand-written zone rules looked wrong: "Bare bones zone rules don't work ... We spent weeks figuring zone out. Dont throw it out." Zone defenders now follow tracks recorded from the coverage lab, and all 40 defensive calls are recorded from it (1,840 runs,
0e04760); - the passing game: the QB's first look at 0.8 seconds, 0.35 seconds a read, four throws (
2d68992), and a QB who escapes; 2244b6c, a sweep: every play against every call over many seeds, 43,240 plays in 4 minutes on 15 cores, with a problem finder;- 21:34: "These plays are not what cover 2 and cover 3 look like. Like at all." More fixes.
Late that night Nick says: "I like the oracle you've made I think I'm going to keep it." At 22:51 Claude writes DESIGNER_AGENT.md.
The 3D athlete build.
At 22:56 a separate Claude session, the designer agent, starts on branch claude/designer-3d: "I asked the agent a couple of times to work on this and it did very mild changes. Almost nothing changed. This is not what you're going to be doing. You will change a lot more."
Thu 1 Oct. 16 commits. The designer, early morning:
- "right now it renders super choppy". The cause was hardware acceleration switched off in Nick's Chrome, which had hidden the real problem;
- "the players move in this slow motion rhythm ... like those old NFL replays that I HATE";
- "I prefer a vibrant FAST paced football. Not this slow mo garbage".
Five motion options were built. "3 the visual is HORRIBLE because of how jittery it is. But you're right that captures the pace better ... If we could combine #3 pace with #5 smoothness". The answer was pose time moving in smooth bursts 20 times a second. At 08:29, 8afd77d: a pro athlete built in Blender by a Python script (art/build-athlete-pro.py, about 44,000 triangles and 28 bones), with a broadcast look, team kits, a stadium bowl and a regulation ball. At 12:43 a second branch, claude/designer-3d-players, adds angular leg motion, 22 block types, sheds, jukes, escapes, one-handed catches, drops, breakups, piles, trailing wraps and takedowns (f5a9fa9, 6a264fe; one commit is credited to "Claude Fable 5.1"). On tackles, at 13:49: "The thing about tackles is that the play has already ended. So we don't necessarily have to abide by the sim perfectly." The agreed rule is to honour the simulation up to the whistle, after which the viewer may carry bodies on. At 14:31: "You almost got that technique perfect. Its A LOT better than it used to be."
In the sim chat, at 08:36: "Ok designer did some work. You gotta make sure our Sim work stays within that new framework." Then football judgement goes in:
- "the safety is not doing his job ... They are supposed to be the last guy standing";
- a QB who reads the defence before the snap and weighs catch chance against gain and risk ("right now our oracle is lying to us with decisions a real QB would never make");
- rating tiers by position group: mediocre 62, standard 75, SEC starter 87, elite 99;
- press coverage;
- at 16:07: "I do want smothering coverage ... unless the QB is elite or the WRs are elite its almost impossible to throw on them. Its at best contested." (
7bfce30); - a pocket that forms and gives ground. At 19:57: "For now that sack amount is fine. We're trying to build intelligent players";
- safeties who level receivers;
- QB scramble settings: Frequent ("Lamar-Jackson type"), Normal, Low.
The seven hand-built "trainer 4-3" calls are retired (4cbd479). The night sweep: runs 3.81 yards, passes 4.11 yards a play, sacks 12.1%.
Fri 2 Oct. 16 commits. At 06:02: "we need a desperation mode. otherwise an elite QB doesn't make that throw at all ... none of this 'times up lets do this leeeeeeeeeeeeeeeeeroy jenkins'". The ratings sweep (cb5e81e) asks "does a better player play better?" for each position group. Two-seed flags proved to be noise twice, so ladders are rerun at six seeds. At 09:33: "Lets fix the counter once and for all ... In a real counter they are making space for him not getting in his way." Then: "our man coverage sucks. they seem to just leave them open a lot". Four separate reasons were found, and the fix was to mirror the receiver's speed. The offensive line now reaches the linebackers, idle linemen get jobs, and a defensive line setting (spread or pinch) is added. At 18:33: "why are the last few prompts taking such an absurd amount of time? ... we're doing a pisspoor job of utilzing our resources. We have a 4070ti GPU sitting idle and $110 of gcloud credits." New tools run on every core, tests run in parallel processes (3 minutes instead of 8-10), and sweeps run on a 56-core Google Cloud machine after Nick raises the CPU quota to 96. A separate read-only chat breaks down every player skill for Nick ("I can hardly keep up"). On receivers: "our elite wide receivers are shit route runners". At 22:48 an analysis-only audit runs overnight.
Sat 3 Oct. 20 commits. Fixes go in one at a time with a 40-seed sweep after each, 147,200 plays. At 09:06: "a really good QB will find two things A) he will throw his receiver open B) he will throw where only his receiver has a chance to catch the ball." At 10:06: "my biggest pet peeve with football games has always been brain dead defenses that give up the same crap over and over. Now we're on the other side of that coin." By QB tier, yards per pass play run 2.78, 3.85, 5.74 and 8.73. At 10:51: "An elite QB can drag an entire team."
The sim/game split.
At 10:53: "write a really good handoff_10-3.md for a new chat window ... I want to preserve this one as the SIM editor." At 10:55, b8ea159 merges claude/better-oracle-3d into main: "the simulation and the 3D game". At 11:01 a new game chat opens: "We're actually going to build the game out first. We can get rid of all the neural stuff. We have some older rosters ... wire in a full game. Complete with downs, touchdowns, kicks." On branch claude/game:
- 12:04, Game Day (
eba6d90): downs, clock, scoring, extra points and two-point tries, automatic kicking, college overtime, 67 teams from the August rosters, and CPU coaches ported from the August game plans; - 12:25, Coach Mode (
197bf76): you call every snap for one team; - a Madden-style play caller and a replay time bar.
Nick was angry twice. At 13:06: "That other viewer already had a REALLY GOOD drawer of plays. Why didnt you just use that?" At 13:16, when the game page had swapped the 3D players for stand-ins: "what in the flying hell is that? We spent an enormous amount of time working on those 3d models". The two chats talk through files, GAME-TO-SIM.md and SIM-TO-GAME.md. The game chat's first requests (14:00): back protection, play to the sticks, and special teams ("For punt returns give the players some genuine intelligence"). They came with a measurement: the sim completed 71.7% of passes against about 62% in real college football. At 17:14 a latest.html index of every page is created ("i constantly have to beg you for the link"). At 17:25: "I wanted the special teams wired in. Why didn't you do that? I want a complete game." Special teams arrive (punts, field goals, squib and onside kicks, fakes; 654bc3e). At 18:25: "now passing is brutally overpowered relative to running." At 18:20 the branch dottie-roster adds V7 reviewed rosters for all 185 teams: 19,425 fictional players with potentials, classes, stars and NIL values (f44028c). Who or what "Dottie" was is not documented. At 21:03: "come up with a shitload of dials", which became a dials page of 53 settings. And a "Watch a Game" page at 1.5 speed.
The phone arcade detour.
At 22:56: "Im debating whether to turn this into a 5 minutes a quarter game where you control the players. How viable is that? especially for mobile specifically." At 23:12: "lets build a throwaway test ... a joystick and a 'who to throw to button' ... jog and sprint". At 23:38, 14e43f3 "Play test: steer one player live from a phone" on branch claude/mobile-play ("Better than I expected"). A sub-agent writes the sound module.
Sun 4 Oct. 12 commits. At 01:57 the phone game (854d170): live motion, runner moves STOP/SPIN/DIVE, a defence tuned for human players and a full-game page. In the morning: "WAY too tiny. Needs to be 3 options tops". "dude you are leaving a background browser that is playing sounds" (the rule since: test sound pages muted and close the tab). At 10:11: "the play ends WAYYY too soon ... The play is whistled dead." So tackles now take time to bring a man down ("held is not down"). Seven Madden-style cameras arrive, and one-frame pose jumps in the films are fixed: the carrier's jumps fell from 114 of 230 films to 2. Two background Claude sessions did this work in their own worktrees but edited the shared folder directly, so spawned tasks now get an explicit file list. At 10:52 Nick frames the choice:
"This is a choice between 2 different games really. 1) An arcade madden 27 mobile style game ... 2) A college football sim like football coach dynasty. But with its own 3d rendered gameplay something that game is missing."
At 11:13 Nick explains the purpose: "this game is meant as a showcase of what I can do. It's not meant to be monetized ... And Im honestly a bit burnt out. The reason this arcadey madden style game appeals to me is because I could probably ship it in 2 days." At 11:18: "Is this why madden defenses are always dogshit? :) I think we just follow them. The reduced capability defense. The accelerated 5 minute clock." Difficulty levels are added (Rookie, Pro, All-Pro, Legend), along with Madden's accelerated clock. Then at 13:41:
"commit it push it. Then lets back up and go back to building the CFB coaching sim after all. Maybe Ill add mobile controls to it."
The V7 rosters are merged (8a95437), the game is found never to have passed the down to the sim ("play to the sticks" was off; f3c13c1), and at 14:10 "everything is merged" (4289508). The phone version is frozen on its branch. On old branches: "why delete them? Just leave em alone. They are old archives." At 14:15: "start with the scoring and upsets, get it closer to real CFB ... we need to be looking at moderate parity". At 16:17, 687e54b "Closer to college football": over 400 mixed games, points per team fall from 39.3 to 32.5 and the better team's win rate from 87% to 74%.
Mon 5 Oct. 18 commits. In the sim chat, the last realism work: runs that are no longer a sure thing, yards after contact in the pile, second-level contact, pursuit. Each comes with a 400-game balance report. At 14:00: "Im getting close to just shipping it ... I can spend another 10 years fine tuning it. AT some point we've done enough." At 14:16:
"Im building the actual game out. I've been working on this sim for 1.5 months. I think its time to put it to rest. So let's just tie up the loose ends now. No more long drawn out sessions fixing this and that. It's not perfect but it will never be."
Era change: "the sim is finished" and SimCFB.
b9f2677 "The simulation is finished" lands at 14:16. Its closing note records about 32 points a team, 6.3 yards a run play and 6.35 a pass play, and the better team winning 70-79%. From now on there is no retuning in passing: any change must be measured before and after with the balance report.
Meanwhile a new chat, "building actual game", had opened at 13:10. At 13:14:
"its 100% free. single player only. coach mode not playable. I think ultimately I have to trust my instinct and make it a coach/management game. Not an arcade Madden clone. Problem with madden clone is that it looks one shotted and completely loses all the depth we worked on for so long (mostly sim feeling like actual football)."
At 13:23 the spec: "1) Needs to be a career 2) all college. We have 185 college rosters 3) look at the game we already built ... NIL and recruiting 4) The 3d viewer". There are five ways to play a game: watch every play, watch key plays, call and watch every play, call key plays, or simulate it all. At 13:33: the 68 Power Four schools, "youre the school no getting fired", and a sleek mobile-game look. At 13:40, "not so gacha looking", and "Call it SimCFB". At 13:45: "we need a desktop version as well. not just mobile."
The simcfb/ app (Vite, React, TypeScript) on branch claude/coach-career is built step by step:
- Step 1 (14:18,
fe85820): one full game in five modes, team uniforms. The football code is not bundled; the app loads the 3D viewer andsim.jsas native modules; - Step 2 (14:53,
698b23b): a season and the quick sim. Background games are settled by drawing from a bank of 58,000 real simulated snaps and 14,700 kicks recorded from 400 full CPU games. That takes about 20 ms a game, and a 413-game season in about 7 seconds; - Step 3 (15:24,
f154a1c): the career, copied from the Augustsrc/careerwith its rules intact: recruiting, NIL, the portal, staff, scheduling.
At 15:37: "hold on forget about hosting for a second. lets built the game first". At 15:47 a recruiting redesign: offers are free, NIL is reserved only on commitment, and ratings are fully visible. At 15:52 the weekly plan and momentum: "If you HYPER FOCUS oline everyone else plays worse but the oline gets a major boost". Four sub-agents gather the real 2026 schedules by conference. That evening's playtest list:
- "i set my game plan to run heavy and all out blitzes and somehow managed to lose to campbell as Florida 30-31 ... lost ... by the exact score as last time ... Almost like it reused the same seed" (a seed bug, fixed);
- "Our linebackers play every snap of every game ... Depth HAS TO MATTER otherwise this is not a CFB sim" (depth chart and fatigue added,
32dbfe3); - brain-dead clock management.
At 23:11: "make an API to play the game yourself. And go ahead and play it". At 23:15: "If Utah and UCLA won the title last 2 years something is wrong lol". At 23:25: "we need to have LESS parity. The games feel a bit random."
Week 11 · 6 – 10 Oct
Five days from a working career game to a public release. The economy is rebuilt (NIL, portal, injuries, playoff). The game goes live on Amazon Web Services on 7 October. AI playtesters, Sonnet models that play the game, report to an Opus "orchestrator" that sends Opus fixers after each bug, around the clock. One expensive mistake costs a day's token budget. On 10 October the game goes public with "no major changes to balance". 142 commits, almost all on claude/coach-career.
Tue 6 Oct. 26 commits. At 10:12: "first and foremost we must fix the left over cash. Most programs are begging boosters for more $. Not sitting flush with unused NIL ... some kind of bidding war for transfer portal players ... the portal was kind of bare." The first headless playtest follows: a programming interface (simcfb/tools/play/api.ts) drives the career without a screen. It ran eight careers, about 54 seasons and 17,600 games (e7e692f). What it found:
- a thin roster had bricked 4 of 8 careers;
- 54% of players were "buried" because depth charts never updated;
- budgets were about ten times what players cost, and money could not actually buy a player.
The fix was a league price index, so money gets spent but not overspent, and uncapped, log-scale offers ("$2M vs USC's $200K"). At 12:54 game-day parity is loosened (0.35 to 0.75, b617420). The commit records Nick's complaint, "less parity... I'll beat Texas one week then lose to Kentucky", and now favourites by power gap win 76, 88 and 96% of the time. At 14:42, on the portal: "If you're Duke and you have $2,000,000 and you need 5 players ...", so every school goes for the best players it can afford and bids against others when it can win. At 16:24: "I suspect we also need to introduce random injuries ... real football isn't like that." Injuries arrive in games and between games, along with garbage time: starters come out in blowouts, and "players can only get hurt if they are playing". At 19:33: "yes build the portal bidding like recruiting" (free bids until a player accepts, capped at 1.5 times the money available). At 20:31: the playoff "needs to be like it is now. Which I believe is 12 teams" (93ff552). Then a staff and hiring mess ("I cant find a single coach to hire lol"), fixed so that every action names its job, its price and who it replaces. Vite's live reloading pushed half-finished edits into the game Nick had open, so UI changes are now made in one write, with an error screen as a guard.
At 22:15, the first overnight swarm:
"ok im going to sleep. I want you to act like the orchestrator. Make 5 separate APIs of the same game. Then have 5 sonnet agents playing it over and over ... Sometimes sim. Sometimes call plays. Sometimes auto coaching ... try everything you can think of."
The five testers each had a brief: play Ohio State hands-on, take a weak program as a long dynasty, stress money, the portal and staff, try to break the game, and press every button. At 23:50: "i played with Florida for 3 seasons. and i was largely where i started. There is no real breakthrough or progression."
Wed 7 Oct. 51 commits, the second-busiest day of the project. The overnight report (OVERNIGHT-REPORT-2026-10-07.md) found that Auto Manage had let a $6.85M head coach walk over a $0.1M raise, that a weak program could not rise, and that Group of Five and FCS teams beat Power Four teams only 5.6% and 0.5% of the time. At 06:21: "no way Gators would keep their star RB and star QB in all 4 quarters up so much". Receivers had run out of bounds on 12.7% of pass plays; routes now stay inside the lines (0.1%, 74c04b3). A 60,000-name pool arrives. To give programs rise and fall: the Heisman Trophy (b1c9eb3), bowl games and postseason money, boosters, a coach's motivator rating that actually counts, and "generational" prospects. Round two of five testers starts at 08:37. At 12:26, on development:
"I almost want people to have a choice to start the game with +$50mil in NIL or with a really good head coach (the game itself has NO DIFFICULTY SETTING, i hate those)"
Development becomes the head coach and coordinator together ("Fuck it lets not over complicate it. Its a combo of the 2"), and a new career starts with a choice of a donor or a builder (0251ea0). A Cover 2 fix cuts blown deep catches from 2.0% to 0.2% of plays (8c8f7da). Auto Manage is redesigned to fill decisions while never overriding the player's own changes. On the start choice: "the game is always the game ... There is no easy mode."
Launch: simcfb.com goes live.
At 19:27: "we need to start getting it ready for mass production ... a web game that detects whether the user is browser or mobile ... I can publish it wherever and can even pay for hosting". At 19:34 the game learns to show "A new version is ready" and wait for the player's Reload (f99439c). At 20:16 phones are landscape-only and every screen fits at 844x390 (1b2a5ed). A Cloudflare Pages setup is prepared at 20:19. At 20:20:
"no cloudflare i just bought simcfb.com on my amazon account. we're going to publish it there."
There is a brief scare at 20:24, "wait hold on wrong account stop", confirmed safe a minute later. At 20:33, 7313bcb "SimCFB is live at simcfb.com". The setup is a private S3 bucket (Amazon's file storage) behind CloudFront (Amazon's content delivery network) with a certificate, a www-to-bare redirect and Route 53 DNS. Releases go out with one command, npm run deploy, which uploads the code first and the page last and then clears the cache. The game is a static app with no server: saves live in the player's browser, with a backup reminder. At 20:39, the tester/fixer swarm:
"launch a few sonnet agents. go through the game interface in both mobile and desktop version. try every button ... You're the agent controller (you opus 5.5). Use Sonnet agents to find the bugs. Opus agents to fix them and publish them."
That evening signing day had frozen the screen for 20-25 seconds, and it was made fast. At 22:27: "Im going to sleep. continue testing ... Take your time don't spin up too many agents. Looks like my CPU goes to near 100% with two chrome headless shells."
Thu 8 Oct. 36 commits. The swarm ran from 20:40 the evening before to about 15:00. Testers phone1, phone2 and desk1 and tester rounds 2 to 5 found the problems, and fixers 1 to 8 each "owned" their files while they worked. Shipped this day:
- phone layouts for every screen;
- double-tap and Back-button guards, and offers that refuse $0;
- a favicon, a robots file and a 404 page;
- full keyboard support (focus kept inside pop-ups, Esc pauses a live game);
- a splash screen for slow first loads;
- How to play with a glossary, and Season > History;
- full screen on first tap, bigger text and finger-size buttons on phones.
The length of a whole game was measured: about 13 minutes watching key plays, about 53 minutes calling them. At 13:12: "I dont know if I just have bad eyes in my old age. but the whole mobile game felt really hard to read", which led to a phone readability pass. At 13:31: "lets clean up the running tasks ... stuff thats been going on for 16+ hours".
The token incident.
At 15:26: "Launch a sonnet 5 agent to take snapshots of every screen in mobile. Then have opus 5.5 go over each one and look for crappy stuff." One "photographer" agent took the screenshots. From 18:31 to 19:02 four Opus reviewer agents read them: about 68 million tokens in 31 minutes. They found nothing. At 18:05 Nick had already said: "this may be a little too slow for what its worth."
Fri 9 Oct. 16 commits. At 06:26:
"ok that was a terrible idea. i burned through all of my tokens extremely fast and I even had $20 reserve that got burned through very fast. What did we do? Was Opus reading each image and that killed us?"
At 06:31: "the worst part is the images are largely useless ... I found 2 problems while playing". The two were key plays that seemed to "teleport in time", and a coach who suggested kneeling on fourth down. The lesson was saved as a rule: measure layouts with a script, look only at flagged screens, and estimate the cost and ask before any batch of agents. But Nick did not overcorrect, at 06:49: "You can use sonnet agents if you want. but I don't think it's necessary to obsess about it." Game prep becomes a visible lever with an "All in" week (69c1664). At 13:56 Nick reverses a 1.6x "big game" multiplier: "100% on game should mean the same whether its a big game or not ... FOR THE USER to decide". "More prep never makes a unit worse" (3f56f98). First-time tips arrive, offers you could never pay are refused, and KNOWN-ISSUES.md lists what was knowingly left alone. One item: the 3D film's final position and the official spot disagree on about 0.4% of plays. A measurement found that one career season on the quick sim and on the full engine gives nearly the same scoring (34.2 against 35.1 points a team).
At 14:12: "alright lets do a final sweep. ... sonnet agents playing the game. This is the last round of testing before I start releasing it to the public." The phone report found no blockers, 2 broken items, 5 confusing ones and 10 polish items. At 18:09 Nick's final fix list included "What can we do about QBs never throwing picks?" At 19:46: "nah its fine i think we'll publish it like this. if people play this game enough to notice a 1% difference in interceptions we're doing good lol." Then analytics: "I want statistics ... how many unique players ... unique visitors, bounce rate, how long people play for". The answer was PostHog, anonymous play statistics (d436207, 20:50). At 21:32: "Staff is not recruiting anyone. Says I don't have enough $ ... I might lose half of my team to the portal for all I know". This led to clear warnings when staff recruiting is paused. At 22:00 Nick asks whether Alabama losing to an FCS cupcake is a bug. The investigation measured that upset at 0.71%, real variance ("i dont care about numbers not adding up. my only concern was that there was a bug"). At 22:53: "alright im going to bed. We're about ready to release it. Want sonnet agents to play the game all night. no need to be super greedy. just maybe 1-2 sessions at a time ... Try to buy a really good NIL team one season. Then don't recruit at all next season."
Release day.
Sat 10 Oct. 13 commits. Six overnight testers played: night-nil, night-ui, night-exploit, night-long, night-phone and night-counter. Fixes landed from 02:00 to 07:50:
- donor money counted in next year's budget;
- a confirm before withdrawing an offer;
- the coaching carousel can no longer rehire a coach a school just fired;
- tap guards, a phone Coach button, conference tabs;
- onside kicks the return team expects (recovery 49% down to 21%,
ce1832d); - a CPU defensive coordinator that calls the answer to a play the offence keeps calling (
00e7dc3).
A prototype for an outside-zone fix was kept on a separate branch for Nick to decide. At 07:28: "I noticed the onside kick thing as well. That needs to be fixed for sure. I lost on an onside kick already once. Lets fix outside zone. if we find a broken play its perfectly fine to tune defenses FOR THAT PLAY SPECIFICALLY." At 10:33:
"ok wowowow i dont want major changes to balance today when we're releasing. If there is one particular busted play its fine to give defense a slight nudge against it. But i dont want massive rebalancing."
At 12:00, a90a834 gives a slight nudge against I-formation Outside Zone and Toss Sweep. At 12:19, 3824a1d makes sure the tendency reader's answer never helps the play it answers, and a81067b merges the night branch. At 12:24 main is reset to claude/coach-career, the tip of everything. After a type check, the app tests and 30 random-coaching games with 0 problems, the merge is deployed to simcfb.com. The live site was confirmed to serve the new build, including the new defence code. The overnight testers' remaining findings were left for Nick's call:
- skipping recruiting hurts too slowly, because the roster refills itself (a team that did nothing for six years went 9-4, 7-6, 7-6, 9-4 before collapsing);
- scoring drops about 12% after the first season;
- top teams lose a little too often;
- duplicate names appear as the name pool runs out.
Subagent briefs that day describe SimCFB as going "public today". At 18:09 to 18:15, the last messages: "Make sure everything is pushed and committed"; "I want the recent work on the main branch"; "which branch is the actual game on? Whats on simcfb?"; "i want to clean the github up. there's all sorts of branches that often led nowhere". And the request that produced this file: "write a detailed history of this project. From the beginning all the way to the end."
What we learned
The lessons that lasted, grouped by subject. The date says when each one was learned, or learned for good.
Physics
- Simple, deterministic physics wins. Five learned contact models and a 305,000-episode NFL contact model all produced "synchronized swimming" or sticky scrums. The hand-written physics they replaced was better ("5174 is a milion times better", 21 Aug). Every later neural model ran on simple physics by design (restated 11 Sep).
- One shared random stream ruins experiments. Any small change re-rolled the whole play; moving one defender for 0.1 seconds changed the yards by a median of 7.1. Dice must be keyed to who, when and what (15 Sep).
- The tackle model shapes everything. A solo tackle that could never finish invalidated a week of training data (29 Aug). An all-or-nothing tackle roll made runs "boom or bust", and the hit model (angle, closing speed, size, falling forward) fixed it (26 Sep).
- An exact GPU copy is a project of its own. Even
Math.hypotdiffers from the textbook formula in the last bit. Drift has to be judged against the CPU's own sensitivity, not a fixed tolerance (22 Aug).
Neural training
- Simulator bugs look exactly like learning failures. Three times the "learning problem" was a defect: the tackle bug (29 Aug), defenders aiming 8.4 yards off the carrier (4 Sep), and a leaked learning rate that made the ball carrier learn 33 times slower (30 Sep). The retrospective's words: "execution failures repeatedly masqueraded as learning failures" (15 Sep).
- Check the learner before the reward. Nine reward changes "did nothing" because CEM had been silently rejecting every candidate (22 Sep). When many different changes all produce no change, look at the trainer first.
- Imitation copies the teacher's flaws. The clone plateaued at the teacher's hidden randomness (24 Aug). The "neural" QB threw to WR3 because WR3 was the authored primary target (7 Sep). The best "neural" defence was partly hand-written aim (11 Sep).
- Grade against the same opponent. A defence co-trained with its own back looks worse on the standard table and better on film. Pin the carrier (1 Sep).
- Leagues, not rivals; CEM to discover, PPO to polish. Self-play against one opponent cycles and forgets. CEM found new behaviour that PPO never tried (15 Sep).
- Pay for the event once, capped, and to the one player responsible. Team-wide penalties and "distance to the ball" terms taught the wrong things (15-16 Sep, 21 Sep, 24 Sep).
- Facts the net needs must be visible directly. For about 500 rounds defenders could not see who had the ball (21 Sep).
- No teachers, no leashes. Coaches and leashes "always end up breaking things in the end". Ask two questions first: is the incentive broken, and is a mechanic or physics rule throwing the players off? (21 Sep; the coverage leash, 14 Sep)
- Menus beat free aiming. Giving the net a short list of football options fixed a long run of aiming problems (25 Sep).
- One play cannot teach leverage. A net trained on a single fixture learns a constant, not a read (12 Sep).
- Even tiny worlds are slow to teach. "just getting the RB to run a simple route is hard" (16 Sep). Eleven on eleven with 50 plays was, in Nick's word, "madness" (17 Sep).
Oracles against nets
- Grade the right thing. Zone coverage gives up certain throws by design, so grading it on every possible throw was wrong from the start (23 Sep).
- The hand-written coverage lab beat every learned coverage, and survived as the zone logic of the final game (9-12 Sep, 30 Sep).
- The neural work taught what to write by hand. Leverage, commitment instead of flicker, reading blockers, and gap discipline that costs a lot to break all came from the nets. The better oracle used them (30 Sep).
- Smart first, then dial down. "It's much easier to dial down a very smart defense then to make a stupid one play better." Fix assignment errors (who owns what) before balance (1-2 Oct).
Testing and agents
- The film is the judge; numbers must explain the film. This rule runs from the 28 July spec to release day. Ablations "measure confusion" (15 Sep), and a film that does not reproduce the training table is not evidence (12 Sep).
- Preflight before training: standing still, a leash audit, one-player credit and determinism. Three runs were lost to silently invalid setups (15 Sep).
- Six seeds, not two, before believing a ratings ladder (2 Oct).
- Written handoffs are the shared memory between AIs. This started with
SPEC.md(30 Jul) and continued throughCONDENSED_BEHAVIOR.md,HANDOFF.md,TRAINING_NOTES.md, the 27 September session handoff, andGAME-TO-SIM.md/SIM-TO-GAME.md(3 Oct). - AIs re-derive solved problems. A checklist of lessons had to be walked before each new drill (24 Sep).
- Parallel agents need owned files. This applied to the four domains (14 Aug), the spawned tasks that collided (4 Oct), and fixers that each own their files while they work (7-8 Oct).
- Reuse what exists. The game chat rebuilt a worse play drawer and swapped out the 3D athletes, and Nick was furious both times (3 Oct).
- AI testers work for interface and economy bugs: about 210 issues were fixed in three days (6-9 Oct).
Cost
- Agents that read images are expensive and found little: about 68 million tokens in 31 minutes, nothing found (8 Oct). Measure layouts with scripts and look only at flagged screens.
- Cloud GPUs are cheap per hour (about $3 an hour all-in) but need discipline: Spot machines, one VM at a time, download before deleting, and a smoke test instead of a full run for a new drill (19-29 Sep).
- One heavy process at a time on the home machine (12 Sep), and use every core when it is free (2 Oct).
- Usage limits shape the schedule. Codex's weekly allowance ran out repeatedly in September (9, 11 and 13 Sep).
Product
- "Fool the eye." "Aesthetics is the key - they only have to fool the eye" (9 and 14 Sep).
- Perfect is the enemy of good. Said on 11, 22 and 26 September, and acted on when the sim was put to rest on 5 October.
- Keep the depth. A coaching game on a real simulation beats an arcade clone that "looks one shotted" (5 Oct).
- No difficulty setting. Ratings are the dial (28 Jul spec; "NO DIFFICULTY SETTING, i hate those", 7 Oct).
- On release day, change only what is broken, narrowly (10 Oct).
How the main ideas evolved
Physics and step functions. It started with dice and ratings in Python (Nov 2025). The 28 July TypeScript engine ran at 60 ticks a second, deterministic and seeded, with a slow "decide" loop and a fast "move" loop, pairwise blocks and a tackle contest. On 16 August contact became impulse and footing. From 17 to 21 August came the learned-physics detour (NFL data, V2 to V5, a neural contact model), rolled back. From 22 August a CUDA copy of the engine was made for training. From 15 September the drill labs used a separate, much simpler batched physics at 10 ticks a second with the ball as a body. On 30 September came sim.js, the better oracle: about 5,000 lines of plain JavaScript, deterministic, deciding every 0.1 seconds with commitment, scoring options by the open space they leave. That is what ships. The project ended where it began, with hand-written step functions, but much smarter ones.
Neural nets and training. From 24 to 29 August, imitation of the authored teacher (to about 98% with a deterministic teacher). From 27 to 31 August, CEM search and DAgger, then the "rabid dogs". On 1 September, adversarial yards-only training; on 2 September, ES over the weights with one shared network. On 4 September, the aim fix and 3.3.11, the best run defence. From 4 to 8 September, passing (3.4.x, 3.5.x) and separate heads (4.0, 4.1). From 8 to 9 September, per-role coverage models (4.2.x to 4.4.x). From 11 to 15 September, "guided" residual labs (v5 run, v6 pass). From 15 to 23 September, the drill labs: leagues, CEM against PPO, the reader network, reward circles, 5v5, 11v11, zone drills and FULLPASS. From 24 to 30 September the scope narrowed to the run lab with menus, the zone lab on the coverage-lab oracle, and the read lab with the call hidden, ending with "real" training runs on Google Cloud. On 30 September training was paused and never resumed. No neural network ships in SimCFB.
The oracle. The word changed meaning four times. In August it was the authored engine, used as the teacher to imitate. In early September it was the plan a net could bend ("the oracle decides; a small network bends it"). From 9 September it was the coverage lab, the zone algorithm that solves who owns whom. From 30 September it was a complete hand-written simulator, the better oracle, which became the product. The "no teachers" rule of 21 September was about not mixing an oracle into learning. After 30 September the question was moot.
Tackling. It began as a binary tackle contest (Jul 28). Impulse and footing came on 16 August. The solo tackle bug that made touchdowns impossible was found on 29 August, and half-shed blockers got partial credit on 30 August. The drill labs used tackle dice, then the hit model (26 Sep: angle, closing speed, size, momentum, falling forward). In the oracle, blocked men stopped tackling through blockers. On 4 October tackles started to take time ("held is not down"), and on 5 October came yards after contact in the pile. After the whistle the 3D viewer may carry bodies on (1 Oct).
Coverage. Man coverage was rewritten on day two (29 Jul), then many labs followed (WR vs CB, SMART LAB, Zone Matrix). Zone Logic B replaced handoff spaghetti (8 Aug), and the "perfect coverage" engine came on 12 August. Learned coverage ran through 4.0 to 4.4.3 and v6 and was never believable. The coverage lab (9-12 Sep) solves ownership over every assignment and became THE zone oracle. Neural zone drills followed, then the c2 slider and the emerge lab (19-23 Sep). The zone lab (26-27 Sep) was re-pointed to coverage-lab tracks, and the read lab (28 Sep) hid the call. In the better oracle, zone follows the recorded coverage-lab tracks. Man coverage mirrors the receiver's speed, press is a contest, safeties stay the last man, defenders break on the ball, and coverage "smothers" by rating (30 Sep to 3 Oct). The release-day Cover 2 fix had deep-half safeties playing over the top (7 Oct).
3D. Canvas circles came first (Jul 28). Sprites and Madden-98-angle sprite packs followed (24 Sep), then Unity ("like two of those rag dolls filled with cotton", 25 Sep), then Madden-97-style single-player poses (25 Sep) and Opus sprites (26 Sep). Codex's Three.js arcade viewer (27 Sep) used blended motions, 100 contact variations, piles and a Neural Lab mode. On 30 September and 1 October came the Blender-built pro athlete, the broadcast look and fast, non-slow-motion pacing, then angular leg motion, block and escape variety, catches, wraps and takedowns. Pose-jump fixes followed on 4 October. In SimCFB this is the film room for every snap.
The game layers. The first full game came on 30 July, then a CPU coach on 31 July, College Game and Career on 13 August, and four domains on 14 August. Game Day and Coach Mode on the better oracle came on 3 October, then special teams, dials and Watch a Game. The phone arcade game with joystick, five-minute quarters and difficulty levels came on 3-4 October and was frozen. SimCFB came on 5 October, with five ways to play a game, the quick-sim bank, a season, the career, momentum and the weekly plan.
The career economy. In August: 68 programs, one budget for the head coach, coordinators and NIL, Clout and recruiting "magnetism" (13 Aug), then recruiting as a race (15 Aug). In SimCFB: free offers with NIL reserved on commitment (5 Oct); a league price index, uncapped log-scale offers, portal bidding rounds, injuries, a 12-team playoff and staff wired end to end (6 Oct); the Heisman, bowls, boosters, generational prospects, development as head coach plus coordinator, and a donor-or-builder start (7 Oct); then game prep as a lever and offers you can never pay refused (9 Oct). Known open items at release: skipping recruiting hurts too slowly, and scoring falls after year one.
Deployment. In July and August it was a local Vite app. In September the films were HTML pages in C:\drill and a local index on port 4291. For SimCFB: a static web app that works offline (5 Oct), Cloudflare Pages considered for 14 minutes, then AWS (S3, CloudFront, a certificate, Route 53) at simcfb.com with npm run deploy (7 Oct). Then phones landscape-only, a reload prompt for new versions, a splash screen, a 404 page (8 Oct), and PostHog analytics (9 Oct).
Cast
Nick. Owner, designer, tester and final judge. Nick wrote the specs and briefs, watched the film, played the game, wrote numbered bug lists, set the standing rules ("teach the players how to play", "fool the eye", "no teachers", plain English, one heavy process), stopped runs, paid for the tools and cloud accounts, and made every direction change. Nick also ran the relay between the AIs, pasting one tool's analysis into another.
Claude Code (Anthropic). The main builder overall, and from 25 August the main builder of the neural, oracle and SimCFB work. By commit credit: "Claude Opus 5" on 168 commits (28 Jul to 22 Sep), "Claude Opus 5.5" on 272 (22 Sep to 10 Oct), "Claude Sonnet 5" on 1 (14 Aug), "Claude Sonnet 5.5" on 5 (30 Sep) and "Claude Fable 5.1" on 3 (1 Oct). Its roles over time:
- the first milestones (28-29 Jul);
- the UI agent (14 Aug) and a repair day (15 Aug);
- the GPU neural-policy and tackle-bug work (25-30 Aug);
- the 3.5.x and 4.x analysis (6-9 Sep);
- the coverage lab (9-12 Sep);
- the long drill-lab chat (11-24 Sep), then the run, zone and read labs (24-30 Sep). It ran in the VS Code extension until 27 September, then in the desktop app;
- Opus sprites (26 Sep);
- the SIM chat, owner of
sim.js(30 Sep to 5 Oct); - the designer chat for the 3D athletes (30 Sep to 1 Oct);
- the GAME chat (3 Oct) and the phone game (3-4 Oct);
- two background worker chats (4 Oct);
- the SimCFB orchestrator (5-10 Oct), which ran sub-agents: schedule gatherers, Sonnet playtesters (about 25 across the rounds, including six night testers), about 17 Opus fixers, a screenshot photographer and four Opus reviewers, and the research agents for this history.
OpenAI Codex ("Astra"). 51 football chats from 29 July to 30 September. Its roles:
- the main builder of the TypeScript game from 29 July to 15 August: passing, coverage, labs, the Play Maker, career mode, and integration of the four agents;
- the learned-contact attempt (19-21 Aug);
- the GPU migration (22-23 Aug);
- the start of neural policies, CEM and the "rabid dogs" (24 Aug to 1 Sep);
- versions 3.3.11 to 4.1.x (4-8 Sep);
- coverage 4.4.x (9 Sep), then extending the coverage lab (10-11 Sep);
- building v6 (12-14 Sep);
- faster drill-lab copies and the first RunPod pod (17-20 Sep);
- Cover 2/3 research (22 Sep);
- the whole visual track: sprites, Unity, poses, the 3D arcade viewer and the Neural Lab mode (24-30 Sep).
Nick called it "Astra" from 9 September; model names in the logs include "GPT-5.6 Sol" and "GPT-6 Sol". It was used through Codex Desktop and, from about 8 September, the ChatGPT app.
"Luna". A Codex helper agent that implemented version 4.4.3 from Astra's instructions (9 Sep).
Grok (xAI). A "grok build" was reviewed in Nick's notes around 12 August. Grok was named as the simulation agent in the 14 August parallel round, and a comparison copy of the drill lab (
drill-lab-grok, 16-22 Sep) supplied an idea that was reused. There are no Grok transcripts.Kilo Code. An agent-manager file on 14 August (probably used to launch the four domain agents; a guess) and a worktree on 22 September.
ChatGPT. Used for second opinions: a hardware comparison on 20 September, and "I even asked ChatGPT what the hell you meant" on 11 September. From about 8 September it was also the front end for Codex.
"Dottie". Only a name: the
dottie-rosterbranch that added the 185-team V7 rosters (3 Oct), and a reviewer Codex could not call (29 Sep). What it was is not documented.Services. GitHub; RunPod (17-19 Sep); Google Cloud (19 Sep onward: G4 GPUs and a 56-core CPU machine); Amazon Web Services (simcfb.com, 7 Oct); PostHog (9 Oct); Blender (the athlete, 1 Oct); Unity (24-25 Sep).
By the numbers
| Measure | Number |
|---|---|
| Calendar span of the main project | 75 days (28 Jul to 10 Oct 2026) |
| Days with commits | 59 (16 without) |
| Commits | 693 (691 on branches plus 2 stash objects), one author |
| Commits credited to a Claude model | 449 (Opus 5: 168, Opus 5.5: 272, Sonnet 5: 1, Sonnet 5.5: 5, Fable 5.1: 3) |
| Commits with no AI credit | 244 (mostly Codex, by the evidence) |
| Busiest weeks | Week 7, 8-14 Sep (159); Week 11, 6-10 Oct (142); Week 10, 29 Sep-5 Oct (131); Week 3, 11-17 Aug (74) |
| Quietest weeks | Week 4, 18-24 Aug (7) and Week 6, 1-7 Sep (7), with the work outside git |
| Busiest days | 13 Sep (65, Codex building v6), 7 Oct (51, launch day), 8 Oct (36), 12 Sep (31), 6 Oct (26) |
| Biggest commits | The GPU simulator, 148,980 lines (24 Aug); the play import, 147,678 lines (11 Aug); design astra, 2,098 files (25 Sep) |
| Branches and worktrees | 47 refs, 23 worktrees, 10 merge commits; history almost linear |
| Experiment folders | 22 under experiments/, plus about 10 labs inside the TypeScript app (WR vs CB, Formation Matrix, Play Lab, SMART LAB, Zone Matrix, calibration, Play Forensics, tracking, divergence, contact and physics labs) |
| Model versions and runs | 3.x to 4.4.x; v5 runs 001-019; CLAUDE1-35; ZONE1-7; FULLPASS1-10; coverage1-25; runlab and zonelab series; readlab-001-004; real-001-007 |
| Codex | 51 football chats; the largest (design astra) 861 MB, 110 messages from Nick |
| Claude Code | About 1,400 messages from Nick in 15 main sessions; the largest session 611 MB over 13 days; 76 sub-agent transcripts (69 in the SimCFB session) |
| Rented GPUs | RunPod: $10 cap, first pod about $0.14 (17 Sep), a 30-minute 4090 for $0.45 (18 Sep) |
| Google Cloud | $300 credit; $158 used over about 53 cloud hours by 29 Sep (about $3 an hour); about $110 left on 2 Oct |
| Tokens | A 6.5 million-token Codex autonomous loop (22-23 Aug); about 68 million tokens in 31 minutes on the image review (8 Oct); about 512 million over the four main days of the SimCFB session |
| AI playtesters | 5 overnight (6-7 Oct), 5 in round two (7 Oct), the tester/fixer swarm (7-8 Oct), a final round (9 Oct), 6 night testers (9-10 Oct) |
| Issues fixed by the swarms | About 210 (by 9 Oct) |
| Largest sweeps | 43,240 plays in 4 minutes (30 Sep); 147,200 plays in the 3 October outlier fixes |
| The game | 68 playable Power Four schools; 185 rosters and 19,425 fictional players; 46 plays (23 run, 23 pass) in 7 formations; 40 defensive calls; the real 2026 schedule; a quick-sim bank of 58,000 snaps and 14,700 kicks |
| Time from "the sim is finished" to live | 2 days, 6 hours (5 Oct 14:16 to 7 Oct 20:33) |
Sources and gaps
What each period rests on.
- Nov 2025 to Jul 2026 (pre-history): file dates and contents of the
cfbfolder and one file naming the project only. There is no git history and no transcripts. - 28 Jul to 5 Sep: git (every commit), the Codex transcripts (from 29 Jul 20:45) and the written notes (SPEC, SPECNEW, TRAINING_TIMELINE, HANDOFF, Nick's dated note files, memory notes). There are no Claude Code transcripts before 6 September at 22:24. Claude's work in this period is known from commit credits and handoff documents.
- 6 Sep to 10 Oct: the Claude Code transcripts are dense, with 48 continuation summaries. Git and the memory notes confirm them.
- 13 Sep: Codex and git only (no Claude transcripts).
- After 30 Sep: no Codex activity.
- Grok and Kilo: no transcripts at all. Their roles come from Nick's notes, branch and folder names, and one Codex integration brief.
Days with no recorded work anywhere: 10 Aug. Several other days have no commits but do have recorded work: 19-20 Aug (the untracked gridiron2 folder and Codex chats), 22-23 Aug (the GPU build, committed 24 Aug), 28 Aug, 31 Aug to 3 Sep (training landed on 4 Sep), 5 Sep, 16 Sep, 18 Sep, 20-21 Sep and 24 Sep.
Guesses in this history.
- Who wrote the untrailered commits of 30 July to 13 August. Codex mostly, by its transcripts, but Claude Code also worked in the same folder then.
- Which tool ran the ES and 3.3.x work on 2-3 September.
- Where the name
grok-timecame from. - Whether Kilo launched the 14 August agents.
- What "Dottie" was.
- The "five prior physics models" referred to in the notes; the likely list is the July engine,
gridiron, NEW PHYSICS MODEL,gridiron2V2-V5 and the GPU kernel.
Where the sources disagree (the choice made here comes first):
- "The sim is finished": 5 Oct 14:16 (git
b9f2677and the chat).SIM-TO-GAME.mdsection 11 and one memory note say 6 Oct. - Release: the site went live on 7 Oct and public on 10 Oct.
KNOWN-ISSUES.mdis headed "9 Oct, at release". - The release-day defence fix (
3824a1d): git shows it merged intoclaude/coach-career(a81067b, 12:19) andmainreset to that tip at 12:24. One transcript summary says it was "not merged or deployed", but that was written before the merge. It was deployed to simcfb.com the same day. The controller confirmed the live site served the new build, with the tendency reader's answer map in the livecoach.js. - Parity: the engine has used 0.75 since 6 Oct. A 10 October tester report still calls it "parity 0.35" (an outdated label).
- Screenshots in the 8 October review: "600+" in the transcript digest against "about 3,400" in the memory note. The token figure (about 68 million in 31 minutes) is the same in both.
- The first rented GPU: Codex's RunPod pod on 17 Sep, then Claude's 4090 on the night of 18 Sep (one note says 19 Sep).
- The start of Google Cloud: 19 Sep (transcripts and memory). A git-based reading put it around 24 Sep, the date of the "training goes to gcloud" rule.
- The start of "design astra": the Codex sprite chat began on 24 Sep. One folder date says 1 Sep, but file dates in that checkout are unreliable (many files were rewritten on 10 Sep).
- The 14 August agents: the Codex brief names Grok for simulation, Claude for UI and Codex for career. Commit credits show Claude models on 5 commits that day.
- The milestones: a Codex digest says Claude built "23 milestones" in about 24 hours. Git shows Milestones 1-7 by name only; the later spec milestones were not labelled as such.
Compiled on 10 October 2026 from 693 git commits, 51 Codex chats, 15 Claude Code sessions with 76 sub-agent transcripts, about 105 memory notes and the project's handoff documents.