CustomLabs
Agentic delivery

How we ship with a fleet of coding agents: first-hand, not vendor marketing.

Six control surfaces, 22 practices, five ways a fleet fails, and the metrics that catch review debt before it becomes a queue. This is the operating model behind every merge request on this site, not a pitch for one.

Most writing about managing AI coding agents is vendor marketing for an orchestration product. This is neither. It's the operating model this studio actually runs, the same one that landed the merge request that shipped this page. The honest finding, confirmed by every fleet we've run and every one we've read about: once generation is cheap, review throughput is the bottleneck, not model capability.

Six control surfaces, each with a named owner and a specific failure it prevents. Skip one and the fleet doesn't get slower. It gets faster at producing work nobody can trust.

The operating model

Six control surfaces.

Each one governs something different. A fleet that's missing one doesn't fail loudly; it fails quietly, in a way that looks like progress.

01

Task definition

Owner: Whoever writes the task — a tech lead, or the engineer requesting the work

What acceptance criteria a task carries before an agent starts, and whether 'done' has a checkable definition

  • The agent asks clarifying questions mid-run, or silently guesses, because the task never said what 'done' means
  • Work that technically satisfies the prompt but misses the actual goal ships anyway
  • Two agents given the same vague ask interpret it two different ways, and both get merged
02

Isolation

Owner: Whoever owns the sandbox and orchestration layer — the fleet operator

Whether two agents can ever touch the same mutable state at the same time

  • Two agents edit the same file in parallel and one's work silently overwrites the other's
  • A blanket `git add -A` on one agent's branch sweeps up another agent's uncommitted work
  • A shared dev database is left half-migrated because two unrelated tasks ran against it at once
03

Stage gates

Owner: The orchestration harness and pipeline definition — not any one agent

The sequence a task moves through, and what a fresh context inherits at each hand-off

  • An agent 'finishes' a task in its own reasoning but never opens a request — the work never lands
  • A stage that can't advance sits idle burning wall-clock instead of releasing the slot
  • A mistake made during planning survives every later stage unchallenged because review inherited the same context and the same blind spot
04

Review throughput

Owner: Whoever owns the review queue — a tech lead, or the review-stage configuration

How many tasks can be in flight without the review queue growing unboundedly

  • Merge lag climbs every week while 'tasks shipped' climbs too — throughput up, delivery down
  • PRs get rubber-stamped because there are more of them than any one person can actually read
  • The same category of bug ships repeatedly because review only ever looks at the diff, never the pattern behind it
05

Durable memory

Owner: Whoever curates workspace memory — often a lead engineer or the fleet operator

Whether a decision made once has to be re-litigated by every subsequent session

  • The same architectural debate happens again, nearly verbatim, a few tasks later
  • A convention agreed on six tasks ago quietly drifts because the reasoning behind it was never persisted anywhere durable
  • Institutional knowledge lives entirely in one tool's per-session context and evaporates the moment that session ends
06

Spend & blast radius

Owner: Whoever sets the harness's budget defaults — the infra or platform owner

The ceiling on any single loop's steps, tokens, wall-clock, and cost, and the gate every landing path must pass through

  • A retry storm turns a two-dollar task into a two-hundred-dollar one before anyone notices
  • An agent pushes directly to the default branch and CI catches the break only after it is already live
  • A runaway loop keeps going because nothing was watching the clock, only an exit condition that never fires
Practice bank

22 practices, six surfaces.

Filter by maturity (crawl, walk, run), then copy the visible list as a Markdown adoption checklist.

01 Task definition

Output quality is capped by task specificity, not by model capability. An agent given "add authentication" will produce something that runs — and something that has nothing to do with what you actually needed, because it filled in the gaps itself, quietly, the way anyone would when the ask is underspecified. A task is a spec: background, a named goal, explicit constraints, and an acceptance criterion someone — or something — can check without asking the requester what they meant. A chat-prompt task feels faster to write and is the single most reliable way to get a confident, well-executed answer to the wrong question.

