Coding agents
Troubleshooting
Causes and checks for missing prompt text, no first trace, a 401 from the receiver, a turn without cost and a tool without output.
Some gaps in a coding-agent trace come from configuration you can fix, and some are limits of the vendor. Each heading below is a symptom.
The prompt or reply did not arrive
A span without its text says so, for example "No request text arrived for this call." There are two possible causes.
- The install used the default
--capture minimal, so the vendor never sent the text. Reinstall with--capture fulland start a new session. The trace itself is complete: the receiver marked the spanevalkit.content_captured=false, so the page can say that capture is off. - The receiver is older than the content merge. Prompt, completion and tool text arrive in separate records that are merged onto the spans by span id, and an older receiver stores them as log rows. Run
evalkit coding doctor: its test turn sends the prompt that way and reports whether the merged tree came back.
No first trace arrives
- A running agent keeps its old configuration. Start a new session after installing.
- The quickstart watches the Environment whose key you installed with. Run
evalkit coding statusand compare the masked key, its first 8 and last 4 characters, with the key under Settings → This project → Environments. - A 401 from the receiver means the key was rotated or belongs to another Environment. Reinstall with the current key.
- The machine cannot reach the endpoint, or a proxy strips the
Authorizationheader. Codex takes the full signal URL for each exporter, while Claude Code and Gemini CLI append/v1/traces|logs|metricsto the base themselves. - With
--no-traceson a vendor that has spans, you still get log events. They are grouped into one trace per prompt when they carry a prompt id (Claude Code, Gemini CLI), and otherwise into one trace per session per UTC day.
doctor reports read back forbidden
A message containing this receiver predates the 'me' alias means the receiver is older than the me tenant alias. Pass --tenant <your tenant id>, copied from the Tenant column under Settings → This project → Environments, or update the receiver. the key belongs to a different tenant than '<tenant>' means the --tenant you passed is not the Environment this key belongs to.
A turn has tokens but no cost
Cost is never on a coding-agent span. Claude Code sends dollars on a separate api_request record, which the receiver matches to the model call by model and identical token counts. Codex sends turn_cost. Gemini CLI, Cursor and Windsurf send no cost at all.
When the record is missing, the trace page prices the call from the catalog and marks the figure as an estimate. The session page counts only reported dollars, so its Cost figure then says how many turns were priced.
A tool row has no result
Natively, only shell commands carry their output, and only with tool content on. Other tools need the Claude Code PostToolUse hook (installed unless --no-subagents) or --capture full on Cursor, Windsurf and OpenCode. Gemini CLI does not export tool output.
Codex refuses to install
The installer writes its [otel] table between # evalkit-managed-begin/end markers. It refuses to run when ~/.codex/config.toml already has an [otel] table outside them, so it never overwrites telemetry you configured by hand. Move or remove that table, then install again.