@bjoernrochel/sevro 0.1.0-rc.8 → 1.0.0

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 (228) hide show
  1. package/CONTRIBUTING.md +22 -6
  2. package/README.md +5 -1
  3. package/docs/README.md +19 -15
  4. package/docs/architecture.md +138 -17
  5. package/docs/assets/README.md +5 -4
  6. package/docs/builtin-graders-v1.md +9 -2
  7. package/docs/codex-host.md +155 -57
  8. package/docs/contracts.md +2 -1
  9. package/docs/creating-cases.md +9 -2
  10. package/docs/development-cli.md +187 -19
  11. package/docs/documentation-quality.md +12 -2
  12. package/docs/evaluation-workflow.md +110 -0
  13. package/docs/extension-protocol-v1.md +26 -3
  14. package/docs/getting-started.md +23 -2
  15. package/docs/guide-evaluation.md +33 -1
  16. package/docs/identity-v1.md +25 -2
  17. package/docs/installing.md +11 -11
  18. package/docs/native-controls.md +76 -5
  19. package/docs/native-hosts.md +196 -7
  20. package/docs/reading-results.md +102 -0
  21. package/docs/recipes.md +489 -0
  22. package/docs/releases.md +31 -12
  23. package/docs/report-v1.md +29 -1
  24. package/docs/results-v1.md +122 -4
  25. package/docs/run-settings-v1.md +147 -0
  26. package/docs/runtime-v1.md +255 -22
  27. package/docs/troubleshooting.md +12 -12
  28. package/docs/typescript-quality.md +89 -26
  29. package/examples/recipes/candidate.ts +26 -0
  30. package/examples/recipes/cases/coding-change.json +21 -0
  31. package/examples/recipes/cases/host-tools.json +21 -0
  32. package/examples/recipes/cases/mise.json +21 -0
  33. package/examples/recipes/cases/node.json +21 -0
  34. package/examples/recipes/cases/python-uv.json +21 -0
  35. package/examples/recipes/cases/semantic.json +17 -0
  36. package/examples/recipes/coding-change/check.ts +23 -0
  37. package/examples/recipes/extension-artifacts.ts +65 -0
  38. package/examples/recipes/extension-methods.ts +174 -0
  39. package/examples/recipes/extension.ts +37 -0
  40. package/examples/recipes/repository-skill/.agents/skills/startup-guide/SKILL.md +7 -0
  41. package/examples/recipes/repository-skill/.claude/skills/startup-guide/SKILL.md +7 -0
  42. package/examples/recipes/repository-skill/README.md +3 -0
  43. package/examples/recipes/run-inputs.ts +188 -0
  44. package/examples/recipes/run-options.ts +131 -0
  45. package/examples/recipes/run.ts +63 -0
  46. package/examples/recipes/runtime/empty.json +1 -0
  47. package/examples/recipes/runtime/goals.json +1 -0
  48. package/examples/recipes/runtime/mise.json +6 -0
  49. package/examples/recipes/runtime/path.json +1 -0
  50. package/examples/recipes/runtime/plugins.json +4 -0
  51. package/examples/recipes/runtime/python-uv.json +10 -0
  52. package/examples/recipes/semantic-judge.ts +29 -0
  53. package/examples/templates/coding/adapter.ts +17 -0
  54. package/examples/templates/coding/case.json +15 -0
  55. package/examples/templates/repository-skill/.agents/skills/startup-guide/SKILL.md +6 -0
  56. package/examples/templates/repository-skill/extension-data.ts +64 -0
  57. package/examples/templates/repository-skill/extension.ts +31 -0
  58. package/examples/templates/response/adapter.ts +12 -0
  59. package/examples/templates/response/case.json +13 -0
  60. package/package.json +11 -5
  61. package/schemas/report-v1.schema.json +9 -0
  62. package/schemas/run-evidence-v1.schema.json +2 -1
  63. package/schemas/runtime-v1.schema.json +43 -7
  64. package/src/advisory.ts +2 -2
  65. package/src/candidate-artifacts.ts +42 -11
  66. package/src/candidate-codex-state.ts +185 -0
  67. package/src/case-validation.ts +73 -50
  68. package/src/cli/cancellation.ts +20 -0
  69. package/src/cli/command.ts +87 -0
  70. package/src/cli/completion.ts +15 -0
  71. package/src/cli/demo.ts +60 -0
  72. package/src/cli/evaluation.ts +55 -0
  73. package/src/cli/extension.ts +79 -0
  74. package/src/cli/help.ts +198 -0
  75. package/src/cli/hosts.ts +55 -0
  76. package/src/cli/init-settings.ts +30 -0
  77. package/src/cli/init.ts +111 -0
  78. package/src/{cli-invocation.ts → cli/invocation.ts} +214 -218
  79. package/src/cli/loading.ts +151 -0
  80. package/src/cli/preparation.ts +154 -0
  81. package/src/cli/presentation.ts +93 -0
  82. package/src/cli/progress.ts +6 -0
  83. package/src/cli/run-manifest.ts +128 -0
  84. package/src/cli/run-options.ts +403 -0
  85. package/src/cli/run-overrides.ts +69 -0
  86. package/src/cli/settings.ts +154 -0
  87. package/src/cli/summary.ts +43 -0
  88. package/src/cli.ts +13 -591
  89. package/src/contract-types.ts +94 -0
  90. package/src/engine.ts +9 -5
  91. package/src/evaluation/advisory.ts +150 -0
  92. package/src/{evaluation-check-plan.ts → evaluation/check-plan.ts} +103 -67
  93. package/src/evaluation/collection.ts +88 -0
  94. package/src/evaluation/context.ts +10 -0
  95. package/src/{evaluation-grading-host.ts → evaluation/grading-host.ts} +5 -5
  96. package/src/evaluation/grading.ts +235 -0
  97. package/src/{evaluation-invocation-plan.ts → evaluation/invocation-plan.ts} +147 -58
  98. package/src/{evaluation-plan.ts → evaluation/plan.ts} +208 -141
  99. package/src/evaluation/progress.ts +19 -0
  100. package/src/evaluation/resources.ts +241 -0
  101. package/src/evaluation/run.ts +206 -0
  102. package/src/{evaluation-semantic.ts → evaluation/semantic.ts} +77 -87
  103. package/src/evaluation/trial.ts +800 -0
  104. package/src/{evaluation-types.ts → evaluation/types.ts} +79 -29
  105. package/src/evidence/host-results.ts +85 -0
  106. package/src/evidence/retained-artifacts.ts +18 -0
  107. package/src/evidence/trial-writer.ts +203 -0
  108. package/src/evidence/usage.ts +17 -0
  109. package/src/extension-client.ts +34 -96
  110. package/src/extension-session.ts +24 -48
  111. package/src/{advisory-fixture.ts → fixtures/advisory.ts} +12 -72
  112. package/src/{fixture-bin.ts → fixtures/bin.ts} +1 -1
  113. package/src/{fixture-cleanup.ts → fixtures/cleanup.ts} +13 -7
  114. package/src/fixtures/create.ts +183 -0
  115. package/src/{generated-fixture.ts → fixtures/generated.ts} +10 -53
  116. package/src/{git-hooks.ts → fixtures/git-hooks.ts} +1 -1
  117. package/src/{preparation.ts → fixtures/preparation.ts} +6 -16
  118. package/src/{repository-fixture.ts → fixtures/repository.ts} +30 -64
  119. package/src/{fixture-setup.ts → fixtures/setup.ts} +33 -51
  120. package/src/{fixture-tools.ts → fixtures/tools.ts} +1 -1
  121. package/src/{workspace-state.ts → fixtures/workspace-state.ts} +5 -5
  122. package/src/generated/cli-result.d.cts +2 -1
  123. package/src/generated/extension.d.cts +2 -1
  124. package/src/generated/report.cjs +1 -1
  125. package/src/generated/report.d.cts +2 -1
  126. package/src/generated/run-evidence.cjs +1 -1
  127. package/src/generated/run-evidence.d.cts +2 -1
  128. package/src/generated/runtime.cjs +1 -1
  129. package/src/generated/runtime.d.cts +2 -1
  130. package/src/git.ts +93 -0
  131. package/src/graders/git-head.ts +29 -84
  132. package/src/graders/shell.ts +50 -68
  133. package/src/host-diagnostic-redaction.ts +52 -0
  134. package/src/host-diagnostics.ts +331 -0
  135. package/src/hosts/claude-continuation.ts +57 -40
  136. package/src/hosts/claude-credential.ts +160 -63
  137. package/src/hosts/claude-events.ts +34 -18
  138. package/src/hosts/claude-keychain.ts +78 -21
  139. package/src/hosts/claude-login-recovery.ts +85 -0
  140. package/src/hosts/claude-login-refresh.ts +178 -0
  141. package/src/hosts/claude-login-store.ts +162 -0
  142. package/src/hosts/claude-login.ts +107 -0
  143. package/src/hosts/claude-native-goal.ts +15 -12
  144. package/src/hosts/claude-process.ts +10 -50
  145. package/src/hosts/claude-refresh-lock.ts +81 -0
  146. package/src/hosts/claude-repository-invocation.ts +9 -34
  147. package/src/hosts/claude-settings.ts +46 -9
  148. package/src/hosts/claude-skill-activations.ts +169 -0
  149. package/src/hosts/claude-state.ts +28 -15
  150. package/src/hosts/claude-tool-calls.ts +13 -10
  151. package/src/hosts/claude.ts +121 -81
  152. package/src/hosts/codex-app-server.ts +78 -52
  153. package/src/hosts/codex-configuration.ts +5 -10
  154. package/src/hosts/codex-exec-controls.ts +516 -0
  155. package/src/hosts/codex-marketplace.ts +12 -10
  156. package/src/hosts/codex-native-calls.ts +15 -122
  157. package/src/hosts/codex-process.ts +10 -183
  158. package/src/hosts/codex-profile.ts +36 -21
  159. package/src/hosts/codex-session-files.ts +1 -9
  160. package/src/hosts/codex-state.ts +134 -18
  161. package/src/hosts/codex.ts +210 -183
  162. package/src/hosts/isolation-common.ts +8 -11
  163. package/src/hosts/isolation-roots.ts +2 -2
  164. package/src/hosts/linux-sandbox.ts +15 -2
  165. package/src/hosts/mac-sandbox.ts +87 -18
  166. package/src/hosts/native-controls.ts +72 -22
  167. package/src/hosts/native-request.ts +55 -0
  168. package/src/hosts/process-lifecycle.ts +216 -48
  169. package/src/hosts/protected-worktrees.ts +1 -1
  170. package/src/hosts/skill-hook-catalog.ts +131 -0
  171. package/src/hosts/skill-hook-handler.ts +374 -0
  172. package/src/hosts/skill-hooks.ts +577 -0
  173. package/src/instrumentation.ts +7 -8
  174. package/src/native-transcript-state.ts +22 -3
  175. package/src/native-transcript-view.ts +52 -13
  176. package/src/native-transcripts.ts +26 -11
  177. package/src/paths.ts +22 -0
  178. package/src/process-lifecycle.ts +150 -0
  179. package/src/provenance.ts +27 -7
  180. package/src/prune.ts +300 -0
  181. package/src/report.ts +63 -36
  182. package/src/resolved-case.ts +1 -1
  183. package/src/results-lock.ts +42 -0
  184. package/src/results.ts +14 -18
  185. package/src/{runtime-config.ts → runtime/config.ts} +160 -46
  186. package/src/{runtime-discovery-apple.ts → runtime/discovery-apple.ts} +3 -3
  187. package/src/{runtime-discovery-providers.ts → runtime/discovery-providers.ts} +3 -9
  188. package/src/{runtime-discovery.ts → runtime/discovery.ts} +4 -4
  189. package/src/{runtime-hook-processes.ts → runtime/hook-processes.ts} +1 -1
  190. package/src/{runtime-hooks.ts → runtime/hooks.ts} +32 -22
  191. package/src/{runtime-paths.ts → runtime/paths.ts} +5 -19
  192. package/src/{runtime-query.ts → runtime/query.ts} +5 -5
  193. package/src/{runtime-seeds.ts → runtime/seeds.ts} +3 -3
  194. package/src/runtime/shared-cache.ts +130 -0
  195. package/src/{runtime-state.ts → runtime/state.ts} +28 -11
  196. package/src/schema-types.ts +73 -161
  197. package/src/shell.ts +4 -0
  198. package/src/transcript-retention.ts +146 -0
  199. package/src/value-guards.ts +22 -0
  200. package/docs/assets/sevro-logo.png +0 -0
  201. package/docs/assets/sevro-symbol.svg +0 -1
  202. package/docs/assets/sevro-wordmark.svg +0 -1
  203. package/docs/cache-ownership-validation.md +0 -49
  204. package/docs/claude-continuation-validation.md +0 -47
  205. package/docs/concurrency-validation.md +0 -86
  206. package/docs/configuration-root-validation.md +0 -70
  207. package/docs/engine-slice.md +0 -114
  208. package/docs/evidence/runtime-startup-30/README.md +0 -185
  209. package/docs/evidence/runtime-startup-30/after.json +0 -319
  210. package/docs/evidence/runtime-startup-30/baseline-timeout.jsonl +0 -2
  211. package/docs/evidence/runtime-startup-30/before.json +0 -403
  212. package/docs/evidence/runtime-startup-30/consumer-smoke.json +0 -63
  213. package/docs/evidence/runtime-startup-30/full-policy-diagnostic.jsonl +0 -3
  214. package/docs/evidence/runtime-startup-30/minimal-policy-diagnostic.jsonl +0 -3
  215. package/docs/evidence/runtime-startup-30/plugin-template-assessment.json +0 -20
  216. package/docs/evidence/runtime-startup-30/seedless-timeout.jsonl +0 -2
  217. package/docs/evidence.md +0 -17
  218. package/docs/fixture-cleanup-validation.md +0 -73
  219. package/docs/guide-verification.json +0 -239
  220. package/src/evaluation-context.ts +0 -259
  221. package/src/evaluation-fixture.ts +0 -302
  222. package/src/evaluation-run.ts +0 -200
  223. package/src/evaluation-trial.ts +0 -1016
  224. package/src/hosts/claude-nested-skills.ts +0 -272
  225. package/src/hosts/codex-command-output.ts +0 -510
  226. package/src/hosts/codex-executor-command.ts +0 -291
  227. package/src/hosts/codex-skill-reads.ts +0 -783
  228. /package/src/{trial-scheduler.ts → evaluation/scheduler.ts} +0 -0
