Docs

    Coding agents

    Reading a turn and its subagents

    The Conversation and Waterfall tabs for a coding-agent turn, agent groups and their rollups, drilling into one subagent, and which figures the vendor reported.

    A coding-agent turn is the user's prompt and everything the agents did about it, and it arrives as one trace. Its page shows what each agent was given, did and returned, and keeps the sums SyntropyLabs computes apart from what the agent reported.

    One turn, one trace

    The turn is one tree. At the root is an agent span with role main, with its llm_call, tool_call and log children. Each subagent is a tool_call (Claude Code's Agent tool) whose child is an agent span with role subagent, with its own calls beneath it.

    Every row carries agent.vendor, the session id, agent.turn.id and agent.role (main, subagent or system). gen_ai.agent.name is the vendor for the main agent and the subagent type for a subagent. evalkit.attribution is native when the vendor supplied the parent and hooks when the CLI synthesized it. Nesting is drawn as fact only when the vendor supplied the parent, and the Agents panel labels inferred nesting.

    A session is its turns in order. The trace header reads "turn 3 of 9", linked to the session, and the arrow buttons beside it open the previous and next turn.

    The trace page for a turn

    The tabs are Conversation, Waterfall, Logs, Evaluation and Metadata. Conversation shows the turn in order, from your prompt to the final reply.

    A tool item shows the full Arguments and Result, folded behind Show more when long. A subagent card has the subagent type, its Task and Last message, its rollup and Show what it did. A rollup is the agent's wall time, model calls, tool calls, tokens, cost and errors. Every item has Show span.

    The page loads the merged spans without the log rows, because one Claude Code session is roughly 14,000 rows and two thirds of them are logs. The header counts come from the response, so they describe the whole turn. Text arrives as a preview cut at 4,096 characters until you focus a span, which fetches it whole.

    In Waterfall, each agent is a group. A group header shows that agent's rollup, and its chevron collapses the subtree while the rollup stays on the row. A subagent's calls count toward the subagent and not toward the agent that launched it, so the rollups sum to the turn without double counting. Above the rows:

    • Collapse all, Expand all, Expand a level and Collapse a level fold and unfold the tree.
    • A chip for each subagent type shows how many ran. Clicking it opens a lone run as its own trace, or shows only what several runs did.
    • The log chip, such as Show 12 log rows inline, appears when the trace has logs and is off by default. Hook plumbing rows are hidden behind a Show N hook rows chip.
    • j and k move, enter opens a span, ← and → fold and unfold, and n and p step through errors. esc closes the open span, then leaves a drill-in.

    Focus one subagent

    Open as trace, on a subagent in Conversation or in the Agents panel, shows only that subtree, with timings re-based to the subagent's own start. The breadcrumb, such as "Turn › subagent:Explore", shows the subagent's computed rollup and Back to turn.

    Vendor-reported totals (agent.subagent.total_tokens, total_tool_uses) summarize the very calls being counted, so they are never added into a rollup. The Agents panel prints them under the rollup, and a waterfall row shows them as "vendor" when they differ. The drill-in is component state, not a route, so it cannot be linked to or shared yet.

    The Agents panel, Sessions and the list

    The Agents in this turn panel lists the main agent and every subagent with the same rollups. The list and the Sessions view show the same numbers through the trace's agents endpoint.

    Sessions lists a session's turns in order, numbered by the agent when it reported a turn number. In the trace list, the Service column names the coding agent, and a turn that launched subagents has an "N subagents" chip.

    What is and is not there

    • A value the agent did not send shows as a dash, never as zero. Hover the dash for the reason, such as "span had no gen_ai.usage attributes".
    • Cost is not on a coding-agent span. Dollars arrive on a separate usage record and are merged onto the model call. If that record is lost, the turn is priced only by the catalog estimate.
    • Natively, tool output is complete only for shell commands, and only when tool content is on. Other tools need the CLI hook (Claude Code) or --capture full (Cursor, Windsurf, OpenCode), so a tool row can have no result.
    • Log rows are drawn as lines without bars. They stay out of the timeline, the counts and the keyboard order unless you show them inline.
    • Opened from Sessions, the back link returns to the session, not to the trace list.

    EvalKit is built by SyntropyLabs. Published on PyPI and npm.