Why
Prevents excellent, confident work against a goal nobody actually agreed to, because 'looks right' was the only bar anyone could check against.
Signal you don't have it
Reviewers arguing about whether a PR 'does what was asked' after the code is already written, instead of before anyone started.
The control
A required acceptance-criteria field on every task, checked by a verification command named in the task itself.
Evidence
The task template with a mandatory, non-empty acceptance-criteria field, and a sample of tasks where the criterion is a command, not a sentence.
Why
A single paragraph lets 'constraint' and 'nice-to-have' blur together, so the agent can't tell what it's actually not allowed to change.
Signal you don't have it
An agent's hand-off comment restates the task back to you almost verbatim, because it had to guess which sentence was the real constraint.
The control
A task schema with named, separately-required fields instead of one free-text box.
Evidence
The task-creation template, and a sample task where scope, goal, and constraints are visibly distinct fields rather than one paragraph.
Why
The task is the interface between what you meant and what gets built; a chat prompt substitutes for that interface instead of feeding it.
Signal you don't have it
Every completed task needs a follow-up round of "that's not quite what I meant" before it's usable.
The control
A gate before the code stage that bounces underspecified tasks back for a written spec, rather than letting an agent start guessing.
Evidence
The rejected-task log, or a sample of tasks bounced at intake for missing required fields.
Why
An unnamed verification step gets decided by whichever agent reaches the verify stage, which means it can quietly change task to task.
Signal you don't have it
Two agents on similar tasks report 'done' using two different definitions of passing.
The control
A required verification-command field, run identically at the verify stage regardless of which agent wrote the code.
Evidence
The verify-stage config or script that runs the task's own named command, not a generic smoke test.

02 Isolation

Fleets of coding agents fail on shared mutable state long before they fail on reasoning. Two agents editing the same file, a shared dev database mutated by two tasks at once, one agent's blanket add sweeping up another agent's uncommitted work — none of these are model failures, and no amount of better prompting fixes them, because the failure is architectural: two writers, one piece of state, no ownership boundary between them. The fix is unglamorous and non-negotiable: one task, one branch, one working tree, one sandbox — so a task that misbehaves has a blast radius of exactly one task.

Why
Fleets fail on shared mutable state, not on reasoning; a shared checkout is the single most common way two agents collide.
Signal you don't have it
A commit shows up on your branch that you didn't write and can't explain.
The control
One sandbox provisioned per task at task start, torn down at task end, with no shared filesystem between concurrent tasks.
Evidence
The sandbox-provisioning config showing a strict one-to-one task-to-sandbox mapping.
Why
A broad add sweeps up whatever another agent left uncommitted in a shared or adjacent workspace, attributing their work to your task, or losing it outright.
Signal you don't have it
A PR contains changes to files nobody discussed in the task description.
The control
Commit hygiene enforced by convention and spot-checked at review: named files staged explicitly, never a wildcard add.
Evidence
A sample of recent commits showing explicit file lists rather than blanket adds.
Why
A shared dev database left half-migrated by a second, unrelated task is indistinguishable from a bug in your own change until someone loses an afternoon to it.
Signal you don't have it
A task fails intermittently, and the fix that 'worked' was rerunning it, not changing any code.
The control
Per-task ephemeral environments, or a locking and queueing layer in front of any environment that genuinely can't be duplicated.
Evidence
The environment-provisioning setup showing task-scoped, not shared, database instances.
Why
A later stage that can inspect an earlier stage's still-open session recreates the shared-mutable-state problem isolation exists to prevent, just moved one level up.
Signal you don't have it
Debugging a review-stage failure requires re-opening the original code-stage session instead of reading its hand-off comment.
The control
Stage boundaries enforced at the infrastructure level — a new context, a new process, reading only the written artifact.
Evidence
The stage-transition mechanism showing each stage spawns a fresh session with no reference to the prior session's live state.

03 Stage gates

A fleet needs named stages with named exit artifacts, not an agent that decides for itself when it's done. Plan produces a plan; code produces a diff and an open request; review produces a verdict; merge produces a merged change; verify produces a pass or a routed-back failure — and every stage starts a fresh context that inherits nothing except what the previous stage wrote down. A stage that can't advance releases the slot instead of looping in place waiting for input that isn't coming. Skip a stage, or let an agent self-certify that a later one isn't needed, and the fleet quietly reverts to one long, ungated context nobody can audit.

