The merge that went to the wrong branch
On September 30 I merged the pull request for this site's caffeine calculator. Twelve seconds later I merged the homepage redesign, which was stacked on top of it. The second one merged into its base branch, the calculator branch, instead of main. The redesign never reached main, and it took a new pull request to get it there.
So I don't stack pull requests anymore. Each one stays independent. If one has to build on another, I wait for the first to land, then merge main into the second.
The setup
Claude Code is my main tool, on my Mac and in cloud sessions I start from my phone. Codex works on some branches. Grokbot reads GitHub directly and follows a brief kept in the repo it works in.
That covers Onset, which is on the App Store, three apps coming soon, two more in development, and this website. Every one of them follows the same rules, kept in one master file that each repo copies. When a rule changes, I change the master copy first.
GitHub is the only place work lives
My projects used to sit in ~/Documents. iCloud Drive syncs that folder, and it duplicates files and breaks git and Xcode. Every checkout now lives in ~/Developer, and nothing code-related goes in Documents.
The folder on my Mac is just a copy, and nothing stays local past the end of a session. That's also how the agents keep up. A cloud session only sees what's on GitHub, so anything left on my Mac doesn't exist for it.
Two files at the root of every repo
- AGENTS.md holds the rules: what the product is, the stack, how to check a change, and what never to do. It stays under 150 lines, and every tool reads it.
- STATUS.md is the handoff: the current checkpoint, what's in flight, the next action, and what hasn't been checked yet. It gets updated in the same pull request as the change it describes.
There's no CLAUDE.md in any repo. Claude Code 2.1.277 and later read a root AGENTS.md when there's no CLAUDE.md, and adding one would make it skip AGENTS.md. My only CLAUDE.md is in my home folder, and all it does is import my personal preferences.
I also stopped writing handoff files. If the next session needs to know something, it goes in STATUS.md, so there's one current version instead of a pile of notes.
One branch per tool, one pull request per change
Branches are named after the tool and the topic, like claude/morning-card or codex/day-line. I squash-merge every pull request myself, and docs-only changes get their own.
Passed, failed, or not run
Every session ends the same way: commit, push the branch, open a pull request, and say what was checked. Each check gets one of three words, passed, failed or not run, with the reason. "Done" on its own doesn't tell me whether the tests ran.
Cloud sessions can't build iOS apps, so they have to say that too, and the build goes to me or to Xcode Cloud.
What still needs me
Agents don't contact anyone, publish anything, spend money, change prices, submit App Store builds, change signing or touch production without my approval. They do most of the work up to that line, and I make the call on everything past it.