@bjoernrochel/sevro 0.1.0-rc.2 → 0.1.0-rc.21

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 (243) hide show
  1. package/CONTRIBUTING.md +170 -0
  2. package/LICENSE +63 -136
  3. package/README.md +83 -66
  4. package/docs/README.md +44 -0
  5. package/docs/acknowledgements.md +14 -0
  6. package/docs/architecture.md +146 -0
  7. package/docs/assets/README.md +27 -0
  8. package/docs/assets/sevro-logo.png +0 -0
  9. package/docs/assets/sevro-symbol.svg +1 -0
  10. package/docs/assets/sevro-wordmark.svg +1 -0
  11. package/docs/builtin-graders-v1.md +41 -13
  12. package/docs/codex-host.md +184 -52
  13. package/docs/contracts.md +19 -0
  14. package/docs/creating-cases.md +139 -0
  15. package/docs/development-cli.md +190 -30
  16. package/docs/documentation-quality.md +61 -0
  17. package/docs/evaluation-workflow.md +110 -0
  18. package/docs/evidence/code-mode-controls-71.md +64 -0
  19. package/docs/evidence/code-mode-programs-85.md +64 -0
  20. package/docs/evidence/codex-state-73/README.md +204 -0
  21. package/docs/evidence/codex-state-73/darrow-migration.patch +182 -0
  22. package/docs/evidence/codex-state-73/results.json +661 -0
  23. package/docs/evidence/local-http-74.md +104 -0
  24. package/docs/evidence/runtime-startup-30/README.md +185 -0
  25. package/docs/evidence/runtime-startup-30/after.json +319 -0
  26. package/docs/evidence/runtime-startup-30/baseline-timeout.jsonl +2 -0
  27. package/docs/evidence/runtime-startup-30/before.json +403 -0
  28. package/docs/evidence/runtime-startup-30/consumer-smoke.json +63 -0
  29. package/docs/evidence/runtime-startup-30/full-policy-diagnostic.jsonl +3 -0
  30. package/docs/evidence/runtime-startup-30/minimal-policy-diagnostic.jsonl +3 -0
  31. package/docs/evidence/runtime-startup-30/plugin-template-assessment.json +20 -0
  32. package/docs/evidence/runtime-startup-30/seedless-timeout.jsonl +2 -0
  33. package/docs/evidence/skill-reads-70/results.json +823 -0
  34. package/docs/evidence.md +21 -0
  35. package/docs/extension-protocol-v1.md +50 -16
  36. package/docs/fixture-cleanup-validation.md +3 -0
  37. package/docs/getting-started.md +102 -0
  38. package/docs/guide-evaluation.md +89 -0
  39. package/docs/guide-verification.json +239 -0
  40. package/docs/identity-v1.md +35 -1
  41. package/docs/installing.md +88 -0
  42. package/docs/licenses/BUSL-1.1-0.1.0-rc.2.txt +159 -0
  43. package/docs/licensing.md +42 -0
  44. package/docs/native-controls.md +76 -5
  45. package/docs/native-hosts.md +228 -0
  46. package/docs/reading-results.md +141 -0
  47. package/docs/recipes.md +489 -0
  48. package/docs/releases.md +81 -40
  49. package/docs/report-v1.md +29 -1
  50. package/docs/results-v1.md +180 -0
  51. package/docs/run-settings-v1.md +147 -0
  52. package/docs/running-evaluations.md +31 -0
  53. package/docs/runtime-v1.md +614 -0
  54. package/docs/specs/repository-guide.md +58 -0
  55. package/docs/troubleshooting.md +30 -0
  56. package/docs/typescript-quality.md +234 -0
  57. package/docs/usability-study.md +114 -0
  58. package/examples/basic/host.ts +2 -2
  59. package/examples/recipes/candidate.ts +26 -0
  60. package/examples/recipes/cases/coding-change.json +21 -0
  61. package/examples/recipes/cases/host-tools.json +21 -0
  62. package/examples/recipes/cases/mise.json +21 -0
  63. package/examples/recipes/cases/node.json +21 -0
  64. package/examples/recipes/cases/python-uv.json +21 -0
  65. package/examples/recipes/cases/semantic.json +17 -0
  66. package/examples/recipes/coding-change/check.ts +23 -0
  67. package/examples/recipes/extension-artifacts.ts +65 -0
  68. package/examples/recipes/extension-methods.ts +174 -0
  69. package/examples/recipes/extension.ts +37 -0
  70. package/examples/recipes/repository-skill/.agents/skills/startup-guide/SKILL.md +7 -0
  71. package/examples/recipes/repository-skill/.claude/skills/startup-guide/SKILL.md +7 -0
  72. package/examples/recipes/repository-skill/README.md +3 -0
  73. package/examples/recipes/run-inputs.ts +188 -0
  74. package/examples/recipes/run-options.ts +131 -0
  75. package/examples/recipes/run.ts +63 -0
  76. package/examples/recipes/runtime/empty.json +1 -0
  77. package/examples/recipes/runtime/goals.json +1 -0
  78. package/examples/recipes/runtime/mise.json +6 -0
  79. package/examples/recipes/runtime/path.json +1 -0
  80. package/examples/recipes/runtime/plugins.json +4 -0
  81. package/examples/recipes/runtime/python-uv.json +10 -0
  82. package/examples/recipes/semantic-judge.ts +29 -0
  83. package/examples/templates/coding/adapter.ts +17 -0
  84. package/examples/templates/coding/case.json +15 -0
  85. package/examples/templates/repository-skill/.agents/skills/startup-guide/SKILL.md +6 -0
  86. package/examples/templates/repository-skill/extension-data.ts +64 -0
  87. package/examples/templates/repository-skill/extension.ts +31 -0
  88. package/examples/templates/response/adapter.ts +12 -0
  89. package/examples/templates/response/case.json +13 -0
  90. package/package.json +39 -6
  91. package/schemas/report-v1.schema.json +9 -0
  92. package/schemas/run-evidence-v1.schema.json +2 -1
  93. package/schemas/runtime-v1.schema.json +193 -0
  94. package/src/advisory.ts +10 -5
  95. package/src/candidate-artifacts.ts +208 -0
  96. package/src/candidate-codex-state.ts +185 -0
  97. package/src/case-validation.ts +105 -0
  98. package/src/cli/cancellation.ts +20 -0
  99. package/src/cli/command.ts +81 -0
  100. package/src/cli/completion.ts +15 -0
  101. package/src/cli/demo.ts +59 -0
  102. package/src/cli/evaluation.ts +55 -0
  103. package/src/cli/extension.ts +79 -0
  104. package/src/cli/help.ts +222 -0
  105. package/src/cli/hosts.ts +59 -0
  106. package/src/cli/init-settings.ts +30 -0
  107. package/src/cli/init.ts +111 -0
  108. package/src/cli/invocation.ts +627 -0
  109. package/src/cli/loading.ts +151 -0
  110. package/src/cli/preparation.ts +163 -0
  111. package/src/cli/presentation.ts +91 -0
  112. package/src/cli/progress.ts +6 -0
  113. package/src/cli/run-manifest.ts +133 -0
  114. package/src/cli/run-options.ts +101 -0
  115. package/src/cli/run-overrides.ts +83 -0
  116. package/src/cli/settings.ts +160 -0
  117. package/src/cli/summary.ts +43 -0
  118. package/src/cli.ts +13 -843
  119. package/src/contract-types.ts +94 -0
  120. package/src/engine.ts +19 -2373
  121. package/src/evaluation/advisory.ts +150 -0
  122. package/src/evaluation/check-plan.ts +510 -0
  123. package/src/evaluation/collection.ts +88 -0
  124. package/src/evaluation/context.ts +10 -0
  125. package/src/evaluation/grading-host.ts +39 -0
  126. package/src/evaluation/grading.ts +258 -0
  127. package/src/evaluation/invocation-plan.ts +548 -0
  128. package/src/evaluation/plan.ts +736 -0
  129. package/src/evaluation/progress.ts +19 -0
  130. package/src/evaluation/resources.ts +241 -0
  131. package/src/evaluation/run.ts +206 -0
  132. package/src/{trial-scheduler.ts → evaluation/scheduler.ts} +3 -1
  133. package/src/evaluation/semantic.ts +312 -0
  134. package/src/evaluation/trial.ts +866 -0
  135. package/src/evaluation/types.ts +207 -0
  136. package/src/evidence/host-results.ts +92 -0
  137. package/src/evidence/retained-artifacts.ts +18 -0
  138. package/src/evidence/trial-writer.ts +203 -0
  139. package/src/evidence/usage.ts +17 -0
  140. package/src/extension-client.ts +228 -148
  141. package/src/extension-session.ts +326 -195
  142. package/src/fixtures/advisory.ts +338 -0
  143. package/src/fixtures/bin.ts +57 -0
  144. package/src/{fixture-cleanup.ts → fixtures/cleanup.ts} +13 -7
  145. package/src/fixtures/create.ts +187 -0
  146. package/src/fixtures/generated.ts +300 -0
  147. package/src/fixtures/git-hooks.ts +24 -0
  148. package/src/fixtures/preparation.ts +270 -0
  149. package/src/{repository-fixture.ts → fixtures/repository.ts} +207 -85
  150. package/src/fixtures/setup.ts +224 -0
  151. package/src/fixtures/tools.ts +88 -0
  152. package/src/fixtures/workspace-state.ts +212 -0
  153. package/src/generated/cli-result.cjs +2 -0
  154. package/src/generated/cli-result.d.cts +3 -0
  155. package/src/generated/extension.cjs +2 -0
  156. package/src/generated/extension.d.cts +3 -0
  157. package/src/generated/report.cjs +2 -0
  158. package/src/generated/report.d.cts +3 -0
  159. package/src/generated/run-evidence.cjs +2 -0
  160. package/src/generated/run-evidence.d.cts +3 -0
  161. package/src/generated/runtime.cjs +2 -0
  162. package/src/generated/runtime.d.cts +3 -0
  163. package/src/graders/artifact.ts +56 -23
  164. package/src/graders/git-head.ts +79 -75
  165. package/src/graders/output.ts +222 -140
  166. package/src/graders/semantic.ts +102 -43
  167. package/src/graders/shell.ts +379 -207
  168. package/src/host-diagnostic-redaction.ts +52 -0
  169. package/src/host-diagnostics.ts +319 -0
  170. package/src/hosts/claude-continuation.ts +63 -18
  171. package/src/hosts/claude-credential.ts +43 -62
  172. package/src/hosts/claude-events.ts +86 -51
  173. package/src/hosts/claude-keychain.ts +59 -0
  174. package/src/hosts/claude-native-goal.ts +57 -33
  175. package/src/hosts/claude-process.ts +111 -0
  176. package/src/hosts/claude-repository-invocation.ts +208 -117
  177. package/src/hosts/claude-settings.ts +240 -21
  178. package/src/hosts/claude-skill-activations.ts +166 -0
  179. package/src/hosts/claude-state.ts +403 -0
  180. package/src/hosts/claude-tool-calls.ts +171 -106
  181. package/src/hosts/claude.ts +561 -451
  182. package/src/hosts/codex-app-server.ts +326 -178
  183. package/src/hosts/codex-configuration.ts +44 -18
  184. package/src/hosts/codex-events.ts +97 -60
  185. package/src/hosts/codex-exec-controls.ts +516 -0
  186. package/src/hosts/codex-invocation.ts +70 -0
  187. package/src/hosts/codex-marketplace.ts +283 -0
  188. package/src/hosts/codex-native-calls.ts +546 -500
  189. package/src/hosts/codex-process.ts +202 -0
  190. package/src/hosts/codex-profile.ts +257 -28
  191. package/src/hosts/codex-session-files.ts +106 -0
  192. package/src/hosts/codex-state.ts +492 -0
  193. package/src/hosts/codex.ts +783 -832
  194. package/src/hosts/isolation-common.ts +94 -0
  195. package/src/hosts/isolation-roots.ts +54 -27
  196. package/src/hosts/isolation.ts +10 -0
  197. package/src/hosts/linux-sandbox.ts +159 -0
  198. package/src/hosts/mac-sandbox.ts +187 -61
  199. package/src/hosts/native-controls.ts +152 -62
  200. package/src/hosts/process-lifecycle.ts +37 -0
  201. package/src/hosts/protected-worktrees.ts +51 -19
  202. package/src/hosts/skill-hook-catalog.ts +131 -0
  203. package/src/hosts/skill-hook-handler.ts +374 -0
  204. package/src/hosts/skill-hooks.ts +580 -0
  205. package/src/hosts/workspace-fingerprint.ts +55 -35
  206. package/src/identity.ts +102 -48
  207. package/src/instrumentation.ts +109 -48
  208. package/src/native-transcript-state.ts +131 -0
  209. package/src/native-transcript-view.ts +90 -0
  210. package/src/native-transcripts.ts +286 -0
  211. package/src/process-lifecycle.ts +150 -0
  212. package/src/provenance.ts +161 -81
  213. package/src/prune.ts +215 -0
  214. package/src/report.ts +172 -140
  215. package/src/resolved-case.ts +33 -0
  216. package/src/results-lock.ts +29 -0
  217. package/src/results.ts +133 -86
  218. package/src/run-owner.ts +154 -63
  219. package/src/runtime/config.ts +456 -0
  220. package/src/runtime/discovery-apple.ts +90 -0
  221. package/src/runtime/discovery-providers.ts +63 -0
  222. package/src/runtime/discovery.ts +70 -0
  223. package/src/runtime/hook-processes.ts +97 -0
  224. package/src/runtime/hooks.ts +476 -0
  225. package/src/runtime/paths.ts +313 -0
  226. package/src/runtime/query.ts +85 -0
  227. package/src/runtime/seeds.ts +134 -0
  228. package/src/runtime/shared-cache.ts +143 -0
  229. package/src/runtime/state.ts +143 -0
  230. package/src/schema-types.ts +198 -0
  231. package/src/schema.ts +15 -19
  232. package/src/transcript-retention.ts +146 -0
  233. package/src/value-guards.ts +20 -0
  234. package/src/advisory-fixture.ts +0 -282
  235. package/src/fixture-bin.ts +0 -87
  236. package/src/fixture-setup.ts +0 -163
  237. package/src/generated-fixture.ts +0 -220
  238. package/src/git-hooks.ts +0 -63
  239. package/src/hosts/claude-nested-skills.ts +0 -218
  240. package/src/hosts/codex-command-output.ts +0 -399
  241. package/src/hosts/codex-executor-command.ts +0 -195
  242. package/src/hosts/codex-skill-reads.ts +0 -391
  243. package/src/preparation.ts +0 -211