Why
Prevents the agent that 'finished' the work in its own reasoning but never produced anything the next stage, or a human, can act on.
Signal you don't have it
A task shows recent activity in its logs but nothing else exists anywhere — no request, no comment, no artifact.
The control
A stage gate that only transitions when its named artifact is actually present and checked, not when the agent claims completion.
Evidence
The stage-transition rule enforcing artifact presence before advancing, and its rejection log.
Why
A mistake made during planning survives every later stage unchallenged if review inherits the same context and the same blind spot that produced it.
Signal you don't have it
Review consistently agrees with code's own self-assessment instead of catching anything code missed.
The control
Each stage runs in a new session; the only input from the prior stage is its written comment, not its transcript.
Evidence
The session-boundary implementation, and a hand-off comment sample showing what actually crosses the boundary.
Why
An idle stage holding a slot blocks that capacity from any task that could actually use it, and looks identical to progress from the outside until someone checks.
Signal you don't have it
A task's last-touch timestamp is old but its status hasn't changed and nothing is queued behind it.
The control
An explicit release action that frees the execution slot without advancing the task, logged with a reason.
Evidence
The release log showing reasons, and the resulting slot reallocation.
Why
The stage an agent skips is, almost by definition, the one that would have caught what it missed — self-assessment is a poor substitute for an independent stage.
Signal you don't have it
A change reaches merge with no review-stage artifact anywhere in its history.
The control
The pipeline enforces stage order structurally — a task cannot enter a later stage without the prior stage's exit artifact recorded.
Evidence
The pipeline definition itself, and an audit of a sample of merged tasks showing every stage represented.

04 Review throughput

Once generation is cheap, review is the bottleneck — and adding agents without adding review capacity doesn't raise throughput, it grows a queue of unread work with a friendlier name attached to it. The fix is layered: machine review first, adversarial and independent, catching what a first pass misses before a human ever opens the diff; a human reviewing decisions and the diffs that actually carry risk, not rubber-stamping every line of every PR because there are more of them than there is attention to spare. A fleet sized past its actual review capacity is not shipping faster — it's converting engineering hours into an ever-growing pile of merge requests nobody has read.

Why
Generation scales far faster than review capacity; uncapped concurrency just moves the bottleneck into an ever-growing queue with a faster-looking front end.
Signal you don't have it
Merge lead time trends upward for weeks while 'tasks completed' trends upward too.
The control
A concurrency ceiling tied to a measured reviewer capacity, revisited when that capacity changes — not a fixed number picked once.
Evidence
The concurrency-limit config, and the review-lead-time trend it is set against.
Why
A human reading every line of every PR doesn't scale past a handful of agents; a machine pass that actually tries to find problems, not rubber-stamp, catches the bulk of what a human would otherwise have to find by hand.
Signal you don't have it
Every PR reaches human review in roughly the same state it left the code stage — nothing gets caught or fixed in between.
The control
A dedicated review stage staffed by an independent reviewer, agent or process, whose explicit job is to find problems, run before the human gate.
Evidence
The review-stage findings log showing issues caught and fixed before human review.
Why
One reviewer's blind spot is invisible to that reviewer by definition; a second independent pass with a different vantage point is the only reliable way to catch it.
Signal you don't have it
The same category of bug recurs across several merged changes despite every one of them passing review.
The control
A second review pass with a distinct lens — security, correctness, scope — required before merge on changes above a defined risk threshold.
Evidence
The multi-pass review configuration, and a sample showing disagreement caught between passes.
Why
Spreading finite human attention evenly across all output means the highest-risk change gets the same scrutiny as the lowest — not enough for the former, wasted on the latter.
Signal you don't have it
A reviewer's calendar is full of low-risk approvals while a genuinely risky change waits in the same queue.
The control
Risk-tiering that routes low-risk, well-covered changes to a lighter gate and reserves full human attention for the changes that need it.
Evidence
The risk-tiering rule, and the review-time distribution it produces across tiers.

05 Durable memory

A fleet that forgets re-litigates the same decision every session, at the same cost, and arrives at a different answer half the time because the reasoning that settled it last time lived in a context window that no longer exists. Conventions drift the same way: every fresh agent invents its own idiom for a problem the last one already solved, because nothing durable told it otherwise. The fix is memory that outlives any single session — shared, versioned, workspace-level, curated rather than left to grow into an unread pile — not a per-tool cache that dies the moment the process exits.

