Coding agents

    Reading a turn and its subagents

    Read one coding-agent turn as a trace: the Conversation and Waterfall tabs, agent groups with rollups, focusing one subagent, and which numbers came from the vendor rather than from the platform.

    After this page you can say what the main agent did, what it handed to each subagent and what came back, where a failure happened, and which figures are the platform’s own sums and which the agent reported about itself.

    One turn, one trace

    A coding-agent turn — the user’s prompt and everything the agents did about it — is one trace and one tree: an agent span with role main at the root, its llm_call, tool_call and log children, and for each subagent a tool_call (Claude Code’s Agent tool) whose child is an agent span with role subagent and its own calls beneath it. A session is its turns in order, so the header reads turn 3 of 9 in session … and prev / next step through the session. Every row carries agent.vendor, the session id, agent.turn.id, agent.role (main · subagent · system), gen_ai.agent.name (the vendor for the main agent, the subagent type for a subagent) and evalkit.attribution: native when the vendor supplied the parent, hooks when the CLI synthesised it. Nesting is drawn as fact only when the vendor supplied the parent; inferred nesting is labelled.

    The trace page for a turn

    Tabs: Conversation · Waterfall · Logs · Evaluation · Metadata. Conversation shows the prompt, the assistant text, tool rows (name · arguments excerpt · result excerpt · duration), a card per subagent (the task it was given, its last message, and the totals the vendor reported: tokens and tool uses) and the final reply; every item has Show span. The page loads the merged spans without the log rows — one Claude Code session is roughly 14,000 rows, two thirds of them logs — and 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 the waterfall each agent is a group: the main agent’s header shows its duration, model calls, tools, tokens, cost and errors; a subagent group header shows the same for that subagent, and its chevron collapses the subtree while the rollup stays on the row. Collapse agents / Expand agents, focus chips per subagent type (for example Explore ×3), Show logs inline (off by default; noise such as hook plumbing is hidden behind a count) and keyboard navigation (j/k rows, / collapse a group, n/p errors, Esc leaves a drill-in). A subagent’s calls count towards the subagent and not towards the agent that launched it, so the rollups sum to the turn without double counting.

    Focus one subagent

    A focus chip hides every row outside the chosen subagents’ subtrees; Open as trace on a subagent header drills in: a breadcrumb Turn › subagent:Explore, only that subtree, timings re-based to the subagent’s own start, its rollups in the breadcrumb and the vendor’s reported totals printed beside them. Vendor-reported totals (agent.subagent.total_tokens, total_tool_uses) are a summary of the very calls being counted, so they are shown next to the computed rollup and never added into it. The drill-in is component state, not a route, so it cannot be linked to or shared yet; Esc returns.

    The Agents panel, Sessions and the list

    The Agents panel on the right lists the main agent and every subagent with the same rollups and Open as trace; the list and the Sessions view show the same numbers through the trace’s agents endpoint. Sessions lists the turns of a session in order with the vendor’s own turn number when it reported one, each with its prompt preview, duration, tokens, cost and agent and subagent counts. The trace list shows the vendor as a pill, the agent version, and a subagents n chip.

    What is and is not there

    • A field the agent did not export says so; it never renders as zero or empty. Not exported by the agent on a Claude Code span means the vendor sends that content as a separate record.
    • 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 catalogue estimate.
    • Tool output is complete natively for shell commands only, and only when tool content is on; other tools need the CLI hook (Claude Code) or --capture full (Cursor, Windsurf, OpenCode). A tool row can legitimately have no result.
    • Log lines are lines, not bars: they stay out of the timeline, the counts and the keyboard order unless turned on.
    • Opened from Sessions, Back returns to the session rather than to the trace list.

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