@evolvingmachines/evolve 0.0.55-project-sable.20260916.db0bc0bb

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +25 -0
  3. package/dist/chunk-5GVMBEYI.js +11 -0
  4. package/dist/chunk-HQJI3HHU.js +1 -0
  5. package/dist/chunk-JS2UTK2I.js +427 -0
  6. package/dist/cli/index.cjs +73 -0
  7. package/dist/cli/index.d.cts +270 -0
  8. package/dist/cli/index.d.ts +270 -0
  9. package/dist/cli/index.js +54 -0
  10. package/dist/index.cjs +669 -0
  11. package/dist/index.d.cts +5023 -0
  12. package/dist/index.d.ts +5023 -0
  13. package/dist/index.js +230 -0
  14. package/dist/managed-modal-IJW62SSK.js +4 -0
  15. package/dist/resumable-HFSICSH3.js +1 -0
  16. package/dist/tar-GVC4KE52.js +1 -0
  17. package/dist/types-DlpTxdR_.d.cts +4777 -0
  18. package/dist/types-DlpTxdR_.d.ts +4777 -0
  19. package/dist/upload-KPYDMWFJ.js +1 -0
  20. package/docs-agents/SKILL.md +138 -0
  21. package/docs-agents/index.md +81 -0
  22. package/docs-agents/python/01-getting-started.md +511 -0
  23. package/docs-agents/python/02-configuration.md +855 -0
  24. package/docs-agents/python/03-runtime.md +899 -0
  25. package/docs-agents/python/04-streaming.md +451 -0
  26. package/docs-agents/python/05-swarm-pipeline.md +953 -0
  27. package/docs-agents/python/index.md +122 -0
  28. package/docs-agents/typescript/01-getting-started.md +494 -0
  29. package/docs-agents/typescript/02-configuration.md +841 -0
  30. package/docs-agents/typescript/03-runtime.md +864 -0
  31. package/docs-agents/typescript/04-streaming.md +478 -0
  32. package/docs-agents/typescript/05-swarm-pipeline.md +957 -0
  33. package/docs-agents/typescript/index.md +121 -0
  34. package/docs-evals/SKILL.md +112 -0
  35. package/docs-evals/cli-reference/agent.mdx +67 -0
  36. package/docs-evals/cli-reference/analysis.mdx +91 -0
  37. package/docs-evals/cli-reference/analyze.mdx +74 -0
  38. package/docs-evals/cli-reference/auth.mdx +60 -0
  39. package/docs-evals/cli-reference/check.mdx +146 -0
  40. package/docs-evals/cli-reference/dataset.mdx +133 -0
  41. package/docs-evals/cli-reference/index.mdx +108 -0
  42. package/docs-evals/cli-reference/job.mdx +239 -0
  43. package/docs-evals/cli-reference/run.mdx +196 -0
  44. package/docs-evals/cli-reference/secrets.mdx +95 -0
  45. package/docs-evals/cli-reference/skill.mdx +51 -0
  46. package/docs-evals/cli-reference/skills.mdx +81 -0
  47. package/docs-evals/cli-reference/trial.mdx +112 -0
  48. package/docs-evals/cli-reference/upload.mdx +36 -0
  49. package/docs-evals/core-concepts/agents.mdx +106 -0
  50. package/docs-evals/core-concepts/analyze.mdx +86 -0
  51. package/docs-evals/core-concepts/check.mdx +51 -0
  52. package/docs-evals/core-concepts/datasets.mdx +138 -0
  53. package/docs-evals/core-concepts/index.mdx +42 -0
  54. package/docs-evals/core-concepts/jobs.mdx +136 -0
  55. package/docs-evals/core-concepts/models.mdx +68 -0
  56. package/docs-evals/core-concepts/sandboxes.mdx +52 -0
  57. package/docs-evals/core-concepts/secrets.mdx +41 -0
  58. package/docs-evals/core-concepts/skills.mdx +42 -0
  59. package/docs-evals/core-concepts/tasks.mdx +216 -0
  60. package/docs-evals/core-concepts/trial-outputs.mdx +103 -0
  61. package/docs-evals/core-concepts/trials.mdx +103 -0
  62. package/docs-evals/core-concepts/upload.mdx +45 -0
  63. package/docs-evals/dashboard/checks.mdx +15 -0
  64. package/docs-evals/dashboard/datasets.mdx +24 -0
  65. package/docs-evals/dashboard/jobs.mdx +65 -0
  66. package/docs-evals/dashboard/traces.mdx +15 -0
  67. package/docs-evals/dashboard/trial-viewer.mdx +30 -0
  68. package/docs-evals/docs.json +180 -0
  69. package/docs-evals/getting-started/installation.mdx +56 -0
  70. package/docs-evals/getting-started/quick-start.mdx +85 -0
  71. package/docs-evals/index.mdx +36 -0
  72. package/docs-evals/sdk/python.mdx +139 -0
  73. package/docs-evals/sdk/typescript.mdx +141 -0
  74. package/docs-evals/sdk-reference/agents.mdx +105 -0
  75. package/docs-evals/sdk-reference/analyses.mdx +125 -0
  76. package/docs-evals/sdk-reference/auth.mdx +76 -0
  77. package/docs-evals/sdk-reference/checks.mdx +166 -0
  78. package/docs-evals/sdk-reference/datasets.mdx +305 -0
  79. package/docs-evals/sdk-reference/errors.mdx +199 -0
  80. package/docs-evals/sdk-reference/index.mdx +58 -0
  81. package/docs-evals/sdk-reference/jobs.mdx +731 -0
  82. package/docs-evals/sdk-reference/meta.mdx +52 -0
  83. package/docs-evals/sdk-reference/skills.mdx +68 -0
  84. package/docs-evals/sdk-reference/trials.mdx +232 -0
  85. package/docs-evals/sdk-reference/types.mdx +272 -0
  86. package/docs-evals/snippets/global-options.mdx +13 -0
  87. package/docs-evals/snippets/list-flags.mdx +23 -0
  88. package/harness-capabilities.json +430 -0
  89. package/hosted-error-codes.json +120 -0
  90. package/package.json +163 -0
  91. package/skills/create-adapter/SKILL.md +287 -0
  92. package/skills/create-task/SKILL.md +491 -0
  93. package/skills/evolve/SKILL.md +39 -0
  94. package/skills/publish/SKILL.md +142 -0
  95. package/skills/rewardkit/SKILL.md +330 -0
  96. package/spec/atif/README.md +45 -0
  97. package/spec/atif/trajectory.schema.json +865 -0
  98. package/spec/openapi.yaml +13447 -0
