Coding agents

    Troubleshooting

    Content not captured, no first trace, 401 from the receiver, a turn without cost, a tool without output — the causes and the checks.

    After this page you can tell a configuration problem from a vendor limitation, and fix the ones that are yours.

    The prompt and reply say “not captured”

    There are two truthful causes. Either capture is off — the install was made with the default --capture minimal, so the vendor never sent the text; reinstall with --capture full and start a new session — or the receiver is older than the content-merging it needs: the records that carry prompt, completion and tool text arrive separately from the spans and are merged onto them by span id, and a receiver that predates that merge stores them as log rows instead. Run evalkit coding doctor: it posts a turn whose prompt travels exactly that way and reports whether the merged tree came back. Nothing in the trace itself is missing in the first case; the span is marked evalkit.content_captured=false so the app can say “capture is off” rather than show an empty box.

    No first trace arrives

    • The session was not restarted. A running agent keeps its old configuration; start a new session after installing.
    • Wrong Environment. The detector on the quickstart page listens to the Environment whose key you installed with. Check evalkit coding status for the masked key and compare its last four characters with the card under Project settings → Environments.
    • 401 from the receiver. The key was rotated or belongs to another Environment. Reinstall with the current key.
    • No outbound network from the machine to the endpoint, or a proxy that strips the Authorization header. Codex takes the full signal URL per exporter; Claude Code and Gemini CLI append /v1/traces|logs|metrics to the base themselves.
    • `--no-traces` on a vendor with spans. You still get log events, one trace per session and day rather than one per turn.

    doctor reports “read back forbidden”

    … this receiver predates the 'me' alias … means the receiver is older than the me tenant alias: pass --tenant <your tenant id> (from the Environment card) 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 that 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 turn is priced from the catalogue estimate and marked as such.

    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 and 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.

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