How I build software with coding agents A developer detailed a year-long setup for running coding agents like Claude Code and Codex CLI on real products, built around a single 32-core, 128 GB Linux box reached over Tailscale and managed with a terminal workspace tool called herdr. The workflow splits models by role — a Fable session lead that plans and merges but never writes feature code, Opus implementers in isolated git worktrees, and Opus adversarial verifiers — after an all-Fable delegation hit the 5-hour usage cap twice in one evening and killed five running implementers. Agents operate under a written per-repo charter, never commit on their own unless permitted, and sweep orphaned microsandbox VMs after every eval run. A write-up for a friend. This is the setup I have converged on after about a year of running Claude Code and Codex CLI on real products, some of them with the agents working for days at a time while I sleep. It is generic on purpose. Where I quote numbers they come from my own repos, measured on 2026-09-23. The short version: one Linux box, a terminal multiplexer built for agents, a written contract per repo that tells the agent how work is done, and a loop of grill → issues → orchestrated build → adversarial verification → merge → docs. The agent never commits on its own unless a charter says so, and it never marks something done that it has only read. One Linux box at home. 32 cores, 128 GB RAM, ~900 GB of disk. Everything agent-related runs here: the agents, the dev servers, the sandboxes, the GPU-fleet control scripts. Laptops are thin clients. Tailscale. The box has no public address. I reach it over the tailnet from any device. MagicDNS gives it a name, so ssh box works from the laptop and from other machines that need to talk to services on it a local Elasticsearch, a local Nominatim, dev servers on odd ports . herdr. A terminal workspace manager for AI coding agents. It gives me a hierarchy of workspaces one per project , tabs one per concern inside the project and panes a shell, an agent or a server . It detects the agent's status in each pane, so I can glance at a board and see which agents are waiting for me and which are still working. Both Claude Code and Codex CLI report their state to it through a session-start hook. There is also a herdr skill so an agent inside a pane can open a tab, spawn another agent in it, run a command there and wait for a match on its output or for that agent to reach "done". That is how a coordinator in one pane drives an implementer in another. Sandboxes. Agent products I build use microsandbox VMs for tool execution. Every eval run leaves VMs and 4 GB sparse disks behind, so cleanup is a written rule, not a habit: after any eval or dev-server session the agent sweeps orphaned VMs, deletes the directories no live VM holds, and says in its recap what it cleared. The disk filled up twice before that rule existed. Rented GPUs when needed. Batch LLM extraction OCR, structured extraction over millions of documents runs on rented L40S boxes with vLLM, driven from the home box by scripts the agents wrote. The agent launches the fleet, checkpoints progress in the target store, and audits the result against a gold set afterwards. Claude Code is the main driver. Global config: Fable 5.1 with a 1M context as the default model, effort xhigh , auto permission mode with a written trust-boundary brief what is prod, what is a live cluster, which commands are "soft deny" and need a human even in auto mode . Codex CLI runs beside it, on GPT-6 Astra. Same skills, same hooks, same herdr integration. I use it for second opinions on plans and for parallel implementation when I want two independent takes. The model split. This took a few painful iterations to settle: - The session lead Fable plans, dispatches, reads reports, reviews diffs, and merges. It does not write feature code. I have literally stopped it mid-turn with "do not code here, you're the orchestrator". - Implementers run on Opus, one per issue, each in its own git worktree. - Adversarial verifiers also run on Opus, one per implementer diff. - One Fable agent runs the final smoke test of the integration branch after a wave merges. The reason is the usage window. All-Fable delegation hit the 5-hour cap twice in one evening and killed five running implementers. Opus implementers plus a single Fable smoke at the end gets the same quality for a fraction of the budget. When I name a model in the request, that wins. Subagent briefs are self-contained. A delegated prompt assumes the subagent has no chat context. It carries the repo path, the objective, the files in and out of scope, the exact evidence format to return files, line refs, commands run, diffs, failures, screenshots, uncertainties , the verification commands, and stop conditions: if the code does not match the brief, a command fails twice, or the task needs out-of-scope files, stop and report instead of improvising. Reports are leads, not facts. The lead reopens the cited files before acting on a finding. Every repo has a CLAUDE.md or AGENTS.md for Codex-first repos . The important design decision: it is an index, not a manual. It says what each surface is, which files own it, the operative rules, and where the long version lives. A unit test pins its size 64 KB in one repo, 72 KB in another and a change may add at most ~10 lines. Narratives, measurements and incident stories go to docs/architecture.md and a docs/journal/ directory. The old 600 KB version is frozen in an archive file that the agent may grep but never edit. Per-surface rules load on demand from docs/agents/ .md routes, data, conventions . The index says "read the matching annex before touching its surface". This keeps the always-on context small and the detailed rules complete. The rules that recur across every repo: - Issue before code. The issue is the unit of work. Body: the observed problem without the proposed fix, acceptance criteria someone else can check, out of scope. Too small for an issue means too small for its own PR. - Branch from dev , named feat|fix|chore|docs/