@@ -0,0 +1,216 @@
1
+ ---
2
+ title: "Tasks"
3
+ description: "The task format: one directory with an instruction, an environment, a verifier, and an optional reference solution."
4
+ ---
5
+
6
+ A task is a directory. The agent reads the instruction and works inside the environment. The verifier runs afterwards and scores the work.
7
+
8
+ ```text
9
+ my-task/
10
+ ├── instruction.md what the agent is asked to do
11
+ ├── task.toml timeouts, network, resources, verifier mode
12
+ ├── pre_artifacts.sh optional: collects the agent's work after the run
13
+ ├── environment/
14
+ │ └── Dockerfile the box the agent works in
15
+ ├── tests/
16
+ │ └── test.sh the verifier: writes the reward
17
+ └── solution/
18
+ └── solve.sh optional reference solution
19
+ ```
20
+
21
+ `task.toml`, `instruction.md` and `tests/test.sh` are required.
22
+
23
+ ## instruction.md
24
+
25
+ Plain Markdown, handed to the agent unchanged at the start of the trial. Say what done looks like, use absolute paths (`/app/out.json`, not `out.json`), and describe the output's shape, so the instruction and the verifier agree.
26
+
27
+ ## environment/
28
+
29
+ A `Dockerfile` that builds the box the agent works in, or a `docker-compose.yaml` when the task needs several containers; the agent then runs in the `main` service. The image is built once, when the dataset is published. A task can instead name a prebuilt image with `docker_image` in `task.toml` and omit the folder: any public registry, with the tag or digest pinned. An untagged or `:latest` reference is refused at import.
30
+
31
+ The agent works in `/app`, and its git state is the submission, so seed a git baseline in the Dockerfile: `git init`, `git add -A`, one commit.
32
+
33
+ The image's `ENTRYPOINT` runs before the agent starts, so a service the image starts is running when the agent arrives. Keep-alive entrypoints such as `sleep infinity` start nothing, and `CMD` is never run. A service that dies before the agent starts fails the trial with its exit code. An image that starts a service cannot be verified in `separate` mode: verify in `shared` mode, or give the verifier its own `tests/Dockerfile`.
34
+
35
+ ## tests/
36
+
37
+ `tests/test.sh` is the verifier. It runs in the task's working directory after the agent finishes, checks the work, and writes the reward to one of two files.
38
+
39
+ - `/logs/verifier/reward.txt`: one number in `[0, 1]`, usually `1` or `0`.
40
+ - `/logs/verifier/reward.json`: a JSON object of named numbers, for a score with several parts.
41
+
42
+ When both exist, `reward.json` wins. The primary reward is the value under `"reward"`, else the single value when the object has one key. Several named scores with no `"reward"` still score the trial, as metrics with no primary reward, and the task is left out of pass@k. Everything the script prints is kept as the verifier log.
43
+
44
+ ```bash
45
+ #!/bin/bash
46
+ set -uo pipefail
47
+
48
+ if uvx pytest /tests/test_outputs.py; then
49
+ echo 1 > /logs/verifier/reward.txt
50
+ else
51
+ echo 0 > /logs/verifier/reward.txt
52
+ fi
53
+ ```
54
+
55
+ Everything under `tests/` is carried onto the verifier beside `test.sh`.
56
+
57
+ `tests/Dockerfile` is built only for a `separate` verifier that pins no `docker_image`. Otherwise it is never built, the task imports with the `tests_dockerfile_not_built` note, and anything the recipe would install must already be in the image.
58
+
59
+ ## pre_artifacts.sh
60
+
61
+ Optional. It runs in the agent's sandbox after the agent finishes and writes the work to hand on under `/logs/artifacts`. Uncommitted work is committed first. Without it, the paths listed under `artifacts` are collected for you.
62
+
63
+ ```bash
64
+ #!/bin/bash
65
+ set -uo pipefail
66
+ mkdir -p /logs/artifacts
67
+ git diff --binary "$(git rev-list --max-parents=0 HEAD)" HEAD > /logs/artifacts/model.patch
68
+ ```
69
+
70
+ ## solution/
71
+
72
+ Optional. `solution/solve.sh` is the reference solution. `evolve check` runs it to confirm the task is solvable. It is archived at publish, gates nothing, and the agent is never given it.
73
+
74
+ ## task.toml
75
+
76
+ The keys a task author sets. Everything else has a default.
77
+
78
+ ```toml
79
+ [agent]
80
+ timeout_sec = 3600
81
+
82
+ [verifier]
83
+ timeout_sec = 600
84
+ environment_mode = "shared"
85
+
86
+ [environment]
87
+ network_mode = "allowlist"
88
+ allowed_hosts = ["pypi.org"]
89
+ cpus = 2
90
+ memory_mb = 4096
91
+ storage_mb = 10240
92
+ ```
93
+
94
+ - **Timeouts.** `agent.timeout_sec` and `verifier.timeout_sec`, in seconds. The defaults are 3600 s for the agent and 600 s for the verifier; a declared value always wins. A job can stretch them with `--timeout-multiplier`.
95
+ - **Network access.** `environment.network_mode` is `no-network` (the agent reaches nothing but its model), `allowlist` (only the hosts in `allowed_hosts`, accepted with this mode only), or `public` (the open internet, and the default). The older `allow_internet = false` means `no-network`, `true` means `public`. Only `no-network` makes the spend cap airtight; see [models](/core-concepts/models).
96
+ - **Verifier network.** A `shared` verifier sees the agent box's network; a `[verifier] network_mode` that differs from it is refused at import. A `separate` verifier box uses the mode of `[verifier.environment]`, else a copy of `[environment]`'s, with `[verifier] network_mode` overriding either. The platform never seals a verifier on its own.
97
+ - **Verifier mode.** `verifier.environment_mode` is `shared`, the verifier runs inside the agent's sandbox after the agent finishes and its credentials are revoked, or `separate`, the verifier boots a fresh copy of the environment and judges only what the task lists under `artifacts`. Without that list a separate verifier sees none of the agent's work, and even the reference solution scores 0. A `[verifier.environment]` table implies `separate`. Only settled separate-mode trials can be [regraded](/core-concepts/jobs#derive-a-new-job).
98
+ - **Resources.** `environment.cpus`, `memory_mb`, `storage_mb`, and `gpus` with `gpu_types`. Omitted, the provider's default sizing applies. A size above a provider's ceiling refuses on that provider; above every ceiling it is refused at import. The ceilings are on [sandboxes](/core-concepts/sandboxes).
99
+ - **Artifacts.** A top-level `artifacts = ["/app/out.json"]` list names the paths carried out of the agent's sandbox: into a separate verifier, and, on a separate-mode trial, into the trial's stored artifacts.
100
+
101
+ ## Environment variables
102
+
103
+ A task's `[environment.env]` table has two value kinds.
104
+
105
+ ```toml
106
+ [environment.env]
107
+ APP_MODE = "ci" # literal: lands in the box as written
108
+ GITHUB_TOKEN = "${GITHUB_TOKEN}" # template: a secret the job must attach
109
+ LOG_LEVEL = "${LOG_LEVEL:-info}" # template with a fallback
110
+ ```
111
+
112
+ A literal lands in the box as written; it is dataset content, so it must never be a secret. A template, `${VAR}` as the whole value, asks for a secret the job attaches with `--secret`, matched by env name; see [secrets](/core-concepts/secrets). `${VAR:-default}` falls back to the default when nothing is attached. A job that leaves a template unsatisfied is refused with `secret_not_attached`, and a `${...}` inside a longer string is refused at import.
113
+
114
+ The image's own start process sees the literals only; templates reach the agent and everything it launches.
115
+
116
+ ## LLM judges
117
+
118
+ A verifier can grade with a language model. The task asks for the credential with an environment template in `task.toml`:
119
+
120
+ ```toml
121
+ [verifier.env]
122
+ ANTHROPIC_API_KEY = "${ANTHROPIC_API_KEY}"
123
+ ```
124
+
125
+ The verifier receives a credential for the platform's gateway under that name, with the matching base-URL variable set beside it, so `litellm`-style clients and `rewardkit` work unchanged and offline. The recognized names are `ANTHROPIC_API_KEY` and `OPENAI_API_KEY` with their `_API_BASE` and `_BASE_URL` companions, each as the entire value; `"Bearer ${ANTHROPIC_API_KEY}"` is refused at import. Any other `${VAR:-default}` resolves to its default, and a non-judge template with no default is refused.
126
+
127
+ The rubric names the judge model, or `rewardkit`'s own default, `anthropic/claude-sonnet-4-6`, applies; the credential admits its key's model family only. `--ve REWARDKIT_JUDGE=<agent>` and `--ve REWARDKIT_MODEL=<model>` override the rubric's `[judge]` for one job, in both verifier modes; no other `--ve` key is accepted. The judge's spend is shown apart from the agent's, on the trial and on the job. Judge tasks are not regradable yet.
128
+
129
+ ## Multi-step tasks
130
+
131
+ A task can walk the agent through ordered steps in one shared environment. A `steps/` directory holds one sub-directory per step in place of the root `instruction.md`, `tests/` and `solution/`, and `[[steps]]` entries in `task.toml` declare them in order. `environment/` stays at the root and the filesystem persists from step to step.
132
+
133
+ ```text
134
+ migrate-then-prove/
135
+ ├── task.toml [[steps]] entries, in order
136
+ ├── environment/
137
+ │ └── Dockerfile
138
+ ├── tests/ optional shared helpers for every step's verifier
139
+ └── steps/
140
+ ├── 01-migrate/
141
+ │ ├── instruction.md
142
+ │ ├── tests/ merged over the shared tests/
143
+ │ └── workdir/ optional files landed before the step; its setup.sh runs first
144
+ └── 02-prove/
145
+ ├── instruction.md
146
+ └── tests/
147
+ ```
148
+
149
+ ```toml
150
+ multi_step_reward_strategy = "mean" # "mean" (default) or "final"
151
+
152
+ [[steps]]
153
+ name = "01-migrate"
154
+ min_reward = 0.5 # below this the trial stops here
155
+
156
+ [[steps]]
157
+ name = "02-prove"
158
+
159
+ [steps.agent]
160
+ timeout_sec = 600 # this step's override of the task-level timeout
161
+ ```
162
+
163
+ Each step has its own instruction, its own verifier (`tests/` merged over the shared `tests/`), an optional `workdir/` whose `setup.sh` runs first, and its own healthcheck, `timeout_sec` under `[steps.agent]` and `[steps.verifier]`, `[steps.verifier].env` and `artifacts` list. Each executed step is verified when it ends, and the results are on the trial as `step_results`.
164
+
165
+ `multi_step_reward_strategy` is `"mean"` (the default, over the steps that produced a result) or `"final"` (the last executed step's result). `min_reward` on a step ends the trial early when the step under-scores: a number gates the primary reward, a map gates each key. A step that fails, or whose healthcheck fails, ends the trial there. A retried trial starts again from the first step.
166
+
167
+ Refused at import: a per-step `user`, network declaration, or verifier environment or mode. `[[steps]]` and `steps/` must agree both ways.
168
+
169
+ ## MCP servers
170
+
171
+ A task can hand its agent MCP tools, registered into the harness's native MCP configuration beside any the arm carries.
172
+
173
+ ```toml
174
+ [[environment.mcp_servers]]
175
+ name = "docs-search"
176
+ transport = "streamable-http" # or "sse" (the default); "http" is read as streamable-http
177
+ url = "http://mcp-server:8000/mcp" # a compose service, reachable with no egress
178
+
179
+ [[environment.mcp_servers]]
180
+ name = "sqlite"
181
+ transport = "stdio" # launched inside the box by the harness
182
+ command = "uvx"
183
+ args = ["mcp-server-sqlite", "--db-path", "/app/data.db"]
184
+ ```
185
+
186
+ A `stdio` server declares `command` and `args`; it inherits `[environment.env]`, and there is no `env` field. A remote server declares an `http` or `https` `url` with no credential in it. The URL must be reachable under the task's own declarations, checked at import: the agent's own container, a compose service by name, or a public host the network policy admits. A `stdio` server that downloads itself (`npx …`, `uvx …`) fails at run time under `no-network`; bake it into the image.
187
+
188
+ ## Healthcheck and the agent user
189
+
190
+ `[environment.healthcheck]` keeps a slow-starting environment from meeting the agent too early: the command runs before the agent is installed, and the agent starts only once it exits `0`.
191
+
192
+ ```toml
193
+ [environment.healthcheck]
194
+ command = "curl -fsS http://localhost:8000/health"
195
+ interval_sec = 5 # every field below command is optional; these are the defaults
196
+ timeout_sec = 30
197
+ start_period_sec = 0
198
+ start_interval_sec = 5
199
+ retries = 3
200
+ ```
201
+
202
+ Inside `start_period_sec` a failure does not count. After it, `retries` failures spaced by `interval_sec`, each bounded by `timeout_sec`, fail the trial before any agent spend. On a multi-container task the check sees the `[environment.env]` literals; on a single-container task it sees none of the table, and templates are visible to no healthcheck.
203
+
204
+ `[agent] user = "dev"` runs the agent as that user, by name or numeric uid. It must exist in the image (`RUN useradd -m dev`); a missing user fails the trial before any spend. Omitted, the image's `USER` applies, root by default. `USER app:group` in the Dockerfile is refused at import, and so is `[verifier] user` other than `root`.
205
+
206
+ ## Not supported
207
+
208
+ - **Computer-use and desktop tasks.** `[environment].os` other than Linux is refused at import. A task whose instruction assumes a desktop is not refused; it runs on a Linux box without one.
209
+ - **Run-level trajectory seeding.** No job flag names a session to resume from. Task-level seeding works: a `trajectory.json` beside `instruction.md` (or in the first step's directory) is seeded into the agent's session on `claude` and `codex`; other harnesses refuse before any spend. `[agent] load_trajectory` and `resume_trajectory` keys are refused.
210
+ - **Verifier scripts whose PEP-723 header needs a package index.** Under `no-network` the verifier box has no index (only `rewardkit` and `litellm` resolve, on a judge task), so such a task is refused at import. Under `allowlist` or `public`, or without `uv run` or `uvx` in `tests/`, nothing changes.
211
+
212
+ ## From tasks to a dataset
213
+
214
+ A dataset is a folder of task directories, published to the catalog with `evolve dataset publish`. See [datasets](/core-concepts/datasets).
215
+
216
+ This is the Harbor task format; the full specification is at [docs.harborframework.com](https://docs.harborframework.com/core-concepts/tasks/overview).
@@ -0,0 +1,103 @@
1
+ ---
2
+ title: "Trial outputs"
3
+ description: "What a finished trial gives you, file by file, and in which formats."
4
+ ---
5
+
6
+ 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.
7
+
8
+ ## The trial directory
9
+
10
+ `evolve trial download <trial-id> -o trials/` saves the trial under `trials/<trial-id>/`. A file the trial never produced is absent, never empty.
11
+
12
+ ```text
13
+ <trial-id>/
14
+ ├── config.json the trial's identity: its task and its agent
15
+ ├── result.json the outcome: status, reward, verifier verdict, exception
16
+ ├── evolve.json the platform's record: cost and tokens per lane, provider, regrade lineage
17
+ ├── exception.txt present when the trial ended with an exception
18
+ ├── agent/
19
+ │ ├── trajectory.json the ATIF trajectory, when stored
20
+ │ ├── trace-parsed.jsonl the parsed trace, one {seq, type, data} per line
21
+ │ ├── codex.txt the harness's stdout, under the harness's own name
22
+ │ ├── stderr.log the harness's stderr
23
+ │ ├── agent-home.json the home capture record
24
+ │ └── .codex/ the captured home, at its real names
25
+ └── verifier/
26
+ ├── test-stdout.txt everything the verifier printed
27
+ └── reward.json the rewards map
28
+ ```
29
+
30
+ 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.
31
+
32
+ `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.
33
+
34
+ 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`.
35
+
36
+ ## The agent's home folder
37
+
38
+ 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.
39
+
40
+ 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.
41
+
42
+ 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.
43
+
44
+ ## The parsed trace
45
+
46
+ 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.
47
+
48
+ ```json
49
+ {"seq": 0, "type": "prompt", "data": {"_prompt": {"text": "Create hello.txt containing Hello."}}}
50
+ {"seq": 1, "type": "agent_message_chunk", "data": {"update": {"sessionUpdate": "agent_message_chunk", "content": {"type": "text", "text": "I'll create the file."}}}}
51
+ {"seq": 2, "type": "tool_call", "data": {"update": {"sessionUpdate": "tool_call", "toolCallId": "call-1", "title": "Write hello.txt", "kind": "edit", "status": "pending"}}}
52
+ {"seq": 3, "type": "tool_call_update", "data": {"update": {"sessionUpdate": "tool_call_update", "toolCallId": "call-1", "status": "completed"}}}
53
+ {"seq": 4, "type": "usage", "data": {"update": {"sessionUpdate": "usage", "scope": "call", "usage": {"promptTokens": 812, "completionTokens": 64}}}}
54
+ ```
55
+
56
+ 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`.
57
+
58
+ 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.
59
+
60
+ ```bash
61
+ evolve trial trace <trial-id>
62
+ evolve trial trace <trial-id> --grep 'permission denied' --tail 50
63
+ evolve trial trace <trial-id> --cursor 140
64
+ ```
65
+
66
+ `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.
67
+
68
+ ## The ATIF trajectory
69
+
70
+ `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.
71
+
72
+ 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.
73
+
74
+ ```json
75
+ {
76
+ "schema_version": "ATIF-v1.7",
77
+ "agent": {"name": "codex", "version": "0.31.0", "model_name": "gpt-5.5"},
78
+ "steps": [
79
+ {"step_id": 1, "source": "user", "message": "Create hello.txt containing Hello."},
80
+ {
81
+ "step_id": 2,
82
+ "source": "agent",
83
+ "message": "I'll create the file.",
84
+ "tool_calls": [{"tool_call_id": "call-1", "function_name": "apply_patch", "arguments": {"path": "hello.txt"}}],
85
+ "observation": {"results": [{"source_call_id": "call-1", "content": "Success"}]}
86
+ }
87
+ ]
88
+ }
89
+ ```
90
+
91
+ ```bash
92
+ evolve trial download <trial-id> --stream trace-atif
93
+ ```
94
+
95
+ ## Raw streams and the verifier log
96
+
97
+ 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:
98
+
99
+ ```bash
100
+ evolve trial download <trial-id> --stream verifier
101
+ ```
102
+
103
+ From the SDK, `trials().artifact(id, "verifier")` returns the same text, and `null` when the trial never stored it.
@@ -0,0 +1,103 @@
1
+ ---
2
+ title: "Trials"
3
+ description: "One agent's attempt at one task: its record, its trace, and its artifacts."
4
+ ---
5
+
6
+ A trial is one attempt of one task by one agent arm. Trial ids are global: every trial command takes the trial id alone, and the trial's record carries its job id. Treat ids as opaque strings.
7
+
8
+ ```bash
9
+ evolve trial show <trial-id>
10
+ ```
11
+
12
+ `trial show` prints the task, the agent and model, the status, the reward, the tokens, what the trial spent and, when it failed, the exception. Spend prints as a plain amount once the meter has settled it, as `at least $X` while it is still a lower bound, and as `-` when nobody has measured it yet.
13
+
14
+ While a trial runs, `attempt_phase` says which step it is in (`prepare`, `build`, `boot`, `install`, `agent`, `verify`, `persist`), and `live_spent_usd` is a lower bound on its spend so far, refreshed about every 30 seconds and null before the first reading; `usage` carries the same reading with its tokens. On a settled trial read `agent_result.cost_usd`; `spend_source` says whether it is final (`measured`).
15
+
16
+ ## The trace
17
+
18
+ Every trial records a parsed event trace: the instruction, each agent turn, every tool call and its result. Print it, filtered on the server.
19
+
20
+ ```bash
21
+ evolve trial trace <trial-id>
22
+ evolve trial trace <trial-id> --type <event-type>
23
+ evolve trial trace <trial-id> --grep 'permission denied' --tail 50
24
+ ```
25
+
26
+ `--type` keeps events of exactly one type. `--grep` is a case-insensitive regex over type and content. `--tail` keeps the last N matching events. To search every trial of a job in one pass:
27
+
28
+ ```bash
29
+ evolve job grep <job-id> 'permission denied'
30
+ ```
31
+
32
+ ## Artifacts
33
+
34
+ Beside the parsed trace, a trial keeps the raw record of its run. One vocabulary names the pieces everywhere; every file and format is described on [trial outputs](/core-concepts/trial-outputs).
35
+
36
+ - `trace-parsed`: the parsed event trace
37
+ - `trace-stdout`: the agent process's stdout, byte for byte
38
+ - `trace-stderr`: the agent process's stderr
39
+ - `trace-atif`: the normalized trajectory, in the ATIF format
40
+ - `agent-home`: the text view of the agent's home folder, captured after the run
41
+ - `verifier`: everything the scoring step printed
42
+ - `trajectory`: reserved for the harness's own native session file, not served yet
43
+
44
+ Stream one artifact to stdout:
45
+
46
+ ```bash
47
+ evolve trial download <trial-id> --stream verifier
48
+ ```
49
+
50
+ ## Download the trial tree
51
+
52
+ Without `--stream`, the trial is saved whole under `<dir>/<trial-id>/` in the trial tree layout, plus `evolve.json`.
53
+
54
+ ```bash
55
+ evolve trial download <trial-id> -o trials/
56
+ ```
57
+
58
+ ```text
59
+ config.json task and agent
60
+ result.json status, reward, verifier verdict, exception, phase clocks
61
+ agent/trajectory.json the normalized ATIF trajectory
62
+ agent/<harness>.txt the harness's stdout stream (claude-code.txt, codex.txt, ...)
63
+ agent/stderr.log the harness's stderr stream
64
+ agent/trace-parsed.jsonl the parsed event trace
65
+ agent/.claude/ ... the captured agent home at its real names
66
+ agent/agent-home.json the capture record: every file's path, size and digest
67
+ verifier/test-stdout.txt the verifier log
68
+ verifier/reward.json the rewards map, when the verifier produced one
69
+ exception.txt when the trial carries an exception
70
+ evolve.json the platform's own record: cost, tokens, provider
71
+ ```
72
+
73
+ An artifact the trial never recorded is an absent file, never an empty placeholder. `--overwrite` replaces an existing folder. The job archive from `evolve job download` holds the same tree per trial, plus what only the server can add: `lock.json`, `trial.log`, `artifacts/`, and the raw `verifier/reward.txt`.
74
+
75
+ ## Act on one trial
76
+
77
+ ```bash
78
+ evolve trial retry <trial-id>
79
+ evolve trial regrade <trial-id>
80
+ evolve trial stop <trial-id> <trial-id>
81
+ ```
82
+
83
+ `retry` runs a settled trial again, `regrade` re-runs only its verifier, and each produces a new job holding the one new trial. `stop` ends in-flight trials without cancelling their job; each stopped trial settles `CANCELLED` and is charged its spend so far.
84
+
85
+ ## Statuses
86
+
87
+ A valid reward, 0 included, is `SCORED`; a failure is never reported as a fabricated zero.
88
+
89
+ - `QUEUED`: waiting for a sandbox slot.
90
+ - `RUNNING`: the agent phase; `attempt_phase` says which step.
91
+ - `SCORING`: the agent finished; the verifier is running.
92
+ - `SCORED`: a valid reward is in `reward`.
93
+ - `SCORING_ERROR`: the verifier crashed or wrote a reward outside `[0, 1]`; read `exception_info`.
94
+ - `INFRASTRUCTURE_ERROR`: the trial was lost before a result was recorded; retried automatically, then `resume`.
95
+ - `BUDGET`: a budget above the trial's own cap refused it. The exception type is `ApiUsageLimitError` and the message carries `user:` (your credits), `team:` (the organization's monthly budget) or `other:` (the platform's global stop). Never retried on its own; add credits or raise the budget, then `resume`.
96
+ - `INDETERMINATE`: the platform cannot tell whether the trial completed.
97
+ - `CANCELLED`: stopped before settling; the exception type is `CancelledError`.
98
+
99
+ `SCORING_ERROR` and `INDETERMINATE` carry the last 4000 characters of the verifier's own output in `exception_message`. Job statuses are on [jobs](/core-concepts/jobs#statuses).
100
+
101
+ <Card title="trial reference" icon="terminal" href="/cli-reference/trial">
102
+ Every flag of `evolve trial`.
103
+ </Card>
@@ -0,0 +1,45 @@
1
+ ---
2
+ title: "Upload a job"
3
+ description: "Bring a job you ran elsewhere onto the platform as a finished job."
4
+ ---
5
+
6
+ A job you ran elsewhere, in the Harbor job layout, uploads as a terminal job. Its trials, traces and rewards become a job you read like any other.
7
+
8
+ ```bash
9
+ evolve upload ./job-2026-08-27__12-00-00 -d terminal-bench-4@4.0
10
+ ```
11
+
12
+ `upload` takes the job directory, or its `.tar.gz`. With `--from <url>` it takes instead a public https URL of the archive, which the server fetches itself. `-d name[@version]` links the uploaded trials to a published dataset version by task name. The command follows the import until the job exists.
13
+
14
+ `--no-wait` returns at once with the import id.
15
+
16
+ ```bash
17
+ evolve job imports --status RUNNING
18
+ evolve job import <import-id> --watch
19
+ ```
20
+
21
+ `job imports` lists your uploads, newest first. `job import --watch` re-attaches to one and follows it to the job, or to its typed failure. A large upload resumes after a dropped connection, and its import id is available before the transfer ends.
22
+
23
+ ## What lands
24
+
25
+ The trials' facts, never a re-judgment: a rewarded trial arrives `SCORED` with its rewards untouched, a trial with no rewards arrives `INDETERMINATE`, and an errored trial keeps its exception. The trajectory, the agent's logs and home folder, and the verifier log land where a native trial's do, so every trace and artifact read works unchanged. Prior `analysis.json`, `lock.json`, `artifacts/` and `steps/` content are not imported.
26
+
27
+ The ingested job carries `upload`: the archive's own `original_job_id` and `original_job_name`, `uploaded_at`, the uploader's `reported_totals`, and `task_links`. It is null on every job this platform ran. Resume, retry and regrade refuse an uploaded job with `job_uploaded`; analyze works on it unchanged.
28
+
29
+ An uploaded job never claims an execution: its `sandbox_provider` is null, the CLI prints `ported`, and the metered spend and token fields stay null. The archive's own figures ride `trial.upload.reported_agent_result` and `upload.reported_totals`, and `job show` prints them as `reported $X.XX (N/M trials reporting)`.
30
+
31
+ ## Task linkage
32
+
33
+ Every trial's `lock.json` names its task by a content hash, and every task the platform imports carries the same hash, so an uploaded job links to the dataset it ran against by itself. A linked trial's analyses run with the task folder; an unlinked trial's run without it, and the record says why: `hash_mismatch`, `task_not_in_dataset`, `no_task_digest`, `no_hash_match`, `no_dataset_named` or `dataset_ambiguous`. A name alone never links.
34
+
35
+ `-d` is the override: it links by task name to that one version, whatever the hashes say, and settles an ambiguous hash. A hint you cannot use fails the import. The outcome is printed by the upload follow, repeated by `evolve analyze` before it spends, and recorded on the job's `upload.task_links`, the import's `task_links` and each trial's `upload.link`.
36
+
37
+ ## Bounds and duplicates
38
+
39
+ The only size limit is the archive ceiling published as `limits.uploads.job_archive_bytes` (`upload_too_large` past it). A trial with a single file over 5 GiB, or a trajectory too large to parse, is skipped instead of failing the job: the import lists it under `skipped_trials` as `trial_too_large`, and `job import` prints one line per skipped trial. A trial whose `result.json` cannot be read fails the whole import with `invalid_trial`.
40
+
41
+ Re-uploading a job you already uploaded fails with `job_already_uploaded`, naming the existing job; delete it, then upload again. Another user uploading the same archive gets their own copy.
42
+
43
+ <Card title="upload reference" icon="terminal" href="/cli-reference/upload">
44
+ Every flag of `evolve upload`.
45
+ </Card>
@@ -0,0 +1,15 @@
1
+ ---
2
+ title: "Checks"
3
+ description: "Read a job's task quality checks in the dashboard."
4
+ ---
5
+
6
+ A job's CHECK tab lists the task quality checks run on the job's datasets.
7
+
8
+ {/* retake after the UI pass, from a non-admin account */}
9
+ <Frame caption="The CHECK tab of a job whose tasks have not been checked">
10
+ <img src="/images/job-check.png" alt="The CHECK tab: the sentence that no task of this job has been checked, and the evolve check command that would check its dataset." />
11
+ </Frame>
12
+
13
+ Until a check exists, the tab shows the command that would start one, `evolve check -d <dataset@version>`, with the job's dataset filled in. Checks start from the command line; see [check](/core-concepts/check).
14
+
15
+ Once a dataset has been checked, the tab lists one row per task with its dataset and its result. Click a row to open the check in the [trial viewer](/dashboard/trial-viewer): the events are the checker's own trace, and its result document is on the DOWNLOAD menu.
@@ -0,0 +1,24 @@
1
+ ---
2
+ title: "Datasets"
3
+ description: "Browse the catalog, and each dataset's tasks and versions, in the dashboard."
4
+ ---
5
+
6
+ The Datasets page lists every dataset you can run: the platform's public datasets and your own private ones.
7
+
8
+ {/* retake after the UI pass, from a non-admin account */}
9
+ <Frame caption="The datasets catalog">
10
+ <img src="/images/datasets.png" alt="The Datasets page: a search box, an ALL, PUBLIC and PRIVATE filter, and a table of datasets with task count, version, visibility, status and update time." />
11
+ </Frame>
12
+
13
+ Search by name, and filter with ALL, PUBLIC or PRIVATE. Each row shows the dataset's task count, its active version, its visibility, its status and when it last changed. Tick rows to delete datasets you own. There is no publish button: publishing is [`evolve dataset publish`](/core-concepts/datasets).
14
+
15
+ Click a dataset to open it.
16
+
17
+ {/* retake after the UI pass, from a non-admin account */}
18
+ <Frame caption="One dataset: its tasks, with a verdict per sandbox provider">
19
+ <img src="/images/dataset.png" alt="One dataset's page: the visibility, version and task count in the header, TASKS and VERSIONS tabs, and a table of tasks with GPUs, agent timeout, verifier timeout, skills and providers." />
20
+ </Frame>
21
+
22
+ The header shows the visibility, the active version and the task count. The TASKS tab lists every task of that version with its GPU count, its agent and verifier timeouts, its skills, and the sandbox providers that can run it. An arrow after a provider means the trial is rerouted to the provider after the arrow. Hover a refused provider for the reason.
23
+
24
+ The VERSIONS tab lists the dataset's versions. DELETE appears only on a dataset you may delete: your own private dataset, or a public one when you are the platform admin. It removes the dataset.
@@ -0,0 +1,65 @@
1
+ ---
2
+ title: "Jobs"
3
+ description: "Start a job from the browser, follow it, and read its results."
4
+ ---
5
+
6
+ The Jobs page lists your jobs, newest first.
7
+
8
+ {/* retake after the UI pass, from a non-admin account */}
9
+ <Frame caption="The jobs list">
10
+ <img src="/images/jobs.png" alt="The Jobs page: a NEW JOB button, a search box, a status filter, and a table of jobs with status, datasets, agents, trials, cost and creation time." />
11
+ </Frame>
12
+
13
+ Search by name, and filter by status: ALL, QUEUED, RUNNING, CANCELLING, COMPLETED, CANCELLED or FAILED. Each row shows the job's datasets, its agents with their models, how many trials have settled out of the total, what it has spent, and when it started. Tick rows to cancel live jobs or delete finished ones.
14
+
15
+ ## New job
16
+
17
+ NEW JOB opens the form. It takes the same choices as `evolve run`.
18
+
19
+ {/* retake after the UI pass, from a non-admin account */}
20
+ <Frame caption="The New job form">
21
+ <img src="/images/new-job.png" alt="The New job form: a Sources list of datasets to tick, an Agents section with agent, model and reasoning effort, an ADD AGENT button, and a Summary rail with LAUNCH and VALIDATE buttons." />
22
+ </Frame>
23
+
24
+ - **Sources**: tick one or more datasets, cap the task count, and narrow the tasks with include and exclude patterns over their names.
25
+ - **Agents**: one arm per entry, with its agent, its model (required) and its reasoning effort. Arm options hold the version pin, a preset, a config file and skills. ADD AGENT adds another arm.
26
+ - **Secrets**: attach a secret from your vault, or save and attach a one-off value.
27
+ - **Job settings**: job name, attempts per task, parallel trials, auto-retries, and the spend cap per trial.
28
+ - **Advanced**, collapsed by default: the sandbox provider, the timeout multipliers, the judge overrides for the verifier, and the exceptions to retry on.
29
+
30
+ The Summary rail counts datasets × agents × attempts. VALIDATE checks the whole form without starting anything. LAUNCH starts the job and opens its page.
31
+
32
+ ## One job
33
+
34
+ {/* retake after the UI pass, from a non-admin account */}
35
+ <Frame caption="A job's page, on its OVERVIEW tab">
36
+ <img src="/images/job.png" alt="A job's page: the job id and status in the header, CANCEL, RESUME, DOWNLOAD and RE-RUN JOB buttons, tiles for trials, errors, average reward, cost and max cost, and the OVERVIEW tab with a progress bar and a per-agent table." />
37
+ </Frame>
38
+
39
+ The header carries the job id and its status. CANCEL stops a running job. RESUME runs a finished job's failed or stopped trials again as a new job.
40
+
41
+ DOWNLOAD saves a finished job's results as a `.tar.gz` in the standard job layout; while the job runs it is disabled, with the reason on hover. RE-RUN JOB opens the New job form filled in with this job's choices.
42
+
43
+ Five tiles sum the job up: trials settled out of the total, errors, average reward, cost so far, and the most the job can cost. The average reward shows a value for a job with one agent and one dataset; with more, it shows a dash and the OVERVIEW rows carry the means. Below them, five tabs.
44
+
45
+ - **OVERVIEW**: a progress bar by trial status, and one row per agent and dataset with its scored trials, errors, mean reward and pass@k.
46
+ - **TRIALS**: every trial, with ALL or ERRORS, its task, agent, status, reward, cost, duration and token counts. Click a row to open the [trial viewer](/dashboard/trial-viewer).
47
+ - **ANALYZE**: the trace analyses of the job's trials, below.
48
+ - **CHECK**: the task quality checks of the job's datasets. See [checks](/dashboard/checks).
49
+ - **CONFIG**: the stored job record as JSON: its id, status, counts, stats and resolved settings.
50
+
51
+ {/* retake after the UI pass, from a non-admin account */}
52
+ <Frame caption="The TRIALS tab">
53
+ <img src="/images/job-trials.png" alt="The TRIALS tab: ALL and ERRORS filters and a table of trials with task, agent, status, reward, cost, duration, input tokens and output tokens." />
54
+ </Frame>
55
+
56
+ ## The ANALYZE tab
57
+
58
+ {/* retake after the UI pass, from a non-admin account */}
59
+ <Frame caption="The ANALYZE tab after every trial was analyzed">
60
+ <img src="/images/job-analyze.png" alt="The ANALYZE tab: tiles for completed, failed and pending analyses and the analyzer's cost, the policy with model, effort and criteria, and a table of pass, fail, not applicable and unknown counts per criterion." />
61
+ </Frame>
62
+
63
+ The tab counts completed, failed and pending analyses and the analyzer's own spend. The policy block names the analyzer's model, its reasoning effort and the rubric's criteria. The first table counts, per criterion, how many analyses ruled pass, fail, not applicable or unknown.
64
+
65
+ Below it, one row per trial carries its label, its verdicts, the analyzer's spend and its summary; click a row to open the analysis in the trial viewer. Start analyses with `evolve analyze <job-id>` or with `--analyze` on `evolve run`, see [analyze](/core-concepts/analyze).
@@ -0,0 +1,15 @@
1
+ ---
2
+ title: "Traces"
3
+ description: "Every recorded run in one list."
4
+ ---
5
+
6
+ The Traces page lists every run the platform recorded for you, newest first: the trials of your jobs, their regrades, analyses and checks, and the managed-agent sessions the platform recorded, which these pages do not cover.
7
+
8
+ {/* retake after the UI pass, from a non-admin account */}
9
+ <Frame caption="The traces list">
10
+ <img src="/images/traces.png" alt="The Traces page: a search box and a table of runs with a trace tag, the sandbox provider, the sandbox id, the agent and model, the start time, the cost and the status." />
11
+ </Frame>
12
+
13
+ Each row carries a tag naming the kind of run (EVAL for a trial, AGENT for a managed-agent session, REGRADE, ANALYZE, or CHECK), the task or session name, the dataset, the reward when there is one, the sandbox provider and sandbox id, the agent and model, when it started, what it spent, and its status. Search by name. Tick rows to stop running ones or delete finished ones.
14
+
15
+ Click a row to open it in the [trial viewer](/dashboard/trial-viewer).
@@ -0,0 +1,30 @@
1
+ ---
2
+ title: "Trial viewer"
3
+ description: "Read one trial's trace event by event, its tool calls, its spend, and download its artifacts."
4
+ ---
5
+
6
+ Click a trial on a job's TRIALS tab, or a row on the Traces page, to open it.
7
+
8
+ {/* retake after the UI pass, from a non-admin account */}
9
+ <Frame caption="A scored trial in the viewer">
10
+ <img src="/images/trial.png" alt="The trial viewer: a header with the task, agent, model, sandbox id, cost and status, a progress bar with previous and next event controls, an EVENTS list on the left, and the selected event's content on the right." />
11
+ </Frame>
12
+
13
+ The header names the run: its kind (EVAL for a trial, AGENT for a managed-agent session, REGRADE, ANALYZE, or CHECK), its task, its agent and model, its sandbox id, what it spent, and its status.
14
+
15
+ BACK returns to where you came from. RETRY runs a settled trial again as a new one-trial job. STOP ends a run that is still going.
16
+
17
+ DOWNLOAD on a trial offers the parsed trace, the ATIF trajectory, the raw stdout, the raw stderr, the agent home folder, the verifier log, or everything at once; on an analysis or a check it offers the verdict document, the raw stdout, the raw stderr, the agent home folder, or everything.
18
+
19
+ Under the header, the reward and the event navigation: previous, next, and a progress bar you can drag. Type `/` to search the events.
20
+
21
+ The EVENTS list runs down the left: the prompt, each assistant message and thought, each tool call and its result, and the gateway's own records: one per model call with its tokens and cost, and a run total at the end. Click an event to read it in full on the right. A running trial keeps appending events while you watch.
22
+
23
+ {/* retake after the UI pass, from a non-admin account */}
24
+ <Frame caption="An analysis run, with the TOOLS panel open">
25
+ <img src="/images/trial-analysis.png" alt="The trial viewer on an analysis run: a TOOLS summary with the number of calls, the success rate and a bar per tool, then the events list and the selected event's content." />
26
+ </Frame>
27
+
28
+ The panel above the events has two tabs. TOOLS counts the run's tool calls, its success rate and how many failed, with a bar per tool. SPEND shows what the run spent. The gateway meter at the end of the run states the prompt, cached, cache-write and completion tokens and the cost in dollars.
29
+
30
+ An analysis, a check or a regrade is read the same way. An analysis's events are the analyzer's own trace, and its verdict document is on the DOWNLOAD menu.