A delivery orchestrator for solo developers & small teams
AI should do the implementation.
You should own the decisions.
The default for AI-assisted development is one of two failure modes: you're either babysitting the agent line by line, or you've handed it the wheel and are hoping for the best. Son of Anton is neither. There are exactly three moments where a developer's judgment is irreplaceable — the orchestrator owns everything in between.
$ /soa plan
# grill-me → approved plan
$ /soa decompose docs/product/plans/phase-N.md
# ticket stack → you approve the list
$ /soa execute phase-N
# orchestrator delivers ticket by ticket
$ /soa closeout phase-N
# stacked PRs squash-merge to main
▮ HUMAN GATE: APPROVAL REQUIRED
Approve the WHAT
A grill-me session forces the AI to surface assumptions, constraints, and scope decisions back to you before any ticket is written. You say yes or refine. The AI does not proceed until you have.
Approve the HOW
The approved plan becomes a ticket stack — ordered, dependency-aware, sized for review. Architectural judgment belongs to you. Ticket authorship belongs to the agent.
Approve DONE
An adversarial subagent reviews every ticket before its PR opens. When the phase is complete, you decide whether to accept. Closeout squash-merges the stack onto main. Nothing merges without you.
What you get
Son of Anton ships as a git subtree — no npm package, no submodule, no external service. The files are real tracked files in your repo history that you can read, diff, and bisect.
- 01
Delivery orchestrator
A TypeScript CLI that drives the ticket loop, manages worktrees and branches, records review outcomes, and enforces stop conditions. Runs via Bun or Node.
- 02
Skill layer
Behavioral instructions in .agents/skills/ that any agent can read, plus per-agent adapters for platforms with their own file conventions.
- 03
Adversarial subagent review
After each ticket, a second AI pass checks the implementation assuming the first one cut corners. Every review leaves artifacts: prompt, report, and ledger. The reconcile step hard-blocks the PR if the ledger would silently disagree with git history.
- 04
Stacked PR model
Each ticket gets its own branch and PR, stacked in dependency order. Closeout squash-merges the whole phase onto main cleanly.
- 05
Migration runner
When Son of Anton ships structural changes, bun run sync applies them to your repo automatically. You pull and run; the migration runs itself.
- 06
Agent-rule injection
Sync injects skill-trigger rules into AGENTS.md so every agent in your repo knows which skills to invoke and when. Idempotent — re-running is always safe.
Runtime policy, not config archaeology
orchestrator.config.json is the durable repo default. One-off operational choices are explicit flags — no config edits, no commits. The resolved policy is written to state.json at the start of every run.
If config and run policy diverge mid-phase, /soa resume refuses to continue silently and prints both policies with exact recovery commands.
Start with gated until you trust the agent on your codebase.
RUNTIME OVERRIDES — NO CONFIG FILE EDITS REQUIRED
$ /soa execute phase-N --boundary-mode gated
$ /soa execute phase-N --subagent-review-policy disabled
$ /soa execute phase-N --subagent claude-cli
$ /soa resume phase-N --boundary-mode cook
$ /soa resume phase-N --baseline orchestrator
$ /soa resume phase-N --baseline run-policy
Subagent runners: claude-cli · codex-cli · cursor-cli. The CLI tries the preferred runner first, then the others, and refuses to record "clean" when none actually complete.
Integration — Codogotchi
Your delivery pipeline has a pulse. Now it has a pet.
Son of Anton integrates with Codogotchi, the macOS desktop companion that reacts to your AI coding agent in real time. At every stage of the ticket loop the orchestrator writes a gate event to ~/.codogotchi/gate.json — and your pet acts it out on your menu bar.
Red TDD, green TDD, adversarial review, PR opened, review clean: nine gate events, each with its own mood. Best-effort and local-only — a write failure never aborts a delivery command, and you can switch it off with one line of config.
{
"gate": "ticket_started",
"plan_key": "phase-N",
"ticket_id": "pN-04"
} Runs on the agent you already use
What Son of Anton is not
- 01
Not a code generator. It does not write boilerplate or scaffold projects.
- 02
Not a fully autonomous agent. The three gates are real stops where a human decision is required. There is no "just ship it" mode.
- 03
Not a cloud service. Everything runs locally. Your code never leaves your machine except where it already does — GitHub PRs and your AI provider.
- 04
Not opinionated about your stack. TypeScript is the orchestrator's runtime; your application can be anything.
- 05
Not tied to one agent. Runs on Codex, Cursor, Copilot, Claude, OpenCode — anything that reads AGENTS.md. Swap agents mid-project if you want.
Install
Two commands. The subtree embeds at .son-of-anton/ — no submodules, no external service, no install step that can break.
Requirements: GitHub repo + gh CLI · Bun or Node · any agent that reads AGENTS.md · working lint, format & test commands
$ git subtree add --prefix .son-of-anton https://github.com/cesarnml/son-of-anton.git main --squash$ /soa update # canonical — fetch, merge, sync, verify $ bash .son-of-anton/scripts/soa-sync.sh # manual equivalent (sync only)
Wires the skill layer for your agents, injects rules into AGENTS.md (and CLAUDE.md for Claude Code), creates the orchestrator symlinks, and runs any pending migrations.
$ /soa plan # if you have a concrete idea $ /soa ideate # if you need to shape the idea first