@evolvingmachines/evolve 0.0.65 → 0.0.67-train-harness-wave-2026-09-25.20260926.e00a8a6d

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 (153) hide show
  1. package/dist/{chunk-DK2MGUPB.js → chunk-DI6LPW2B.js} +2 -2
  2. package/dist/cli/index.cjs +29 -29
  3. package/dist/cli/index.d.cts +3 -3
  4. package/dist/cli/index.d.ts +3 -3
  5. package/dist/cli/index.js +18 -18
  6. package/dist/index.cjs +64 -60
  7. package/dist/index.d.cts +297 -18
  8. package/dist/index.d.ts +297 -18
  9. package/dist/index.js +48 -44
  10. package/dist/{types-B_qmzlMk.d.cts → types-Dj0iMl5V.d.cts} +70 -90
  11. package/dist/{types-B_qmzlMk.d.ts → types-Dj0iMl5V.d.ts} +70 -90
  12. package/harness-capabilities.json +285 -0
  13. package/package.json +9 -6
  14. package/skills/create-adapter/SKILL.md +71 -26
  15. package/skills/create-task/SKILL.md +124 -66
  16. package/skills/evolve/SKILL.md +37 -20
  17. package/skills/evolve-evals/SKILL.md +142 -69
  18. package/skills/evolve-evals/references/cli-reference/agent.md +76 -0
  19. package/skills/evolve-evals/references/cli-reference/analysis.md +78 -0
  20. package/skills/evolve-evals/references/cli-reference/analyze.md +97 -0
  21. package/skills/evolve-evals/references/cli-reference/auth.md +96 -0
  22. package/skills/evolve-evals/references/cli-reference/check.md +157 -0
  23. package/skills/evolve-evals/references/cli-reference/dataset.md +154 -0
  24. package/skills/evolve-evals/references/cli-reference/filesystem.md +168 -0
  25. package/skills/evolve-evals/references/cli-reference/index.md +149 -0
  26. package/skills/evolve-evals/references/cli-reference/job.md +198 -0
  27. package/skills/evolve-evals/references/cli-reference/run.md +188 -0
  28. package/skills/evolve-evals/references/cli-reference/secrets.md +77 -0
  29. package/skills/evolve-evals/references/cli-reference/session.md +56 -0
  30. package/skills/evolve-evals/references/cli-reference/skill.md +52 -0
  31. package/skills/evolve-evals/references/cli-reference/skills.md +85 -0
  32. package/skills/evolve-evals/references/cli-reference/trial.md +115 -0
  33. package/skills/evolve-evals/references/cli-reference/upload.md +72 -0
  34. package/skills/evolve-evals/references/core-concepts/agents.md +101 -0
  35. package/skills/evolve-evals/references/core-concepts/analyze.md +143 -0
  36. package/skills/evolve-evals/references/core-concepts/check.md +116 -0
  37. package/skills/evolve-evals/references/core-concepts/compatibility.md +39 -0
  38. package/skills/evolve-evals/references/core-concepts/compose.md +103 -0
  39. package/skills/evolve-evals/references/core-concepts/datasets.md +234 -0
  40. package/skills/evolve-evals/references/core-concepts/index.md +52 -0
  41. package/skills/evolve-evals/references/core-concepts/jobs.md +223 -0
  42. package/skills/evolve-evals/references/core-concepts/models.md +73 -0
  43. package/skills/evolve-evals/references/core-concepts/multi-step.md +93 -0
  44. package/skills/evolve-evals/references/core-concepts/rewardkit.md +341 -0
  45. package/skills/evolve-evals/references/core-concepts/sandboxes.md +73 -0
  46. package/skills/evolve-evals/references/core-concepts/secrets.md +86 -0
  47. package/skills/evolve-evals/references/core-concepts/sharing.md +81 -0
  48. package/skills/evolve-evals/references/core-concepts/skills.md +100 -0
  49. package/skills/evolve-evals/references/core-concepts/task-config.md +169 -0
  50. package/skills/evolve-evals/references/core-concepts/task-environment.md +127 -0
  51. package/skills/evolve-evals/references/core-concepts/task-reference.md +191 -0
  52. package/skills/evolve-evals/references/core-concepts/task-verifiers.md +209 -0
  53. package/skills/evolve-evals/references/core-concepts/tasks.md +90 -0
  54. package/skills/evolve-evals/references/core-concepts/teams.md +128 -0
  55. package/skills/evolve-evals/references/core-concepts/trial-outputs.md +225 -0
  56. package/skills/evolve-evals/references/core-concepts/trials.md +129 -0
  57. package/skills/evolve-evals/references/core-concepts/upload-sdk-session.md +240 -0
  58. package/skills/evolve-evals/references/core-concepts/upload.md +166 -0
  59. package/skills/evolve-evals/references/dashboard/checks.md +54 -0
  60. package/skills/evolve-evals/references/dashboard/datasets.md +65 -0
  61. package/skills/evolve-evals/references/dashboard/jobs.md +106 -0
  62. package/skills/evolve-evals/references/dashboard/traces.md +54 -0
  63. package/skills/evolve-evals/references/dashboard/trial-viewer.md +77 -0
  64. package/skills/evolve-evals/references/getting-started/first-task.md +228 -0
  65. package/skills/evolve-evals/references/getting-started/installation.md +79 -0
  66. package/skills/evolve-evals/references/getting-started/quick-start.md +100 -0
  67. package/skills/evolve-evals/references/index.md +58 -0
  68. package/skills/evolve-evals/references/sdk/http.md +110 -0
  69. package/skills/evolve-evals/references/sdk/python.md +108 -0
  70. package/skills/evolve-evals/references/sdk/typescript.md +104 -0
  71. package/skills/evolve-evals/references/sdk-reference/agents.md +75 -0
  72. package/skills/evolve-evals/references/sdk-reference/analyses.md +125 -0
  73. package/skills/evolve-evals/references/sdk-reference/auth.md +171 -0
  74. package/skills/evolve-evals/references/sdk-reference/checks.md +146 -0
  75. package/skills/evolve-evals/references/sdk-reference/datasets.md +170 -0
  76. package/skills/evolve-evals/references/sdk-reference/error-codes.md +231 -0
  77. package/skills/evolve-evals/references/sdk-reference/errors.md +98 -0
  78. package/skills/evolve-evals/references/sdk-reference/filesystem.md +166 -0
  79. package/skills/evolve-evals/references/sdk-reference/index.md +161 -0
  80. package/skills/evolve-evals/references/sdk-reference/jobs.md +250 -0
  81. package/skills/evolve-evals/references/sdk-reference/meta.md +54 -0
  82. package/skills/evolve-evals/references/sdk-reference/methods/agents.md +154 -0
  83. package/skills/evolve-evals/references/sdk-reference/methods/analyses.md +211 -0
  84. package/skills/evolve-evals/references/sdk-reference/methods/auth.md +257 -0
  85. package/skills/evolve-evals/references/sdk-reference/methods/checks.md +462 -0
  86. package/skills/evolve-evals/references/sdk-reference/methods/datasets.md +687 -0
  87. package/skills/evolve-evals/references/sdk-reference/methods/filesystem.md +527 -0
  88. package/skills/evolve-evals/references/sdk-reference/methods/jobs.md +1023 -0
  89. package/skills/evolve-evals/references/sdk-reference/methods/meta.md +213 -0
  90. package/skills/evolve-evals/references/sdk-reference/methods/secrets.md +157 -0
  91. package/skills/evolve-evals/references/sdk-reference/methods/skills.md +125 -0
  92. package/skills/evolve-evals/references/sdk-reference/methods/trials.md +371 -0
  93. package/skills/evolve-evals/references/sdk-reference/secrets.md +104 -0
  94. package/skills/evolve-evals/references/sdk-reference/skills.md +66 -0
  95. package/skills/evolve-evals/references/sdk-reference/trials.md +164 -0
  96. package/skills/evolve-evals/references/sdk-reference/types.md +1255 -0
  97. package/skills/publish/SKILL.md +103 -79
  98. package/skills/rewardkit/SKILL.md +78 -23
  99. package/spec/openapi.yaml +164 -160
  100. package/skills/evolve-evals/references/cli-reference/agent.mdx +0 -79
  101. package/skills/evolve-evals/references/cli-reference/analysis.mdx +0 -160
  102. package/skills/evolve-evals/references/cli-reference/analyze.mdx +0 -84
  103. package/skills/evolve-evals/references/cli-reference/auth.mdx +0 -133
  104. package/skills/evolve-evals/references/cli-reference/check.mdx +0 -263
  105. package/skills/evolve-evals/references/cli-reference/dataset.mdx +0 -151
  106. package/skills/evolve-evals/references/cli-reference/index.mdx +0 -108
  107. package/skills/evolve-evals/references/cli-reference/job.mdx +0 -278
  108. package/skills/evolve-evals/references/cli-reference/run.mdx +0 -204
  109. package/skills/evolve-evals/references/cli-reference/secrets.mdx +0 -95
  110. package/skills/evolve-evals/references/cli-reference/skill.mdx +0 -61
  111. package/skills/evolve-evals/references/cli-reference/skills.mdx +0 -81
  112. package/skills/evolve-evals/references/cli-reference/trial.mdx +0 -181
  113. package/skills/evolve-evals/references/cli-reference/upload.mdx +0 -36
  114. package/skills/evolve-evals/references/core-concepts/agents.mdx +0 -106
  115. package/skills/evolve-evals/references/core-concepts/analyze.mdx +0 -86
  116. package/skills/evolve-evals/references/core-concepts/check.mdx +0 -64
  117. package/skills/evolve-evals/references/core-concepts/datasets.mdx +0 -138
  118. package/skills/evolve-evals/references/core-concepts/index.mdx +0 -42
  119. package/skills/evolve-evals/references/core-concepts/jobs.mdx +0 -151
  120. package/skills/evolve-evals/references/core-concepts/models.mdx +0 -68
  121. package/skills/evolve-evals/references/core-concepts/sandboxes.mdx +0 -52
  122. package/skills/evolve-evals/references/core-concepts/secrets.mdx +0 -41
  123. package/skills/evolve-evals/references/core-concepts/sharing.mdx +0 -35
  124. package/skills/evolve-evals/references/core-concepts/skills.mdx +0 -42
  125. package/skills/evolve-evals/references/core-concepts/tasks.mdx +0 -216
  126. package/skills/evolve-evals/references/core-concepts/teams.mdx +0 -36
  127. package/skills/evolve-evals/references/core-concepts/trial-outputs.mdx +0 -117
  128. package/skills/evolve-evals/references/core-concepts/trials.mdx +0 -103
  129. package/skills/evolve-evals/references/core-concepts/upload.mdx +0 -93
  130. package/skills/evolve-evals/references/dashboard/checks.mdx +0 -21
  131. package/skills/evolve-evals/references/dashboard/datasets.mdx +0 -24
  132. package/skills/evolve-evals/references/dashboard/jobs.mdx +0 -65
  133. package/skills/evolve-evals/references/dashboard/traces.mdx +0 -17
  134. package/skills/evolve-evals/references/dashboard/trial-viewer.mdx +0 -30
  135. package/skills/evolve-evals/references/getting-started/installation.mdx +0 -56
  136. package/skills/evolve-evals/references/getting-started/quick-start.mdx +0 -94
  137. package/skills/evolve-evals/references/index.mdx +0 -48
  138. package/skills/evolve-evals/references/sdk/python.mdx +0 -161
  139. package/skills/evolve-evals/references/sdk/typescript.mdx +0 -163
  140. package/skills/evolve-evals/references/sdk-reference/agents.mdx +0 -108
  141. package/skills/evolve-evals/references/sdk-reference/analyses.mdx +0 -222
  142. package/skills/evolve-evals/references/sdk-reference/auth.mdx +0 -116
  143. package/skills/evolve-evals/references/sdk-reference/checks.mdx +0 -300
  144. package/skills/evolve-evals/references/sdk-reference/datasets.mdx +0 -346
  145. package/skills/evolve-evals/references/sdk-reference/errors.mdx +0 -210
  146. package/skills/evolve-evals/references/sdk-reference/index.mdx +0 -60
  147. package/skills/evolve-evals/references/sdk-reference/jobs.mdx +0 -822
  148. package/skills/evolve-evals/references/sdk-reference/meta.mdx +0 -52
  149. package/skills/evolve-evals/references/sdk-reference/skills.mdx +0 -69
  150. package/skills/evolve-evals/references/sdk-reference/trials.mdx +0 -302
  151. package/skills/evolve-evals/references/sdk-reference/types.mdx +0 -274
  152. package/skills/evolve-evals/references/snippets/global-options.mdx +0 -13
  153. package/skills/evolve-evals/references/snippets/list-flags.mdx +0 -23
