Skip to main content
A finished trial leaves five kinds of output: its record, its parsed trace, its trajectory, the raw streams of the agent and the verifier, and the agent’s home folder. All of them download as one directory, and each can be read on its own.

The trial directory

evolve trial download <trial-id> -o trials/ saves the trial under trials/<trial-id>/. A file the trial never produced is absent, never empty.
The stdout file takes the harness’s name: claude-code.txt, codex.txt, gemini-cli.txt, qwen-code.txt, kimi-code.txt, opencode.txt or droid.txt, and stdout.log for an agent you registered yourself. The tree also holds agent/sessions/ (claude, codex), agent/qwen-sessions/ (qwen) and agent/opencode/ (opencode): copies of the session files at the paths other tools expect. result.json states agent_result.cost_usd only once the spend is final; until then it is null there, and evolve.json carries the current figure with its spend_source. Tokens are always stated. The job download, evolve job download, adds to every trial its lock.json, its trial.log, the raw verifier/reward.txt, steps/<name>/verifier/reward.json on a multi-step trial, the home byte for byte, and artifacts/ with a manifest.json and each collected artifact at its source path (separate-mode trials only). Everything platform-specific in the archive’s record files rides under an x_evolve key: a trial’s spend is x_evolve.spentUsd with its spendSource, and the job config’s agents carry x_reasoning_effort and x_preset.

The agent’s home folder

The agent’s home is the harness’s own working state: its session files, its settings, and the transcripts of any subagents it ran. The platform captures it after the run and keeps it with the trial, so the run can be inspected the way the agent saw it. In the download it sits under agent/ at its real names, with agent-home.json beside it: every captured file’s path, size, sha256 and mode, and every file that was skipped, with the reason. The trial download carries the text view of the home. A file that is not UTF-8 text, such as a database, is named in the record and left out; the job download carries every byte. Two caches are left out on purpose, codex’s .codex/.tmp/plugins and opencode’s .config/opencode/node_modules; the record lists them under excluded, and anything else it could not carry under skipped, with the reason. From the SDK, trials().artifact(id, "agent-home") returns the same text view as a map from sandbox path to content. A home too large to serve as one text view is refused with a 413 invalid_input; the job download carries it whole.

The parsed trace

Every harness prints its run in its own format. The platform parses that stream into one vocabulary, the parsed trace, which the dashboard shows and evolve trial trace prints. Each event is one JSON object: seq, a position that also serves as a resume cursor; type, the kind of event; and data, the harness’s update as parsed.
The kinds are prompt for the instruction the agent received, user_message_chunk, agent_message_chunk and agent_thought_chunk for text, tool_call and tool_call_update for a tool call and its later status and output, plan for the agent’s plan entries, usage for token counts, error for a failure the harness reported, and trace_loss when events were lost. A tool call’s kind is one of the parser’s kinds, such as read, edit or execute, and its status moves through pending, in_progress, completed or failed. Once the trial is finished, the gateway’s own usage events follow the harness’s, one per model call, with the tokens and the cost as priced. Their data.update.source is gateway, and they are the only usage lines that carry tokens and money.
trial trace prints one line per event: the position, the type, and the data cut to 140 characters. A gateway usage event prints as gateway <model> with its tokens and cost. --type, --grep and --tail filter on the server; --cursor <seq> resumes after the last event you saw; --json prints each event in full. While the trial runs, the dashboard’s trial viewer shows the trace as it grows.

The ATIF trajectory

agent/trajectory.json is the same run in ATIF, the Agent Trajectory Interchange Format, the trajectory format Harbor defines, at version ATIF-v1.7. The platform builds it from the stored parsed trace. Its top-level fields are schema_version, agent with the harness’s name, version and model, and steps, the ordered system, user and agent turns, with session_id, trajectory_id, final_metrics, subagent_trajectories and extra optional. The instruction becomes the first user step. An agent step carries its message, its tool_calls under the harness’s own tool names, and the observation those calls returned.

Raw streams and the verifier log

Three artifacts are kept byte for byte: trace-stdout, the harness process’s stdout; trace-stderr, its stderr; and verifier, everything the verifier printed. The reward itself is in result.json and in verifier/reward.json. Print one of them instead of saving:
From the SDK, trials().artifact(id, "verifier") returns the same text, and null when the trial never stored it.