Writing, 11 min read
Mission control
Part 1 of 2. In July I let a colony of Claude Code sessions play Factorio for a week: a foreman, eight named workers, a reviewer, a “god” on Claude Fable, and a dashboard that looked like mission control. Between 17:00 and 21:00 UTC it logged 856 refused sessions as successes, and from 17:31 its production log was silent.
Why a game that never ends
I want to know how to build agents that run for hours without me, and are still honest in the morning. An agent here is an AI model that works in a loop on its own: it reads the situation, picks an action, takes it, and reads again.
The way I build with them has a name on this site: loop engineering. A small crew of agents does the work, reviewers who did not build it check every change, and one person decides what lands. Think of a factory: a foreman plans, workers build, and an inspector checks the work from outside.
Factorio is a good place to test that. You mine ore, smelt it, build machines, then build machines that build machines. It never ends. A factory always has a next problem: a furnace out of coal, a belt that backs up, biters, the game’s aliens, at the wall.
Two things make it a test bed. It has ground truth: the production statistics say exactly how many iron plates came out last minute. And it has a remote console, RCON: a way to type commands into the running game from outside, in Lua, the game’s scripting language. An agent can act through it. An agent can also cheat through it.
01of 06
The colony

It started on 22 July, late in the evening. The players were Claude Code sessions. Claude Code is Anthropic’s coding assistant, and a session is one run of it, from start to stop. They played the game through the remote console, over a small program I wrote, the bridge. It ran for about a week, as three colonies: three runs, one after the other.
None of the names below are people. Each one is a role, played by Claude Code sessions. First a foreman and four named workers: Ada, Bolt, Cog and Dot. Within two hours a reviewer, an advisor and a challenger joined. On 24 July an overseer came, and four more workers, Eve, Flux, Gus and Hex, each with a charter: expansion, defense, rebuilding, or filling in where needed (“flex”).
That evening every seat got a model tier: a size of Claude model, from small and cheap to large and costly. Haiku, the smallest, took the chores like refuel and haul. Sonnet, the middle one, took the planners and builders. Opus, the largest of the three, took the reviewer and every third foreman cycle. Above all of them sat “god” on Claude Fable, the top model. The colony called it in by writing a new, unanswered “@god:” line in one of two shared notes files, or it came when at least 60% of the colony’s health checks, on the factory and on the agents, missed their targets. It came at most once an hour.
On 26 July the reflex layer arrived: plain rules in code that ran every second, with no model. Then came an architect and a director, the director in plain code too. That night one “king” replaced the foreman, the architect, the overseer and the reviewer, with one board, the shared list of tasks.
Who was in the colony, and when
- 55% Sonnet
- 26% Haiku
- 12% default model
- 8% Opus
- Fable: 8 sessions
- 01
Snapshot
a read of the factory
- 02
Architect
the most important path, and how to check it
- 03
Foreman
one plan section per worker
- 04
Challenger
argues with the plan
- 05
Workers
build in parallel, each in its zone
- 06
Reviewer + advisor
check the claims, research the questions
Later the colony stopped working in rounds and ran continuously: workers pulled the next task from the board, and a session that went quiet for six minutes was killed.
02of 06
Mission control