@@ -0,0 +1,1255 @@
1
+ ---
2
+ title: "Returned objects"
3
+ description: "Read jobs, trials, pages, costs, and results without guessing their shape."
4
+ ---
5
+
6
+ The SDK returns structured data. TypeScript uses objects. Python uses dataclasses for most entities and dictionaries for stats, analyses, checks, and rubric records.
7
+
8
+ ## Field access by language
9
+
10
+ | Value | TypeScript | Python |
11
+ | --- | --- | --- |
12
+ | Job id | `job.id` | `job.id` |
13
+ | Trial reward | `trial.reward` | `trial.reward` |
14
+ | Job cost | `job.stats.cost_usd` | `job.stats.get("cost_usd")` |
15
+ | Analysis checks | `analysis.checks` | `analysis["checks"]` |
16
+ | Check results | `check.results` | `check["results"]` |
17
+ | Filesystem state | `status.state` | `status.state` |
18
+ | Page cursor | `page.nextCursor` | `page.next_cursor` |
19
+ | Trial tally | `job.trials.byStatus` | `job.trials.by_status` |
20
+ | Compare matrix | `comparison.taskMatrix` | `comparison.task_matrix` |
21
+
22
+ Most domain field names are snake_case in both languages. One deliberate Python exception is a check row's task tally: `row.tasks["byStatus"]`.
23
+
24
+ ## Job or check row?
25
+
26
+ `jobs.list()` defaults to jobs. With `kind="all"`, discriminate before reading fields:
27
+
28
+ ```ts TypeScript
29
+ import { jobs } from "@evolvingmachines/evolve";
30
+ for await (const row of jobs().list({
31
+ kind: "all"
32
+ })) {
33
+ if (row.kind === "job") {
34
+ console.log(row.job_name, row.trials.byStatus);
35
+ }
36
+ else {
37
+ console.log(row.name, row.tasks.byStatus);
38
+ }
39
+ }
40
+ ```
41
+
42
+ ```python Python
43
+ from evolve import jobs
44
+
45
+ async for row in jobs().list(kind="all"):
46
+ if row.kind == "job":
47
+ print(row.job_name, row.trials.by_status)
48
+ else:
49
+ print(row.name, row.tasks["byStatus"])
50
+ ```
51
+
52
+ A check row has task-check counts. It does not have job arms, attempts, trial counts, or trial spend caps.
53
+
54
+ ## Status vocabulary
55
+
56
+ | Entity | States | Terminal |
57
+ | --- | --- | --- |
58
+ | Job | `QUEUED`, `RUNNING`, `CANCELLING`, `COMPLETED`, `CANCELLED`, `FAILED` | Last three |
59
+ | Trial | `QUEUED`, `RUNNING`, `SCORING`, `SCORED`, `SCORING_ERROR`, `INFRASTRUCTURE_ERROR`, `BUDGET`, `INDETERMINATE`, `CANCELLED` | All except first three |
60
+ | Analysis / task check | `queued`, `running`, `completed`, `failed` | Last two |
61
+ | Check group | `queued`, `running`, `completed` | `completed` |
62
+ | Import | `QUEUED`, `RUNNING`, `COMPLETED`, `FAILED` | Last two |
63
+ | Dataset version | `DRAFT`, `RECEIVING`, `IMPORTING`, `BUILDING`, `READY`, `FAILED`, `ARCHIVED` | Consult [meta](/sdk-reference/meta) for the published terminal set |
64
+
65
+ `FAILED` remains part of the job vocabulary. Do not infer all trial outcomes from the job's status: a completed job can contain scoring, infrastructure, or budget failures.
66
+
67
+ ## Null is information
68
+
69
+ | Value | Meaning |
70
+ | --- | --- |
71
+ | `reward: 0` | A real primary reward of zero |
72
+ | `reward: null` | No primary reward is available; inspect status and the full rewards map |
73
+ | `analysis: null` | No attached analysis result |
74
+ | `usage: null` | No usage reading is available |
75
+ | `finished_at: null` | Not finished, or no finish timestamp was recorded |
76
+ | `capture: null` | No settled capture summary is available |
77
+
78
+ Do not replace missing cost or reward with zero in a report.
79
+
80
+ ## Cost and statistics
81
+
82
+ `usage` groups `spent_usd`, input/cached/cache-write/output token counts, `as_of`, and `provisional`. A provisional reading can increase.
83
+
84
+ | `spend_source` | Meaning |
85
+ | --- | --- |
86
+ | `measured` | Final gateway reading |
87
+ | `measured_provisional` | Measured lower bound awaiting confirmation |
88
+ | `assumed_cap` | Spend was not measured; stored zero is a placeholder, not proof of no spend |
89
+
90
+ Job `stats.cost_usd` includes trial model spend and judge spend. `judge_cost_usd` identifies the judge share. Analysis cost is separate in `stats.analysis.cost_usd`; GPU compute estimates are separate too.
91
+
92
+ Job completion/error/cancellation counters overlap. Use the per-status trial tally when you need disjoint counts.
93
+
94
+ `passAtK(job)` / `pass_at_k(job)` reads sorted points from the server's `stats.evals` groups. It does not recompute them locally. A single-attempt job, incomplete group, or non-binary rewards may have no pass@k points.
95
+
96
+ ## Name types safely
97
+
98
+ TypeScript exports useful types such as `JobCreate`, `Job`, `Trial`, and `HostedClientConfig`. Some nested input/result types are inferred through methods instead of exported by name:
99
+
100
+ ```ts
101
+ import { checks, type JobCreate } from "@evolvingmachines/evolve";
102
+
103
+ type CheckInput = Parameters<ReturnType<typeof checks>["create"]>[0];
104
+ type JobRetryPolicy = NonNullable<JobCreate["retry"]>;
105
+ ```
106
+
107
+ The root-exported `RetryConfig` is for the separate Swarm API. Use the job's retry shape for managed evals.
108
+
109
+ Python exports hosted types such as `DatasetSelector`, `AgentArm`, and `JobRetryConfigInput`. Dataclass fields use attributes; TypedDict values use dictionary keys. The schemas below name each field. A `?` marks a field that may be absent; `null` means it may be present without a value. Python uses `None` for null and normal dictionaries for nested TypedDict records.
110
+
111
+ ## Job fields
112
+
113
+ `Job` is returned by submission, detail reads, and job actions. A returned object describes the accepted state; use `watch` to wait for execution.
114
+
115
+ | Field | Read it for |
116
+ | --- | --- |
117
+ | `trials.total`, `trials.byStatus` | Disjoint counts by trial status; Python uses `by_status` |
118
+ | `counts` | Selected agent and task counts |
119
+ | `stats` | Rewards, costs, errors, and analysis totals |
120
+ | `build_exclusions` | Tasks excluded because their build failed |
121
+ | `source_jobs` | Parent jobs and `resume`, `retry`, or `regrade` provenance |
122
+ | `upload` | Imported-result provenance; null for native execution |
123
+ | `viewer` | Caller’s access: `creator`, `member`, `shared`, `link`, or null |
124
+
125
+ The compact TypeScript schemas below describe data shapes. Some nested names are inferred types rather than root exports. Python fields keep the same spelling unless the language table above says otherwise.
126
+
127
+ ### Job: every top-level field
128
+
129
+ ```ts
130
+ interface Job {
131
+ kind: "job";
132
+ id: string;
133
+ job_name: string;
134
+ status: JobStatus;
135
+ datasets: DatasetRef[];
136
+ agents: AgentArm[];
137
+ n_attempts: number;
138
+ n_concurrent_trials: number;
139
+ max_trial_spend_usd: number;
140
+ worst_case_spend_usd: number;
141
+ retry: RetryConfig;
142
+ analyze: AnalyzeConfig | null;
143
+ timeout_multiplier: number;
144
+ agent_timeout_multiplier: number | null;
145
+ verifier_timeout_multiplier: number | null;
146
+ agent_setup_timeout_multiplier: number | null;
147
+ environment_build_timeout_multiplier: number | null;
148
+ sandbox_provider: EvalSandboxProvider | null;
149
+ org: string | null;
150
+ visibility: JobVisibility;
151
+ system_log: boolean;
152
+ counts: { agents: number; tasks: number };
153
+ build_exclusions: JobBuildExclusion[];
154
+ n_total_trials: number;
155
+ trials: TrialStatusTally;
156
+ stats: JobStats;
157
+ failure: JobFailure | null;
158
+ source_jobs: SourceJob[];
159
+ is_regrade: boolean;
160
+ viewer: JobViewer | null;
161
+ upload: UploadProvenance | null;
162
+ idempotent_replay: boolean;
163
+ started_at: string;
164
+ updated_at: string;
165
+ finished_at: string | null;
166
+ }
167
+
168
+ interface TrialStatusTally {
169
+ total: number;
170
+ byStatus: TrialCounts;
171
+ }
172
+ ```
173
+
174
+ ### Resolved datasets, agent arms, retry and analysis policy
175
+
176
+ ```ts
177
+ interface DatasetRef {
178
+ name: string;
179
+ version: string;
180
+ }
181
+
182
+ interface AgentArm {
183
+ name: string;
184
+ model_name: string;
185
+ version: string | null;
186
+ reasoning_effort: string | null;
187
+ kwargs: Record<string, unknown> | null;
188
+ preset: string | null;
189
+ skills: string[];
190
+ skill_locks: SkillLock[] | null;
191
+ }
192
+
193
+ interface SkillLock {
194
+ name: string;
195
+ source: string;
196
+ digest: string;
197
+ git_url: string | null;
198
+ git_commit_id: string | null;
199
+ }
200
+
201
+ interface RetryConfig {
202
+ max_retries: number;
203
+ include_exceptions: string[] | null;
204
+ exclude_exceptions: string[];
205
+ wait_multiplier: number;
206
+ min_wait_sec: number;
207
+ max_wait_sec: number;
208
+ }
209
+
210
+ interface AnalyzeConfig {
211
+ agent: string;
212
+ model_name: string;
213
+ rubric: Rubric;
214
+ prompt: string | null;
215
+ reasoning_effort: string | null;
216
+ sandbox_provider: EvalSandboxProvider;
217
+ n_concurrent: number | null;
218
+ passing: boolean;
219
+ failing: boolean;
220
+ n_trials: number | null;
221
+ trial_ids: string[] | null;
222
+ }
223
+ ```
224
+
225
+ ### Statistics and reward groups
226
+
227
+ Python stats are dictionaries. `n_completed_trials`, `n_errored_trials`, and `n_cancelled_trials` can overlap; they are not a partition of trials. `evals` groups rewards by agent, model, and dataset. Its current mean metric counts unrewarded trials as zero. [Task rollups](#task-rollups) and [comparisons](#comparison-results) use scored trials, with different handling of null rewards explained below.
228
+
229
+ ```ts
230
+ interface JobStats {
231
+ n_completed_trials?: number;
232
+ n_errored_trials?: number;
233
+ n_running_trials?: number;
234
+ n_pending_trials?: number;
235
+ n_cancelled_trials?: number;
236
+ n_retries?: number;
237
+ evals?: Record<string, AgentDatasetStats>;
238
+ n_input_tokens?: number | null;
239
+ n_cache_tokens?: number | null;
240
+ n_output_tokens?: number | null;
241
+ cost_usd?: number | null;
242
+ gpu_cost_usd?: number | null;
243
+ judge_cost_usd?: number | null;
244
+ n_unmeasured_trials?: number;
245
+ n_unmeasured_judge_trials?: number;
246
+ analysis?: JobAnalysisStats | null;
247
+ }
248
+
249
+ interface AgentDatasetStats {
250
+ n_trials?: number;
251
+ n_errors?: number;
252
+ metrics?: Record<string, unknown>[];
253
+ pass_at_k?: Record<string, number>;
254
+ reward_stats?: Record<string, Record<string, string[]>>;
255
+ exception_stats?: Record<string, string[]>;
256
+ }
257
+
258
+ interface JobAnalysisStats {
259
+ n_completed: number;
260
+ n_failed: number;
261
+ n_pending: number;
262
+ cost_usd: number | null;
263
+ checks: Record<
264
+ string,
265
+ { n_pass: number; n_fail: number; n_not_applicable: number; n_unknown: number }
266
+ >;
267
+ }
268
+ ```
269
+
270
+ ### Failure, build exclusions, and source jobs
271
+
272
+ ```ts
273
+ interface JobFailure {
274
+ code: string;
275
+ message: string;
276
+ }
277
+
278
+ interface JobBuildExclusion {
279
+ dataset: DatasetRef;
280
+ n_tasks_ran: number;
281
+ n_tasks_selected: number;
282
+ n_tasks_failed_to_build: number;
283
+ failed_task_names: string[];
284
+ note: string;
285
+ }
286
+
287
+ interface SourceJob {
288
+ action: "regrade" | "resume" | "retry";
289
+ type: "hub";
290
+ job_id: string;
291
+ }
292
+
293
+ interface UploadProvenance {
294
+ original_job_id: string | null;
295
+ original_job_name: string | null;
296
+ uploaded_at: string;
297
+ reported_totals: {
298
+ cost_usd: number | null;
299
+ n_input_tokens: number | null;
300
+ n_cache_tokens: number | null;
301
+ n_output_tokens: number | null;
302
+ n_trials_reporting: number;
303
+ } | null;
304
+ task_links: JobTaskLink[] | null;
305
+ datasets: UploadDataset[] | null;
306
+ }
307
+ ```
308
+
309
+ ### Check rows in a mixed jobs list
310
+
311
+ A check row is a summary, not a full `Check`. In Python, `row.tasks` is a dictionary and its key remains `byStatus`.
312
+
313
+ ```ts
314
+ interface CheckRow {
315
+ kind: "check";
316
+ id: string;
317
+ name: string;
318
+ status: CheckStatus;
319
+ source: CheckSource;
320
+ agent: string;
321
+ model_name: string;
322
+ reasoning_effort: string | null;
323
+ sandbox_provider: EvalSandboxProvider;
324
+ org: string;
325
+ visibility: JobVisibility;
326
+ tasks: CheckTaskTally;
327
+ cost_usd: number | null;
328
+ created_at: string;
329
+ finished_at: string | null;
330
+ }
331
+
332
+ interface CheckTaskTally {
333
+ total: number;
334
+ byStatus: Record<AnalysisStatus | "stopped", number>;
335
+ }
336
+ ```
337
+
338
+ ### Imported dataset provenance
339
+
340
+ ```ts
341
+ interface UploadDataset {
342
+ name: string;
343
+ version: string | null;
344
+ }
345
+ ```
346
+
347
+ ## Trial fields
348
+
349
+ A `Trial` holds one attempt’s outcome and evidence. `reward` is the primary scalar; `verifier_result.rewards` preserves the complete reward map.
350
+
351
+ ### Trial: every top-level field
352
+
353
+ ```ts
354
+ interface Trial {
355
+ id: string;
356
+ job_id: string;
357
+ task_name: string;
358
+ source: string;
359
+ agent_info: AgentInfo;
360
+ attempt: number;
361
+ status: TrialStatus;
362
+ reward: number | null;
363
+ verifier_result: VerifierResult | null;
364
+ exception_info: ExceptionInfo | null;
365
+ agent_result: AgentResult | null;
366
+ judge_result?: JudgeResult | null;
367
+ analysis?: TrialAnalysis | null;
368
+ environment_setup: TimingInfo | null;
369
+ agent_setup: TimingInfo | null;
370
+ agent_execution: TimingInfo | null;
371
+ verifier: TimingInfo | null;
372
+ queue_wait: TimingInfo | null;
373
+ harness_bundle: TimingInfo | null;
374
+ image_prepare: TimingInfo | null;
375
+ shared_verify_setup: TimingInfo | null;
376
+ harness_bundle_cache_hit: boolean | null;
377
+ step_results: StepResult[] | null;
378
+ spend_source: SpendSource | null;
379
+ judge_spend_source?: SpendSource | null;
380
+ live_spent_usd: number | null;
381
+ live_spend_at: string | null;
382
+ usage?: UsageReading | null;
383
+ max_trial_spend_usd: number | null;
384
+ sandbox_provider: EvalSandboxProvider | null;
385
+ sandbox_provider_degrade?: {
386
+ from: EvalSandboxProvider;
387
+ to: EvalSandboxProvider;
388
+ reason: string;
389
+ } | null;
390
+ gpu_cost?: TrialGpuCost | null;
391
+ sandbox_id: string | null;
392
+ verifier_sandbox_id: string | null;
393
+ verifier_environment_mode: VerifierEnvironmentMode | null;
394
+ attempt_phase: AttemptPhase | null;
395
+ n_retries: number;
396
+ retries: TrialRetry[];
397
+ session_ref: string | null;
398
+ upload: TrialUploadProvenance | null;
399
+ started_at: string | null;
400
+ finished_at: string | null;
401
+ }
402
+ ```
403
+
404
+ ### Agent, scores, usage, and timing
405
+
406
+ ```ts
407
+ interface AgentInfo {
408
+ name: string;
409
+ version: string | null;
410
+ model_info: ModelInfo;
411
+ reasoning_effort?: string | null;
412
+ }
413
+
414
+ interface ModelInfo {
415
+ name: string;
416
+ provider?: string | null;
417
+ }
418
+
419
+ interface VerifierResult {
420
+ rewards?: Record<string, number> | null;
421
+ }
422
+
423
+ interface ExceptionInfo {
424
+ exception_type: string;
425
+ exception_message: string;
426
+ exception_traceback?: string;
427
+ occurred_at: string;
428
+ }
429
+
430
+ interface AgentResult {
431
+ n_input_tokens?: number | null;
432
+ n_cache_tokens?: number | null;
433
+ n_output_tokens?: number | null;
434
+ cost_usd?: number | null;
435
+ rollout_details?: Record<string, unknown>[] | null;
436
+ metadata?: Record<string, unknown> | null;
437
+ }
438
+
439
+ interface JudgeResult {
440
+ n_input_tokens?: number | null;
441
+ n_cache_tokens?: number | null;
442
+ n_output_tokens?: number | null;
443
+ cost_usd?: number | null;
444
+ }
445
+
446
+ interface UsageReading {
447
+ provisional: boolean;
448
+ spent_usd: number | null;
449
+ input_tokens: number | null;
450
+ cached_input_tokens: number | null;
451
+ cache_write_tokens: number | null;
452
+ output_tokens: number | null;
453
+ as_of: string | null;
454
+ }
455
+
456
+ interface TimingInfo {
457
+ started_at: string | null;
458
+ finished_at: string | null;
459
+ }
460
+
461
+ interface TrialGpuCost {
462
+ estimate_usd: number | null;
463
+ unpriced_reason: string | null;
464
+ provider: EvalSandboxProvider;
465
+ gpu_type: string | null;
466
+ declared_gpu_types: string[] | null;
467
+ resolved_gpu_types: string[] | null;
468
+ attached_gpu_type: string | null;
469
+ gpu_count: number;
470
+ duration_sec: number | null;
471
+ rate_usd_per_gpu_sec: number | null;
472
+ rate_card: { version: number; source: string | null; source_date: string | null };
473
+ measured_from: string | null;
474
+ measured_to: string | null;
475
+ }
476
+ ```
477
+
478
+ ### Steps, retries, and imported provenance
479
+
480
+ Each timing record has `started_at` and `finished_at`; overlapping phases must not be added as independent durations. Python `step_results`, `sandbox_provider_degrade`, and `gpu_cost` hold dictionaries.
481
+
482
+ ```ts
483
+ interface StepResult {
484
+ step_name?: string;
485
+ agent_result?: AgentResult | null;
486
+ verifier_result?: VerifierResult | null;
487
+ exception_info?: ExceptionInfo | null;
488
+ agent_execution?: TimingInfo | null;
489
+ verifier?: TimingInfo | null;
490
+ }
491
+
492
+ interface TrialRetry {
493
+ attempt_number: number;
494
+ exception_info: ExceptionInfo;
495
+ cost_usd: number | null;
496
+ started_at: string | null;
497
+ settled_at: string | null;
498
+ }
499
+
500
+ interface TrialUploadProvenance {
501
+ original_trial_id: string | null;
502
+ original_trial_name: string;
503
+ original_task_name: string;
504
+ reported_agent_result: {
505
+ n_input_tokens: number | null;
506
+ n_cache_tokens: number | null;
507
+ n_output_tokens: number | null;
508
+ cost_usd: number | null;
509
+ } | null;
510
+ link: TrialTaskLink | null;
511
+ }
512
+
513
+ interface TrialTaskLink {
514
+ linked_by: TaskLinkedBy;
515
+ link_reason: TaskLinkReason | null;
516
+ dataset: string | null;
517
+ version: string | null;
518
+ task_digest: string | null;
519
+ candidates: string[];
520
+ }
521
+ ```
522
+
523
+ ### Stop result
524
+
525
+ ```ts
526
+ interface StopResponse {
527
+ stopped: Trial[];
528
+ stopped_analyses: TrialAnalysis[];
529
+ already_terminal: string[];
530
+ not_found: string[];
531
+ }
532
+ ```
533
+
534
+ Attempt phases are `prepare`, `build`, `boot`, `install`, `agent`, `verify`, and `persist`. Verifier mode is `shared` or `separate`. Sandbox provider is `e2b`, `daytona`, or `modal`.
535
+
536
+ ## Task rollups
537
+
538
+ `jobs().tasks(id)` gives one `JobTaskRollup` per distinct `(task_name, source)` pair. It is the short route from a job summary to the tasks needing inspection.
539
+
540
+ | Field | Type | Meaning |
541
+ | --- | --- | --- |
542
+ | `task_name` | `string` | Task name |
543
+ | `source` | `string` | Dataset source |
544
+ | `trials` | `TrialStatusTally` | `total` plus per-status counts |
545
+ | `mean_reward` | `number \| null` | Reward sum divided by all scored trials; null if none |
546
+ | `cost_usd` | `number \| null` | Measured spend across settled trials |
547
+ | `check` | `TaskCheck \| null` | Latest readable quality check from a dataset version this job uses |
548
+
549
+ Python returns a `JobTaskRollup` dataclass; `check` is a dictionary or `None`. A scored trial with a null reward contributes zero to this rollup’s mean.
550
+
551
+ ### Task rollup schema
552
+
553
+ ```ts
554
+ interface JobTaskRollup {
555
+ task_name: string;
556
+ source: string;
557
+ trials: TrialStatusTally;
558
+ mean_reward: number | null;
559
+ cost_usd: number | null;
560
+ check: TaskCheck | null;
561
+ }
562
+ ```
563
+
564
+ ## Comparison results
565
+
566
+ `jobs().compare(ids)` returns aggregates in your id order. Each task row has one cell per requested job; disagreement rows come first.
567
+
568
+ ```text
569
+ CompareResponse
570
+ ├── jobs[] Per-job aggregates
571
+ └── taskMatrix[] Python: task_matrix
572
+ ├── task_name
573
+ ├── disagreement
574
+ └── cells[] Same order as requested job ids
575
+ ├── status Trial status, MIXED, or MISSING
576
+ ├── mean_reward Scored trials only; null if none
577
+ └── coverage scored / total
578
+ ```
579
+
580
+ `MIXED` means attempts have different statuses. `MISSING` means the job has no attempts for that task. Comparison means use non-null rewards on scored trials. `coverage.scored` counts every scored trial, including ones with a null reward; those trials are excluded from the comparison mean.
581
+
582
+ The comparison matrix groups by task name alone, including matching names from different datasets or versions. The per-job task summary groups by both task name and source.
583
+
584
+ ### All comparison fields
585
+
586
+ ```ts
587
+ interface CompareResponse {
588
+ jobs: CompareJobAggregate[];
589
+ taskMatrix: CompareTaskRow[];
590
+ }
591
+
592
+ interface CompareJobAggregate {
593
+ id: string;
594
+ datasets: DatasetRef[];
595
+ status: JobStatus;
596
+ mean_reward: number | null;
597
+ coverage: CompareCoverage;
598
+ cost_usd: number;
599
+ agents: AgentArm[];
600
+ started_at: string;
601
+ }
602
+
603
+ interface CompareTaskRow {
604
+ task_name: string;
605
+ disagreement: boolean;
606
+ cells: CompareCell[];
607
+ }
608
+
609
+ interface CompareCell {
610
+ job_id: string;
611
+ status: TrialStatus | "MIXED" | "MISSING";
612
+ mean_reward: number | null;
613
+ coverage: CompareCoverage;
614
+ }
615
+
616
+ interface CompareCoverage {
617
+ scored: number;
618
+ total: number;
619
+ }
620
+ ```
621
+
622
+ ## Job events
623
+
624
+ Every event has `seq: number`, `type`, and `data`. Switch on `type`: different event types can have the same payload. Python’s `JobEvent.data` is a dictionary.
625
+
626
+ | Event type | Payload | When it matters |
627
+ | --- | --- | --- |
628
+ | `job.created` | `JobCreatedData` | Resolved creation inputs |
629
+ | `job.running` | `{ job_id: string }` | Execution began |
630
+ | `job.cancelling` | `JobCancellingData` | Cancellation accepted; work may still be active |
631
+ | `job.cancelled` | `JobCancelledData` | Cancellation settled |
632
+ | `job.completed` | `{ job_id: string }` | Job settled; inspect trial outcomes |
633
+ | `job.failed` | `{ job_id: string }` | Reserved terminal event; no current server path emits it |
634
+ | `trial.running` | `TrialRunningData` | Attempt began |
635
+ | `trial.scoring` | `TrialScoringData` | Verification began |
636
+ | `trial.spend` | `TrialSpendData` | Provisional spend sample |
637
+ | `trial.settled` | `TrialSettledData` | Attempt settled; an automatic retry can follow |
638
+ | `trial.retrying` | `TrialRetryingData` | Attempt requeued with delay and retry count |
639
+ | `trial.retry_circuit_broken` | `TrialRetryCircuitBrokenData` | Repeated infrastructure failure stopped further retry |
640
+
641
+ ### Job lifecycle payloads
642
+
643
+ A `job.created` event includes only the four agent fields shown below. Imported or older jobs can have null spend or provider metadata. These are the received fields; the current SDK declaration instead uses the full `AgentArm` type and non-null spend and provider types.
644
+
645
+ ```ts
646
+ interface JobCreatedData {
647
+ datasets: DatasetRef[];
648
+ task_count: number;
649
+ agents: {
650
+ name: string | null;
651
+ model_name: string | null;
652
+ version: string | null;
653
+ reasoning_effort: string | null;
654
+ }[];
655
+ n_attempts: number;
656
+ n_concurrent_trials: number;
657
+ max_trial_spend_usd: number | null;
658
+ sandbox_provider: EvalSandboxProvider | null;
659
+ trial_count: number;
660
+ retry: RetryConfig;
661
+ timeout_multiplier: number;
662
+ agent_timeout_multiplier: number | null;
663
+ verifier_timeout_multiplier: number | null;
664
+ agent_setup_timeout_multiplier: number | null;
665
+ environment_build_timeout_multiplier: number | null;
666
+ }
667
+
668
+ interface JobCancellingData {
669
+ job_id: string;
670
+ cancelled_trials: number;
671
+ active_trials: number;
672
+ }
673
+
674
+ interface JobCancelledData {
675
+ job_id: string;
676
+ cancelled_trials: number;
677
+ }
678
+ ```
679
+
680
+ ### Trial progress and outcome payloads
681
+
682
+ `live_spent_usd` is a lagging lower bound. On settled events, missing `reward` means no score; zero is a score. An exception message can be absent on cancellation or older recorded events.
683
+
684
+ ```ts
685
+ interface TrialRunningData {
686
+ trial_id: string;
687
+ task_name: string;
688
+ }
689
+
690
+ interface TrialScoringData {
691
+ trial_id: string;
692
+ captured_bytes?: number;
693
+ }
694
+
695
+ interface TrialSpendData {
696
+ trial_id: string;
697
+ task_name: string;
698
+ live_spent_usd: number;
699
+ n_input_tokens?: number;
700
+ n_cache_tokens?: number;
701
+ n_output_tokens?: number;
702
+ }
703
+
704
+ interface TrialSettledData {
705
+ trial_id: string;
706
+ task_name: string;
707
+ status: TrialStatus;
708
+ reward?: number | null;
709
+ exception_type?: string;
710
+ exception_message?: string;
711
+ attempt_phase?: AttemptPhase | null;
712
+ }
713
+ ```
714
+
715
+ ### Automatic retry payloads
716
+
717
+ The circuit breaker compares typed failure classes. Its event follows `trial.settled` instead of `trial.retrying`; the attempt stays terminal.
718
+
719
+ ```ts
720
+ interface TrialRetryingData {
721
+ trial_id: string;
722
+ task_name: string;
723
+ retry: number;
724
+ max_retries: number;
725
+ delay_sec: number;
726
+ exception_type: string;
727
+ }
728
+
729
+ type InfraFailureSignature =
730
+ | "sandbox_death"
731
+ | "provider_create_failure"
732
+ | "stream_disconnect"
733
+ | "exec_chdir_failure";
734
+
735
+ interface TrialRetryCircuitBrokenData {
736
+ trial_id: string;
737
+ task_name: string;
738
+ signature: InfraFailureSignature;
739
+ consecutive: number;
740
+ failure_phase: string;
741
+ max_retries: number;
742
+ retries_unused: number;
743
+ exception_message: string | null;
744
+ }
745
+ ```
746
+
747
+ ## Analysis and check results
748
+
749
+ Analysis reads a trial’s trajectory. A task check reviews the task itself. Their criterion results share the same four outcomes: `pass`, `fail`, `not_applicable`, and `unknown`.
750
+
751
+ Python returns results and defaults as dictionaries. `checks` maps criterion names to `{ outcome, explanation, evidence }`; evidence is a list of `{ where, quote }` records. Evolve derives no verdict from a result; compute what you need from the criteria.
752
+
753
+ ### Analysis result and criterion evidence
754
+
755
+ ```ts
756
+ interface TrialAnalysis {
757
+ id: string;
758
+ trial_id: string;
759
+ job_id: string;
760
+ task_name: string;
761
+ status: AnalysisStatus;
762
+ agent: string;
763
+ model_name: string;
764
+ reasoning_effort: string | null;
765
+ rubric: Rubric;
766
+ prompt: string | null;
767
+ summary: string | null;
768
+ checks: Record<string, AnalysisCheck> | null;
769
+ estimated_cost_usd: number | null;
770
+ usage?: UsageReading | null;
771
+ attempts?: number;
772
+ failure: AnalysisFailure | null;
773
+ created_at: string;
774
+ finished_at: string | null;
775
+ }
776
+
777
+ interface AnalysisCheck {
778
+ outcome: "pass" | "fail" | "not_applicable" | "unknown";
779
+ explanation: string;
780
+ evidence: AnalysisEvidence[];
781
+ }
782
+
783
+ interface AnalysisEvidence {
784
+ where: string;
785
+ quote: string;
786
+ }
787
+
788
+ interface AnalysisFailure {
789
+ phase: string;
790
+ message: string;
791
+ }
792
+
793
+ interface AnalyzeDefaults {
794
+ agent: string;
795
+ model_name: string;
796
+ rubric: Rubric;
797
+ prompt: string;
798
+ reasoning_effort: string | null;
799
+ sandbox_provider: EvalSandboxProvider;
800
+ }
801
+ ```
802
+
803
+ ### Check group and each task result
804
+
805
+ A completed group may contain failed task checks; inspect every result.
806
+
807
+ ```ts
808
+ interface Check {
809
+ id: string;
810
+ name: string;
811
+ status: CheckStatus;
812
+ source: CheckSource;
813
+ agent: string;
814
+ model_name: string;
815
+ reasoning_effort: string | null;
816
+ rubric: Rubric;
817
+ prompt: string | null;
818
+ sandbox_provider: EvalSandboxProvider;
819
+ n_concurrent: number | null;
820
+ include_task_names: string[];
821
+ exclude_task_names: string[];
822
+ n_tasks: number | null;
823
+ visibility: JobVisibility;
824
+ results: TaskCheck[];
825
+ cost_usd: number | null;
826
+ created_at: string;
827
+ finished_at: string | null;
828
+ }
829
+
830
+ interface CheckSource {
831
+ type: "archive" | "dataset";
832
+ sha256: string;
833
+ bytes: number | null;
834
+ dataset: string | null;
835
+ }
836
+
837
+ interface TaskCheck {
838
+ id: string;
839
+ check_id: string;
840
+ task_name: string;
841
+ status: AnalysisStatus;
842
+ checks: Record<string, AnalysisCheck> | null;
843
+ cost_usd: number | null;
844
+ attempts: number;
845
+ failure: AnalysisFailure | null;
846
+ created_at: string;
847
+ finished_at: string | null;
848
+ }
849
+
850
+ interface CheckDefaults {
851
+ agent: string;
852
+ model_name: string;
853
+ rubric: Rubric;
854
+ prompt: string;
855
+ reasoning_effort: string | null;
856
+ sandbox_provider: EvalSandboxProvider;
857
+ }
858
+ ```
859
+
860
+ ### Analyzer and checker transcripts
861
+
862
+ `events` contains parsed activity after `since`; `total` counts every stored activity row. `gateway_calls` is separate and returned in full. Optional `stored_at` aligns one server timestamp per returned event; it is absent when events came from the stored transcript file. Python does not expose these transcript methods.
863
+
864
+ ```ts
865
+ interface AnalysisTranscript {
866
+ id: string;
867
+ analyzed_trial_id: string | null;
868
+ job_id: string | null;
869
+ task_name: string | null;
870
+ model_name: string | null;
871
+ sandbox_provider: string | null;
872
+ sandbox_id: string | null;
873
+ is_ended: boolean;
874
+ total: number;
875
+ events: TraceEvent[];
876
+ gateway_calls: TraceEvent[];
877
+ stored_at?: string[];
878
+ }
879
+
880
+ interface TaskCheckTranscript {
881
+ id: string;
882
+ check_id: string | null;
883
+ dataset: string | null;
884
+ task_name: string | null;
885
+ model_name: string | null;
886
+ sandbox_provider: string | null;
887
+ sandbox_id: string | null;
888
+ is_ended: boolean;
889
+ total: number;
890
+ events: TraceEvent[];
891
+ gateway_calls: TraceEvent[];
892
+ stored_at?: string[];
893
+ }
894
+ ```
895
+
896
+ ### Rubric
897
+
898
+ ```ts
899
+ interface Rubric {
900
+ criteria: RubricCriterion[];
901
+ }
902
+
903
+ interface RubricCriterion {
904
+ name: string;
905
+ description: string;
906
+ guidance: string;
907
+ }
908
+ ```
909
+
910
+ ## Filesystem results
911
+
912
+ Filesystem pages keep `next_cursor` in both SDKs. Python uses dataclasses for their records, and dictionaries for event `data`.
913
+
914
+ ### State, live box, and retained capture
915
+
916
+ `captured` state does not guarantee every file’s bytes were retained. Inspect capture `status`, `left_out`, and each entry’s `captured` field.
917
+
918
+ ```ts
919
+ interface FilesystemStatus {
920
+ state: FilesystemState;
921
+ box: FilesystemBox | null;
922
+ watcher: "native" | "poll" | null;
923
+ root: string;
924
+ work_dir: string;
925
+ capture: FilesystemCapture | null;
926
+ }
927
+
928
+ interface FilesystemBox {
929
+ provider: EvalSandboxProvider;
930
+ id: string;
931
+ role: "agent" | "verifier" | "analyzer" | "checker";
932
+ since: string;
933
+ }
934
+
935
+ interface FilesystemCapture {
936
+ id: string;
937
+ at: string | null;
938
+ phase: "after_verifier" | "after_seal" | "after_run";
939
+ entries: number;
940
+ changed_files: number;
941
+ changed_bytes: number;
942
+ status: "ready" | "incomplete" | "failed";
943
+ left_out: string[];
944
+ failure_reason: string | null;
945
+ }
946
+
947
+ interface TaskPackageFilesystemStatus extends FilesystemStatus {
948
+ state: "none";
949
+ source: "package";
950
+ package_retained: boolean;
951
+ }
952
+ ```
953
+
954
+ ### Directory, search, and changed-file pages
955
+
956
+ On a captured entry, `captured: false` means no bytes were retained. `left_out` describes an omitted or failed capture; otherwise it may be an untouched image file. On a live entry, `captured` is null. Package entries have retained bytes.
957
+
958
+ ```ts
959
+ interface FilesystemEntry {
960
+ name: string;
961
+ type: "dir" | "file" | "symlink" | "other";
962
+ size: number;
963
+ mtime: string;
964
+ mode: string;
965
+ owner: string;
966
+ changed: "created" | "modified" | null;
967
+ phase: "setup" | "agent" | "verifier" | null;
968
+ captured: boolean | null;
969
+ left_out?: string;
970
+ target?: string;
971
+ }
972
+
973
+ interface FilesystemListing {
974
+ path: string;
975
+ source: "live" | "capture" | "package";
976
+ entries: FilesystemEntry[];
977
+ next_cursor: string | null;
978
+ ms: number;
979
+ }
980
+
981
+ interface FilesystemSearchHit {
982
+ path: string;
983
+ line: number;
984
+ snippet: string;
985
+ }
986
+
987
+ interface FilesystemSearchResult {
988
+ hits: FilesystemSearchHit[];
989
+ truncated: boolean;
990
+ scope: "path" | "box";
991
+ source: "live" | "capture";
992
+ image_files_excluded?: boolean;
993
+ ms: number;
994
+ }
995
+
996
+ interface FilesystemChange {
997
+ path: string;
998
+ type: "dir" | "file" | "symlink" | "other";
999
+ changed: "created" | "modified" | "removed";
1000
+ phase: "setup" | "agent" | "verifier";
1001
+ size: number;
1002
+ mtime: string;
1003
+ left_out?: string;
1004
+ }
1005
+
1006
+ interface FilesystemChanges {
1007
+ source: "live" | "capture";
1008
+ total: number;
1009
+ changed_bytes: number;
1010
+ items: FilesystemChange[];
1011
+ next_cursor: string | null;
1012
+ }
1013
+ ```
1014
+
1015
+ ### Watch registration and filesystem events
1016
+
1017
+ ```ts
1018
+ interface FilesystemWatchResult {
1019
+ watcher: "native" | "poll";
1020
+ paths: string[];
1021
+ }
1022
+
1023
+ type FilesystemStreamEvent =
1024
+ | { event: "state"; id?: string; data: { state: FilesystemState; box: FilesystemBox | null } }
1025
+ | {
1026
+ event: "fs";
1027
+ id: string;
1028
+ data: { seq: number; t: string; path: string; type: "create" | "write" | "remove" | "rename"; source: "watch" | "poll" };
1029
+ }
1030
+ | { event: "ping"; id?: string; data: Record<string, never> };
1031
+ ```
1032
+
1033
+ ### Sandbox log pages, log events, and processes
1034
+
1035
+ ```ts
1036
+ interface SandboxLogLine {
1037
+ seq: number;
1038
+ t: string | null;
1039
+ fd: "out" | "err";
1040
+ line: string;
1041
+ }
1042
+
1043
+ interface SandboxLogLines {
1044
+ stream: SandboxLogStream;
1045
+ lines: SandboxLogLine[];
1046
+ next_cursor: string | null;
1047
+ reason?: string;
1048
+ }
1049
+
1050
+ type SandboxLogEvent =
1051
+ | { event: "line"; id: string; data: SandboxLogLine & { stream: SandboxLogStream } }
1052
+ | { event: "state"; id?: string; data: { state: FilesystemState; box: FilesystemBox | null } }
1053
+ | { event: "ping"; id?: string; data: Record<string, never> };
1054
+
1055
+ interface SandboxProcs {
1056
+ text: string;
1057
+ ms: number;
1058
+ }
1059
+ ```
1060
+
1061
+ ## Sharing and deletion
1062
+
1063
+ Jobs and checks use the same `JobShares` result. A link is unlisted; `PRIVATE` does not mean that email grants are absent. Read `emails` to inspect them.
1064
+
1065
+ ### Share state and deletion receipt
1066
+
1067
+ ```ts
1068
+ type JobVisibility = "PRIVATE" | "LINK";
1069
+
1070
+ interface JobShares {
1071
+ visibility: JobVisibility;
1072
+ link: JobShareLink;
1073
+ emails: JobShareEmail[];
1074
+ }
1075
+
1076
+ interface JobShareLink {
1077
+ enabled: boolean;
1078
+ url?: string;
1079
+ }
1080
+
1081
+ interface JobShareEmail {
1082
+ email: string;
1083
+ shared_by: string;
1084
+ created_at: string;
1085
+ }
1086
+
1087
+ interface JobDeleteResult {
1088
+ job_id: string;
1089
+ trials_deleted: number;
1090
+ analyses_deleted: number;
1091
+ }
1092
+ ```
1093
+
1094
+ ## Job imports
1095
+
1096
+ `jobs().upload()` returns an import record. `COMPLETED` supplies `job_id` while the imported job exists; `FAILED` supplies a typed `failure`. The imported job records earlier work and does not start an agent.
1097
+
1098
+ `receiving` reports an upload still in transit. Worker `progress` is separate: fetching, extracting, validating, or ingesting. Inspect skipped trials and task links before treating an upload as a complete benchmark.
1099
+
1100
+ ### Import record and progress
1101
+
1102
+ The `hub` source variant is reserved in the type; current upload methods accept a local directory/archive or a public HTTPS archive URL.
1103
+
1104
+ ```ts
1105
+ interface JobImport {
1106
+ id: string;
1107
+ status: DatasetImportStatus;
1108
+ receiving: boolean;
1109
+ source: JobImportSource | null;
1110
+ dataset: string | null;
1111
+ job_id: string | null;
1112
+ n_trials_uploaded: number | null;
1113
+ n_trials_skipped: number | null;
1114
+ skipped_trials: JobImportSkippedTrial[] | null;
1115
+ task_links: JobTaskLink[] | null;
1116
+ failure: JobImportFailure | null;
1117
+ progress: JobImportProgress | null;
1118
+ created_at?: string;
1119
+ updated_at?: string;
1120
+ }
1121
+
1122
+ type JobImportSource =
1123
+ | { type: "archive"; sha256: string }
1124
+ | { type: "archive_url"; url: string }
1125
+ | { type: "hub"; job_id: string };
1126
+
1127
+ interface JobImportProgress {
1128
+ phase: JobImportPhaseName;
1129
+ started_at: string;
1130
+ phases: JobImportPhaseProgress[];
1131
+ }
1132
+
1133
+ interface JobImportPhaseProgress {
1134
+ name: JobImportPhaseName;
1135
+ started_at: string;
1136
+ completed_at?: string;
1137
+ }
1138
+ ```
1139
+
1140
+ ### Import failures, skipped trials, and task links
1141
+
1142
+ ```ts
1143
+ interface JobImportFailure {
1144
+ code: string;
1145
+ message: string;
1146
+ details?: Record<string, unknown>;
1147
+ }
1148
+
1149
+ interface JobImportSkippedTrial {
1150
+ trial: string;
1151
+ code: "trial_too_large";
1152
+ message: string;
1153
+ details?: { file: string; bytes: number; max_bytes: number };
1154
+ }
1155
+
1156
+ interface JobTaskLink {
1157
+ task_name: string;
1158
+ n_trials: number;
1159
+ n_linked: number;
1160
+ n_unlinked: number;
1161
+ linked_by: TaskLinkedBy;
1162
+ datasets: string[];
1163
+ link_reasons: Partial<Record<TaskLinkReason, number>>;
1164
+ candidates: string[];
1165
+ }
1166
+ ```
1167
+
1168
+ `TaskLinkedBy` is `dataset_flag`, `job_dataset_record`, `task_hash`, or `none`. When no task is linked, `TaskLinkReason` is `hash_mismatch`, `task_not_in_dataset`, `no_dataset_named`, `dataset_ambiguous`, `no_hash_match`, or `no_task_digest`.
1169
+
1170
+ ## passAtK
1171
+
1172
+ Python: `pass_at_k`. Read already-computed pass@k points from a job; this helper does not recompute scores. Groups without eligible points are omitted.
1173
+
1174
+ ```ts TypeScript
1175
+ import { passAtK } from "@evolvingmachines/evolve";
1176
+ for (const group of passAtK(job)) {
1177
+ console.log(group.evals_key, group.points);
1178
+ }
1179
+ ```
1180
+
1181
+ ```python Python
1182
+ from evolve import pass_at_k
1183
+
1184
+ for group in pass_at_k(job):
1185
+ print(group.evals_key, group.points)
1186
+ ```
1187
+
1188
+ ### Helper result
1189
+
1190
+ ```ts
1191
+ interface PassAtKGroup {
1192
+ evals_key: string;
1193
+ points: PassAtKPoint[];
1194
+ }
1195
+
1196
+ interface PassAtKPoint {
1197
+ k: number;
1198
+ value: number;
1199
+ }
1200
+ ```
1201
+
1202
+ ## gatewayUsageOf
1203
+
1204
+ Python: `gateway_usage_of`. Return the platform meter’s usage update from a trace event, or null / `None`. A harness’s own usage line has no gateway source and does not qualify.
1205
+
1206
+ ```ts TypeScript
1207
+ import { gatewayUsageOf } from "@evolvingmachines/evolve";
1208
+ const reading = gatewayUsageOf(event);
1209
+ if (reading)
1210
+ console.log(reading.usage.costUsd);
1211
+ ```
1212
+
1213
+ ```python Python
1214
+ from evolve import gateway_usage_of
1215
+
1216
+ reading = gateway_usage_of(event)
1217
+ if reading is not None:
1218
+ print(reading["usage"]["costUsd"])
1219
+ ```
1220
+
1221
+ Gateway payload keys stay camelCase inside Python dictionaries. `promptTokens` includes cached and cache-written input. Missing readings are not zero-cost calls.
1222
+
1223
+ ### Trace event and gateway usage
1224
+
1225
+ ```ts
1226
+ interface TraceEvent {
1227
+ seq: number;
1228
+ type: string;
1229
+ data: Record<string, unknown>;
1230
+ }
1231
+
1232
+ interface GatewayUsage {
1233
+ sessionUpdate: "usage";
1234
+ scope: "call";
1235
+ source: "gateway";
1236
+ callId: string;
1237
+ status: string | null;
1238
+ startedAt: string | null;
1239
+ endedAt: string | null;
1240
+ receivedAt: string;
1241
+ usage: {
1242
+ promptTokens: number;
1243
+ completionTokens: number;
1244
+ cachedTokens: number;
1245
+ costUsd: number;
1246
+ extra: { cache_write_tokens: number; reasoning_tokens?: number };
1247
+ };
1248
+ }
1249
+
1250
+ interface GatewayUsageEvent {
1251
+ timestamp: string | null;
1252
+ model: string | null;
1253
+ update: GatewayUsage;
1254
+ }
1255
+ ```