Building Software With a Team of AI Agents
What happens when agents stop being the bottleneck, and what I'm learning about planning, shared memory, review and cost.
By Hamed Taheri. Working draft, revised October 15, 2026. PR counts through October 15; other numbers through October 14. Full playbook · Give to your AI
431merged in October 1–15, against 154 in all of September.
- April–September. More sessions in parallel, sessions that message each other, single sessions that work longer and check their own work, and guardrails.
- October. Shared memory for the agents and a new system to run them: scripted pipelines that prepare, build and review each task.
I don't write the code. Agents do most of the implementation; I decide what to build, define it so an agent can finish it, and check what comes back. Almost a year ago, I began redesigning our development process around that split: from one session per feature to scripted pipelines that prepare, implement and review work in parallel.
In October, my account passed September's merged-PR total within 11 days. Earlier gains came from running more sessions in parallel, letting them message each other, and getting single sessions to work longer, check their own work and stay inside guardrails. In October, the agents got shared memory and a new system to run them: scripted pipelines that prepare, build and review each task. That's when output jumped.
The bigger surprise was where the work waited. In the pipeline's first nine days, more than half the runs ended with an approval carrying a condition only a person could clear. The agents stopped being the constraint; my decisions became the queue.
This is the method behind those numbers, the failures that shaped it, and what I haven't measured yet.
What changed in my work
$16.38 → $5.30
Per task, coordination included
October 5: one long coordinating session, about 20 tasks. October 10–13: scripted pipeline, 64 tasks marked done.
$1.86 → $0.48
The same task, lean worker
8 model calls instead of 21, less than half the peak context, and every acceptance check met.
37
Stops instead of guesses
Workers that hit a gap in the brief handed the task back. Each stop cost cents; a guessed migration costs far more.
API-priced usage, not invoices. The two cost windows count tasks differently; this is not a matched comparison. How I counted ↗
How the work flows
Me + coordinator
49.6% of spend
Plans with me, writes specs, launches runs. Never reads code or diffs.
Preparer
$0.18 median
Turns the spec into a six-field brief, or answers NOT READY.
Worker
$0.43 median
Capped, lean, own worktree. Implements one brief and opens a draft PR.
Reviewer
$0.11 median
No edit tools. Reviews the exact revision: MERGE, MERGE AFTER or DO NOT MERGE.
Gate + me
human time
I clear conditions and merge to an integration branch. Release is a separate, supervised step.
Agents review every PR against its acceptance checks. I read the gate: the verdicts, the conditions and the PRs held for me. Nothing reaches production without a person.
120 / 206were approved by the AI reviewer, then waited for my decision.
- 120 Approved, waiting on a decision only a person can make
- 31 Approved, nothing blocking: ready for my gate
- 37 Stopped at a gap in the brief instead of guessing
- 18 Other: no PR, spec not ready, or an error
The seven practices I use
Each practice came from a failure. Four of them:
$36.70
An agent refreshed 8,336 cached pages one at a time. One wildcard would have cost about half a cent.
Now: A hook blocks it before it runs.
9 rounds
One PR, patched one finding at a time. Each review found the next problem; two patches added new serious bugs.
Now: One deep review, one complete fix, one confirmation.
0 columns
A spec said a sibling task creates the table, without listing its columns. The worker guessed; mocked tests passed.
Now: Paste the exact table definition into every spec that uses it.
90 MB
Free disk left mid-run: 251 leftover worktrees and a 301 GB container disk. A review failed to start.
Now: Check free space before every batch; prune after.
1. Prepare a task an agent can finish
A worker once invented column names for a table another task created, because my spec named the table without listing its columns. Mocked tests passed. Now every worker gets outcome, acceptance checks, spec, files, verification commands and branch, and a shared table comes with its exact definition.
- 1Outcome
- Part B writes every imported row to the import table, with a status per row.
- 2Acceptance
- 1. Valid rows land as imported. 2. Invalid rows land as rejected, with a reason. 3. Queries run against a real Postgres, not mocks.
- 3Spec
- The accepted import spec and plan, pinned to a commit.
- 4Files
- Exact path:start-end ranges, plus the CREATE TABLE copied from part A.
- 5Verification
- The test command for the import module, then one run against a disposable Postgres.
- 6Branch
- Its own worktree and branch; the PR stacks on part A’s branch.
Product decisions are where I spend most of my time. My session asks them in rounds of three or four multiple-choice questions, each option with a why-yes and a why-no. On October 14, I groomed about 59 tasks in seven rounds. Prepare work
2. Give each session a focused job
My coordinating session plans and routes; it never implements. Separate headless processes prepare, implement and review, each with only the tools it needs, a budget and its own worktree. A default worker inherits every tool and instruction. Trimming that took the same task from $1.86 to $0.48.
Same task, two worker setups
Task mq4d · lean run on Sonnet 5.5Model calls
Peak context
Cost
claude -p worker missed one acceptance check; the lean worker met all of them. Lean means six tools, no MCP servers, a fixed 1,200-token worker card, capped file reads, and the brief plus exact code ranges in the prompt.Discovery and changing requirements stay interactive. Execution and scripts
3. Review the whole change before patching
One PR took nine fix rounds and about $6.68 because each review found the next nearby problem. Now I use one deep review, one complete fix and one confirmation, with depth matched to risk. A new finding in the same area goes to a person for design review, never to round three. Tests must exercise the layer that changed: mocks hid the table bug above. Review and delivery
4. Count the workflow, including failed attempts
A cheap worker can hide expensive coordination. In the October 10–13 window, my coordinating session was 49.6% of all spend, so it now routes and never reads code. I count preparation, failed attempts, reviews and the coordinator, and keep money paid, API-priced usage and accepted work as three separate numbers. My target is $1–2 per task with a hard cap of $5; over $2 means the task should be split. Cost and evidence
5. Keep useful state outside the conversation
Team memory holds tasks, owners, decisions, handoffs, messages and guidelines. A new session retrieves the state it needs instead of the whole conversation, and a handoff keeps the evidence and the next action.
I use Personize, the entity-driven memory layer we build; our own development became its use case. A table and a markdown file are enough for one developer with one tool. Shared identity, safe claims and governed retrieval start to matter when several people and tools share the same work. Queue claims aren't atomic yet, so I run one coordinator. Memory and kit
6. Put important limits in code
An agent spent $36.70 refreshing cached pages one at a time when one wildcard would have cost about half a cent. A sentence in the instructions hadn't stopped it; a hook now does. Scripts, permissions and human approval guard anything expensive or irreversible. These guardrails aren't a sandbox: on a shared machine, run workers in containers with scoped credentials. Guardrails
7. Save the lesson and test it again
Every rule above started as a recorded failure: the change, the outcome, the cost and what broke. An agent can draft a sanitized finding; a person decides whether to share it. I'd like other teams' findings too, especially the ones that contradict mine. Learning and contributions
What this does and doesn't show
How every number was counted: evidence and definitions.
Where this is going
We work with tens of agents today. The direction I'm building toward is hundreds or thousands working in parallel alongside developers, sharing context and coordinating complex work. Those held runs show what has to change first: human decision capacity, not agent capacity. That means batched decision inboxes, versioned claims so several coordinators can run safely, and budgets that cover a whole fleet.
Try one change, or pass this to your AI
Pick one bottleneck and three checkable tasks. Track acceptance, every attempt, cost and your own time before adding parallel work. The workflow assessment finds your main constraint in twelve questions, and the pilot guide walks through the test.
Read https://hamedtaheri.com/playbook/v0.1.0/agent/start.md.
Compare these practices with our workflow, following our project rules.
Propose one change and three tasks to test it. Include acceptance checks,
a total budget covering review and retries, and cost and human-time measures.
Don't start paid runs yet.
The templates, memory starter and measurement tools are in the starter kit. The production runner scripts aren't public yet; ask me if you'd like to see them.
I'm curious how much further experienced developers, product managers and CTOs could take this. Read the full playbook, or book a call to compare notes.