@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,52 @@
1
+ ---
2
+ title: "meta"
3
+ description: "The platform's capability document, no key needed."
4
+ ---
5
+
6
+ `meta()` fetches the capability document, `GET /api/meta`: everything a client would otherwise hardcode. It needs no API key.
7
+
8
+ - `agents`: every built-in, with `runnable` and `reason`, `default_model` and `models` (the picker's list; a job still requires an explicit model), `effort_support` (`level`, `binary` or `none`) and `default_effort`, `version_pinnable` and `latest_version` (null means not known right now), `supports_config` and `presets`.
9
+ - `agent_registration`: the rules a registration must satisfy: `name_pattern`, the length and size caps, `max_per_user`, `reserved_names`, `reserved_env_keys`.
10
+ - `sandbox_providers`: each provider's `sizing` ceilings, its `gpus` block, and its `refuses` list; `platform_constraints` beside it holds what no provider runs. `gpu_concurrency_cap` is the fleet's cap on GPU trials in flight.
11
+ - `managed_providers`: the managed sandbox doors this deployment serves, a managed-agents fact.
12
+ - `network_modes`: the three modes a task may declare.
13
+ - `statuses`: the `job`, `trial`, `import` and `dataset_version` vocabularies, each with its `terminal` members.
14
+ - `analyze`: the analyzer's `default_model`, its `reasoning_efforts`, and each roster model's `default_reasoning_effort`.
15
+ - `limits`: `job` (`n_concurrent_trials` default and max, `default_max_trial_spend_usd`, `default_max_retries`, `default_sandbox_provider`, `default_sizing`, `model_required`, `default_agent_timeout_sec`, `default_verifier_timeout_sec`, `default_timeout_multiplier`, the effort vocabulary), `compare` (`min_ids`, `max_ids`), `pagination` (a default and max per collection kind), `uploads` (the one physical ceiling per archive kind with `archive_bytes_source`, the agent tarball and skill caps), `dataset_names`, and `max_items_named_in_error_message`, which is why `details` exists.
16
+ - `error_codes` and `import_warning_codes`: the closed lists.
17
+
18
+ `schema_version` moves when a field changes meaning, never when a value changes. The response carries an `ETag` and `Cache-Control: public, max-age=300, stale-while-revalidate=300`; send the ETag back as `If-None-Match` and an unchanged document answers 304.
19
+
20
+ <Tabs>
21
+ <Tab title="TypeScript">
22
+ ```ts
23
+ import { meta } from "@evolvingmachines/evolve";
24
+
25
+ function meta(config?: HostedClientConfig): Promise<CapabilityDocument>
26
+ ```
27
+
28
+ Also `hosted().meta()`.
29
+
30
+ ```ts
31
+ const doc = await meta();
32
+ for (const agent of doc.agents) console.log(agent.name, agent.models.map((m) => m.alias));
33
+ ```
34
+ </Tab>
35
+ <Tab title="Python">
36
+ ```python
37
+ from evolve import meta
38
+
39
+ async def meta(config: Optional[HostedClientConfig] = None) -> CapabilityDocument
40
+ ```
41
+
42
+ Also `await hosted().meta()`.
43
+
44
+ ```python
45
+ doc = await meta()
46
+ for agent in doc.agents: print(
47
+ agent.name,
48
+ [m.alias for m in agent.models],
49
+ )
50
+ ```
51
+ </Tab>
52
+ </Tabs>
@@ -0,0 +1,68 @@
1
+ ---
2
+ title: "skills"
3
+ description: "Upload and manage platform-stored skills."
4
+ ---
5
+
6
+ `skills()` returns the skills client. An uploaded skill is referenced from a job as `upload:<id>` or `name:<skill-name>`.
7
+
8
+ ## upload
9
+
10
+ <Tabs>
11
+ <Tab title="TypeScript">
12
+ ```ts
13
+ upload(directory: string): Promise<SkillUpload[]>
14
+ ```
15
+
16
+ Upload a skill folder. Its name becomes your moving name pointer.
17
+
18
+ ```ts
19
+ const [skill] = await skills().upload("./my-skill");
20
+ ```
21
+ </Tab>
22
+ <Tab title="Python">
23
+ ```python
24
+ async def upload(directory: str) -> List[SkillUpload]
25
+ ```
26
+
27
+ Upload a skill folder. Its name becomes your moving name pointer.
28
+
29
+ ```python
30
+ [skill] = await skills().upload("./my-skill")
31
+ ```
32
+ </Tab>
33
+ </Tabs>
34
+
35
+ ## list, get, delete
36
+
37
+ <Tabs>
38
+ <Tab title="TypeScript">
39
+ ```ts
40
+ list(options?: { limit?: number; cursor?: string }): SkillUploadList
41
+ get(id: string): Promise<SkillUpload & { skill_md: string | null }>
42
+ delete(id: string): Promise<void>
43
+ ```
44
+
45
+ Your uploads, one upload with its `SKILL.md`, or delete one. A skill a running job references cannot be deleted.
46
+
47
+ ```ts
48
+ const one = await skills().get(skill.id);
49
+ ```
50
+ </Tab>
51
+ <Tab title="Python">
52
+ ```python
53
+ def list(
54
+ *,
55
+ limit: Optional[int] = None,
56
+ cursor: Optional[str] = None,
57
+ )
58
+ async def get(skill_id: str) -> SkillUpload
59
+ async def delete(skill_id: str) -> None
60
+ ```
61
+
62
+ Your uploads, one upload, or delete one. A skill a running job references cannot be deleted.
63
+
64
+ ```python
65
+ one = await skills().get(skill.id)
66
+ ```
67
+ </Tab>
68
+ </Tabs>
@@ -0,0 +1,232 @@
1
+ ---
2
+ title: "trials"
3
+ description: "Read, download, and act on single trials."
4
+ ---
5
+
6
+ `trials()` returns the trials client. A trial id is global: no method needs the job id.
7
+
8
+ ## get
9
+
10
+ <Tabs>
11
+ <Tab title="TypeScript">
12
+ ```ts
13
+ get(trialId: string): Promise<Trial>
14
+ ```
15
+
16
+ One trial in full. Its `job_id` points back to the job.
17
+
18
+ ```ts
19
+ const trial = await trials().get("d1a10c4e-…");
20
+ ```
21
+ </Tab>
22
+ <Tab title="Python">
23
+ ```python
24
+ async def get(trial_id: str) -> Trial
25
+ ```
26
+
27
+ One trial in full. Its `job_id` points back to the job.
28
+
29
+ ```python
30
+ trial = await trials().get("d1a10c4e-…")
31
+ ```
32
+ </Tab>
33
+ </Tabs>
34
+
35
+ ## trace, traceEvents
36
+
37
+ <Tabs>
38
+ <Tab title="TypeScript">
39
+ ```ts
40
+ trace(
41
+ trialId: string,
42
+ options?: { cursor?: string; limit?: number; type?: string; grep?: string; tail?: number },
43
+ ): Promise<TraceEventPage>
44
+ traceEvents(
45
+ trialId: string,
46
+ options?: TraceOptions,
47
+ ): AsyncIterableIterator<TraceEvent>
48
+ ```
49
+
50
+ One page of the parsed trace, or every available event; `traceEvents` drains what is stored and stops. `type` (an exact type), `grep` (a case-insensitive regex over type and content, a plain string being a substring) and `tail` (the last N matches, 1 to 10000) filter on the server and compose with the cursor.
51
+
52
+ A cursor is a `seq`: to resume later, pass the last event's `seq` as a string. `limit` defaults to 200, at most 1000, and event 0 is the instruction.
53
+
54
+ ```ts
55
+ for await (const event of trials().traceEvents(
56
+ trial.id,
57
+ { grep: "permission denied" },
58
+ )) {
59
+ console.log(event.seq, event.type);
60
+ }
61
+ ```
62
+ </Tab>
63
+ <Tab title="Python">
64
+ ```python
65
+ async def trace(
66
+ trial_id: str,
67
+ *,
68
+ cursor=None,
69
+ limit=None,
70
+ type=None,
71
+ grep=None,
72
+ tail=None,
73
+ ) -> TraceEventPage
74
+ async def trace_events(
75
+ trial_id: str,
76
+ *,
77
+ cursor=None,
78
+ limit=None,
79
+ type=None,
80
+ grep=None,
81
+ tail=None,
82
+ )
83
+ ```
84
+
85
+ One page of the parsed trace, or every available event; `trace_events` drains what is stored and stops. `type` (an exact type), `grep` (a case-insensitive regex over type and content, a plain string being a substring) and `tail` (the last N matches, 1 to 10000) filter on the server and compose with the cursor.
86
+
87
+ A cursor is a `seq`: to resume later, pass the last event's `seq` as a string. `limit` defaults to 200, at most 1000, and event 0 is the instruction.
88
+
89
+ ```python
90
+ async for event in trials().trace_events(
91
+ trial.id,
92
+ grep="permission denied",
93
+ ):
94
+ print(event.seq, event.type)
95
+ ```
96
+ </Tab>
97
+ </Tabs>
98
+
99
+ ## artifact
100
+
101
+ <Tabs>
102
+ <Tab title="TypeScript">
103
+ ```ts
104
+ artifact(
105
+ trialId: string,
106
+ stream: "verifier" | "trace-stdout" | "trace-stderr" | "trace-atif" | "trajectory",
107
+ ): Promise<string | null>
108
+ artifact(
109
+ trialId: string,
110
+ stream: "agent-home",
111
+ ): Promise<Record<string, string> | null>
112
+ ```
113
+
114
+ One raw artifact, the same names `evolve trial download --stream` takes. Null means the trial never stored it.
115
+
116
+ ```ts
117
+ const log = await trials().artifact(trial.id, "verifier");
118
+ ```
119
+ </Tab>
120
+ <Tab title="Python">
121
+ ```python
122
+ async def artifact(
123
+ trial_id: str,
124
+ stream: Literal['trace-parsed', 'verifier', 'trace-stdout', 'trace-stderr', 'trace-atif', 'trajectory', 'agent-home'],
125
+ ) -> Optional[Union[str, Dict[str, str]]]
126
+ ```
127
+
128
+ One raw artifact, the same names `evolve trial download --stream` takes. None means the trial never stored it. `trace-parsed` is refused here; use `trace()`.
129
+
130
+ ```python
131
+ log = await trials().artifact(trial.id, "verifier")
132
+ ```
133
+ </Tab>
134
+ </Tabs>
135
+
136
+ ## files, file
137
+
138
+ <Tabs>
139
+ <Tab title="TypeScript">
140
+ ```ts
141
+ files(
142
+ trialId: string,
143
+ options?: { limit?: number; cursor?: string },
144
+ ): Promise<TrialFilePage>
145
+ file(
146
+ trialId: string,
147
+ path: string,
148
+ range?: { start?: number; end?: number; suffix?: number },
149
+ ): Promise<Buffer>
150
+ ```
151
+
152
+ Every file the platform stored for the trial, as `{ path, size_bytes }` rows sorted by path (`limit` default 200, at most 1000), and the raw bytes of one of them. A range reads a slice; `suffix` reads the last N bytes. A very large file must be read by range. There is no CLI verb for either.
153
+
154
+ ```ts
155
+ const tail = await trials().file(
156
+ trial.id,
157
+ "verifier/test-stdout.txt",
158
+ { suffix: 4096 },
159
+ );
160
+ ```
161
+ </Tab>
162
+ <Tab title="Python">
163
+ ```python
164
+ async def files(
165
+ trial_id: str,
166
+ *,
167
+ cursor: Optional[str] = None,
168
+ limit: Optional[int] = None,
169
+ ) -> TrialFilePage
170
+ async def file(
171
+ trial_id: str,
172
+ path: str,
173
+ *,
174
+ start: Optional[int] = None,
175
+ end: Optional[int] = None,
176
+ suffix: Optional[int] = None,
177
+ ) -> bytes
178
+ ```
179
+
180
+ Every file the platform stored for the trial, as `path` and `size_bytes` rows sorted by path (`limit` default 200, at most 1000), and the raw bytes of one of them. A range reads a slice; `suffix` reads the last N bytes. A very large file must be read by range. There is no CLI verb for either.
181
+
182
+ ```python
183
+ tail = await trials().file(
184
+ trial.id,
185
+ "verifier/test-stdout.txt",
186
+ suffix=4096,
187
+ )
188
+ ```
189
+ </Tab>
190
+ </Tabs>
191
+
192
+ ## regrade, retry, stop
193
+
194
+ <Tabs>
195
+ <Tab title="TypeScript">
196
+ ```ts
197
+ regrade(trialId: string): Promise<Job>
198
+ retry(
199
+ trialId: string,
200
+ options?: StartJobOptions,
201
+ ): Promise<Job>
202
+ stop(trialIds: string[]): Promise<StopResponse>
203
+ ```
204
+
205
+ Re-run only the verifier, run the trial again, or stop in-flight trials. A regrade and a retry each return a new one-trial job; `regrade` is refused with `regrade_source_ineligible` for a shared-mode trial, `retry` with `trial_not_settled` for a live one.
206
+
207
+ `stop` takes at most 100 ids, trials and analyses mixed, and reports each in exactly one of `stopped`, `stopped_analyses`, `already_terminal` or `not_found`. Stopped trials rejoin the run on a `resume` of their job.
208
+
209
+ ```ts
210
+ const again = await trials().retry(trial.id);
211
+ ```
212
+ </Tab>
213
+ <Tab title="Python">
214
+ ```python
215
+ async def regrade(trial_id: str) -> Job
216
+ async def retry(
217
+ trial_id: str,
218
+ *,
219
+ idempotency_key: Optional[str] = None,
220
+ ) -> Job
221
+ async def stop(trial_ids: List[str]) -> StopResponse
222
+ ```
223
+
224
+ Re-run only the verifier, run the trial again, or stop in-flight trials. A regrade and a retry each return a new one-trial job; `regrade` is refused with `regrade_source_ineligible` for a shared-mode trial, `retry` with `trial_not_settled` for a live one.
225
+
226
+ `stop` takes at most 100 ids, trials and analyses mixed, and reports each in exactly one of `stopped`, `stopped_analyses`, `already_terminal` or `not_found`. Stopped trials rejoin the run on a `resume` of their job.
227
+
228
+ ```python
229
+ again = await trials().retry(trial.id)
230
+ ```
231
+ </Tab>
232
+ </Tabs>
@@ -0,0 +1,272 @@
1
+ ---
2
+ title: "Types"
3
+ description: "Every field of the objects the clients return: name, type, meaning, and when it is null."
4
+ ---
5
+
6
+ Field names are the wire's, `snake_case`, identical in TypeScript and Python. Four keys are the exception: TypeScript exposes `nextCursor`, `hasMore`, `byStatus` and `taskMatrix` as the wire spells them; Python maps them to `next_cursor`, `has_more`, `by_status` and `task_matrix`. Python results are dataclasses and their closed vocabularies are `Literal` types.
7
+
8
+ Eleven closed vocabularies are exported as runtime lists in TypeScript: `TRIAL_STATUSES`, `ANALYSIS_STATUSES`, `CHECK_STATUSES`, `EVAL_SANDBOX_PROVIDERS`, `JOB_LIST_SCOPES`, `TRIAL_ARTIFACT_STREAMS`, `ANALYSIS_ARTIFACT_STREAMS`, `AGENT_EFFORT_SUPPORT_VALUES`, `TASK_LINKED_BY`, `TASK_LINK_REASONS` and `HOSTED_ERROR_CODES`. Python exports `HOSTED_ERROR_CODES`.
9
+
10
+ ## Page
11
+
12
+ Every list answers `Page<T>`: `items`, `nextCursor` (pass it back as `cursor`; `null` means no next page) and `hasMore`. A list handle is awaited for one page or iterated for every page.
13
+
14
+ ## Job
15
+
16
+ One shape from `start`, `get`, `list`, `cancel`, `resume`, `retry` and `regrade`.
17
+
18
+ | Field | Type | Meaning |
19
+ | --- | --- | --- |
20
+ | `id` | string | UUID; treat every id as opaque. |
21
+ | `job_name` | string | The label; server-generated when the create omitted one. Not unique. |
22
+ | `status` | `QUEUED` `RUNNING` `CANCELLING` `COMPLETED` `CANCELLED` `FAILED` | See [jobs](/core-concepts/jobs#statuses). |
23
+ | `datasets` | `{ name, version }[]` | The resolved versions the job ran. |
24
+ | `agents` | `AgentArm[]` | Below. |
25
+ | `n_attempts`, `n_concurrent_trials` | number | As resolved. |
26
+ | `max_trial_spend_usd` | number | The resolved per-trial cap. |
27
+ | `worst_case_spend_usd` | number | Cap × trials × (`retry.max_retries` + 1). |
28
+ | `retry` | `RetryConfig` | The resolved policy, every field present. |
29
+ | `analyze` | `AnalyzeConfig \| null` | The resolved embedded-analysis policy; null when the create named none, and always null on a regrade job. A later manual `analyze()` does not rewrite it. |
30
+ | `timeout_multiplier` | number | The global multiplier, 1.0 when none was named. |
31
+ | `agent_timeout_multiplier`, `verifier_timeout_multiplier`, `agent_setup_timeout_multiplier`, `environment_build_timeout_multiplier` | number \| null | Null means the global applies. |
32
+ | `sandbox_provider` | `e2b` `daytona` `modal` \| null | Null exactly on an uploaded job. |
33
+ | `counts` | `{ agents, tasks }` | Entity counts. |
34
+ | `build_exclusions` | `JobBuildExclusion[]` | One entry per dataset whose selection lost tasks that failed to build; empty otherwise, and always empty on a derived job. See [datasets](/core-concepts/datasets#partially-built-versions). |
35
+ | `n_total_trials` | number | |
36
+ | `trials` | `{ total, byStatus }` | `byStatus` names every trial status, zeros included. |
37
+ | `stats` | `JobStats` | Below. |
38
+ | `failure` | `{ code, message } \| null` | Why the job FAILED. Null on every job today; `FAILED` is reserved. |
39
+ | `source_jobs` | `{ action, type, job_id }[]` | `action` is `regrade`, `resume` or `retry`; `type` is always `hub`. Empty on an original job. |
40
+ | `is_regrade` | boolean | Any `source_jobs` entry with `action: "regrade"`. |
41
+ | `upload` | `UploadProvenance \| null` | Null on every job this platform ran. See [upload](/core-concepts/upload). |
42
+ | `idempotent_replay` | boolean | True only on a response that replayed an existing job for an idempotency key. |
43
+ | `started_at`, `updated_at` | string | |
44
+ | `finished_at` | string \| null | Null while the job is live. |
45
+
46
+ ### AgentArm
47
+
48
+ | Field | Type | Meaning |
49
+ | --- | --- | --- |
50
+ | `name`, `model_name` | string | |
51
+ | `version` | string \| null | The pin as resolved at create; the version that ran is `Trial.agent_info.version`. |
52
+ | `reasoning_effort` | string \| null | The stamped effort. |
53
+ | `kwargs` | object \| null | The accepted agent kwargs; null when none. |
54
+ | `preset` | string \| null | |
55
+ | `skills` | string[] | The pinned references; empty when none. |
56
+ | `skill_locks` | `SkillLock[] \| null` | What mounted: `name`, `source` (the pinned reference), `digest` (`sha256:<hex>`), `git_url` and `git_commit_id` (null unless git-backed). Null until the arm's first trial resolved its skills. |
57
+
58
+ ### RetryConfig
59
+
60
+ `max_retries`, `include_exceptions` (string[] or null, null meaning no filter), `exclude_exceptions` (string[]), `wait_multiplier`, `min_wait_sec`, `max_wait_sec`. Backoff between attempts is min(`min_wait_sec` × `wait_multiplier`^attempt, `max_wait_sec`). The input shape accepts every field as optional; an explicit `exclude_exceptions: null` turns exclusions off, while omitting it keeps the default non-retryable set. `include_exceptions` null, omitted or `[]` all mean no filter.
61
+
62
+ ### AnalyzeConfig
63
+
64
+ `model_name`, `rubric` (`{ criteria: [{ name, description, guidance }] }`), `prompt` (string or null for the default body), `reasoning_effort`, `sandbox_provider`, `n_concurrent` (number or null for the organization's ceiling alone), `passing`, `failing` (both false means every analyzable trial), `n_trials` (number or null for no cap). The input shape takes every field as optional.
65
+
66
+ ### JobStats
67
+
68
+ Counters are cumulative: errored trials are a subset of completed, cancelled a subset of errored. The disjoint breakdown is `Job.trials.byStatus`.
69
+
70
+ | Field | Type | Meaning |
71
+ | --- | --- | --- |
72
+ | `n_completed_trials`, `n_errored_trials`, `n_running_trials`, `n_pending_trials`, `n_cancelled_trials`, `n_retries` | number | |
73
+ | `evals` | `Record<string, AgentDatasetStats>` | Keyed `agent__model__effort__dataset`; the dataset is always the last `__` segment. |
74
+ | `n_input_tokens`, `n_cache_tokens`, `n_output_tokens` | number \| null | Input includes cache tokens. Null until recorded. |
75
+ | `cost_usd` | number \| null | Measured spend across settled trials, agent and judge together. Null before any settled. |
76
+ | `judge_cost_usd` | number \| null | The judge share of `cost_usd`. 0 with no judge tasks; null like `cost_usd`. |
77
+ | `gpu_cost_usd` | number \| null | Sum of the trials' GPU estimates; never part of `cost_usd`. Null when no trial carries one. |
78
+ | `n_unmeasured_trials`, `n_unmeasured_judge_trials` | number | Settled trials whose spend nobody measured, so `cost_usd` is a floor. Never null. |
79
+ | `analysis` | `JobAnalysisStats \| null` | Null when no trial was ever analyzed. |
80
+
81
+ `AgentDatasetStats`: `n_trials` (trials that produced a rewards map), `n_errors` (trials carrying `exception_info`), `metrics` (a mean per arm, unrewarded trials counting 0), `pass_at_k` (a map of k as string to a value in [0, 1]; `{}` when the group cannot answer), `reward_stats` (reward key → value → trial ids), `exception_stats` (exception type → trial ids).
82
+
83
+ `JobAnalysisStats`: `n_completed`, `n_failed`, `n_pending` (trials by their latest analysis), `cost_usd` (the latest analyses' measured spend summed; null when none was measured), `checks` (per criterion, `{ n_pass, n_fail, n_not_applicable, n_unknown }`).
84
+
85
+ ### JobBuildExclusion
86
+
87
+ `dataset` (`{ name, version }`), `n_tasks_ran`, `n_tasks_selected` (what the filters matched before any `n_tasks` cap), `n_tasks_failed_to_build`, `failed_task_names` (sorted), `note` (the sentence to show).
88
+
89
+ ### UploadProvenance
90
+
91
+ `original_job_id` and `original_job_name` (what the archive's own files said; null when they said nothing), `uploaded_at`, `reported_totals` (`cost_usd`, `n_input_tokens`, `n_cache_tokens`, `n_output_tokens`, each null when no trial reported it, plus `n_trials_reporting`; null on jobs ingested before the field existed), `task_links` (`JobTaskLink[]`; null on jobs ingested before task linking existed).
92
+
93
+ `JobTaskLink`: `task_name`, `n_trials`, `n_linked`, `n_unlinked`, `linked_by` (`dataset_flag`, `job_dataset_record`, `task_hash` or `none`), `datasets` (the `name@version` refs linked to), `link_reasons` (a count per reason: `hash_mismatch`, `task_not_in_dataset`, `no_dataset_named`, `dataset_ambiguous`, `no_hash_match`, `no_task_digest`), `candidates` (the refs an ambiguous hash matched).
94
+
95
+ ## Trial
96
+
97
+ One shape on list rows and on `trials().get()`; the detail route alone serves `exception_info.exception_message` untruncated. Execution facts (`sandbox_provider`, `verifier_environment_mode`, `agent_result.cost_usd`, `spend_source`) are null until the trial has executed: null means "did not run", never zero.
98
+
99
+ | Field | Type | Meaning |
100
+ | --- | --- | --- |
101
+ | `id`, `job_id` | string | A trial id is global; `job_id` points back. |
102
+ | `task_name` | string | |
103
+ | `source` | string | The dataset the task came from. |
104
+ | `agent_info` | `{ name, version, model_info: { name, provider }, reasoning_effort }` | `version` is the version that ran, null until resolved. |
105
+ | `attempt` | number | 1 to `n_attempts`. |
106
+ | `status` | `QUEUED` `RUNNING` `SCORING` `SCORED` `SCORING_ERROR` `INFRASTRUCTURE_ERROR` `BUDGET` `INDETERMINATE` `CANCELLED` | See [trials](/core-concepts/trials#statuses). |
107
+ | `reward` | number \| null | The primary reward: the value under `reward` in the rewards map, else the single value when the map has one key, else null. Zero is a reward. |
108
+ | `verifier_result` | `{ rewards } \| null` | The named rewards map. |
109
+ | `exception_info` | `ExceptionInfo \| null` | `exception_type` (`ScoringError`, `InfrastructureError`, `ApiUsageLimitError`, `CancelledError`, `IncompleteTrialError`), `exception_message` (cut to 2000 characters on list rows), `exception_traceback` (empty when none was recorded), `occurred_at`. |
110
+ | `agent_result` | `AgentResult \| null` | `n_input_tokens` (cache included), `n_cache_tokens`, `n_output_tokens`, `cost_usd` (null until the trial executed), `rollout_details` (reserved, null), `metadata` (the harness bundle, the network mode the trial ran under and where that decision came from). |
111
+ | `judge_result` | `{ n_input_tokens, n_cache_tokens, n_output_tokens, cost_usd } \| null` | The judge's own spend. Null when no judge ever ran. |
112
+ | `analysis` | `TrialAnalysis \| null` | The latest analysis; null when never analyzed. |
113
+ | `environment_setup`, `agent_setup`, `agent_execution`, `verifier` | `{ started_at, finished_at } \| null` | Phase clocks; either bound null while unreached. `verifier` is the graded command alone. |
114
+ | `queue_wait` | `TimingInfo \| null` | From claimable to begun. |
115
+ | `harness_bundle`, `image_prepare` | `TimingInfo \| null` | Nested inside `environment_setup`. `image_prepare` is near zero on modal by design. |
116
+ | `shared_verify_setup` | `TimingInfo \| null` | What a shared-mode verify did before its command; ends where `verifier` begins. Null on separate-mode and multi-step trials. |
117
+ | `harness_bundle_cache_hit` | boolean \| null | Null is unrecorded, never a miss. |
118
+ | `step_results` | `StepResult[] \| null` | Null on a single-step trial. One entry per step that ran, in order: `step_name`, `agent_result`, `verifier_result`, `exception_info`, `agent_execution`, `verifier`. |
119
+ | `spend_source` | `measured` `measured_provisional` `assumed_cap` \| null | Only `measured` is final; `assumed_cap` carries a 0 nobody measured. |
120
+ | `judge_spend_source` | same \| null | Null exactly when `judge_result` is null. |
121
+ | `live_spent_usd`, `live_spend_at` | number \| null, string \| null | A mid-run lower bound and its timestamp; cleared at settle. |
122
+ | `usage` | `UsageReading \| null` | Below. Null when the meter never answered. |
123
+ | `max_trial_spend_usd` | number \| null | The cap this trial ran under. |
124
+ | `sandbox_provider` | provider \| null | Where it ran. |
125
+ | `sandbox_provider_degrade` | `{ from, to, reason } \| null` | Set when a GPU task moved to modal. |
126
+ | `gpu_cost` | `TrialGpuCost \| null` | Settled GPU trials only. `estimate_usd` and `unpriced_reason` are exclusive; `provider`, `gpu_type`, `declared_gpu_types`, `resolved_gpu_types`, `attached_gpu_type`, `gpu_count`, `duration_sec`, `rate_usd_per_gpu_sec`, `rate_card` (`{ version, source, source_date }`), `measured_from`, `measured_to`. |
127
+ | `sandbox_id`, `verifier_sandbox_id` | string \| null | The verifier box exists in separate mode only. |
128
+ | `verifier_environment_mode` | `shared` `separate` \| null | Decides regrade eligibility. |
129
+ | `attempt_phase` | `prepare` `build` `boot` `install` `agent` `verify` `persist` \| null | Which step a RUNNING trial is in. |
130
+ | `n_retries` | number | Automatic retries consumed. |
131
+ | `retries` | `TrialRetry[]` | Retired attempts, oldest first: `attempt_number`, `exception_info`, `cost_usd` (real spend the job total includes), `started_at`, `settled_at`. The trial body is the final attempt. |
132
+ | `session_ref` | string \| null | |
133
+ | `upload` | `TrialUploadProvenance \| null` | `original_trial_id`, `original_trial_name`, `original_task_name` (verbatim, possibly `org/name`), `reported_agent_result` (the archive's own tokens and cost, or null), `link` (`linked_by`, `link_reason`, `dataset`, `version`, `task_digest`, `candidates`). Null on every trial this platform ran. |
134
+ | `started_at`, `finished_at` | string \| null | |
135
+
136
+ ### UsageReading
137
+
138
+ The same object, same keys, on trials, analyses and managed-agent sessions.
139
+
140
+ | Field | Type | Meaning |
141
+ | --- | --- | --- |
142
+ | `provisional` | boolean | True while every number can still grow. |
143
+ | `spent_usd` | number \| null | Null means never measured. |
144
+ | `input_tokens` | number \| null | Includes the cached and the cache-written shares. |
145
+ | `cached_input_tokens` | number \| null | Read from the provider's prompt cache. |
146
+ | `cache_write_tokens` | number \| null | Written to the cache; priced apart by Anthropic. 0 for providers without a cache-write price. |
147
+ | `output_tokens` | number \| null | |
148
+ | `as_of` | string \| null | When the reading was taken. |
149
+
150
+ ## TrialAnalysis
151
+
152
+ | Field | Type | Meaning |
153
+ | --- | --- | --- |
154
+ | `id`, `trial_id`, `job_id`, `task_name` | string | |
155
+ | `status` | `queued` `running` `completed` `failed` | `failed` also covers a run the platform lost. |
156
+ | `model_name` | string | |
157
+ | `reasoning_effort` | string \| null | Null only on analyses recorded before it was stamped. |
158
+ | `rubric` | `Rubric` | Frozen at enqueue. |
159
+ | `prompt` | string \| null | Null means the default body. |
160
+ | `summary` | string \| null | Null until completed. |
161
+ | `checks` | `Record<string, AnalysisCheck> \| null` | One entry per criterion: `outcome` (`pass`, `fail`, `not_applicable`, `unknown`), `explanation`, `evidence` (`{ where, quote }[]`; at least one behind a pass or a fail). Null until completed. |
162
+ | `label` | `flagged` `env_fault` `unclear` `clean` \| null | Null until completed and under a custom rubric. |
163
+ | `estimated_cost_usd` | number \| null | The analyzer's own metered spend, covering both attempts when a re-run fired. |
164
+ | `usage` | `UsageReading \| null` | |
165
+ | `attempts` | number | 1, or 2 when the one automatic re-run fired. |
166
+ | `failure` | `{ phase, message } \| null` | Non-null exactly when `failed`. `phase` is `invalid_result`, `inputs`, `timeout`, or an infrastructure stage (`mint_key`, `boot`, `harness_install`, `agent`, `artifact_read`, `lease_expired`). |
167
+ | `created_at`, `finished_at` | string, string \| null | |
168
+
169
+ ## Check and TaskCheck
170
+
171
+ `Check`: `id`, `status` (`queued`, `running`, `completed`; a check never fails as a whole), `source` (`{ type, sha256, bytes, dataset }`: `type` is `archive` with `bytes` set and `dataset` null, or `dataset` with the resolved `name@version` and `bytes` null), `model_name`, `reasoning_effort`, `rubric`, `prompt` (null for the default), `sandbox_provider`, `n_concurrent` (null for the ceiling alone), `include_task_names`, `exclude_task_names`, `n_tasks` (null for no cap), `results` (`TaskCheck[]`, sorted by task name), `cost_usd` (the sum of measured task costs; null when none), `created_at`, `finished_at` (null until every task settled).
172
+
173
+ `TaskCheck`: `id`, `check_id`, `task_name`, `status` (`queued`, `running`, `completed`, `failed`), `checks` (as on an analysis; no summary), `label` (`has_a_problem`, `unclear`, `no_problem_found`; null until completed and under a custom rubric), `executed` (true when none of the five run-based criteria is unknown; null exactly when `label` is null), `cost_usd`, `attempts`, `failure`, `created_at`, `finished_at`.
174
+
175
+ ## Dataset
176
+
177
+ `list()` returns the summary fields; `get()` adds `versions`, `selected_version`, `tasks`, `failed_tasks`, `created_at` and `updated_at`.
178
+
179
+ | Field | Type | Meaning |
180
+ | --- | --- | --- |
181
+ | `name`, `title`, `description` | string, string \| null, string \| null | |
182
+ | `active_version` | `DatasetVersion \| null` | Null when nothing is active; a bare name then refuses. |
183
+ | `latest_version` | `DatasetVersion \| null` | The newest version row, active or not; where a publish is observable before it lands. |
184
+ | `versions` | `DatasetVersion[]` | Newest first. |
185
+ | `selected_version` | `DatasetVersion \| null` | The version whose tasks are listed. |
186
+ | `tasks` | `Page<Task>` | One page; pass `{ limit, cursor }` to `get()`. |
187
+ | `failed_tasks` | `{ task_name, failure }[]` | The selected version's failed tasks, capped at the page limit; `n_failed_tasks` on the version is the exact count. |
188
+ | `upstream` | `UpstreamStatus \| null` | Null when the active version did not come from git. |
189
+
190
+ ### DatasetVersion
191
+
192
+ | Field | Type | Meaning |
193
+ | --- | --- | --- |
194
+ | `version` | string | |
195
+ | `state` | `DRAFT` `RECEIVING` `IMPORTING` `BUILDING` `READY` `FAILED` `ARCHIVED` | See [datasets](/core-concepts/datasets#version-states). |
196
+ | `created_at` | string | |
197
+ | `task_count` | number | The READY tasks. |
198
+ | `n_failed_tasks` | number | Tasks that failed their build. |
199
+ | `manifest` | `{ name, version, description, authors, keywords, task_count } \| null` | The `dataset.toml` identity; null without a manifest. |
200
+ | `source` | `DatasetVersionSource \| null` | `{ kind: "git", git_url, ref, commit, path }`, `{ kind: "archive", digest }`, `{ kind: "archive_url", archive_url, digest }` or `{ kind: "hub_package", hub_package, digest }`. Every digest is `sha256:<hex>`; `commit` is a bare sha. Null when nothing readable was recorded. |
201
+
202
+ ### Task
203
+
204
+ Public fields only; instructions, environments and tests never leave the server.
205
+
206
+ `task_name`, `agent_timeout_sec`, `verifier_timeout_sec`, `gpus` (0 for a CPU task), `gpu_types` (null means any type), `providers` (per provider `{ ok: true }`, `{ ok: true, degrades_to: "modal", reason }` or `{ ok: false, reason }`), `notes` (`{ code: "tests_dockerfile_not_built", message }[]`; empty when there is nothing to say).
207
+
208
+ `TaskBuild`, from `getTaskBuild()`: `task_name`, `state` (`READY` or `FAILED`), `failure` (`{ code, step, message, excerpt }`; `step` is `parse`, `image-build`, `image-config`, `skills-verify`, `compose-resolve`, `image-mirror` or `store`; null on READY), `build_log_ref` (null on READY and on parse refusals).
209
+
210
+ ### UpstreamStatus
211
+
212
+ `git_url` (userinfo stripped), `ref`, `current_commit`, `path` (null for the repository root), `latest_commit` (null when the last check failed), `acked_commit` (the newest commit a local version exists for), `moved` (branch on this), `behind_by` (reserved, null), `checked_at`, `error` (why the last check failed; show "could not check", never "up to date"), `auto_import`. A version pinned to a sha serves the watch at rest: `latest_commit`, `checked_at` and `error` null, `moved` false.
213
+
214
+ ## DatasetImport
215
+
216
+ | Field | Type | Meaning |
217
+ | --- | --- | --- |
218
+ | `id` | string | Not a UUID. |
219
+ | `status` | `QUEUED` `RUNNING` `COMPLETED` `FAILED` | `COMPLETED` means the version is READY. |
220
+ | `receiving` | boolean | True while a large corpus is still uploading through its resumable session. |
221
+ | `name`, `version` | string | |
222
+ | `failure` | `{ code, message, failures: [{ task_name, error }] } \| null` | The key is `failure`, never `error`. |
223
+ | `warnings` | `{ code, message }[]` | `solutions_archiving_disabled`, `no_solutions_archived`, `partial_solutions_archived`, `tasks_failed_to_build`, `tests_dockerfile_not_built`. |
224
+ | `progress` | `DatasetImportProgress \| null` | `phase` (`extracting`, `parsing`, `building`, `copying`, `verifying`), `started_at`, `phases` (`{ name, started_at, completed_at, done, total, banked }[]`; `completed_at` stays absent on the phase a FAILED import died in), `images` and `codebuild`, counters for the build step. Null until the import's first report. |
225
+ | `task_count` | number | Once counted. |
226
+
227
+ ## JobImport
228
+
229
+ | Field | Type | Meaning |
230
+ | --- | --- | --- |
231
+ | `id`, `status`, `receiving` | as on `DatasetImport` | |
232
+ | `source` | `{ type: "archive", sha256 }` \| `{ type: "archive_url", url }` \| null | Null while a session is still receiving. `hub` is reserved. |
233
+ | `dataset` | string \| null | The hint as given. |
234
+ | `job_id` | string \| null | The ingested job, from COMPLETED on; null again if that job was deleted. |
235
+ | `n_trials_uploaded`, `n_trials_skipped` | number \| null | Null until COMPLETED. |
236
+ | `skipped_trials` | `{ trial, code: "trial_too_large", message, details: { file, bytes, max_bytes } }[] \| null` | Null until COMPLETED. |
237
+ | `task_links` | `JobTaskLink[] \| null` | The same rows the job serves as `upload.task_links`. |
238
+ | `failure` | `{ code, message, details } \| null` | |
239
+ | `progress` | `{ phase, started_at, phases } \| null` | Phases `fetching`, `extracting`, `validating`, `ingesting`. |
240
+
241
+ ## Events
242
+
243
+ `jobs().watch()` yields `JobEvent`: `seq` (the resume position) plus `type` and `data`. Switching on `type` narrows `data`.
244
+
245
+ | Type | Data |
246
+ | --- | --- |
247
+ | `job.created` | `datasets`, `task_count`, `agents`, `n_attempts`, `n_concurrent_trials`, `max_trial_spend_usd`, `sandbox_provider`, `trial_count`, `retry`, the five multipliers. |
248
+ | `job.running`, `job.completed` | `{ job_id }`. |
249
+ | `job.cancelling` | `job_id`, `cancelled_trials` (queued trials cancelled outright), `active_trials` (still winding down). |
250
+ | `job.cancelled` | `job_id`, `cancelled_trials`. |
251
+ | `job.failed` | `{ job_id }`. Reserved: no server path emits it. |
252
+ | `trial.running` | `trial_id`, `task_name`. |
253
+ | `trial.scoring` | `trial_id`, `captured_bytes`. |
254
+ | `trial.spend` | `trial_id`, `task_name`, `live_spent_usd`, and `n_input_tokens`, `n_cache_tokens`, `n_output_tokens` when the sample carried them. Emitted only when a reading landed on a live trial. |
255
+ | `trial.settled` | `trial_id`, `task_name`, `status`, `reward` (scored path only), `exception_type` and `exception_message` (failures; a cancel carries the type alone), `attempt_phase` (when the settle happened mid-phase). Not final while a `trial.retrying` can follow. |
256
+ | `trial.retrying` | `trial_id`, `task_name`, `retry` (1-based), `max_retries`, `delay_sec`, `exception_type`. Follows the `trial.settled` it retries. |
257
+ | `trial.retry_circuit_broken` | `trial_id`, `task_name`, `signature` (`sandbox_death`, `provider_create_failure`, `stream_disconnect`, `exec_chdir_failure`), `consecutive`, `failure_phase`, `max_retries`, `retries_unused`, `exception_message`. The trial stays terminal. |
258
+
259
+ ## Smaller shapes
260
+
261
+ - `JobTaskRollup`, from `jobs().tasks()`: `task_name`, `source`, `trials` (`{ total, byStatus }`), `mean_reward` (over SCORED trials; null when none), `cost_usd`, `check` (the task's latest `TaskCheck` on a version this job spans; null when never checked).
262
+ - `CompareResponse`, from `jobs().compare()`: `jobs` (per job: `id`, `datasets`, `status`, `mean_reward` over SCORED trials, `coverage` `{ scored, total }`, `cost_usd`, `agents`, `started_at`) and `taskMatrix` (per task: `task_name`, `disagreement`, `cells` in the caller's id order, each `{ job_id, status, mean_reward, coverage }` where `status` is a trial status when every trial in the cell shares it, `MIXED` when they differ, `MISSING` when the job has no trial for the task). Disagreement rows come first.
263
+ - `StopResponse`, from `trials().stop()`: `stopped` (`Trial[]`), `stopped_analyses` (`TrialAnalysis[]`, each `failed` with phase `stopped`), `already_terminal` (ids), `not_found` (ids that do not exist or are not yours; never told apart). Every requested id appears in exactly one list.
264
+ - `JobGrepGroup`, from `jobs().grep()`: `trial_id`, `task_name` (string or null), `match_count` (exact), `events` (the first five matches).
265
+ - `TrialFile`, from `trials().files()`: `path`, `size_bytes`.
266
+ - `TraceEvent`: `seq`, `type`, `data`. A `usage` event whose `data.update.source` is `gateway` is the platform's meter and the only usage line that carries tokens and money; `gatewayUsageOf(event)` reads it. On a terminal trial these follow the last harness event with `seq` from 1000000000 (`GATEWAY_TRACE_SEQ_BASE`).
267
+ - `SkillUpload`: `id`, `name`, `digest`, `size_bytes`, `description`, `ref` (the `upload:<id>` string), `created_at`.
268
+ - `Agent`: `name`, `source` (`install_script` or `tarball`), `run_command`, `env`, `created_at`, `updated_at`.
269
+ - `AuthStatus`: `user_id`, `email`, `key` (`{ id, label, created_at, last_used_at }`; `last_used_at` is always null today).
270
+ - `Organization`: `org_id`, `slug`, `display_name`, `personal`, `role` (`owner` or `member`), `created_at`. `OrganizationDetail` adds `member_count`, `quota` and `usage`; see [auth and orgs](/sdk-reference/auth#quota-and-usage).
271
+ - `JobDeleteResult`: `job_id`, `trials_deleted`, `analyses_deleted`.
272
+ - `DatasetPreflight`, from `datasets().preflight()`: `importer_version`, `checks` (the guards that ran), `deferred` (`{ name, reads }[]`, the guards a `task.toml` alone cannot decide), `manifest` (`{ ok, name, short_name, version, task_count, reason } \| null`), `tasks` (per task `name`, `ok`, `task_key`, `schema_version`, `providers`, `notes`, `reason`), `tasks_total`, `tasks_ok`, `tasks_refused`.
@@ -0,0 +1,13 @@
1
+ ## Global options
2
+
3
+ <ParamField path="--json">
4
+ Machine-readable JSON output.
5
+ </ParamField>
6
+
7
+ <ParamField path="--api-key" type="key">
8
+ API key. Defaults to `$EVOLVE_API_KEY`.
9
+ </ParamField>
10
+
11
+ <ParamField path="--base-url" type="url">
12
+ API base URL. Defaults to the Evolve dashboard API.
13
+ </ParamField>