I watched it on a dashboard. The first version went up that first evening, and it grew fast: a live map of the factory, a crew panel, every agent’s messages as a chat, production charts, a task board, and later a “colony pulse” that showed the loop was still running. It looked like mission control. And it gave every finished session a green tick, the mark for a success, including the ones that did nothing.
03of 06
The hour of green ticks
In Factorio you research new technology with science packs: items the factory makes and feeds into labs. The first colony’s pack counter ended at 472, and its last snapshot of the game recorded 17 technologies as researched. One of them was set straight in Lua after a save rollback, a return to an earlier save. That is the exact kind of command the hive I built later, in part 2, refuses. Then, on 24 July, the pack count stopped at 472 and never moved again.
Science packs made by machines in the July colonies
- Colony 1
- Colony 2
- Colony 3
The numbers as a table
| Colony | Hours on record | Packs at the end | Note |
|---|---|---|---|
| Colony 1 | 31.1 from the first sample after a save rollback | 472 | Reached 472 at hour 8.8 and stayed there. |
| Colony 2 | 26.6 | 0 | No automated packs. |
| Colony 3 | 72.5 | 448 | 98 by hour 11.4, then almost flat until hour 44.7. |
About 40 minutes after the pack count stopped, at 17:31, the production log went silent until the next afternoon; the colony’s own review called the save frozen. The dispatcher, the code that started the sessions, kept starting them. Between 17:00 and 21:00, 856 sessions came back with one line: “You’ve hit your monthly spend limit.” The account had reached its spending limit for the month, and each of these sessions ended on that message. Every one of them was logged as a success.
Sessions the dispatcher started per hour, 24 to 25 July (UTC), by the reply they got
- “You’ve hit your monthly spend limit”
- Connection refused
- Other replies
The numbers as a table
| Hour | “You’ve hit your monthly spend limit” | Connection refused | Other replies |
|---|---|---|---|
| 24 Jul 16:00 UTC | 0 | 0 | 21 |
| 24 Jul 17:00 UTC | 274 | 0 | 98 |
| 24 Jul 18:00 UTC | 555 | 0 | 0 |
| 24 Jul 19:00 UTC | 18 | 0 | 0 |
| 24 Jul 20:00 UTC | 9 | 0 | 0 |
| 24 Jul 21:00 UTC | 0 | 0 | 9 |
| 24 Jul 22:00 UTC | 0 | 0 | 5 |
| 24 Jul 23:00 UTC | 0 | 0 | 23 |
| 25 Jul 00:00 UTC | 0 | 0 | 5 |
| 25 Jul 01:00 UTC | 0 | 0 | 9 |
| 25 Jul 02:00 UTC | 0 | 0 | 14 |
| 25 Jul 04:00 UTC | 0 | 0 | 14 |
| 25 Jul 05:00 UTC | 0 | 1 | 4 |
| 25 Jul 06:00 UTC | 0 | 22 | 31 |
| 25 Jul 07:00 UTC | 0 | 24 | 76 |
| 25 Jul 08:00 UTC | 0 | 56 | 40 |
| 25 Jul 09:00 UTC | 0 | 24 | 3 |
| 25 Jul 10:00 UTC | 0 | 2 | 2 |
| 25 Jul 11:00 UTC | 0 | 0 | 5 |
| 25 Jul 12:00 UTC | 0 | 2 | 2 |
| 25 Jul 13:00 UTC | 0 | 1 | 3 |
| 25 Jul 14:00 UTC | 0 | 29 | 16 |
| 25 Jul 15:00 UTC | 0 | 1 | 12 |
Hours with zero sessions are left out of the table.
The next morning the game itself stopped answering: the connection was refused. Now the workers did what they should: one check of the connection, a refusal, then wait, with no attempt to build. And the dispatcher still started them, one shift after another.