package/docs/releases.md CHANGED
@@ -7,12 +7,19 @@ exact semantic version; development versions containing `-dev` are not release
7
7
  candidates. Darrow pins the published version in development dependencies and
8
8
  its lockfile. Marketplace plugins do not depend on Sevro.
9
9
 
10
+ The [current release](installing.md#current-release) uses the current [licensing terms](licensing.md).
11
+ Published `rc.1` and `rc.2` retain their original BSL grants. Always select a new
12
+ version for publication; a local development tarball does not replace an
13
+ already published artifact.
14
+
10
15
  ## Candidate contract
11
16
 
12
17
  Prepare one candidate from the intended release tag and package metadata. The
13
18
  tag must equal `v<package version>`. Package metadata must identify the public
14
19
  repository, registry, distribution tag, and an owner-selected license with its
15
- nonempty `LICENSE` file. Prereleases cannot use npm's `latest` distribution tag.
20
+ nonempty `LICENSE` file. `latest` identifies the recommended default release,
21
+ including a release candidate. Use `next` for a preview that should require an
22
+ explicit opt-in. Preparation accepts either tag for prerelease and stable versions.
16
23
 
17
24
  Preparation creates a new absolute output directory and never replaces an
18
25
  existing directory. It packs with lifecycle scripts disabled, retains the npm
@@ -21,8 +28,9 @@ The record identifies the package, version, release tag, distribution tag,
21
28
  tarball SHA-256 and npm SHA-512 integrity, and the preparation runtimes.
22
29
  Preparation does not publish a package or create a Git tag.
23
30
 
24
- The package installation check accepts `--tarball <absolute file>` to verify
25
- that exact candidate without repacking. The supplied tarball remains intact.
31
+ For development or explicitly requested diagnostics, the package installation
32
+ check accepts `--tarball <absolute file>` to verify an exact candidate without
33
+ repacking. It is not a release step. The supplied tarball remains intact.
26
34
  Its installed name and version must match the source metadata. Installation,
27
35
  CLI execution, generic grading, prompt-only execution, release provenance,
28
36
  reporting, and supported deterministic native fixtures run without source Git
@@ -30,59 +38,92 @@ metadata in the installed package.
30
38
 
31
39
  ## Maintainer workflow
32
40
 
33
- 1. Select the license, update `package.json` to the intended release version,
34
- and commit those changes. Preserve the existing public schemas and document
35
- behavior changes. For the first candidate, use `0.1.0-rc.1` with npm tag
36
- `next`; a prerelease does not establish full Darrow migration completion.
37
- 2. Run frozen installation, typecheck, formatting, and the full test suite.
38
- 3. Prepare and test the exact candidate:
41
+ Release already verified code. Do not rerun tests locally or in CI as part of a
42
+ release: reuse the successful source CI run. Code, dependencies, schemas, tests,
43
+ examples, license changes, and other quality inputs belong in ordinary changes
44
+ with their own CI before starting the release.
45
+
46
+ 1. Start a release branch from verified `main`. Update `package.json.version`
47
+ to a new release version, keep the selected license, and run `bun run docs:sync`.
48
+ Set `publishConfig.tag` to `latest` for the recommended default or `next`
49
+ for an opt-in preview. Commit and open a pull request; every release commit
50
+ must reach `main` through a PR. Never attempt a direct release push to `main`.
51
+ 2. Merge the release PR after its static checks and reused CI evidence pass.
52
+ Release CI compares the candidate against a successful ancestor run on
53
+ `main`, permitting only version/distribution-tag changes and the exact
54
+ release documentation and workflow files inventoried in
55
+ [the CI selector](../.github/scripts/release-ci.py). All other tracked inputs
56
+ must match. The original run must have completed all four quality phases
57
+ and their gate steps, or the historical complete quality gate;
58
+ another release's reused status is insufficient. CI retains the source SHA
59
+ and run URL in `release-ci.json`. Missing evidence fails the release check;
60
+ it does not trigger another test run. Ordinary code changes and explicit
61
+ workflow dispatches continue to run the full gate.
62
+ 3. From the clean, merged release commit, use macOS, Bun 1.3.13, Node 24,
63
+ and npm to prepare one exact candidate:
64
+
65
+ ```sh
66
+ bun install --frozen-lockfile
67
+ bun run release:prepare --tag "v${SEVRO_RELEASE_VERSION:?set the selected new release version}" --output /absolute/new/release-directory
68
+ ```
69
+
70
+ 4. Inspect the version, repository, license, distribution tag, file inventory,
71
+ and retained checksums. Publish that tarball with lifecycle scripts disabled
72
+ using the commands below. Do not run `check:typescript`, `test:package-install`,
73
+ Darrow's archive/installed gates, or native trials during release. Diagnostic
74
+ tests require a separate explicit request.
75
+ 5. Once npm serves the version, compare `dist.integrity` with `release.json`
76
+ and verify the intended distribution tag:
39
77
 
40
78
  ```sh
41
- bun run release:prepare --tag v0.1.0-rc.1 --output /absolute/new/release-directory
42
- bun run test:package-install --tarball /absolute/new/release-directory/bjoernrochel-sevro-0.1.0-rc.1.tgz
79
+ npm view "@bjoernrochel/sevro@${SEVRO_RELEASE_VERSION}" version dist.integrity --json
80
+ npm view @bjoernrochel/sevro dist-tags --json
43
81
  ```
44
82
 
45
- 4. Run Darrow's public integration against that same tarball:
83
+ npm may take a few minutes to process the accepted upload. Wait for the
84
+ registry record rather than republishing. Retain the reviewed tarball,
85
+ checksums, and original CI evidence.
86
+
87
+ 6. Create the matching Git tag at the merged release commit and push only the tag:
46
88
 
47
89
  ```sh
48
- SEVRO_PACKAGE_TARBALL=/absolute/new/release-directory/bjoernrochel-sevro-0.1.0-rc.1.tgz bun run test:eval-runner-sevro-package
90
+ git tag -a "v${SEVRO_RELEASE_VERSION}" -m "Release ${SEVRO_RELEASE_VERSION}"
91
+ git push origin "refs/tags/v${SEVRO_RELEASE_VERSION}"
49
92
  ```
50
93
 
51
- 5. Review the changes, file inventory, retained checks, and compatibility
52
- limitations before authorizing publication. Keep the reviewed tarball and
53
- its checksums. Publish that artifact rather than repacking after review.
54
- 6. After publication, verify registry integrity, install the exact version in
55
- Darrow, and run its frozen installed compatibility gate. Retain the prior
56
- version's evidence for updates. Roll back through a new dependency/lockfile
57
- commit and rerun the installed gate; never relabel failed-version evidence.
94
+ Darrow dependency/lockfile updates and compatibility gates are a separate
95
+ Darrow PR, not prerequisites for npm publication. A prerelease does not establish
96
+ full Darrow migration completion. Preserve prior-version evidence for updates
97
+ and rollback; never relabel failed-version evidence.
98
+
99
+ ## Local macOS publication
100
+
101
+ There is no GitHub release job. The maintainer prepares, inspects, and publishes
102
+ the reviewed tarball from macOS with an authenticated npm account. Check its
103
+ retained checksum immediately before publication:
58
104
 
59
- ## Manual release workflow
105
+ ```sh
106
+ cd /absolute/reviewed
107
+ shasum -a 256 -c SHA256SUMS
108
+ npm publish ./bjoernrochel-sevro-0.1.0-rc.1.tgz --ignore-scripts --access public --tag latest
109
+ ```
60
110
 
61
- `.github/workflows/release.yml` runs only through explicit dispatch against a
62
- release tag. Its default prepares and checks the artifact. `publish: true`
63
- additionally publishes that verified artifact using npm trusted publishing.
64
- No push or pull-request event publishes a package.
111
+ Replace the example version and distribution tag with the reviewed candidate's
112
+ values. The package repository URL must match this public repository. Preparing
113
+ a tarball or opening a pull request does not authorize publication.
65
114
 
66
- Before the first publication, an npm owner must establish the package and its
67
- publishing authorization. The initial reviewed tarball can be published
68
- manually with an authenticated npm account:
115
+ An existing published candidate can become the default without republishing:
69
116
 
70
117
  ```sh
71
- npm publish /absolute/reviewed/bjoernrochel-sevro-0.1.0-rc.1.tgz --ignore-scripts --access public --tag next
118
+ npm dist-tag add @bjoernrochel/sevro@0.1.0-rc.2 latest
119
+ npm view @bjoernrochel/sevro dist-tags --json
72
120
  ```
73
121
 
74
- After the package exists, configure its trusted publisher for GitHub owner
75
- `BjRo`, repository `sevro`, and workflow filename `release.yml`. The workflow
76
- uses a GitHub-hosted runner, Node 24, npm 11.20.0, and job-scoped `id-token: write`.
77
- The package repository URL must match this public repository. See npm's
78
- [trusted publishing documentation](https://docs.npmjs.com/trusted-publishers/).
79
- The workflow checks the downloaded artifact's SHA-256 before publishing and
80
- retains its release record. Configuring an owner or workflow does not itself
81
- authorize this coding session to publish or push.
122
+ Promotion changes the registry tag; it does not update the published tarball.
82
123
 
83
- The first local candidate is `0.1.0-rc.1`, using the owner-selected
124
+ The first published candidate was `0.1.0-rc.1`, using the owner-selected
84
125
  `BUSL-1.1` license. Its `LICENSE` preserves Darrow's terms and parameters,
85
- changing only the Licensed Work name and description to Sevro. Neither local
86
- checks nor a workflow file claim a remote CI run or publication. Darrow's exact
126
+ changing only the Licensed Work name and description to Sevro. Local checks do
127
+ not claim a remote CI run or publication. Darrow's exact
87
128
  registry pin, default caller switch, remaining workflow migrations, focused live validation, and
88
129
  generic runner removal remain separate extraction gates.
package/docs/report-v1.md CHANGED
@@ -3,10 +3,14 @@
3
3
  `sevro report` reads one or more retained `sevro.cli-result.v1` files and their
4
4
  referenced `sevro.run-evidence.v1` files. It validates both public schemas and
5
5
  checks run identity, exit category, case count, and trial references before
6
- reporting. Paths must be absolute and distinct.
6
+ reporting. Programmatic `createReport` paths must be absolute and distinct.
7
+ CLI `--result-file` paths may be relative to the invoking directory; they are
8
+ canonicalized before duplicate detection and loading.
7
9
 
8
10
  ```sh
9
11
  sevro report --result-file /absolute/path/to/result.json
12
+ sevro report --latest
13
+ sevro report --latest --results-root ./other-results
10
14
  sevro report --json --result-file /absolute/path/to/first.json \
11
15
  --result-file /absolute/path/to/second.json
12
16
  ```
@@ -17,6 +21,30 @@ inputs return exit 64 with a diagnostic on stderr. Reporting does not change
17
21
  the exit category of any input run; each row retains its original code.
18
22
  Pre-run failures with no case rows remain visible in the input-run section.
19
23
 
24
+ `--latest` selects
25
+ `<cwd>/.sevro/results/latest.json`; `--results-root` changes that root and requires
26
+ `--latest`. It is exclusive with `--result-file`. Each retained CLI evaluation
27
+ saves a `result.json` beside its run evidence and atomically updates latest,
28
+ including dry and failed runs. Pre-run failures do not replace latest. Missing
29
+ latest or referenced evidence is an error. See
30
+ [the evaluation workflow](evaluation-workflow.md).
31
+
32
+ [`sevro prune`](reading-results.md#prune-retained-results) maintains this index
33
+ when removing retained evidence. After pruning, latest selects the newest
34
+ remaining completed result; if none remain, the index is removed and `--latest`
35
+ reports a missing-input diagnostic. Explicit reports still require their selected
36
+ results and evidence to exist.
37
+
38
+ After [`sevro prune --native-transcripts`](reading-results.md#remove-native-transcript-bundles),
39
+ reports accept absent native bundles only with the matching
40
+ [pruning receipt](results-v1.md#native-transcript-bundles). Present bundles must
41
+ still match their recorded hashes; unexplained missing bytes remain an error.
42
+ New report rows include optional `nativeTranscripts` with nonnegative integer
43
+ `retained` and `pruned` bundle counts across the case's trials and host roles.
44
+ Markdown shows the same counts beside retained evidence. Older report documents
45
+ without this field remain valid. Pruning does not change verdicts, routes,
46
+ identity, usage, or duration.
47
+
20
48
  Each case row keeps task verdict, execution, and grading separate. Task pass
21
49
  rate is measured only when every trial completed execution and grading with an
22
50
  assessed task verdict. Candidate duration sums the measured host call time
@@ -9,6 +9,17 @@ Each domain outcome also gets one human-readable line with its case, trial,
9
9
  outcome ID, and status. Domain outcomes remain independent of the task verdict
10
10
  and exit code.
11
11
 
12
+ The CLI also shows trial states, bounded failed/unavailable
13
+ check details, measured candidate duration and known/unknown usage in human
14
+ completion. Actual preparation/candidate/grading/evidence stage messages use
15
+ stderr in both modes; they do not assert task success. Dry execution/grading are
16
+ explicitly skipped. JSON stdout stays unchanged. The CLI saves `result.json`
17
+ beside retained run evidence and atomically publishes `<results-root>/latest.json`
18
+ for [report access](report-v1.md). These output files stay inside excluded storage
19
+ and do not change evaluation identity. A failure to retain CLI/latest output is
20
+ reported as an internal error after an otherwise successful run; an earlier
21
+ nonzero run outcome keeps its precedence and its evidence reference.
22
+
12
23
  ## Separate states
13
24
 
14
25
  Each trial and aggregate result carries:
@@ -98,6 +109,17 @@ persistence error.
98
109
  [`identity-v1.md`](identity-v1.md) defines the canonical digest and each
99
110
  comparison dimension.
100
111
 
112
+ Current CLI runs additionally retain the redacted effective-settings preview as
113
+ optional `configuration.resolved` (`sevro.resolved-run-settings.v1`), including
114
+ saved-setting selections and resolved operational paths. This snapshot excludes
115
+ credentials, credential-option paths, private source-closure/mapping paths,
116
+ private extension configuration and runtime
117
+ environment values; it is outside `configuration.digest`. Assessment settings
118
+ remain bound by the existing identity inputs and `configuration.redacted`.
119
+ Historical evidence without this optional field remains valid; missing settings
120
+ stay unknown. See [saved run settings](run-settings-v1.md) for precedence and
121
+ privacy limits.
122
+
101
123
  The versioned machine-readable contracts are
102
124
  [`cli-result-v1.schema.json`](../schemas/cli-result-v1.schema.json) and
103
125
  [`run-evidence-v1.schema.json`](../schemas/run-evidence-v1.schema.json). A
@@ -110,9 +132,167 @@ An interrupted or failed run keeps completed trials plus an explicit partial
110
132
  attempt or diagnostic record. Failed persistence is an internal error and
111
133
  cannot be presented as a successful assessment.
112
134
 
135
+ Successful temporary workspaces are removed after their evidence is saved.
136
+ Failed and cancelled workspaces, including trials with unavailable required
137
+ grading evidence, are kept for 24 hours after becoming inactive. Evaluation
138
+ startup removes expired workspaces with verified inactive ownership. Active or
139
+ unverifiable workspaces and unregistered legacy folders are preserved; saved
140
+ results and evidence remain intact. Failed cleanup is retried on later evaluations.
141
+
142
+ `sevro.observation.workspaces` records candidate and retained auxiliary workspace
143
+ paths for inspection. These paths are temporary and do not affect evaluation identity.
144
+
145
+ Retained results have no automatic expiration. The explicit
146
+ [`sevro prune` command](reading-results.md#prune-retained-results) applies an
147
+ operator-selected age or count policy, defaulting to the newest ten results.
148
+ It deletes complete retained result directories and maintains `latest.json`
149
+ for the remaining results. Active or unrecognized attempts remain protected;
150
+ fixture cleanup and run-state coordination metadata have separate lifecycles.
151
+
152
+ Opted-in [candidate artifact runtimes](runtime-v1.md#candidate-artifact-access)
153
+ remain available through grading and are removed afterward, including failed
154
+ and cancelled trials. Failed-fixture retention does not preserve them.
155
+ Read access does not automatically retain artifact bytes in run evidence.
156
+
157
+ Checker private home, temporary storage, and copied dependency slots are removed
158
+ after grading on success, failure, and cancellation. Retained failed fixtures and
159
+ saved evidence do not retain checker runtime copies. Explicitly declared shared
160
+ caches survive this cleanup and remain under operator control.
161
+
113
162
  A host adapter can return `executionFailed: true` with bounded artifacts from
114
163
  a failed process. The engine retains those artifacts, skips all grading, and
115
164
  reports `failed` / `not_requested` / `not_assessed` with exit code `2`. A final
116
165
  message that happens to match a check cannot turn that failure into a pass.
117
166
  Claude retains its bounded event stream and, when present, up to 64 KiB of
118
167
  stderr as private host artifacts. Failure bodies do not appear in CLI diagnostics.
168
+ Codex preflight failures retain `codex.process` (stage, reason, exit code, signal,
169
+ duration, and stderr truncation) and `codex.stderr` (the first 64 KiB), with role
170
+ prefixes for semantic/advisory hosts. Diagnostics distinguish failure, timeout,
171
+ and cancellation without exposing raw stderr.
172
+
173
+ ## Native host diagnostics
174
+
175
+ The CLI's opt-in
176
+ [`--retain-host-diagnostics`](development-cli.md#retain-native-host-diagnostics)
177
+ retains candidate artifact `sevro.host.diagnostics` with format
178
+ `sevro.host-diagnostics.v1`. Semantic and advisory requests use the existing
179
+ `sevro.semantic[.<source digest>].` and `sevro.advisory.` artifact ID prefixes.
180
+ The flag is independent of native transcript retention.
181
+
182
+ The private JSON contains `host`, `role`, `stage`, `error`, `processes`,
183
+ and `processesDropped`. Error evidence preserves the original name, message,
184
+ stack and available error code, with up to eight error entries in the cause chain. Repeated
185
+ or deeper causes end in an explicit `truncated` entry. Messages and stacks
186
+ are bounded to 8,192 characters per entry. A host-returned failure without a
187
+ thrown exception receives a runner failure summary; subprocess receipts and
188
+ bounded output supply its native evidence.
189
+
190
+ Each process receipt records stage, actual `code`, `signal`, `durationMs`,
191
+ reason, stdout/stderr prefixes, and separate truncation markers. Unknown native
192
+ exit information remains `null`; app-server's synthesized protocol result is
193
+ not substituted for a process exit code. Each stream retains at most 64 KiB,
194
+ and hosts continue consuming output after filling the diagnostic prefix.
195
+ Stream parsing and decoding failures also retain available prefixes.
196
+ Text uses replacement decoding for diagnostic inspection; it is not an exact
197
+ native-byte archive.
198
+
199
+ The journal keeps at most 32 recent process receipts and at most 2 MiB of
200
+ encoded receipt data. It drops oldest receipts first and reports their count.
201
+ The failing stage and bounded error remain independent of those dropped
202
+ receipts. Known credentials from selected authentication files, forwarded
203
+ Claude authentication variables, and common credential patterns are redacted
204
+ from the diagnostic JSON. Sevro does not explicitly dump environment values,
205
+ full argv, or settings into diagnostics. Treat retained diagnostics as private evidence and keep
206
+ them out of Git; redaction is not authorization to publish subprocess output.
207
+
208
+ The engine supplies an optional `retainHostDiagnostics(bytes)` callback to
209
+ host adapters. Bundled opted-in hosts invoke it before removing native state.
210
+ The callback saves the artifact with private permissions and registers its
211
+ file URL and SHA-256 in trial evidence. Direct adapter calls without that
212
+ callback return diagnostic bytes in ordinary host artifacts.
213
+
214
+ Failure diagnostics name the retained file URL when it fits the CLI message
215
+ limit; `evidencePath` and trial `artifactPath` resolve artifact references
216
+ even when a message cannot contain the URL. Native failures retain the existing
217
+ execution, grading, task and exit semantics. Failed diagnostic persistence is
218
+ an internal runner error, not a successful assessment or an ordinary host
219
+ failure. Cleanup errors do not replace an earlier host or diagnostic-persistence
220
+ failure; cleanup warnings contain no raw error/output bodies.
221
+
222
+ ## Native transcript bundles
223
+
224
+ With [runtime transcript opt-in](runtime-v1.md#native-transcript-access), each
225
+ bundled host captures full native files before removing its private state.
226
+ Candidate artifact `sevro.native-transcripts.bundle` has format
227
+ `sevro.native-transcripts.v2`. It contains `host` (`codex` or `claude`), `role`,
228
+ native `rootSessionId` (or `null`), `completeness`, `issues`, and `files`.
229
+ Each file records its native relative `path`, SHA-256 `sha256` of the original
230
+ bytes, and `gzipBase64`: the exact file bytes compressed with gzip, then encoded
231
+ as base64. Decode base64, decompress gzip, and verify the original-byte hash
232
+ before using a file. Bound decompression to 5 MiB across all files in the bundle.
233
+ Decode bytes without rewriting native records. Native
234
+ session paths, root/child records and sidecar metadata preserve associations;
235
+ the bundle does not normalize model, effort, timing, token, or cost statistics.
236
+ Existing unknown metrics remain unknown.
237
+
238
+ Sevro reads both v2 bundles and existing `sevro.native-transcripts.v1` bundles.
239
+ V1 files use uncompressed `bytesBase64`; decode that field directly without
240
+ gzip decompression and verify the same original-byte hash. Readers must select
241
+ the payload field and decoding by `format` and reject unsupported formats,
242
+ corrupt compressed payloads, hash mismatches, or a decoded total above 5 MiB.
243
+ New captures emit v2; reading retained v1 evidence does not rewrite it.
244
+ The retained view exposes the same exact native files for either format, with
245
+ the original bundle in `index.json`.
246
+
247
+ `sevro.host.native-transcripts` records the same capture state and file hashes
248
+ without raw bytes. Semantic and advisory bundles retain their role in the
249
+ bundle and use the existing `sevro.semantic[.<source digest>].` and
250
+ `sevro.advisory.` artifact ID prefixes. Run/trial artifact references supply
251
+ stable private file URLs and whole-bundle hashes after native home cleanup.
252
+ Extensions receive these references through the existing `evaluate` protocol;
253
+ benchmarks can use the same references and decode the native files.
254
+
255
+ Capture includes native transcript-tree sidecars and refuses descendant links,
256
+ special files and escaping paths. It is bounded to 4,096 directory entries,
257
+ 5 MiB of native file bytes before compression and 7 MiB of encoded file
258
+ metadata/gzip content. The
259
+ bundle remains inside the existing 8 MiB item and 32 MiB host artifact budgets;
260
+ it groups sessions instead of spending an artifact per child. Limits produce
261
+ `byte_limit`, `entry_limit`, or `bundle_limit` issues. Unreadable, unsafe or
262
+ changing entries, malformed/empty native records, malformed JSON sidecars,
263
+ an unknown/missing original session, or incomplete host
264
+ execution produce explicit partial/unavailable capture. `complete` means the
265
+ identified root's tree was captured within those bounds after completed host
266
+ execution and generic syntax/basic record validation. JSONL must contain
267
+ nonempty JSON object records with a nonempty string `type`; JSON sidecars must
268
+ parse as JSON. UTF-8 decoding is strict. One trailing newline and CRLF are
269
+ accepted; blank interior records, invalid encoding and truncated JSON are
270
+ malformed. Unknown native fields and record types remain valid. Issues
271
+ `empty_transcript`, `malformed_transcript` and `malformed_sidecar` downgrade
272
+ capture without rewriting or discarding retained bytes. This validates basic
273
+ structure, not native semantic correctness.
274
+ An empty/missing native JSONL tree is `unavailable`. Failure, cancellation and
275
+ timeout retain available native bytes with incomplete capture state. Raw
276
+ bundles and views are private evidence and must stay out of Git.
277
+
278
+ The explicit [`sevro prune --native-transcripts` mode](reading-results.md#remove-native-transcript-bundles)
279
+ can remove these bundles without rewriting CLI results, run/trial evidence,
280
+ capture observations, native file hashes, or whole-bundle hashes. It retains
281
+ other artifacts and does not change evaluation identity or assessment states.
282
+ Reports validate present native bundles against their recorded SHA-256 and
283
+ require an exact pruning receipt for absent bundles.
284
+
285
+ Before deletion, Sevro atomically writes private
286
+ `native-transcripts-pruned.json` beside `run.json`, with format
287
+ `sevro.pruned-native-transcripts.v1`, the original `runId`, and `artifacts`.
288
+ Each entry contains the original artifact reference (`id`, `path`, `sha256`,
289
+ and any optional reference flags), plus its `caseId` and `trial`. Entries follow
290
+ run trial/reference order and cover every candidate, semantic (including
291
+ source-specific), and advisory native bundle in that run. A receipt must match
292
+ these original references exactly; malformed, inconsistent, or linked receipts
293
+ are errors. Bundle references must name regular files directly inside their
294
+ result directory. Missing bytes without a receipt, changed hashes, and escaping
295
+ references remain errors. An interrupted deletion may leave some marked bundles
296
+ present; reports count actual availability, and a repeated prune completes removal.
297
+ Transcript references that alias result/trial metadata, raw responses, or other
298
+ retained artifacts are refused before pruning.
@@ -0,0 +1,147 @@
1
+ # Saved run settings v1
2
+
3
+ Save recurring evaluation selections in a JSON run manifest, then use
4
+ `sevro run --run-manifest-file ./evaluation.json`. The examples use the
5
+ [installed command](installing.md#make-the-command-available).
6
+
7
+ ## Repeat an evaluation
8
+
9
+ Start with an existing [resolved case and adapter](getting-started.md), and save
10
+ this `evaluation.json` beside `case.json` and `host-adapter.ts`:
11
+
12
+ ```json
13
+ {
14
+ "format": "sevro.run.v1",
15
+ "settings": {
16
+ "case-file": "./case.json",
17
+ "adapter-module": "./host-adapter.ts",
18
+ "project-root": ".",
19
+ "condition": "passive",
20
+ "trials": 3,
21
+ "jobs": 1,
22
+ "threshold": 1
23
+ }
24
+ }
25
+ ```
26
+
27
+ Run it twice with the same saved selections, or explicitly override one setting:
28
+
29
+ ```sh
30
+ sevro run --run-manifest-file ./evaluation.json
31
+ sevro run --run-manifest-file ./evaluation.json
32
+ sevro run --run-manifest-file ./evaluation.json --trials 1 --json
33
+ ```
34
+
35
+ Every run prints effective settings on stderr before candidate execution, then
36
+ prints the result and evidence location. The example requires all assessed
37
+ trials to pass. A missing assessment remains `not_assessed`. Use `--dry` to
38
+ check preparation without calling the candidate or graders; dry preparation
39
+ does not prove native authentication or task success.
40
+
41
+ ## Select candidate and grading routes once
42
+
43
+ For native execution, replace the adapter selection with an explicit host,
44
+ model and effort. Each grading role has its own selection. For example, a case
45
+ with semantic checks can use this manifest:
46
+
47
+ ```json
48
+ {
49
+ "format": "sevro.run.v1",
50
+ "settings": {
51
+ "case-file": "./semantic-case.json",
52
+ "project-root": ".",
53
+ "host": "codex",
54
+ "model": "<candidate-model>",
55
+ "effort": "medium",
56
+ "codex-auth-file": "../private/auth.json",
57
+ "semantic-host": "codex",
58
+ "semantic-model": "<grading-model>",
59
+ "semantic-effort": "high",
60
+ "trials": 3,
61
+ "threshold": 1
62
+ }
63
+ }
64
+ ```
65
+
66
+ Replace model placeholders with installed-host-supported model names and supply
67
+ the [native prerequisites and authentication](native-hosts.md). Models and
68
+ efforts are never inferred or copied between roles. Candidate Claude uses
69
+ `host: "claude"` and its own explicit `model`/`effort`. An optional advisory
70
+ route uses `advisory-host`, `advisory-model` and `advisory-effort`; advisory
71
+ review requires a Git fixture and remains separate from the task verdict.
72
+ Injected adapters continue to declare their own model and effort.
73
+
74
+ ## Format, precedence and paths
75
+
76
+ The root has exactly `format: "sevro.run.v1"` and an object `settings`. Settings
77
+ use the [CLI option names](development-cli.md) without the leading `--`.
78
+ All run options can be saved except `json` and `run-manifest-file`. Keep output
79
+ presentation explicit on the command line, including `--json` when collecting
80
+ a versioned success or failure document. Manifests do not include other
81
+ manifests and are read only when explicitly selected; there is no discovery.
82
+
83
+ | Option kind | JSON value |
84
+ | --------------------------------------------------------------------------------------- | ----------------------------------------------------- |
85
+ | `trials`, `jobs`, `threshold`, `codex-timeout-ms` | Number, with the CLI's existing ranges |
86
+ | `dry`, `shell-isolation`, `retain-host-diagnostics`, `claude-project-settings` | Boolean |
87
+ | `extension-source-file`, `protected-root`, `replace-builtin-grader`, `advisory-exclude` | Array of nonempty strings; `[]` selects an empty list |
88
+ | Other run options | Nonempty string |
89
+
90
+ Precedence is **built-in defaults → saved settings → explicit CLI options**.
91
+ Omitted settings retain the [documented defaults](development-cli.md#run-defaults).
92
+ An explicit repeatable flag replaces its saved array in full; repeated CLI
93
+ occurrences build the replacement array. `--no-dry`, `--no-shell-isolation`,
94
+ `--no-retain-host-diagnostics` and `--no-claude-project-settings` override saved
95
+ `true` values with `false`.
96
+
97
+ Selecting an alternative route on the CLI removes its saved alternative and
98
+ route-only settings. For example, `--adapter-module ./host-adapter.ts` replaces
99
+ a saved native candidate and its model/effort. Selecting `--host claude` over
100
+ a saved Codex candidate requires fresh explicit `--model` and `--effort`;
101
+ grading roles keep their separate selections. Shared Codex settings remain
102
+ while any Codex route is selected. CLI `--case-file` replaces a saved extension
103
+ source and its extension-only options. CLI `--extension-command-file` replaces
104
+ a saved case file; supply the extension's required ID and source closure.
105
+ Supplying two exclusive alternatives explicitly remains an error.
106
+
107
+ Paths saved in a manifest resolve from the **canonical directory containing
108
+ that manifest**, including `project-root`, output roots, adapters, protected
109
+ roots and extension source files. CLI paths always resolve from the invoking
110
+ current directory. `advisory-exclude` contains fixture-relative names, not host
111
+ paths. Paths inside case files, extension command argv, source maps and runtime
112
+ files retain their existing contracts. A manifest must be a regular,
113
+ non-symlink JSON file of at most 64 KiB. Unsupported versions, unknown fields,
114
+ invalid types and unreadable files fail before execution with an actionable
115
+ file/field diagnostic and exit `64`.
116
+
117
+ ## Runtime, evidence and identity
118
+
119
+ The existing [`sevro.json` runtime contract](runtime-v1.md) is unchanged.
120
+ A run manifest selects recurring evaluation settings; `runtime-config-file`
121
+ can select a separate runtime file. Otherwise Sevro still discovers exactly
122
+ `<project-root>/sevro.json`. Runtime declarations do not become run options.
123
+
124
+ Current CLI runs retain the effective preview as optional
125
+ `configuration.resolved` in `sevro.run-evidence.v1`, with format
126
+ `sevro.resolved-run-settings.v1`. It records selected case and extension command
127
+ paths, source-closure count, mapping selection, adapters, routes, model/effort,
128
+ trial settings, runtime file selection and operational output locations. It
129
+ omits credentials and credential-option paths, private source-closure and mapping
130
+ paths, private extension configuration, runtime environment values and native
131
+ diagnostic contents. Explicit protected roots, paths and model labels are still operator metadata;
132
+ inspect retained evidence before sharing it. The runtime policy's existing
133
+ redacted evidence still retains explicitly declared non-secret environment
134
+ values. Older evidence without `configuration.resolved` remains valid and
135
+ does not acquire inferred settings.
136
+
137
+ Assessment settings enter the [evaluation identity](identity-v1.md) through
138
+ resolved cases, fixtures, checks, routes and `configuration.redacted`. The
139
+ additional `configuration.redacted.runSettings` binds shell isolation, explicit
140
+ protected roots, deprecated runtime selections, selected native timeouts and
141
+ Claude project-settings authority. Equivalent saved and
142
+ explicit selections have the same identity. Semantic changes such as model,
143
+ effort, trial count, job limit or threshold change identity. The manifest's
144
+ location, CLI output mode, and output/run-state paths are excluded from the
145
+ semantic configuration digest; `configuration.resolved` is an operational
146
+ snapshot outside that digest. Project content, including a tracked manifest,
147
+ still follows the existing project identity rules.
@@ -0,0 +1,31 @@
1
+ # Run an evaluation
2
+
3
+ Begin with the [deterministic example](getting-started.md). For your own case,
4
+ make [the installed command available](installing.md#make-the-command-available),
5
+ then select a trusted adapter and absolute paths:
6
+
7
+ ```sh
8
+ sevro run --json \
9
+ --case-file /absolute/path/case.json \
10
+ --adapter-module /absolute/path/host.ts \
11
+ --project-root /absolute/path/project \
12
+ --results-root /absolute/path/results \
13
+ --condition passive --trials 1 --threshold 1
14
+ ```
15
+
16
+ For a contributor checkout, use `bun src/cli.ts` in place of `sevro`.
17
+ An adapter is trusted executable code; injection does not automatically provide
18
+ native isolation. `--project-root` identifies the evaluated project, not
19
+ necessarily the runner checkout. `--results-root` receives evidence.
20
+ Trials control repetition, and the threshold controls the required pass rate.
21
+
22
+ A passive condition cannot request execution-changing instrumentation.
23
+ `--dry` prepares without execution/grading: successful preparation is still
24
+ `not_assessed`. For model routes follow [native hosts](native-hosts.md).
25
+ An [extension command](creating-cases.md) and a direct case file are exclusive.
26
+ Read [results](reading-results.md) to interpret failures and missing data.
27
+
28
+ The [detailed CLI reference](development-cli.md) owns configuration roots,
29
+ concurrency, cancellation, semantic/advisory routes, fixtures, and extra options.
30
+ Preserve its limitations when composing commands. Cancellation stops admission
31
+ and retains completed evidence before cleanup.