Fixed
- Parallel subagents now each get their own trace subtree. When one turn spawned several
Agentsubagents at once, only onetool:Agentspan received a nestedinteraction— the others showed no children. The stitcher matched subagents to their parentAgentcall bypromptId, which parallel calls share, so they collapsed onto a single call. Subagents are now matched by thetoolUseIdrecorded in each subagent's.meta.json(unique per invocation), withpromptIdkept as a fallback for older transcripts. - A subagent's final
llm_requestis no longer dropped. A subagent's transcript usually finishes flushing after its parent turn was already shipped (the final synthesis lands last), and the one-shot incremental read froze each subagent's offset before that row arrived, with no way to re-attach it. Subagents now emit as a standalone pass keyed off the parentAgentcall's persisted span link: each subagent file is re-read every Stop and its spans are emitted incrementally, exactly once — a call once a later call closes it, and the trailing call plus interaction span once the file stops growing. Emitting each span once (rather than re-sending the whole subtree) keeps the additivetracesrollup correct, since that view has no per-span dedup unlike the rawspanstable.
Added
subagent.nameattribute (the agent type, e.g.Explore) on subagent spans, alongside the existingsubagent.idandsubagent.type.