On the dashboard that looked like this. Ada, in her 160th turn: “RCON still down”, the 137th turn in a row that did nothing, and a green tick. The stats page next to it showed Ada at 480 runs and 95% success. The colony’s rule file has the lesson in capitals: never use the success rate to judge whether workers stopped. Count the raw sessions.
04of 06
Pauses and lookups
I first blamed idle time. In one measured round, no worker was building for 44% of the time, while the planners, the reviewer and the advisor ran on. On 26 July I cut that to 5%. Production did not go up.
The colony’s own research report named the real problem: many of its “decisions” were lookups dressed as decisions. The answer was already in the notes, but as prose. So each worker had to work it out again with a model call, every time, instead of running it as a rule in code.
05of 06
The quiet end
Sessions per hour by role, 26 to 29 July (UTC)
- Named workers
- Foreman
- Advisor and others
The numbers as a table
| Hour | Named workers | Foreman | Advisor and others |
|---|---|---|---|
| 26 Jul 14:00 UTC | 44 | 7 | 9 |
| 26 Jul 15:00 UTC | 56 | 6 | 11 |
| 26 Jul 16:00 UTC | 27 | 4 | 7 |
| 26 Jul 17:00 UTC | 33 | 8 | 12 |
| 26 Jul 18:00 UTC | 23 | 8 | 9 |
| 26 Jul 19:00 UTC | 1 | 30 | 3 |
| 26 Jul 20:00 UTC | 0 | 1 | 1 |
| 26 Jul 21:00 UTC | 0 | 1 | 0 |
| 26 Jul 22:00 UTC | 0 | 1 | 1 |
| 26 Jul 23:00 UTC | 0 | 1 | 0 |
| 27 Jul 00:00 UTC | 0 | 1 | 1 |
| 27 Jul 01:00 UTC | 0 | 1 | 0 |
| 27 Jul 03:00 UTC | 0 | 2 | 1 |
| 27 Jul 04:00 UTC | 0 | 1 | 1 |
| 27 Jul 05:00 UTC | 0 | 1 | 0 |
| 27 Jul 06:00 UTC | 0 | 2 | 1 |
| 27 Jul 07:00 UTC | 0 | 6 | 1 |
| 27 Jul 08:00 UTC | 0 | 1 | 1 |
| 27 Jul 09:00 UTC | 0 | 2 | 0 |
| 27 Jul 10:00 UTC | 0 | 1 | 1 |
| 27 Jul 11:00 UTC | 0 | 1 | 0 |
| 27 Jul 12:00 UTC | 0 | 7 | 1 |
| 27 Jul 13:00 UTC | 0 | 2 | 1 |
| 27 Jul 14:00 UTC | 0 | 1 | 0 |
| 27 Jul 15:00 UTC | 0 | 1 | 1 |
| 27 Jul 16:00 UTC | 0 | 2 | 0 |
| 27 Jul 17:00 UTC | 0 | 1 | 1 |
| 27 Jul 18:00 UTC | 0 | 1 | 0 |
| 27 Jul 19:00 UTC | 0 | 1 | 1 |
| 27 Jul 20:00 UTC | 0 | 3 | 1 |
| 27 Jul 21:00 UTC | 0 | 3 | 0 |
| 27 Jul 22:00 UTC | 0 | 27 | 3 |
| 27 Jul 23:00 UTC | 0 | 1 | 1 |
| 28 Jul 01:00 UTC | 0 | 2 | 1 |
| 28 Jul 02:00 UTC | 0 | 1 | 0 |
| 28 Jul 03:00 UTC | 0 | 1 | 1 |
| 28 Jul 04:00 UTC | 0 | 3 | 1 |
| 28 Jul 05:00 UTC | 0 | 1 | 1 |
| 28 Jul 06:00 UTC | 0 | 1 | 0 |
| 28 Jul 07:00 UTC | 0 | 2 | 1 |
| 28 Jul 08:00 UTC | 0 | 24 | 3 |
| 28 Jul 09:00 UTC | 0 | 27 | 4 |
| 28 Jul 10:00 UTC | 0 | 8 | 1 |
| 28 Jul 11:00 UTC | 0 | 13 | 2 |
| 28 Jul 12:00 UTC | 0 | 27 | 3 |
| 28 Jul 13:00 UTC | 0 | 31 | 3 |
| 28 Jul 14:00 UTC | 0 | 30 | 3 |
| 28 Jul 15:00 UTC | 0 | 17 | 2 |
| 28 Jul 16:00 UTC | 0 | 1 | 1 |
| 28 Jul 17:00 UTC | 0 | 1 | 0 |
| 28 Jul 18:00 UTC | 0 | 1 | 1 |
| 28 Jul 19:00 UTC | 0 | 1 | 0 |
| 28 Jul 20:00 UTC | 0 | 1 | 1 |
| 28 Jul 21:00 UTC | 0 | 1 | 0 |
| 28 Jul 22:00 UTC | 0 | 3 | 1 |
| 28 Jul 23:00 UTC | 0 | 1 | 1 |
| 29 Jul 01:00 UTC | 0 | 2 | 1 |
| 29 Jul 02:00 UTC | 0 | 1 | 0 |
| 29 Jul 03:00 UTC | 0 | 1 | 1 |
| 29 Jul 04:00 UTC | 0 | 1 | 0 |
| 29 Jul 05:00 UTC | 0 | 1 | 1 |
| 29 Jul 06:00 UTC | 0 | 1 | 0 |
| 29 Jul 07:00 UTC | 0 | 2 | 1 |
| 29 Jul 08:00 UTC | 0 | 1 | 1 |
| 29 Jul 09:00 UTC | 0 | 1 | 0 |
| 29 Jul 10:00 UTC | 0 | 1 | 1 |
| 29 Jul 11:00 UTC | 0 | 1 | 0 |
| 29 Jul 12:00 UTC | 0 | 1 | 1 |
| 29 Jul 13:00 UTC | 0 | 1 | 0 |
| 29 Jul 14:00 UTC | 0 | 1 | 1 |
| 29 Jul 15:00 UTC | 0 | 2 | 1 |
| 29 Jul 16:00 UTC | 0 | 1 | 0 |
| 29 Jul 17:00 UTC | 0 | 4 | 1 |
| 29 Jul 18:00 UTC | 0 | 19 | 4 |
| 29 Jul 19:00 UTC | 0 | 2 | 0 |
Hours with zero sessions are left out of the table.
The third colony ended in a different silence. The last worker session started on 26 July at 19:26 and ended a minute later. No worker session started again. The foreman ran 336 more sessions and the advisor 65, for almost three days. Late on, a check found the last worker session 43 hours old, while an earlier check had reported the workforce alive. My reading of the code, not proven: the workers’ loop took its tasks from a second, new board, which had no open tasks, while the foreman kept writing tasks on the old one.
Agent sessions against science packs, per colony
So did more agents give more output? Not in my own data. The chart shows it per colony: the most sessions, most of them refused, in the first; none of its packs in the second; nearly the same packs from the fewest worker sessions in the third. The third colony’s production log has 71 hours with a reading. In 68 of them no worker session started at all, and in those hours the log still shows about 109 iron plates an hour. The machines kept running without them.

06of 06
What July taught
Plain rules in code came only on day 5, and later colonies did not beat the first. In factory terms, July had a foreman and workers, and its checks came from inside: a reviewer in the same colony, and a dashboard that ticked green. July taught me one thing above all: count what ran. Count the packs, the plates and the commands, and never the success rate.
So in October I built the inspector first: the plain rules, the grader that scores the work from outside, and the logs, before any agent played. That is part 2.
Credits
Factorio is by Wube Software. As I read its terms of service on 21 October 2026, they allow videos made with the game’s content and forbid extracting its assets to share them on their own; I found nothing about screenshots. The pictures here show the game; no asset files are shared.
The colony ran on Claude models by Anthropic: Haiku, Sonnet, Opus and, for “god”, Fable.
The illustration at the top is a painted image made in Krea; its loop is an image-to-video run of Seedance 2.5 on Krea.
The dashboard, the bridge and the colony are mine. The replay, the captures and the charts were made for this post from the colony’s archive.
