How I work with coding agentsThe system is mine: the architecture, the rules and the review.
I run Claude Code as a pair programmer, inside rules, skills and hooks I wrote. It proposes and executes; I decide, and nothing merges without my review. Below: the skills I wrote for it, the mistakes that became rules, what is enforced rather than asked, and where it still fails.
- Agent
- Claude Code
- Its role
- Pair programmer. Never merges alone.
- Reviewed by
- Me, every change
- Works in
- Parallel git worktrees, one task each
From ticket to merge
The system I built, then one real run of it, with each decision I took.
- feature-prior-art11 ranked rules from how developers show their agents, sources cited
- ui-ux-designJourney, wireframe and two placements, sent for review
- Alexandre“Placement A. Build it.”
- 2 agents in parallelOne draws the figure, one the mascot; the page is built here
- Alexandre“Drop the counts. Skills first, like a video game.”
- ux-reviewer6 findings: 2 fixed, 1 declined with its reason
- Alexandre“Credit me. Cut the skills that read as chores.”
- pr-lifecyclePR opened, before and after attached, no conflict
- Alexandre“I review first.”
Skill tree
Every skill the agent can use. I designed and wrote the first six classes; the last one is Anthropic's official review, security and skill tooling I run on every change.
ArchitectShape it before it is built
- feature-prior-artActiveResearches how established products solve a screen or a flow, and returns ranked rules with sources.
- ui-ux-designActiveJourney, hierarchy, every state and a wireframe, approved before any code.
- product-coherenceActiveMaps a feature against every path in the product: no second route to the same outcome, no copy that over-promises.
DebuggerProve it, then fix it
- bug-diagnosisActiveA command that fails on the bug first, one falsifiable hypothesis at a time, then the same command passing.
Read an excerpt of the skill
## 1. Build a command that fails on this bug One command you have run at least once, that is: - on the user's exact symptom: it asserts what they saw, not "it does not crash", so it cannot pass while this bug is still there; - deterministic: same verdict every run; - fast: seconds, so it can run after every change; - unattended: you run it, not the user. ## 3. Hypotheses that can be wrong Write three to five, ranked, before testing any: a single one anchors on the first plausible idea. Each states its prediction: "if X is the cause, changing Y makes the bug disappear".
- mobile-devicesActiveDrives iOS simulators and Android emulators through their view hierarchy as text, never by window clicks.
- ux-reviewerCompanionA fresh-eyed reviewer that checks every built screen against the design rules it did not write.
- fact-checker-verifierCompanionChecks every figure and date against two sources before anything is published.
ShipperFrom branch to merge
- pr-lifecycleActiveFrom first push to confirmed merge: CI watched after every push, conflicts resolved, merged only on my word.
- worktree-isolationActiveRuns a dev server or a migration in its own worktree, on its own port and database.
- before-and-afterActiveCaptures a UI change before and after and attaches both to its pull request.
OrchestratorMany agents, one direction
- coordinatorActiveSplits a feature into tasks, one agent per worktree, then reviews and merges their pull requests.
- parallel-agentsActiveRuns independent fixes in parallel subagents, then integrates and verifies once.
- handoffActiveSends side work found on the way to its own worktree and agent, never into the branch in hand.
- foremanActiveWatches every background session across projects, spots what is stuck and proposes the next move.
OperatorPlan the day, improve the system
- daily-planActiveEach morning, ranks the day's work from open PRs, production errors, issues and product data.
- weekly-agent-auditActiveReads a week of sessions and proposes fixes to my own rules and skills. Nothing changes without approval.
GuardianHooks that are always on
- machine-locksPassiveQueues simulators, databases and ports between parallel sessions, and blocks commands that would hit them all at once.
- review-nudgePassiveRaises a review prompt as soon as a diff grows past a size worth a second look.
- where-we-arePassiveKeeps a live line on where the work stands and what the next action is.
- config-syncPassiveCommits and pushes any agent config change left behind when a session ends.
From AnthropicOfficial, run on every change
- code-reviewOfficialReviews every diff for correctness bugs before it merges, up to a multi-agent review in the cloud for large changes.
- claude-securityOfficialScans a codebase or a change for vulnerabilities, then turns findings into patches checked by a panel of agents.
- skill-creatorOfficialBuilds and benchmarks new skills with evals, so a skill is measured before it is trusted.
- claude-apiOfficialReference for building product features on the Claude API: models, tool use, prompt caching.
Third-partyanatomy
Mistakes that became rules
- MistakeThe agent read a stale database client as a live foreign-key violation, and a stale mail library as broken auth.Rule nowRestart the dev server after a schema, client or dependency change, before concluding anything.
- MistakeIt handed back screenshots it had not looked at, and I spotted the fault first.Rule nowRead every capture you take and say what is on it, including what you did not expect.
- MistakeIt called a mobile app done because the build and the tests were green.Rule nowLaunch it on the platform it ships to and read a capture before saying it works.
Asked, and enforced
- Asked, in a ruleStop only what you started: end a process by its PID or its own port, never by name, because parallel worktrees run the same servers.
- Enforced, by a hookBefore any shell command runs, a hook checks it against the machine's locks. Commands that would hit every session at once, such as killall Simulator or adb kill-server, never run.
Where it still fails
- It can be confidently wrong. That is why I review and merge every change myself.
- A green test suite says nothing about an app on its device: it has to launch the app and look.
- It forgets between conversations unless a rule or a memory note carries it over.
- My hooks read the command text: they stop a slip, not a script written to get around them.
Tooling I built for it
- herdr-flutter ↗: open source: a coding agent watches and hot reloads a running Flutter app
- RunnerDock: self-hosted GitHub Actions runners on Apple Silicon
- worktree-ports: parallel git worktrees with their own ports and databases
- ask-me-by-phone: the agent calls me when it is blocked
- hermes-os: a persistent product studio of agents
References
- herdr-flutter, open source ↗lets a coding agent watch and hot reload a running Flutter app
I researched this page with feature-prior-art, designed it with ui-ux-design, had agents build it in parallel, and reviewed every change before merging it.