How it works

Subagents

Three investigation lines run concurrently with isolated contexts. Only conclusions come back — and the correlation between them is never delegated.

Splitting the work is not about speed. It is about keeping three different kinds of evidence from contaminating each other before they are compared: a subagent that has already read the diff will find the timing more convincing than it should.

The three roles

performance-investigatorCharacterise the symptom.

When did it start, how big is it, and which signals moved together? Computes onset and magnitude from raw samples rather than describing the shape of a graph.

returns → Onset timestamp, settled ratio, and which golden signals did and did not move.

deployment-investigatorEnumerate the changes.

Every deployment in a generous window — generous on purpose, because a window drawn tightly around the incident is a window that assumes the answer. Rules candidates in or out on timing alone.

returns → A ranked candidate list with a timing verdict for each, and nothing about mechanism.

code-investigatorExplain the mechanism.

Reads the diffs of the timing-plausible candidates only, and assesses whether the change could produce the observed shape. A timing correlation without a mechanism is not a root cause.

returns → For each candidate: a mechanism, or an explicit "no plausible mechanism".

The root agent correlates the three. It has to reconcile a symptom, a candidate and a mechanism into one claim with a confidence number attached, and that judgement is the part a human is actually approving. It is never handed to a subagent.

What the harness actually gives you

typescript
// this is the whole API
create_sub_agent({ name, input, model })
Reality
Declaring named subagentsNot possible. AgentSpec has no subagent field.
The nameInvented by the model at call time, not registered anywhere.
The briefWritten by the model as input. Not a template you control.
Tool accessSubagents always inherit the root’s full tool set.
NestingForbidden. A subagent cannot spawn one.

What that means in practice

  • Because subagents inherit every tool, a subagent can in principle reach a destructive tool. It does not get to skip the gate for doing so — that route is probe P3 in Gate Prover, and it held. Before that suite existed, nobody had written down whether it did.
  • Isolated contexts are the reason 61 samples, four diffs and a deployment history fit at all. The root agent sees conclusions, not the transcripts that produced them.
  • The console renders subagent threads as separate lanes, so you can see which line of investigation produced which claim rather than a single flat log.