@@ -0,0 +1,110 @@
1
+ # From a demo to your next evaluation
2
+
3
+ Create an evaluation, prepare it, run its assertions, and inspect the latest
4
+ result with the installed `sevro` command.
5
+
6
+ ## Try the demo and create a project
7
+
8
+ You need Bun 1.3.13. [Install Sevro](installing.md) and
9
+ [make its command available on `PATH`](installing.md#make-the-command-available),
10
+ then run:
11
+
12
+ ```sh
13
+ sevro demo
14
+ sevro init --template response --directory ./response-evaluation
15
+ cd response-evaluation
16
+ ```
17
+
18
+ The demo returns an assessed `passed` task and evidence under `.sevro/results`,
19
+ using its own temporary project without credentials. The initializer refuses
20
+ existing destinations, including directories and symbolic links. It writes
21
+ real assertions, a deterministic adapter, `run.json` and template instructions.
22
+ [Saved settings](run-settings-v1.md) use their manifest's directory for paths;
23
+ `sevro.json` retains its separate runtime scope. Keep private `.sevro/` out of Git.
24
+
25
+ ## Prepare before execution
26
+
27
+ ```sh
28
+ sevro run --run-manifest-file run.json --dry
29
+ ```
30
+
31
+ Stderr shows the whitelisted resolved settings before candidate execution:
32
+ case/source selection, routes/model/effort, trials, threshold, concurrency,
33
+ runtime selection and canonical storage paths. Invalid input names its option,
34
+ file or field; missing executables name installation or explicit override paths.
35
+ Correct the named prerequisite and repeat preparation.
36
+
37
+ Dry preparation follows normal fixture, extension and check preparation without
38
+ calling the candidate or graders. Expect
39
+ `execution=not_run grading=not_requested task=not_assessed`. It does not establish
40
+ authentication, provider model availability, native skill dispatch or model success.
41
+ See [native prerequisites](native-hosts.md) and [troubleshooting](troubleshooting.md).
42
+
43
+ ## Run, read and change one thing
44
+
45
+ ```sh
46
+ sevro run --run-manifest-file run.json
47
+ sevro report --latest
48
+ SEVRO_TEMPLATE_FAIL=1 sevro run --run-manifest-file run.json
49
+ sevro report --latest
50
+ ```
51
+
52
+ The first run's adapter returns exactly `ready`; its regex assertion must pass.
53
+ The negative control returns `wrong`: expect exit `1`, completed execution and
54
+ grading, task `failed`, and the named `ready` check's reason. Then edit `case.json`
55
+ and `adapter.ts`, prepare again and rerun. Explicit flags override saved settings;
56
+ `--trials 3` repeats the task without rewriting `run.json`.
57
+
58
+ Progress uses stderr at actual preparation, candidate, grading and evidence
59
+ retention boundaries. Trial numbers distinguish concurrent work, which may
60
+ interleave. Stage `completed` means the attempt finished; the result states whether
61
+ execution/grading succeeded. Dry runs explicitly skip candidate and grading;
62
+ failed candidates skip grading. Failed preparation never prints candidate start.
63
+ Evidence completion follows persistence. Optional synchronous engine observers
64
+ cannot change the result through a thrown exception.
65
+
66
+ Human completion shows per-trial states, failed/unavailable check reasons,
67
+ measured candidate time, known/unknown usage/cost and `result=`/`evidence=` paths.
68
+ Candidate time measures the host call, not total setup time. Absent metrics remain
69
+ `unknown`; dry duration is unknown. Prompt-only completion stays `not_assessed`.
70
+ Add `--json` to emit one `sevro.cli-result.v1` stdout document; progress remains on
71
+ stderr. See [reading results](reading-results.md).
72
+
73
+ Each retained CLI evaluation saves `result.json` beside its run evidence and
74
+ atomically publishes `<results-root>/latest.json`. Latest is the last retained CLI
75
+ result, including dry runs and failed assessments. Pre-run failures do not replace
76
+ it. Concurrent runs publish in completion order. Output files stay under excluded
77
+ results storage, preserving project identity. A latest-write failure cannot turn
78
+ an earlier failed assessment into success.
79
+
80
+ `report --latest` reads `<cwd>/.sevro/results/latest.json`. Use
81
+ `report --latest --results-root ./other-results` for another output root or working
82
+ directory. `--result-file ./path/to/result.json` selects older runs and accepts
83
+ relative paths. Reports validate referenced evidence; missing/moved evidence
84
+ produces a diagnostic. To reclaim native bundle space while keeping reportable
85
+ results and hashes, use [`sevro prune --native-transcripts`](reading-results.md#remove-native-transcript-bundles).
86
+ Reports label bundles intentionally removed by that command as pruned.
87
+ [Report v1](report-v1.md) defines fields and limits.
88
+
89
+ ## Choose another starter
90
+
91
+ | Template | Real assertions | Prerequisites and interpretation |
92
+ | ------------------ | ------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------- |
93
+ | `response` | Exact `ready` response; negative control returns `wrong` | Bun; no model credentials |
94
+ | `coding` | Edit `add.sh`; isolated checks test positive, negative and zero addition | Bun plus `sandbox-exec` on macOS or `bubblewrap`/`socat` on Linux; negative control leaves subtraction bug |
95
+ | `repository-skill` | Actual `.agents/skills/startup-guide/SKILL.md` mount; explicit invocation evidence; correct start command and port | Bun, Git, Codex, native isolation, explicit model/effort and readable auth file; dry is unassessed |
96
+
97
+ From a new parent directory, use `sevro init --template coding --directory ./coding-eval`
98
+ or `sevro init --template repository-skill --directory ./skill-eval`. Read its generated
99
+ README for controls and dry/live commands. Repository-skill `command.json` records
100
+ absolute Bun/extension argv; regenerate it after moving the project.
101
+
102
+ For model evaluations, replace a saved adapter route with explicit `--host`,
103
+ `--model`, `--effort` and host authentication options. Candidate, semantic and
104
+ advisory model choices remain independent. Deterministic adapters measure wiring;
105
+ they do not measure model ability. Native runs may incur provider charges.
106
+ Automated package checks run response/coding pass/fail and native skill preparation;
107
+ authenticated native behavior and human usability remain unmeasured. The
108
+ [study protocol](https://github.com/BjRo/sevro/blob/main/docs/usability-study.md) records deferred human measurements.
109
+ [Runnable recipes](recipes.md) cover Claude, plugins/hooks, goals, semantic grading
110
+ and host tools.
@@ -106,8 +106,16 @@ trial in the Git fixture after source history and working-tree files are built,
106
106
  before extension artifacts are mounted or the host starts. The command is never
107
107
  interpreted through a shell by Sevro; an extension may explicitly select a
108
108
  shell executable. `{{sevro.project}}` and `{{sevro.workspace}}` in environment
109
- values resolve to the declared roots at execution time. The symbolic values and
110
- command enter fixture and comparison identity, while retained configuration
109
+ values resolve to the declared roots at execution time. Setup's `HOME` is the
110
+ candidate commands' private trial home, outside the Git fixture. Ordinary
111
+ `$HOME` paths can initialize directories and seed prior state before the candidate
112
+ starts, including without a runtime configuration file. This home is separate
113
+ from host authentication and native configuration, other trials, and grader homes.
114
+ Setup's `TMPDIR` remains disposable and is removed when setup finishes; the shared
115
+ home survives through candidate execution and grading, then is removed even on
116
+ setup failure, cancellation, or dry runs. Trusted injected hosts must use the
117
+ supplied `candidateRuntimeRoot` and runtime policy to preserve this boundary.
118
+ The symbolic values and command enter fixture and comparison identity, while retained configuration
111
119
  records only their digest. Setup has a two-minute limit, inherits no credential
112
120
  environment variables, and its output is discarded. Failure or interruption
113
121
  stops the run before host execution; it cannot become a passing assessment.
@@ -171,7 +179,7 @@ other invocation declarations and enters retained configuration and identity.
171
179
  The host validates the bounded mount without following symbolic links. Its
172
180
  `sevro.claude.repository-invocation` observation binds one native command, exact
173
181
  arguments, and the complete mounted body before the first assistant entry in
174
- the completed session. It retains only acceptance and ordered skill metadata.
182
+ the completed session. It retains only acceptance and the dispatched skill name.
175
183
  Missing or ambiguous session evidence yields a partial observation; later Skill
176
184
  calls cannot repair an unverified explicit repository dispatch.
177
185
 
@@ -224,6 +232,21 @@ grader error, or unavailable required evidence.
224
232
  Host adapters can supply additional namespaced observations. The engine bounds
225
233
  and retains those records, then passes them to `evaluate`. Required observation
226
234
  IDs must be present with `complete` evidence before a task can pass.
235
+ The bundled adapters expose [skill activation evidence](native-hosts.md#skill-activation-evidence)
236
+ as `sevro.host.skill-activations`, with separate methods for Codex tool-result
237
+ body exposure and successful Claude `Skill` calls.
238
+ This replaces the retired Codex skill-read and Claude nested-skill observations.
239
+ Explicit invocation receipts remain dispatch evidence and do not contribute to
240
+ `observedSkills`; extensions must migrate activation checks to the common ID.
241
+ Codex additionally supplies per-skill `skillExposures` and independent
242
+ `collectionStatus` in that observation. Its optional
243
+ `sevro.host.skill-exposure-claims` capability provides complete evidence only
244
+ for listed positive full or partial body exposures, even when collection is
245
+ partial. Extensions must check the requested skill and acceptable exposure
246
+ status explicitly; this evidence cannot establish absence or primary selection.
247
+ See the [exposure contract](native-hosts.md#skill-activation-evidence) for scope,
248
+ unknown states and host limitations. Required aggregate activation evidence
249
+ still needs a `complete` observation as before.
227
250
  Host adapters can also supply bounded evidence artifacts. The engine persists
228
251
  their bytes outside the candidate workspace before `evaluate`, then passes
229
252
  file URLs and digests through the existing artifact references. A required host
@@ -5,6 +5,27 @@ Darrow checkout, Codex/Claude login, or model credentials are required. The
5
5
  adapter returns `ready`; Sevro grades that response against `^ready$`.
6
6
  This teaches the runner lifecycle, not the quality of an actual model.
7
7
 
8
+ <a id="built-in-demo-in-this-checkout"></a>
9
+
10
+ ## Built-in demo
11
+
12
+ With [Sevro installed and on `PATH`](installing.md#make-the-command-available), run:
13
+
14
+ ```sh
15
+ sevro demo
16
+ ```
17
+
18
+ It prints `execution=completed grading=completed task=passed` and an absolute
19
+ `evidence=` path under `.sevro/results` in your current directory. The demo owns
20
+ its packaged case and adapter, uses a separate temporary project, and ignores
21
+ your project's `sevro.json` and native configuration. No credentials are needed.
22
+ Effective run settings appear on stderr before evaluation. Add `--json` for one
23
+ versioned result on stdout.
24
+
25
+ Continue with [the initialized evaluation workflow](evaluation-workflow.md) to
26
+ create response, coding or repository-skill assertions, prepare them, inspect
27
+ progress and access the latest result without copying an evidence path.
28
+
8
29
  ## From an installed package
9
30
 
10
31
  Prepare a new directory:
@@ -16,8 +37,8 @@ bun init -y
16
37
  ```
17
38
 
18
39
  Install the [current release](installing.md#current-release) there, then return
19
- here to run the example. Read [version differences](installing.md#published-package-and-checkout)
20
- for the current docs, source-available license, and earlier BSL releases.
40
+ here to run the example. See [licensing](licensing.md) for the current terms and
41
+ the licenses retained by historical releases.
21
42
 
22
43
  Make the local installation available on `PATH` for this shell, then call
23
44
  `sevro` directly. Bun must also be on `PATH`.
@@ -54,6 +54,34 @@ documentation and both skill mounts; the eval cases and grader code are withheld
54
54
  The case matrix covers orientation, explicit invocation, unrelated requests,
55
55
  missing/conflicting/stale evidence, follow-ups, pressure for effects,
56
56
  extension boundaries, contributions, and licensing.
57
+
58
+ The deterministic CLI integration suite runs all eleven positive cases on each
59
+ host. Eight negative cases also run on both hosts: attempted effects, missing
60
+ events, incomplete native turns, missing/wrong invocation receipts, stale/missing
61
+ follow-up reads, and missing continuation evidence. These exercise distinct host
62
+ event formats or receipt identifiers. Ten host-independent negatives run on
63
+ Codex once: changed files or skill mounts, extra directories, host failure,
64
+ missing/partial common selection observations, and four answer contradictions.
65
+ This keeps every failure scenario while reducing the matrix from 58 to 48 CLI
66
+ runs. Two additional Codex positive controls remain, for 50 guide integration
67
+ tests in total. The docs phase still dry-prepares all eleven cases.
68
+
69
+ On 2026-10-24, an instrumented local comparison on macOS arm64 with Bun 1.3.13
70
+ measured the negative cases at 262.55 seconds for 36 passing tests on `adf04a1`,
71
+ then 181.50 seconds for 26 passing tests with #145: 81.05 seconds less (30.9%).
72
+ These are sums of individual case durations in `tests.log`, not a CI speedup
73
+ forecast. Claude's negative cases alone changed from 130.23 to 57.50 seconds;
74
+ that ratio rescales their shard weight. Reproduce the targeted measurement with:
75
+
76
+ ```sh
77
+ bun run check:typescript --coverage ./tests/guide/codex-negative.test.ts \
78
+ ./tests/guide/claude-negative.test.ts
79
+ ```
80
+
81
+ These sparse timing runs passed their tests and report validation, but failed
82
+ the unchanged 95% full-inventory coverage thresholds as expected. Full acceptance
83
+ still requires every CI phase and the combined coverage gate on the candidate.
84
+
57
85
  Missing event artifacts, incomplete turns, missing dispatch receipts, or absent
58
86
  fresh follow-up reads cannot pass. Built-in `sevro.regex` checks assess answer
59
87
  assertions and contradictions. The `sevro.shell` check verifies Git status,
@@ -73,9 +101,13 @@ Automatic checks remain signals, not a complete truth judgment. Acceptance
73
101
  requires inspecting material claims against the sources actually read.
74
102
  File listings do not count as source inspection; follow-ups require fresh
75
103
  content. Explicit invocation requires Sevro's complete host dispatch receipt.
104
+ Automatic selection requires the complete `sevro.host.skill-activations`
105
+ observation on both hosts. Codex uses passive tool-result hooks; Claude uses
106
+ successful native `Skill` calls. The evaluator does not fall back to command
107
+ patterns, direct Claude file reads, or retired skill-read observations.
76
108
  See the [guide contract](specs/repository-guide.md).
77
109
 
78
- The [earlier verification record](guide-verification.json) describes historical
110
+ The [earlier verification record](https://github.com/BjRo/sevro/blob/main/docs/guide-verification.json) describes historical
79
111
  trials of the previous harness. Its outputs and recheck observations are preserved
80
112
  as history; they do not validate this conversion. The old `--recheck` command
81
113
  and custom evidence format have been removed. Rerun changed cases through Sevro
@@ -32,7 +32,10 @@ The CLI derives `runnerBuildDigest` from sorted packaged file paths and their
32
32
  SHA-256 bytes under `src/`, `schemas/`, `docs/`, and `examples/`, plus `README.md` and
33
33
  `package.json`. For a Git project, `projectDigest` binds the revision and dirty
34
34
  patch digest without the checkout path. Without a revision it hashes a bounded
35
- file snapshot, excluding `.git`, results, and run-state storage. A caller may
35
+ file snapshot, excluding `.git`, results, and run-state storage. Results and
36
+ run-state storage are also excluded from untracked Git identity, so repeated
37
+ project-local output does not change the project digest. Tracked source changes
38
+ remain included, even under a selected storage directory. A caller may
36
39
  provide explicit 64-character digests for controlled development runs.
37
40
 
38
41
  The prefix separates this digest from component digests and future identity
@@ -48,6 +51,17 @@ The effective positive trial job limit is retained as `configuration.redacted.jo
48
51
  and enters `configurationDigest`. Changing parallelism changes evaluation identity,
49
52
  even when the condition, host route, trial count, and assessment threshold match.
50
53
 
54
+ CLI [saved run settings](run-settings-v1.md) resolve before evaluation. Equivalent
55
+ manifest and explicit selections produce the same semantic inputs. CLI evidence
56
+ also retains `configuration.redacted.runSettings` for shell isolation, explicit
57
+ protected roots, deprecated runtime selections, selected native timeouts and
58
+ Claude project-settings authority. These values enter the
59
+ configuration digest. Optional `configuration.resolved` stores the whitelisted
60
+ operator preview outside that digest, including operational paths and the
61
+ selected manifest location. Relocating output storage alone does not alter
62
+ identity. A tracked manifest remains project content under the normal project
63
+ identity rules.
64
+
51
65
  Extension runs retain the operator-supplied redacted extension configuration
52
66
  under `configuration.redacted.extensionConfiguration`, alongside
53
67
  `extensionConfigurationDigest`. The retained copy is the same snapshot used
@@ -64,10 +78,19 @@ for the host default. Configuration paths and unrelated TOML bytes are not
64
78
  imported settings; a relocated configuration with the same effective values
65
79
  keeps this component unchanged.
66
80
 
81
+ Opted-in bundled native roles also record `sevro.host.retain-diagnostics: true`.
82
+ The [diagnostic retention switch](development-cli.md#retain-native-host-diagnostics)
83
+ therefore changes `configurationDigest`. Omission leaves that host setting
84
+ absent and preserves the previous configuration shape. Retained diagnostic
85
+ contents and temporary native state paths do not enter identity.
86
+
67
87
  Selected [runtime configuration](runtime-v1.md) is retained under
68
88
  `configuration.redacted.runtimePolicy` and enters `configurationDigest`.
69
89
  It includes declared non-secret environment values, canonical read roots,
70
- private seed digests and optional role selections, and hook authority. Per-role output paths are resolved
90
+ private seed digests and optional role selections, shared-cache sources/slots/roles,
91
+ and hook authority. Mutable shared-cache contents are excluded; equal identities
92
+ do not establish equal cache contents or trial independence in shared mode.
93
+ Per-role output paths are resolved
71
94
  only during execution; runtime placeholders remain symbolic in identity.
72
95
  Runtime roots also retain lexical aliases, metadata discovery sources,
73
96
  and skipped optional directories. Moving or
@@ -1,8 +1,9 @@
1
1
  # Install, update, or remove Sevro
2
2
 
3
3
  Use Bun 1.3.13 for this TypeScript/Bun CLI. Installation does not make it a
4
- Node-only executable. Full validation and native isolation target macOS;
5
- Linux and Windows are unverified.
4
+ Node-only executable. Full validation and native isolation target macOS and
5
+ Ubuntu 24.04 x64. See the [bounded platform evidence](native-hosts.md#validated-platform-scope);
6
+ Windows remains unverified.
6
7
 
7
8
  ## Install locally
8
9
 
@@ -22,10 +23,10 @@ Local installation records the selected version in the project lockfile.
22
23
 
23
24
  ## Current release
24
25
 
25
- The current release is `0.1.0-rc.8`. Install this exact version:
26
+ The current release is `1.0.0`. Install this exact version:
26
27
 
27
28
  ```sh
28
- bun add --exact @bjoernrochel/sevro@0.1.0-rc.8
29
+ bun add --exact @bjoernrochel/sevro@1.0.0
29
30
  ```
30
31
 
31
32
  <!-- sevro-current-release:end -->
@@ -46,17 +47,16 @@ no adjustment is needed. Bun must also be on `PATH`: the executable uses
46
47
 
47
48
  ## Published package and checkout
48
49
 
49
- The [current release](#current-release) includes runtime
50
- configuration, native goals, selected plugin hooks, current onboarding, and
51
- [source-available licensing terms](licensing.md). Earlier `rc.1` and `rc.2`
52
- packages retain BUSL-1.1. The license transition began with `0.1.0-rc.3`.
53
- Source checkouts can include changes beyond their
54
- package version; compare the exact release tag when establishing provenance.
50
+ See [licensing](licensing.md) for Sevro's source-available terms and historical
51
+ licensing transitions.
55
52
 
56
- The candidate npm package contains sources, schemas, examples, documentation,
53
+ The npm package contains sources, schemas, examples, documentation,
57
54
  LICENSE, and contribution guidance. It excludes tests, developer scripts, Git
58
55
  metadata, and repository guide mounts. Use a source checkout for the guide.
59
56
 
57
+ Source checkouts can include changes beyond their package version; compare the
58
+ exact release tag when establishing provenance.
59
+
60
60
  ## Work from source
61
61
 
62
62
  ```sh
@@ -5,7 +5,8 @@ retain an observation with that ID. It exposes host facts for extension policy:
5
5
 
6
6
  - `method: native_control_calls`;
7
7
  - ordered `calls` containing only `ordinal`, `namespace`, and `name`;
8
- - `acceptedAgentCount`, a verified Codex acceptance count or `null` on Claude;
8
+ - `acceptedAgentCount`, a verified direct native Codex acceptance count when
9
+ overall coverage is complete, otherwise `null` (also `null` on Claude);
9
10
  - `submittedExecCalls`, the Codex submitted-code count or `null` on Claude; and
10
11
  - `truncated`, which is `false` for a complete record and may be unknown (`null`)
11
12
  for an incomplete Codex record.
@@ -15,9 +16,71 @@ tool arguments, task messages, command bodies, or results. Call labels prove an
15
16
  invocation attempt, not success. Extensions decide which calls are prohibited.
16
17
  An unknown acceptance count cannot establish agent acceptance.
17
18
 
18
- Codex projects labels and counts from its bound native-session observation and
19
- preserves its completeness. Incomplete counts remain `null`. Submitted code remains explicit: extensions cannot
20
- infer absence of controls inside code that this observer did not inspect.
19
+ Codex projects labels and counts from its bound native-session observation.
20
+ It additionally retains `directAcceptedAgentCount`, the number of positively
21
+ correlated direct native spawn acceptances in that source, independently of exec
22
+ inspection. This is an observed count, not a total across unknown launch paths.
23
+ `coverage.nativeCalls` records native-session completeness;
24
+ `coverage.execInspection` records whether all submitted exec sources were
25
+ understood and matched to the direct submission inventory;
26
+ `coverage.acceptedAgents: direct_native_calls` names the scope of both acceptance
27
+ counts. Accepted launches through exec are not included in these direct counts.
28
+ When native capture is incomplete, even a zero observed count cannot establish
29
+ absence. Native labels remain usable as positive attempt evidence regardless
30
+ of an unrelated exec inspection gap. A rejected attempt is never an acceptance.
31
+
32
+ When submitted code is present, both observations also retain `execCalls`:
33
+ one receipt per native `exec` submission, with its native `ordinal`, inspection
34
+ `completeness`, and ordered `calls` containing `index`, `namespace`, and `name`.
35
+ The index is local to that submission; native ordinals are not synthesized.
36
+ The original direct-call list and total `submittedExecCalls` stay unchanged.
37
+
38
+ Sevro statically inspects bounded straight-line Code Mode
39
+ programs without executing them. It accepts literal tool calls, constant result
40
+ bindings, template interpolation and `+` composition of inspected expressions,
41
+ direct `text`/`store` output, and literal `Promise.all`/`allSettled` batches.
42
+ Batch results may use flat constant array bindings or result-only
43
+ `forEach(text)` or `for ... of` output, including blocks and conditional
44
+ result-field selection. `JSON.stringify`, `String`, object spread/shorthand,
45
+ and nested result fields are supported. Numeric output loops must use the
46
+ bounded shape `for (let i = 0; i < results.length; i++)`, indexing the known
47
+ batch with that loop variable. Output loops and conditional expressions cannot
48
+ invoke tools. Destructuring defaults, rest elements,
49
+ holes, nested bindings, duplicate names, and shadowed globals remain unsupported.
50
+ Tool argument strings, comments and printed tool-looking text
51
+ do not become call labels. A rejected tool request returned by a completed
52
+ script still appears in its submitted-call inventory. This inventory proves
53
+ submission of those requests, not successful effects or acceptance; the existing
54
+ acceptance count describes independently correlated direct native spawns.
55
+
56
+ Dynamic lookup, aliases, shadowed globals, callbacks that invoke tools,
57
+ conditional tool execution, and nested executors keep source inspection partial.
58
+ Each receipt's `inspectionReason` is `null` on success, or `unsupported_source`,
59
+ `malformed_source`, `source_limit`, or `foreign_namespace`. Unsupported syntax
60
+ and expression/call-budget exhaustion use `unsupported_source`.
61
+ Source is bounded at
62
+ 64 KiB, traversed expressions at 2,048, and calls at 128 per submission; tool
63
+ labels are bounded at 64 characters. Private source and output bytes are discarded.
64
+ The portable observation becomes partial if any submission is uninspected or
65
+ receipt counts/ordinals disagree with the native list. `acceptedAgentCount`
66
+ remains `null` in that case, while native coverage, direct acceptance facts and
67
+ the native `submittedExecCalls` count remain independently available.
68
+ `submittedExecCalls` and `truncated` depend on native capture, not exec output.
69
+
70
+ Receipt `completeness` describes source inspection, independently of execution
71
+ or displayed output. `execution` is `completed`, `failed`, or `incomplete`;
72
+ `output` is `complete`, `truncated`, or `unavailable`. Output evidence requires
73
+ a unique later output bound to the same native call ID, with recognized text
74
+ blocks. `complete` describes the displayed receipt, not the whole program's
75
+ execution. Execution status additionally requires a successful or failed script
76
+ header. Missing, ambiguous or
77
+ malformed output yields `incomplete`/`unavailable`; a yielded or unrecognized
78
+ header stays `incomplete`. Displayed truncation does not change source coverage.
79
+ A fully inspected source with no launch call proves that absence even if its
80
+ shell output was truncated or the exec cell failed. Source inspection cannot
81
+ prove execution or success. Missing fields in historical receipts are unknown;
82
+ historical artifacts retain their original results and meanings.
83
+
21
84
  Claude records every tool-use label from the bounded stream, with namespace
22
85
  `claude`, without filtering to Skill or Agent. It requires a completed successful
23
86
  turn, valid unique tool-use IDs and names, and a non-truncated list of at most
@@ -26,4 +89,12 @@ Tool-looking text in arguments or output does not become a native call.
26
89
 
27
90
  Consumers must verify the source, completeness, shape, ordering, and counts
28
91
  before using an empty call list to establish absence. Missing or partial
29
- evidence cannot establish a negative assertion.
92
+ source coverage cannot establish a negative assertion. For Codex, consumers must
93
+ inspect every `execCalls` receipt in addition to the direct `calls` list,
94
+ validate receipt ordinals against the direct `exec` submissions, and require
95
+ all receipts to be complete with counts matching `submittedExecCalls`.
96
+ They can use positively observed native attempt labels before requiring complete
97
+ coverage for an absence pass. They must examine submitted labels for prohibited controls even when
98
+ `acceptedAgentCount` is zero. Older consumers that require
99
+ `submittedExecCalls === 0` remain conservative but cannot use this new evidence
100
+ until they adopt receipt validation.