@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,138 @@
1
+ ---
2
+ title: "Datasets"
3
+ description: "The catalog, and publishing your own dataset."
4
+ ---
5
+
6
+ A dataset is a named, versioned folder of [tasks](/core-concepts/tasks) in the catalog. You name a version as `name@version`. A bare name means the dataset's active version.
7
+
8
+ ## Browse the catalog
9
+
10
+ ```bash
11
+ evolve dataset list
12
+ evolve dataset show terminal-bench-4@4.0
13
+ ```
14
+
15
+ `dataset list` prints every dataset you can run: the platform's public datasets and your own. `--search <text>` filters by name and description. `dataset show` prints one dataset's versions, its tasks with their timeouts, and for each task which sandbox providers can run it.
16
+
17
+ ## Publish your own
18
+
19
+ Any folder of task directories can be published: a single task directory, a directory with a `tasks/` folder, or a directory of task directories. What you publish is private to your organization; another account asking for its name reads `dataset_not_found`. A name belongs to its first publisher: re-publishing your own name adds a version, and a name owned by anyone else is refused with `dataset_name_taken`.
20
+
21
+ Check it first: the pre-flight is a dry run that uploads nothing and writes nothing.
22
+
23
+ ```bash
24
+ evolve dataset check ./my-swe
25
+ ```
26
+
27
+ Then publish from a local directory, from a git repository, or from a source the server fetches itself.
28
+
29
+ <Tabs>
30
+ <Tab title="Local directory">
31
+ ```bash
32
+ evolve dataset publish \
33
+ --dir ./my-swe \
34
+ --name my-swe \
35
+ --version 1.0 \
36
+ --watch
37
+ ```
38
+
39
+ When the folder carries a `dataset.toml` manifest, `--name` and `--version` come from it and may be omitted.
40
+
41
+ Everything in the directory is packed, dotfiles included, and executables stay executable. Only `.git`, `.DS_Store` and `.venv` are left out, and symlinks are never packed. A large upload resumes after a dropped connection, and `evolve dataset watch` can follow it from another machine while it uploads: it reads `QUEUED (receiving)` until the corpus has arrived.
42
+ </Tab>
43
+ <Tab title="Git repository">
44
+ ```bash
45
+ evolve dataset publish \
46
+ --git https://github.com/acme/my-swe.git \
47
+ --ref v1.0.0 \
48
+ --name my-swe \
49
+ --version 1.0 \
50
+ --watch
51
+ ```
52
+
53
+ `--ref` must be pinned: a tag, or a full 40-character commit sha. A branch name is refused with `unpinned_git_ref`, and the refusal's `details.commit` is the sha to pin. `--path <subfolder>` imports one folder of a larger repository. The URL must be `https://`; for a private repository put a token in it.
54
+ </Tab>
55
+ <Tab title="Fetchable source">
56
+ ```bash
57
+ evolve dataset publish --from hub:cookbook/hello-world --watch
58
+ ```
59
+
60
+ `--from` takes a public https tarball URL, or `hub:org/name[@ref]` for a public package on the Harbor hub. Both are public only, with no credentials in the URL. A tarball may wrap the corpus in one top-level directory, so a repository's archive URL publishes as is.
61
+
62
+ For a hub package the name and version default to the package's own, and the ref is pinned when the publish is accepted. A package the hub does not show is refused with `hub_package_not_found`; a hub that cannot be reached is `hub_unreachable`, retry the publish.
63
+ </Tab>
64
+ </Tabs>
65
+
66
+ `--watch` follows the publish until the version is READY or FAILED. Each task builds on its own, so one broken task does not block the others; `--watch` ends with how many built. If the terminal is gone, `evolve dataset watch <name>` re-attaches to the same follow, from any machine. `--skip-preflight` uploads without the check; a task the check would have refused then fails at import instead.
67
+
68
+ ### The pre-flight
69
+
70
+ The pre-flight sends each task's `task.toml`, and the `dataset.toml` if there is one, and answers with a verdict per task. It checks what a `task.toml` alone can decide, so an all-ok answer means no config refuses, not that every image will build. A `NOTE` is not a refusal; today it is `tests_dockerfile_not_built`. A refused task stops the publish before anything is uploaded.
71
+
72
+ ### The manifest
73
+
74
+ A corpus with a `dataset.toml` imports what the manifest says: only the tasks listed under `[[tasks]]`, each verified against its pinned digest. A listed task the checkout lacks fails the publish with `manifest_task_missing`, a digest mismatch with `manifest_digest_mismatch`. The `[dataset]` description reaches the catalog, and every version records the identity it imported under as `manifest`. A `metric.py` custom metric is refused with `custom_metric_not_supported`.
75
+
76
+ ## What happens when you publish
77
+
78
+ ```mermaid
79
+ %%{init: {"themeVariables": {"fontSize": "14px", "fontFamily": "Google Sans Flex, sans-serif"}, "flowchart": {"nodeSpacing": 20, "rankSpacing": 24, "padding": 10, "wrappingWidth": 120, "subGraphTitleMargin": {"top": 6, "bottom": 6}}}}%%
80
+ flowchart TB
81
+ subgraph PUB[At publish]
82
+ direction LR
83
+ P[Pre-flight: nothing uploaded] --> U[Upload: the version is IMPORTING, then BUILDING]
84
+ U --> B[Parse and build: one image per task]
85
+ B --> RD[READY, or FAILED when no task built]
86
+ end
87
+ subgraph RUN[At the first run]
88
+ direction LR
89
+ F[The first trial on a provider is slower] --> L[Every later trial starts from the cache]
90
+ end
91
+ PUB --> RUN
92
+ ```
93
+
94
+ Every declaration in `task.toml` is honored or refused with the reason; a task never runs on weaker semantics than it declares.
95
+
96
+ Each task's `environment/` is built into an image once. Tasks build independently: one that fails any step is recorded FAILED with a typed reason, and the others keep building.
97
+
98
+ The version lands READY when at least one task built, and FAILED only when none did or on a corpus-level refusal; a FAILED version changes nothing, the dataset keeps serving what it served. On your own dataset, READY also makes the version active, so the bare name runs it. A job refuses any version that is not READY with `version_not_ready`.
99
+
100
+ The first trial of a task on a provider takes a few minutes longer than the rest; it is not a hang.
101
+
102
+ The import's `warnings` name what a version will permanently lack: `no_solutions_archived` or `partial_solutions_archived` for the reference-solution record, `tasks_failed_to_build` when some tasks failed, `tests_dockerfile_not_built` for the tasks whose verifier never builds their `tests/Dockerfile`.
103
+
104
+ ### Partially built versions
105
+
106
+ On the version, `task_count` counts the READY tasks and `n_failed_tasks` the rest. `dataset show name@version` lists every failed task with its reason, and `dataset publish --watch` prints each task's outcome. A whole-dataset or glob job on such a version runs the READY tasks and says so in its `build_exclusions`. Naming a failed task explicitly at job create is refused with `task_failed_to_build`; a fix is a new version.
107
+
108
+ ### Version states
109
+
110
+ A version moves `DRAFT` → `RECEIVING` (a large upload still streaming) → `IMPORTING` → `BUILDING` → `READY`, with `FAILED` and `ARCHIVED` as off-ramps. `READY` is the only state that accepts jobs.
111
+
112
+ An import is `QUEUED` (`receiving: true` while the corpus is still uploading), `RUNNING`, `COMPLETED` (the version is READY) or `FAILED` (read `failure`). A finished import stays readable as long as its dataset exists.
113
+
114
+ ## Versions
115
+
116
+ Each publish creates a version, and a version that lands READY is built and active. To point the bare name at a different READY version:
117
+
118
+ ```bash
119
+ evolve dataset activate my-swe 1.0
120
+ ```
121
+
122
+ Activating the version that is already active succeeds without change. A version still building is refused with `version_not_ready`; a FAILED or ARCHIVED one with `version_not_activatable`.
123
+
124
+ The owner of a dataset can download the original package back:
125
+
126
+ ```bash
127
+ evolve dataset download my-swe@1.0 -o corpora/
128
+ ```
129
+
130
+ It is the whole corpus you published, `solution/` included, and the one call that returns task files. Only the owner may: a platform dataset has no owner and cannot be downloaded, and someone else's dataset reads as not found.
131
+
132
+ Deleting a dataset removes its versions, tasks and archived solutions. You must own it (`dataset_not_owned` on a platform dataset), and a dataset any job ran against is never deleted: `dataset_in_use` names the blocking jobs.
133
+
134
+ A dataset published from git records what it was built from, and `dataset list` and `dataset show` print one line when the ref has moved upstream. A new version is always one you publish, unless you opt in with `datasets().update(name, { upstream_auto_import: true })`; that is refused with `upstream_not_watchable` on a dataset with no moving git ref.
135
+
136
+ <Card title="dataset reference" icon="terminal" href="/cli-reference/dataset">
137
+ Every flag of `evolve dataset`.
138
+ </Card>
@@ -0,0 +1,42 @@
1
+ ---
2
+ title: "Core concepts"
3
+ description: "How a dataset becomes trials, rewards, analyses and results."
4
+ ---
5
+
6
+ ```mermaid
7
+ %%{init: {"themeVariables": {"fontSize": "15px", "fontFamily": "Google Sans Flex, sans-serif"}, "flowchart": {"nodeSpacing": 24, "rankSpacing": 28, "padding": 10, "wrappingWidth": 170, "subGraphTitleMargin": {"top": 6, "bottom": 6}}}}%%
8
+ flowchart TB
9
+ subgraph S[Set up]
10
+ D[Dataset: a folder of tasks] --> J[Job: arms of harness x model, one sandbox provider]
11
+ J --> T[Trials: one per task per arm]
12
+ end
13
+ subgraph RUN[Run, per trial]
14
+ SB[Sandbox: the agent works on the task] --> V[Verifier: scores the result]
15
+ SB -.-> L[Live trace to the dashboard]
16
+ V --> R[Reward and outputs: trajectory, files, logs]
17
+ end
18
+ subgraph AFTER[After]
19
+ AN[Analyze: trace analysis, verdicts]
20
+ C[Check: task quality]
21
+ O[Results: jobs, trials, analyses and checks, in the dashboard and as downloads]
22
+ end
23
+ T --> SB
24
+ R --> AN
25
+ D --> C
26
+ R ~~~ C
27
+ R --> O
28
+ AN --> O
29
+ C --> O
30
+ ```
31
+
32
+ - **Dataset**: a named, versioned folder of tasks in the catalog. `name@version` names one version; a bare name means the active one.
33
+ - **Task**: one directory with an instruction, an environment, and a verifier. See [tasks](/core-concepts/tasks).
34
+ - **Job**: one run of every task of its datasets by every arm, a fixed number of attempts each. See [jobs](/core-concepts/jobs).
35
+ - **Arm**: one harness driving one model, with its optional effort, preset, config and skills. A job with two models has two arms, and every arm runs on the job's one sandbox provider.
36
+ - **Trial**: one attempt of one task by one arm, in its own sandbox. See [trials](/core-concepts/trials).
37
+ - **Trajectory**: the record of what the agent did: the instruction, every agent turn, every tool call and its result. It streams live to the dashboard while the trial runs and is stored with the trial.
38
+ - **Verifier**: the task's test script. It runs after the agent has finished and produces the reward.
39
+ - **Reward**: the verifier's score for the trial, usually `1` or `0`.
40
+ - **Outputs**: what a finished trial keeps: the reward, the trajectory, the agent's files and the logs, captured when the trial ends. See [trial outputs](/core-concepts/trial-outputs).
41
+ - **Analysis**: a rubric judgment of a settled trial's trace, one analyzer run per trial. See [analyze](/core-concepts/analyze).
42
+ - **Check**: a rubric judgment of a task itself, before you spend a job on it. See [check](/core-concepts/check).
@@ -0,0 +1,136 @@
1
+ ---
2
+ title: "Jobs"
3
+ description: "Start a job, watch it, read its results, and derive new jobs from it."
4
+ ---
5
+
6
+ A job runs every task of its datasets with every agent arm, a fixed number of attempts each. Start one with `evolve run`. It is the short form of `evolve job start`, and both take the same flags.
7
+
8
+ ```bash
9
+ evolve run \
10
+ -d terminal-bench-4@4.0 \
11
+ -a codex \
12
+ -m gpt-5.5 \
13
+ -k 2 \
14
+ -l 5 \
15
+ --watch
16
+ ```
17
+
18
+ `-d` names a dataset and may repeat: one job can span several. `-a` names the agent. `-m` names the model and may repeat too; each model is one arm, so two models against one agent run every task twice.
19
+
20
+ `-k` is the number of attempts per task and arm (default 1). `-n` is how many trials run in parallel (default 4, at most 150). `--job-name` gives the job a label; omitted, the server generates one.
21
+
22
+ ## Narrow the task set
23
+
24
+ ```bash
25
+ evolve run \
26
+ -d terminal-bench-4@4.0 \
27
+ -a codex \
28
+ -m gpt-5.5 \
29
+ -i 'auth-*' \
30
+ -x 'auth-legacy' \
31
+ -l 20 \
32
+ --watch
33
+ ```
34
+
35
+ `-i` and `-x` are include and exclude globs over task names, applied to every dataset. `-l` caps the task count of each dataset after the filters.
36
+
37
+ ## Watch it
38
+
39
+ `--watch` streams the job's events until it finishes: each trial as it starts, scores and settles, then the final block. `-q` keeps only the final block. Without `--watch` the command prints the job id and returns; read the job later with `evolve job show`.
40
+
41
+ ## Spend and retries
42
+
43
+ Every trial runs under a model-spend cap, `--max-trial-spend <usd>`; omitted, the server's default applies, $200. It is the only spend limit: there is no job-wide budget. The job states the cap it applied as `max_trial_spend_usd` and the most it can cost as `worst_case_spend_usd`, the cap times the trials times the attempts the retry policy allows. A trial that exhausts its cap is not a failure; it is scored on what it produced.
44
+
45
+ Your credit balance sits under every cap. A job started at a zero balance is refused with `insufficient_credits`, and a balance that runs out stops spending mid-job.
46
+
47
+ Trials that fail on infrastructure errors are retried automatically. `-r <n>` sets how many times; the default is 2, and `0` turns it off. No other status re-runs on its own. `--retry-include` and `--retry-exclude` choose by exception type, exclude wins, and the names are on the [run reference](/cli-reference/run#spend-and-retries).
48
+
49
+ A retried trial keeps its history: `n_retries` and the `retries` list on the trial, `stats.n_retries` on the job, and every retried attempt's spend stays in the job total. Two infrastructure failures of the same kind in a row stop the retries early; the trial stays `INFRASTRUCTURE_ERROR`, its message says why, and the event stream carries `trial.retry_circuit_broken`.
50
+
51
+ ## Read the results
52
+
53
+ ```bash
54
+ evolve job show <job-id>
55
+ evolve job trials <job-id> --status INFRASTRUCTURE_ERROR,SCORING_ERROR
56
+ evolve job tasks <job-id>
57
+ evolve job compare <job-id> <job-id>
58
+ evolve job list --search nightly
59
+ ```
60
+
61
+ `job show` prints the whole job, with pass@k once every attempt has settled. `job trials` lists the trials, `--status` and `--dataset` narrow the list. `job tasks` is one row per task.
62
+
63
+ `job compare` puts two to ten jobs side by side. `job list` is your jobs, newest first; `--scope shared` lists your organizations' jobs that teammates created.
64
+
65
+ A job's spend prints as `at least $X` while it holds settled trials whose spend has not been measured yet.
66
+
67
+ pass@k is the chance that k attempts contain at least one success, averaged over the tasks of an arm. The k values are the powers of two and the multiples of five up to the smallest attempt count, so a single-attempt job has none. An attempt that produced no reward counts as a failure, and a group with non-binary rewards or attempts still in flight shows nothing. The archive's `result.json` carries the same numbers.
68
+
69
+ ## Statuses
70
+
71
+ A job is `QUEUED` (accepted, waiting for dispatch), `RUNNING`, `CANCELLING` (cancel requested, in-flight trials winding down), `COMPLETED` (every trial settled), `CANCELLED`, or `FAILED`. `FAILED` is reserved: nothing sets it today, so `failure` is null on every job. A job that goes wrong does so one trial at a time and still reaches `COMPLETED`; read `trials.byStatus` for where. Trial statuses are on [trials](/core-concepts/trials#statuses).
72
+
73
+ ## Derive a new job
74
+
75
+ Every derived run is a new job linked to its source through `source_jobs`. The source is never changed.
76
+
77
+ ```bash
78
+ evolve job retry <job-id> --failed-only
79
+ evolve job retry <job-id> -t <trial-id> -t <trial-id>
80
+ evolve job resume <job-id> -f InfrastructureError
81
+ evolve job regrade <job-id> --task tricky-task
82
+ ```
83
+
84
+ `resume` takes a finished job's failed or stopped trials and runs them: `ScoringError`, `InfrastructureError`, `ApiUsageLimitError` and `IncompleteTrialError`, plus stopped trials and the still-queued trials of a cancelled job. `-f <type>` narrows it by exception type. Scored trials are never re-run. A live source is refused with `job_not_terminal`, an empty selection with `no_failed_trials`.
85
+
86
+ `retry` runs selected trials again: every trial, only the failed ones with `--failed-only` (`SCORING_ERROR`, `INFRASTRUCTURE_ERROR`, `BUDGET`, `INDETERMINATE`), or exactly the ones named with `-t`. A scored trial is a legitimate target. The whole-job and `--failed-only` forms need a finished source; the named form works on a running job once every named trial has settled, else `trial_not_settled`, or `trial_not_found` for an id the job does not own. Naming trials and `--failed-only` together is refused.
87
+
88
+ `regrade` re-runs only the verifier of a finished job, under the network policy the source trial ran with; `--status` and `--task` narrow the set. Only settled separate-mode trials are eligible; shared-mode trials and judge tasks are not. A single-trial regrade of an ineligible source is refused with `regrade_source_ineligible`; a whole-job regrade skips the ineligible trials and answers `no_regradable_trials` when none remain. The result is a job with `is_regrade` true.
89
+
90
+ ## Stop, cancel, delete
91
+
92
+ ```bash
93
+ evolve job cancel <job-id>
94
+ evolve job stop <job-id> --dataset terminal-bench-4
95
+ evolve job delete <job-id> --yes
96
+ ```
97
+
98
+ `cancel` asks the whole job to stop; a finished job is a no-op. `stop` ends one dataset's live trials and leaves the job running. `delete` removes a job you created permanently: its trials, traces, analyses and stored files. Without `--yes` it asks first.
99
+
100
+ Only the job's creator may delete it; another member of the organization is refused with `org_forbidden`. The job must be finished: a live job, a running analysis wave or a live regrade derived from it refuses, naming what to wait for. Regrade jobs and the `source_jobs` entries of derived jobs stay. Deleting an uploaded job is how it is replaced; see [upload](/core-concepts/upload).
101
+
102
+ ## Download
103
+
104
+ ```bash
105
+ evolve job download <job-id> -o results/
106
+ ```
107
+
108
+ The results unpack as the standard job directory, `results/job-<id>/`: the job's `config.json`, `lock.json`, `result.json` and `job.log`, and one directory per trial. See [trial outputs](/core-concepts/trial-outputs) for what each trial directory holds.
109
+
110
+ ## Config files
111
+
112
+ Put the job in a file and run it with `-c`. The file is YAML or JSON with the same field names the SDK's `jobs().start()` takes. Flags on the command line override the file's fields, one field at a time. `--print-config` prints the resolved job body as JSON and exits without running anything.
113
+
114
+ ```yaml nightly.yaml
115
+ datasets:
116
+ - name: terminal-bench-4
117
+ version: "4.0"
118
+ - name: harbor-examples
119
+ version: "1.0"
120
+ agents:
121
+ - name: codex
122
+ model_name: gpt-5.5
123
+ - name: claude
124
+ model_name: fable
125
+ n_attempts: 2
126
+ max_trial_spend_usd: 25
127
+ ```
128
+
129
+ ```bash
130
+ evolve run -c nightly.yaml --print-config
131
+ evolve run -c nightly.yaml --watch
132
+ ```
133
+
134
+ <Card title="run reference" icon="terminal" href="/cli-reference/run">
135
+ Every flag of `evolve run`.
136
+ </Card>
@@ -0,0 +1,68 @@
1
+ ---
2
+ title: "Models"
3
+ description: "How a model is named on -m, and why one API key covers every provider."
4
+ ---
5
+
6
+ `-m` names the model an arm runs, as the harness knows it. One `EVOLVE_API_KEY` covers every provider: you never configure a provider key for a job, and every model call that goes through the platform's gateway is metered against the trial's spend cap. The cap is airtight only on a task that declares `no-network`; under `allowlist` or `public` an agent can reach a provider directly with a key of its own, and that traffic is neither metered nor capped.
7
+
8
+ ```bash
9
+ evolve run \
10
+ -d terminal-bench-4@4.0 \
11
+ -a claude \
12
+ -m fable \
13
+ -l 5 \
14
+ --watch
15
+ evolve run \
16
+ -d terminal-bench-4@4.0 \
17
+ -a codex \
18
+ -m gpt-5.5 \
19
+ -m gpt-5.6-terra \
20
+ -l 5 \
21
+ --watch
22
+ ```
23
+
24
+ `-m` repeats. Each model is one arm, so the second command runs every task twice, once per model. Every arm must name a model; there is no default.
25
+
26
+ With a provider key of your own enabled, model calls bill that provider account instead of credits; the cap still applies, and a zero credit balance still refuses a job create, resume or retry.
27
+
28
+ ## The rosters
29
+
30
+ Each harness has its own roster of model names. These are the names the SDK ships at this release. The platform publishes the live list for each harness in its capability document, which the SDK reads with `meta()`.
31
+
32
+ <Tabs>
33
+ <Tab title="claude">
34
+ `fable`, `opus`, `sonnet`, `haiku`, `opus[1m]`, `sonnet[1m]`, `glm-5.3`, `glm-5.3-flash`, `openrouter/deepseek/deepseek-v4.1-flash`, `fireworks/deepseek-v4.1-flash`
35
+ </Tab>
36
+ <Tab title="codex">
37
+ `gpt-6-astra`, `gpt-5.6-sol`, `gpt-5.6-terra`, `gpt-5.6-luna`, `gpt-5.5`, `gpt-5.3-codex`
38
+ </Tab>
39
+ <Tab title="gemini">
40
+ `gemini-3.5-flash`, `gemini-3.5-flash-lite`, `gemini-3.1-pro-preview`
41
+ </Tab>
42
+ <Tab title="qwen">
43
+ `qwen3.7-max`, `qwen3.7-plus`, `qwen3.6-flash`
44
+ </Tab>
45
+ <Tab title="kimi">
46
+ `kimi-k3`, `kimi-k2.7-code`, `kimi-k3-raptor`, `kimi-k2p7-code-raptor`
47
+ </Tab>
48
+ <Tab title="opencode">
49
+ `openrouter/anthropic/claude-fable-5.1`, `openrouter/anthropic/claude-opus-5`, `openrouter/anthropic/claude-sonnet-5`, `openrouter/anthropic/claude-haiku-4.5`, `openrouter/openai/gpt-6-astra`, `openrouter/openai/gpt-5.6-sol`, `openrouter/openai/gpt-5.6-terra`, `openrouter/openai/gpt-5.6-luna`, `openrouter/google/gemini-3.6-flash`, `openrouter/qwen/qwen3.7-max`, `openrouter/moonshotai/kimi-k3`, `openrouter/z-ai/glm-5.3`, `openrouter/z-ai/glm-5.3-flash`, `openrouter/deepseek/deepseek-v4.1-flash`, `fireworks/deepseek-v4.1-flash`
50
+ </Tab>
51
+ <Tab title="droid">
52
+ `claude-fable-5.1`, `claude-opus-5`, `claude-sonnet-5`, `claude-haiku-4-5`, `gpt-6-astra`, `gpt-5.6-sol`, `gpt-5.6-terra`, `gpt-5.6-luna`, `gemini-3.6-flash`, `qwen3.7-max`, `kimi-k3`, `glm-5.3`, `glm-5.3-flash`, `openrouter/deepseek/deepseek-v4.1-flash`, `fireworks/deepseek-v4.1-flash`
53
+ </Tab>
54
+ </Tabs>
55
+
56
+ ## Reasoning effort
57
+
58
+ `--effort <value>` sets the reasoning effort for every arm. The values each harness accepts are in the [capability document](/sdk-reference/meta), under its `effort_support`: `gemini` accepts no effort value, `qwen` switches thinking on or off rather than taking a level, and the other five harnesses take a level. An effort a harness cannot honor is refused with `invalid_input` when the job is created, never silently skipped.
59
+
60
+ An omitted effort resolves to the harness's own default and is stamped as if declared: every trial echoes it on `agent_info.reasoning_effort`, and the job's `stats.evals` keys carry it as the segment before the dataset, `agent__model__effort__dataset`. Effort is part of an arm's identity: the same agent and model at two efforts are two arms.
61
+
62
+ ## The analyzer's and the checker's model
63
+
64
+ The analyzer and the checker run on the `claude` roster. Their default model is `openrouter/deepseek/deepseek-v4.1-flash`; `-m` on `evolve analyze` and `evolve check`, and `--analyze-model` on `evolve run`, pick another.
65
+
66
+ <Card title="Agents" icon="bot" href="/core-concepts/agents">
67
+ The seven harnesses, and how to bring your own.
68
+ </Card>
@@ -0,0 +1,52 @@
1
+ ---
2
+ title: "Sandboxes"
3
+ description: "Where trials run: e2b, daytona, or modal."
4
+ ---
5
+
6
+ Every trial runs in its own sandbox on one of three providers. Pick the provider per job with `-e`; the default is `daytona`. Once chosen, the provider is fixed for the job's life, and a resumed job inherits it.
7
+
8
+ - `e2b`: [E2B](https://e2b.dev/docs)
9
+ - `daytona`: [Daytona](https://www.daytona.io/docs), the default
10
+ - `modal`: [Modal](https://modal.com/docs)
11
+
12
+ ```bash
13
+ evolve run \
14
+ -d terminal-bench-4@4.0 \
15
+ -a codex \
16
+ -m gpt-5.5 \
17
+ -e modal \
18
+ -l 5 \
19
+ --watch
20
+ ```
21
+
22
+ ## Which tasks run where
23
+
24
+ Not every task can run on every provider, and the catalog says so before any money is spent. `evolve dataset show` lists a verdict per provider for every task.
25
+
26
+ ```bash
27
+ evolve dataset show terminal-bench-4@4.0
28
+ ```
29
+
30
+ A verdict is `ok`, or refused with a reason. A GPU task carries a third form: `ok` with a note that the trial degrades to `modal`, the provider that reserves GPUs. Starting a job whose selected tasks include one that is refused on the chosen provider is rejected at creation with `provider_unsupported`, so nothing is spent on a trial that cannot execute.
31
+
32
+ Three refusals appear in the verdicts: multi-container tasks run on `e2b` and `daytona` only; a multi-container task under `no-network` runs nowhere, so declare `allowlist` or `public`; and a size above a provider's ceiling refuses on that provider.
33
+
34
+ | Provider | Max vCPUs | Max memory | Disk |
35
+ | --- | --- | --- | --- |
36
+ | `e2b` | 8 | 8192 MB | fixed, 20 GB |
37
+ | `daytona` | 4 | 8192 MB | sized per task, up to 10 GB |
38
+ | `modal` | 16 | 32768 MB | fixed, 512 GB |
39
+
40
+ Two limits show only when the sandbox is created, as an `INFRASTRUCTURE_ERROR` with the reason in the trial's failure detail. On `daytona` an `allowlist` holds one kind of entry: IP addresses and CIDRs for a single-container task (at most 10), hostnames for a multi-container task (at most 20, `*.` covering a domain). `e2b` and `modal` take both kinds.
41
+
42
+ Each provider keeps a box alive for at most its own plan's lifetime, 24 hours on `e2b` and `modal`. A timeout stretched past it fails the trial.
43
+
44
+ ## GPU tasks
45
+
46
+ A task declares `gpus` and `gpu_types` in `[environment]`; `gpu_types` null means any type. GPU compute is paid by the platform; a GPU trial draws your credits for its model calls only. `modal` is the provider that reserves GPUs today, so a GPU task runs on `modal` whatever the job picked, and the trial records the move in `sandbox_provider_degrade`. A queued GPU trial past the fleet's `gpu_concurrency_cap` waits; a GPU count above `modal`'s ceiling is refused at import.
47
+
48
+ Every settled GPU trial states its compute as an estimate, `gpu_cost`, from the sandbox's lifetime at the provider's list price. It is a separate figure, never added to the model spend; the job sums it as `stats.gpu_cost_usd`. `evolve trial show` prints it as `gpu compute (est.)`, and `unpriced_reason` says why when no honest number exists.
49
+
50
+ ## The analyzer's and the checker's sandbox
51
+
52
+ Trace analysis and task checks run in sandboxes too. `-e` on `evolve analyze` and on `evolve check`, and `--analyze-provider` on `evolve run`, pick the provider. Omitted, the platform's analysis default applies, `daytona`.
@@ -0,0 +1,41 @@
1
+ ---
2
+ title: "Secrets"
3
+ description: "Store env secrets once and attach them to jobs by name."
4
+ ---
5
+
6
+ An env secret is a value stored under a name, with a delivery mode. Values are write-only: every read returns metadata, never the value.
7
+
8
+ ```bash
9
+ printf %s "$GITHUB_TOKEN" | evolve secrets set GITHUB_TOKEN --delivery direct
10
+ ```
11
+
12
+ Pipe the value on stdin, as above, to keep it out of your shell history; `--value <value>` is the other channel. `--delivery` is required: `direct` places the value in the sandbox environment, `brokered` keeps it out of every sandbox and needs the `--allowed-host`, `--allowed-path-prefix` and `--allowed-method` scoping. Eval trials take `direct` secrets only; a brokered one is refused with `secret_brokered_unsupported`. `--label <label>` keeps several values of one name side by side; the default label is `default`.
13
+
14
+ Restating the same value re-shapes its delivery or scoping. A different value under an existing name and label is refused with `secret_exists`: delete it first, or use another label.
15
+
16
+ ```bash
17
+ evolve secrets list
18
+ evolve secrets delete GITHUB_TOKEN --label staging
19
+ ```
20
+
21
+ ## Attach a secret to a job
22
+
23
+ ```bash
24
+ evolve run \
25
+ -d terminal-bench-4@4.0 \
26
+ -a codex \
27
+ -m gpt-5.5 \
28
+ --secret GITHUB_TOKEN \
29
+ -l 5 \
30
+ --watch
31
+ ```
32
+
33
+ `--secret NAME[@LABEL][=ENVNAME]` attaches a stored secret to every agent run. `@LABEL` picks a labeled row; omitted, the `default` row or the only row, and several labels with no `default` is refused with `secret_ambiguous`. `=ENVNAME` renames the variable inside the sandbox; a name the platform owns, such as the `EVOLVE_` prefix or `REWARDKIT_JUDGE`, is refused. The job stores a reference, and the value never rides the command line.
34
+
35
+ In the SDK the same attachment is `secrets: [{ name, label?, as? }]` on `jobs().start()`. `--secret-inline NAME[@LABEL]:DELIVERY=VALUE`, or `{ name, value, delivery, label?, as? }` in that list, saves the value and attaches it in one step; re-running with the same value converges, a different value is refused with `secret_exists`.
36
+
37
+ A task's `[environment.env]` can ask for a secret with a `${VAR}` template, satisfied by a secret attached under that env name; see [tasks](/core-concepts/tasks#environment-variables). Plain, non-secret environment does not go on a job: the server refuses `agent_env` (`--ae`). Declare it in the task's `[environment.env]` table instead.
38
+
39
+ <Card title="secrets reference" icon="terminal" href="/cli-reference/secrets">
40
+ Every flag of `evolve secrets`.
41
+ </Card>
@@ -0,0 +1,42 @@
1
+ ---
2
+ title: "Skills"
3
+ description: "Mount skills into every agent run, from a git source or from your uploads."
4
+ ---
5
+
6
+ A skill is a folder of instructions mounted into the agent's run. Give a job one or more with `--skills`; every arm gets them.
7
+
8
+ ```bash
9
+ evolve run \
10
+ -d terminal-bench-4@4.0 \
11
+ -a claude \
12
+ -m fable \
13
+ --skills skills.sh/acme/skills/pdf \
14
+ -l 5 \
15
+ --watch
16
+ ```
17
+
18
+ `--skills` (also spelled `--skill`) repeats, and accepts:
19
+
20
+ - `skills.sh/<owner>/<repo>[/<skill>]`
21
+ - `org/repo[@ref]`
22
+ - an https git URL
23
+ - `upload:<id>`, a skill you uploaded
24
+ - `name:<skill-name>`, your moving name pointer, resolved on the server to its current upload
25
+ - a local folder, which is uploaded first and then referenced
26
+
27
+ ## Upload a skill
28
+
29
+ ```bash
30
+ evolve skill upload ./my-skill
31
+ evolve skill list
32
+ evolve skill show name:my-skill
33
+ evolve skill delete <id>
34
+ ```
35
+
36
+ The folder's name becomes your moving name pointer: `name:my-skill` resolves to the latest upload with that name, and an unknown name is refused with `skill_name_not_found`. `skill show` prints the metadata and the `SKILL.md`. A skill that a running job references cannot be deleted, and past jobs keep the version they ran with.
37
+
38
+ The job's arm records what mounted under `skill_locks`: name, pinned source, digest and, for a git skill, the repository and commit. A skill that cannot be fetched fails the trial as an infrastructure error, never as a score.
39
+
40
+ <Card title="skill reference" icon="terminal" href="/cli-reference/skill">
41
+ Every flag of `evolve skill`.
42
+ </Card>