> ## Documentation Index
> Fetch the complete documentation index at: https://docs.evolvingmachines.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Trial outputs

> What a finished trial gives you, file by file, and in which formats.

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.

```text theme={null}
<trial-id>/
├── config.json             the trial's identity: its task and its agent
├── result.json             the outcome: status, reward, verifier verdict, exception
├── evolve.json             the platform's record: cost and tokens per lane, provider, regrade lineage
├── exception.txt           present when the trial ended with an exception
├── agent/
│   ├── trajectory.json     the ATIF trajectory, when stored
│   ├── trace-parsed.jsonl  the parsed trace, one {seq, type, data} per line
│   ├── codex.txt           the harness's stdout, under the harness's own name
│   ├── stderr.log          the harness's stderr
│   ├── agent-home.json     the home capture record
│   └── .codex/             the captured home, at its real names
└── verifier/
    ├── test-stdout.txt     everything the verifier printed
    └── reward.json         the rewards map
```

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.

```json theme={null}
{"seq": 0, "type": "prompt", "data": {"_prompt": {"text": "Create hello.txt containing Hello."}}}
{"seq": 1, "type": "agent_message_chunk", "data": {"update": {"sessionUpdate": "agent_message_chunk", "content": {"type": "text", "text": "I'll create the file."}}}}
{"seq": 2, "type": "tool_call", "data": {"update": {"sessionUpdate": "tool_call", "toolCallId": "call-1", "title": "Write hello.txt", "kind": "edit", "status": "pending"}}}
{"seq": 3, "type": "tool_call_update", "data": {"update": {"sessionUpdate": "tool_call_update", "toolCallId": "call-1", "status": "completed"}}}
{"seq": 4, "type": "usage", "data": {"update": {"sessionUpdate": "usage", "scope": "call", "usage": {"promptTokens": 812, "completionTokens": 64}}}}
```

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.

```bash theme={null}
evolve trial trace <trial-id>
evolve trial trace <trial-id> --grep 'permission denied' --tail 50
evolve trial trace <trial-id> --cursor 140
```

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

```json theme={null}
{
  "schema_version": "ATIF-v1.7",
  "agent": {"name": "codex", "version": "0.31.0", "model_name": "gpt-6-astra"},
  "steps": [
    {"step_id": 1, "source": "user", "message": "Create hello.txt containing Hello."},
    {
      "step_id": 2,
      "source": "agent",
      "message": "I'll create the file.",
      "tool_calls": [{"tool_call_id": "call-1", "function_name": "apply_patch", "arguments": {"path": "hello.txt"}}],
      "observation": {"results": [{"source_call_id": "call-1", "content": "Success"}]}
    }
  ]
}
```

```bash theme={null}
evolve trial download <trial-id> --stream trace-atif
```

## 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:

```bash theme={null}
evolve trial download <trial-id> --stream verifier
```

From the SDK, `trials().artifact(id, "verifier")` returns the same text, and `null` when the trial never stored it.
