AI agents
One human, four AI roles, zero access to production
The orchestrator plans and reviews, Claude Code takes the hard and visual tasks, Codex implements, the asset chat paints. No agent pushes, merges or deploys – a human decides after a review by a different model than the author.
4.1 Roles
The agents are not “a team that makes the game on its own”. Each has a narrow role and clearly written limits, and every decision that is hard to undo stays with a human.
- Marcinowner
Goals, priorities, sign-off decisions, playtests. The only one who merges into the main branch and deploys.
- OrchestratorClaude chat
Plans, briefs with scope and a “do not touch” list, report reviews, recommended decisions.
- Claude Codeterminal agent
Hard and visual tasks: rendering, look and feel, diagnosis, cross-reviews, this website.
- Codexterminal agent
Implementation: gameplay features, backend, arena generator, tests and reports with numbers.
- Asset chatOpenAI image_gen
Commissioned 2D art and 3D sheets: weapons, hands, zombie concepts, vehicles.
4.2 Rules
- No push, merge, deploy or secrets. Hooks in the Claude Code toolkit enforce it: they block every
git push, changes on the main branch, Worker publishing, writes to R2 and reads of key files – before the command runs. - Cross-review. Work is reviewed by a different model than its author, read-only; mutation tests and measurements run in copies outside the repository.
- At most 3 parallel sessions. Each in its own worktree, with free ports and its own report.
- Scope and “do not touch”. Every brief lists the files and modules outside the task. The report opens by confirming they were left alone.
- New features behind a flag. The existing mode must stay the baseline – down to the pixel.
- Look first, code second. A mock-up, sheet or concept goes for sign-off before any implementation. This site was made the same way.
BLOCKED by the Neon City hook: release without --dry-run.
Neon City hook: test processes are still running. Stop the ones you started in this session and check again; if they belong to the owner, list them in your answer and finish.
4.3 The loop: brief → report → review → decision
A brief is a short document: goal, scope, a “do not touch” list, acceptance criteria and the expected report format. The implementer works in its own worktree and finishes with a report full of numbers: tests before and after, screenshots, measurements, risks and the things it did not check.
The report goes to review. The reviewer takes nothing on trust: it rebuilds from a clean export, plants deliberate bugs to see whether the tests catch them, and looks at the screenshots. There are three possible verdicts: REJECTED, ACCEPTED WITH NOTES or ACCEPTED.
Only after acceptance does a change reach the preview and staging, where Marcin plays it. Merging and deploying is always done by a human.
4.4 Case study: TRAM-1
TRAM-1 brought trams into the ordinary match: a timetable, stops, contact with the player and the D5 warning corridor. The author’s report was long, the tests were green, and 20 arenas came out identical across two runs. The first review rejected it anyway.
- Review 1 · REJECTED
Blocking: the D5 corridor was invisible from above. Its triangles had reversed vertex order and the material draws only the front face. The geometry existed, so tests and stats passed. On top of that, the tram shown in co-op drifted away from its collision, and a tram standing at a stop dealt damage.
- Fix 1
Reversed winding, a test of the normal’s sign and a new smoke run counting D5 pixels in a fixed frame: 23 → 1001 pixels by day, 190 → 1212 at night. Damage only above 0.5 m/s and once per pass; at a stop: 0 HP. Prediction vs server: 0 m.
- Review 2 · ACCEPTED WITH NOTES
D5, render timing and the stop were closed. Two notes: an actor pushed in front of the nose was sometimes “carried” (2–4% of trials, up to 11 m), and with 150 ms latency remote players showed up to 1.74 m inside the tram.
- Fix 2 · ACCEPTED
Carried further than 1 m: 0/96 trials in Łódź and 0/96 in Kraków. Maximum overlap of remote characters with the tram: 0.055 m, 0 frames above 0.1 m. Tests: 1634 backend and 937 client, 0 failures.
The lesson: a test that checks geometry exists does not check that it can be seen. Since this fix, signing off a visual element requires measuring pixels in the frame, not just a screenshot in the report.
The author wrote it down in the fix report: the earlier images and the PASS claim did not constitute sign-off for D5. The review found a bug that none of the 1600 tests could see.
4.5 Excerpts from briefs and verdicts
Short, anonymised excerpts, translated from Polish – without paths, addresses or branch names.
No game source code on the site. No push, no repository creation, no deploy. Design and mock-up for sign-off first.
Every prompt comes with a scope and a “do not touch” list. New features behind a flag; the existing mode is the baseline.
No edits to shared packages, networking, the OSM parser, audio or the other agent’s directory. No amend, push or deploy.
Verdict: REJECTED. The author’s report lists “D5 readability” as signed off, but no screenshot shows it.
The earlier D5 sign-off was wrong: the geometry existed, but the strip was not visible from above; the earlier images and PASS do not constitute sign-off.
Verdict: ACCEPTED WITH NOTES. Blocking R-01 is closed, as my own pixel measurement confirms.