Why
Code shows what was decided but not why; the next agent that hits an adjacent decision re-litigates it from scratch without the reasoning that settled it the first time.
Signal you don't have it
The same architectural debate happens again, nearly verbatim, a few tasks later.
The control
A memory-write step that is part of finishing a task, not an optional extra someone does when they remember to.
Evidence
The memory store showing decisions with their stated reasoning, not just conclusions.
Why
A convention that only lives in one session context is invisible to every other agent and gone the moment that session ends.
Signal you don't have it
Two agents working the same week produce two different idioms for the same problem, neither aware the other existed.
The control
A memory layer addressable by every agent in the fleet, independent of which tool or session wrote to it.
Evidence
The shared memory store's access pattern showing reads from sessions that did not write the original entry.
Why
Memory nobody curates becomes memory nobody trusts enough to read, which is functionally the same as having none.
Signal you don't have it
New entries keep getting written that contradict older ones nobody removed.
The control
A review step, human or agent, that periodically reconciles memory the same way code gets reviewed.
Evidence
A changelog of memory edits — merges, corrections, retirals — not just a growing append-only log.

06 Spend & blast radius

Every agent loop needs an explicit ceiling — steps, tokens, wall-clock, cost — enforced by the harness, not requested of the model, because a model has no reliable internal sense of "I've tried this six times, stop." And every landing path needs a gate no agent can bypass: no direct pushes to the default branch, CI as the arbiter, a forced terminal state when a budget runs out instead of a loop that idles indefinitely. Skip either one and the failure mode is the same shape twice — a retry storm that turns a two-dollar task into a two-hundred-dollar one, or a 3am unreviewed change that only gets noticed once it's already live.

Why
A model has no reliable internal sense of "I've tried this six times, stop" — an unbounded loop keeps retrying a failed approach because the failed attempt sits in context looking like fresh information.
Signal you don't have it
A single task's cost or run time is an outlier ten times larger than a similar task, with no corresponding increase in complexity.
The control
A budget enforced by the orchestration harness, independent of the model, with a forced terminal state when the budget is hit.
Evidence
The budget configuration, and the distribution of terminal states — success, failure, escalated — across recent runs.
Why
A direct push skips every gate the fleet relies on — review, tests, verification — in one step, and it only takes one to put an unreviewed change into production.
Signal you don't have it
A commit on the default branch has no corresponding merge request anywhere in the history.
The control
Branch protection that rejects direct pushes at the git-host level, not just a convention agents are told to follow.
Evidence
The branch-protection rule configuration, and a git history showing one merge request per landed change.
Why
A retry-amplified task that costs forty times its estimate is invisible in a monthly aggregate until the invoice arrives; per-task tracking catches it while it is still one task, not a pattern across many.
Signal you don't have it
The first sign of a cost problem is a monthly bill, not a per-task alert.
The control
A per-task cost ledger checked against budget in real time, with an alert or hard stop when a task exceeds it.
Evidence
The cost-ledger dashboard or report, broken out per task, not just aggregated.
Five ways a fleet fails

Not model failures. Operating-model failures.

Every one of these looks, from the outside, like an agent capability problem. None of them are.

Review debt

Looks like: Merge lag climbs while "throughput" improves — more tasks completed, longer queue of them waiting to actually ship.

Guardrail: Cap in-flight tasks at the review capacity you actually have; run machine review before human review.

Green tests, broken feature

Looks like: The agent writes the tests it then passes, so a suite that is all green tells you nothing about whether the feature is right.

Guardrail: Author acceptance criteria before the code stage, by a different context; make verification its own stage.

Convention drift

Looks like: Every agent invents its own idiom for the same problem, because nothing durable told it what the last one decided.

Guardrail: Durable memory plus house conventions the fleet reads, enforced by lint and CI rather than by hope.

Silent scope creep

Looks like: The agent improves things nobody asked for, and the diff is twice the size the task actually needed.

Guardrail: Name the scope in the task; diffs outside the stated files get bounced at review.

Retry-amplified spend

Looks like: A loop that costs forty times the estimate, discovered on the monthly invoice instead of while it was happening.

