Sub-agents are just wrong
Boris Tane
infra.sf · 24 Sep 2026
polylane.com · @boristane
polylane.com · @boristane
Hi, I'm Boris. Polylane finds issues in production and opens the pull request that fixes them. This is how we deleted 17 agents and got better at it.
About me
Boris Tane
2021Before Polylane I was at Cloudflare, leading the Workers observability team. Before that I founded Baselime, an observability startup Cloudflare acquired.
About Polylane
Polylane finds issues in production
and opens the pull request that fixes them.
and opens the pull request that fixes them.
It watches logs, metrics and traces from every cloud resource on every connected provider, and alerts from your observability and error tracking tools.
How Polylane works
Every resource on every connected cloud, and how they connect: the context graph. Red rings are issue hotspots, dashed rings are change hotspots. Each resource has baselines across multiple horizons; values that break the baseline become issues.
How it works
DetectionSomething breaks its baseline
→
TriageReal, or noise?
→
InvestigationFind the root cause
→
RemediationPull request or escalate
VerificationDid the fix hold?
Four jobs for every issue. Detect it, confirm it's real, find the root cause, then fix it with a pull request, escalate to an engineer, or write it up and stop. Then verify: once the fix ships, the resource is watched against its baseline again, and if it still breaks, it's detected again. That closes the loop. Most issues stop at triage.
Our first architecture
A triage agent, a coordinator, up to fifteen hypothesis agents and a coding agent: up to 18 agents for one issue. Each hypothesis agent tries to prove or disprove one hypothesis, from a different starting point: logs first, codebase first. Then they vote, another agent summarises, and the summary goes back to the orchestrator as a message.
The problem
Every handoff loses context.
Who sees what
Read the notes beside each box. The orchestrator, later, has history and two summaries, no evidence. The coding agent has the plan, nothing else. So agents kept redoing each other's work, and the pull requests fixed symptoms instead of root causes.
Evaluation
Every agent passed its evals.
The system didn't.
The system didn't.
Each stage evaluated on its own passed. The end result was poor, because the failures lived in the handoffs.
Debugging
One run, dozens of traces.
Why we built it
Models couldn't do the whole job.
And our harness wasn't that good.
And our harness wasn't that good.
We iterated for months, per agent, per prompt, per handoff. The results never matched the effort.
Current architecture
Triage agentCoordinator15 hypothesis agentsCoding agent
One agent.
We deleted all of them, the workflows between them and the gates in front of the pull request.
One agent
The same agent collects the evidence, tests the hypotheses, reaches one verdict, and clones, edits and validates in the sandbox before opening the pull request. One trace. No summaries.
What made it possible
We built our own harness.
- Tools, optimised for the agent
- Compaction
- Context managed over hundreds of turns
None of this works with an off-the-shelf loop. One agent running for hundreds of turns only works because we own the harness: tools shaped for how the agent uses them, compaction that keeps what matters, and deliberate context management across the whole run.
Hours from detecting an issue to opening its pull request
Over the month around the cutover, the median went from 2.2 hours to 35 minutes and the p90 from nine days to under two hours. The pipeline sat for hours in a chain of workflows, each waiting on the last. Axis not to scale.
One agent35 min median 18 agents
2.2h median
Share of detected issues that ended in a pull request
0.6% under the sub-agents, 4.2% under the single agent, and rising. A pipeline has to survive every handoff: triage promotes, the coordinator produces hypotheses, the fan-out reaches a verdict. Each handoff is a place to fail.
Model spend per pull request
$111 to about $18 in the first nine days. Every run starts on the stronger model, so a dismissed issue costs more than before. Not all of it is the architecture: we're iterating on everything. Don't @ me.
One agent
Actually, you need an orchestrator with 15 hypothesis sub-agents and confidence-weighted voting
One agent
Don't build sub-agents.
- Handoffs lose more than they save
- Evaluate the run, not the agents
- One trace per run
The agent that gathers the evidence should be the agent that acts on it. Per-agent evals pass while the system fails. A wrong decision across a dozen traces takes an afternoon to explain; in one trace it takes a scroll.
Thanks for having me!
Boris Tane
polylane.com/blog/sub-agents-are-just-wrong
@boristane
@boristane