August 13, 2026·8 min read

One operator, a fleet of agents

How one person runs a portfolio of sites without being the bottleneck: hand the work to autonomous agents, and make yourself the gate instead of the hands.

By Andrew Pyle

The honest constraint behind everything I build is that there is one of me. A portfolio of sites doesn't care about that. Each one wants features, fixes, content, and maintenance, and the naive way to run several at once is to context-switch between them until nothing gets real attention. So I stopped trying to be the hands on every keyboard. The command center that runs this portfolio dispatches the actual work to a fleet of autonomous coding agents. My job moved up a level — from doing the work to deciding what work gets done.

This is a build-log about that shift: what "a fleet of agents" actually means in practice, why it's only safe because of a few boring guardrails, and where I'm still figuring it out. It's the most architectural of these field notes, because the interesting part isn't any one agent — it's the shape of the system around them.

01The gate

The model: The human is the gate, not the worker.

The core inversion is simple to state and hard to actually hold to: I don't want to be the one typing every change, but I absolutely want to be the one who decides which changes happen. So the command center never spawns an agent on its own. Every dispatch is operator-gated. The system can propose, queue, and stage a unit of work; a human — me — approves it before an agent picks it up and starts touching real files.

An autonomous fleet that can start its own work is a liability. An autonomous fleet that can only start work you approved is leverage.

That one rule is what makes the word "autonomous" safe to use. The agents are autonomous within a task — they read the code, make the change, run the checks — but they are not autonomous about which task exists. The gate stays human on purpose.

For the bigger units of work, the gate is more than a yes. A build-sized dispatch — a whole feature, a migration, a sweep across many files — gets a written plan first, and then gets stress-tested against my own catalogued past mistakes before anything is handed off. The approval I give isn't "go do something in that area"; it's "go execute this specific, already-poked-at plan."

02Fan out

Fan out, don't queue up: Breadth is a parallelism problem.

The reason a fleet beats a single capable agent is breadth. Most portfolio work isn't one deep problem; it's many independent ones — a fix here, a content pass there, an audit across several sites. Done serially, that's a queue that never drains. Done in parallel, it's a fan-out: the wall-clock cost is the slowest sub-task, not the sum.

The catch is collisions. Two agents editing the same working tree at once will step on each other. So file-mutating work that runs in parallel gets isolated — each agent works on its own copy of the repository, a separate git worktree, makes its changes in isolation, and the results come back as reviewable diffs rather than a tangle of concurrent edits. This isn't theoretical: the repository behind this very site keeps a `.worktrees/` directory for exactly that.

Scope

A unit of work is defined small enough that one agent can own it end to end — a task, not a project.

Isolate

Anything that writes files runs in its own worktree, so parallel agents never share a mutable surface.

Report back

Each agent returns its outcome up to the command center — not a wall of logs, but a result the operator can act on.

03One screen

Approve from one screen: The gate has to be low-friction or it becomes the bottleneck.

A human gate is only leverage if pressing it is easy. If approving each unit of work meant SSHing to a box, reading a build log, and remembering the right command, I'd have rebuilt the bottleneck I was trying to escape. So the approvals themselves roll up to one screen. When an agent has a change ready to merge, or a deploy waiting to go out, it doesn't ask me in some terminal I have to go find — it posts the request to an Operator Approval Queue, and I clear it with one click from a single dashboard.

The two things that queue up most are the two most consequential: merge this pull request, and unblock this deploy. Both are pre-authorized as a matter of doctrine, but pre-authorized doesn't mean automatic — it means the decision is mine to make quickly, not that the machine makes it for me. The production pipeline has a deliberate human gate — a manual block step — sitting right before the irreversible step of shipping to the live server. The reload that could take a site down waits for a person — the same shape as the whole fleet, drawn at the scale of a single deploy.

One detail I like: the gate knows when it isn't needed. The nightly build that just refreshes the homepage stats skips the deploy block entirely and ships itself, because it runs off the already-vetted main branch and the deploy carries its own health checks and rollback. Automating the approval away where it adds nothing is what keeps me willing to honor it where it matters.

04One place to look

One place to look: Status rolls up, so I don't chase terminals.

The failure mode of running many agents is worse than running none: a dozen jobs blinking for attention across a dozen terminal tabs, and no single view of what's actually done. The fix is that outcomes roll up centrally. When an agent finishes — or gets blocked, or files a follow-up it shouldn't do inline — that lands as a record in one place: the tasks, tickets, and recaps the command center keeps. I check the rollup, not the tabs.

This is the difference between "I have automation" and "I have a system." Automation that you have to babysit individually doesn't scale past your attention. A rollup does. The unit that makes it work is small and boring: an agent that trips over a "we should also fix X" mid-task doesn't act on it and doesn't lose it — it files a tracked task that shows up in the same rollup I already read, instead of dying in a scrollback buffer nobody reopens.

05Across boundaries

Coordination across boundaries: One agent's finding is another project's ticket.

The subtle part of running a fleet across a whole portfolio isn't parallelism inside one repo — it's what happens when work crosses a project line. An agent deep in one site notices something that's actually a different project's problem: a data feed gone stale upstream, or shared infrastructure that needs a change. The tempting thing is to have that agent reach over and fix it — which is exactly how you get one agent quietly editing a repo it doesn't understand.

So the fleet coordinates through a shared list instead of through side effects. An agent that hits a cross-boundary need doesn't cross the boundary — it can file a ticket against another project on one canonical, portfolio-wide list, and that request gets triaged the same operator-gated way everything else does. The boundary stays a real boundary, and coordination happens as a visible request I can see, rather than as an invisible edit I discover later.

06The house rules

Why it's safe: The fleet inherits the house rules.

None of this would be defensible on its own. A fleet of agents editing production systems is exactly the kind of thing that goes wrong loudly. It's tolerable here only because the fleet composes with the other principles this command center is built on — the ones I've written about separately:

Dry-run by default

Anything that writes to an outside system shows me what it would do first, and only acts on approval. An agent can't quietly push a change to the world.

Status is observed, not declared

State is computed from ground truth, not trusted from a field that says "done." So an agent reporting success doesn't override what the system actually observes.

Put those together and the autonomy is bounded on both ends: agents can't start work I didn't approve, and they can't finish work by simply claiming it's finished. The scary version of "a fleet of autonomous agents" is the one without those two walls. This one has them, and every agent that gets dispatched inherits them automatically — the guardrails aren't re-argued per task, they're the substrate the whole fleet runs on.

The thing I keep relearning is that the leverage isn't the agents — it's the gating and the rollup around them. Anyone can spawn a model to write code. The work is building the system that lets you dispatch that across a whole portfolio without losing the thread or your nerve: approve deliberately, isolate the parallel work, and make the truth roll up to one place. The agents are the hands. The point was to stop being the hands and start being the person who decides.