Guardrail: Hard ceilings, a per-task budget, and "release, don't stall" instead of idle looping.

The metrics that matter

Six numbers, and how each one lies.

Every one of these is measurable today. Every one has a way of looking better than it is.

Human-to-agent ratio

Tells you
How many concurrent agents one reviewer can actually hold before quality drops.
Lies when
A high ratio looks efficient right up until merge lag and rework rate reveal the reviewer is actually the bottleneck.
Act by
Add review capacity — a person, or a machine-review pass — before adding another agent, not after.

Review lead time

Tells you
How long finished work waits, ready to merge, before it actually ships.
Lies when
A short median doesn't tell you how many tasks are stuck in the queue behind it, not being counted in that average.
Act by
Watch the trend on the slow tail, not just the average — a growing p90 is the queue backing up even while the median still looks fine.

First-pass merge rate

Tells you
The percentage of tasks that land with no rework round — how often the first attempt is actually good enough.
Lies when
A rising rate can mean better task definition, or it can mean reviewers waving weaker work through to keep the number up.
Act by
Pair it with escaped-defect rate before trusting it — rising first-pass rate alongside rising escaped defects is the reviewer giving up, not the fleet improving.

Round-trips per task

Tells you
How many times a task bounces between stages before it lands — the rework rate.
Lies when
Zero round-trips isn't necessarily good — it can mean the review pass wasn't looking hard enough to send anything back.
Act by
Investigate any task with three or more round-trips individually — that is almost always a task-definition problem, not an agent-capability one.

Cost per merged change

Tells you
What a shipped change actually costs, every attempt and every round of rework included.
Lies when
Cost per API call, or per task started, undercounts it — retries and abandoned attempts vanish from that number entirely.
Act by
Divide total spend by merged changes, not by tasks started, and watch the trend before the monthly invoice does.

Escaped-defect rate

Tells you
Post-merge fixes attributable to agent work — whether the review stage actually caught what it was supposed to catch.
Lies when
Zero escaped defects early on usually means too little traffic has hit the change yet, not that review is airtight.
Act by
Track it per stage-gate configuration change — a rate that climbs after loosening a review gate is the signal to tighten it back.
What we actually run

Verifiable, not claimed.

No invented metrics, no throughput multipliers, no client names. Just what this repository's own history proves.

Run this yourself

CodeHerder is the task registry and per-task sandbox layer that runs this operating model day to day, the how behind the why on this page.

Questions

Before you run this on Monday.

What teams ask us before adopting this operating model.

01 Is this just vibe coding at scale?

The opposite of it, structurally. Vibe coding is a chat prompt and a hope; this is a written spec with a machine-checkable acceptance criterion, an isolated sandbox, a named stage sequence, and a verification stage that runs after review — not a human eyeballing the output and calling it good.

02 What's the actual bottleneck?

Review, once generation is cheap. Adding more agents doesn't raise throughput if review capacity stays fixed — it just grows an unread queue with a faster-looking front end. Machine review before human review is the fix; see the review-throughput surface above.

03 Do we need a framework or an orchestrator?

Something has to implement the six surfaces — isolation, stage gates, and spend ceilings in particular are hard to run by convention alone — but the framework is the implementation detail, not the point. Judge any tool by whether it gives you these six things, not by its feature list.

04 How do you stop two agents breaking each other's work?

Isolation: one task, one branch, one working tree, one sandbox. It's the least glamorous of the six surfaces and the one that causes the most damage when it's skipped — see the isolation surface above.

05 Does this hold up on regulated or audited code?

This operating model is about how work gets delivered, not about compliance sign-off — those are a different, and real, set of questions. See our AI Security Review for the InfoSec, privacy, risk, and procurement checklist a regulated system also has to clear.

06 Does it replace engineers?

No — review throughput is the human bottleneck by design, not an oversight to engineer away. A senior engineer's judgment is what the review and stage-gate surfaces exist to apply efficiently across more work, not what they replace.

07 How do we start on Monday?

Pick two surfaces, not all six: task definition (require an acceptance criterion on every task) and spend and blast radius (a hard ceiling and branch protection). Both are crawl-maturity, both are cheap, and both prevent the two failure modes that do the most damage first.

navigate select esc close