Rules so far
GitHub CI is down to one job today, about 3 runner minutes, and nothing in it runs Playwright. The repo went private yesterday (the WinLu tile packs are committed and their license does not allow redistribution), and a private repo gets slower 2-core runners and billed minutes. The plan has 2,000 a month and 1,811 are used. One push to a pull request ran eight end-to-end shards for about 190 runner minutes before it timed out. I told Claude to cut CI way back. The full suite, which takes 80 to 100 minutes on a 4-core machine, now runs on mine every week and before every release.
That one is a CLAUDE.md rule. The file is what Claude reads at the start of every session, and the rules I set in it carry my name and a date. Several of them came after something went wrong, and the newest is the one about GitHub minutes.
Pull requests
For the first four days everything went straight to main, 209 commits. On October 1 I asked for a branch per major feature, a pull request when it’s done so it gets an independent review, and me merging. The review paid off quickly. On the 2nd Copilot read main and found six problems. Among them were an animation editor save that accepted a partial skeleton and a dungeon simulator that weighted encounter groups differently from the game. Its review of PR #1 added two more, one of them a save whose JSON was not an object, which crashed instead of returning an error.
105 pull requests have merged since. I stopped using Copilot on the 8th. The Claude Code Review Action reviews the pull requests now, and I merge them.
Spikes were my own mistake. I had thought a spike’s PR would merge, and on the 4th I told Claude “we don’t need more GO/NO GO branches. I was mistaken about merging.” They stay open as drafts and never merge, and a spike that comes back GO gets rebuilt on a real feature branch.
GitHub also has a ruleset on main since the 6th that requires a pull request and a passing check. On the free plan a private repo doesn’t enforce it, and the API answered 403 when asked today. For now, “don’t commit to main” is a line in CLAUDE.md and nothing else.
Before engine code
On the 4th both spikes came back GO, and the plan was to rebuild the battle stage and its tools on Phaser. That evening, after about 56 research agents in three rounds, I chose our own engine on PixiJS v8 and Three.js instead. With it came a rule: no engine code until I approve a written architecture design doc. I’ve done some engine work myself, scene graphs and render pipelines, and I wanted to see and approve the architecture before anything got built.
I approved the first version that night with all of Claude’s recommendations. The next day a platform spike tested it and changed more than a dozen things (the canvas now fills the whole window, and the 3D watchdog waits 1 second, not 2). That day I also picked 640x360 from comparison pictures and approved the final version. The nine engine milestones, M0 to M8, are done under that design, the last on the 16th.
Lost files
My Sprite Fusion exports were kept out of git. On the 10th the status file records that the crew’s idle sheets were gone from the machine, an empty folder since the 9th, probably lost along with a removed worktree. I re-exported them. The old rule is withdrawn, and the exports are committed now (Sprite Fusion’s terms allow use in a distributed game with no attribution, and the API key never goes in).

The four crew idle sheets live in public/art/crew/ now. Here is a battle on the 9th, before they went in, and one on the 11th after.
![]()
![]()
Small ones
DEVELOPING.md has a list of traps that have bitten before. One is to judge lint and typecheck by exit code and not the last line of output. Another is to never edit src/ while a Playwright run is going, because Vite hot-reloads and the run dies mid-test. Every PR adds its own changelog.d file too, since two PRs that both add a line under Unreleased conflict on every merge.
GitHub runs one short check job per pull request now, and main is protected by CLAUDE.md alone.