@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
@@ -1,20 +1,114 @@
1
1
  # Development CLI
2
2
 
3
- The local `sevro run` command connects a resolved JSON case or an explicit
4
- extension to a host route.
5
- It uses the engine's normal grading and evidence path. This remains a
6
- development entrypoint while the full extension lifecycle and production
7
- provenance collection are being built.
3
+ The `sevro run` command connects a resolved JSON case or an explicit extension
4
+ to a host route. The installed CLI and source entrypoint use the same engine
5
+ grading, evidence, and extension lifecycle.
8
6
 
9
7
  `sevro report` reads one or more retained JSON results through the
10
8
  [versioned report contract](report-v1.md). It emits Markdown by default or
11
9
  `sevro.report.v1` with `--json`.
12
10
 
11
+ `sevro prune` [removes older retained results](reading-results.md#prune-retained-results)
12
+ and maintains the latest report index. Bare pruning keeps the newest ten results;
13
+ `--keep`, `--older-than`, and `--latest` select explicit retention policies.
14
+
15
+ Examples assume [Sevro and Bun are on `PATH`](installing.md#make-the-command-available).
16
+ For a contributor checkout, use `bun src/cli.ts` in place of `sevro`.
17
+
18
+ Use `sevro --help`, `sevro run --help`, `sevro report --help`, or
19
+ `sevro prune --help` for examples,
20
+ required options, and defaults without preparing a run. `sevro --version` prints
21
+ the installed package version. Invocation and configuration diagnostics go to
22
+ stderr in both output modes; `--json` keeps one `sevro.cli-result.v1` document
23
+ on stdout. Invalid case diagnostics name the input file and offending field.
24
+
25
+ <a id="run-defaults-in-this-checkout"></a>
26
+
27
+ ## Run defaults
28
+
29
+ `sevro demo` owns a deterministic case, fixture and adapter. It needs no model
30
+ credentials and immediately prints an assessed verdict plus an evidence path in
31
+ `.sevro/results` beneath the invoking directory. Its temporary project and
32
+ configuration are independent of the caller's files and runtime policy.
33
+
34
+ An ordinary run needs a case source and candidate route. For example:
35
+
36
+ ```sh
37
+ sevro run --case-file ./case.json --adapter-module ./host-adapter.ts
38
+ ```
39
+
40
+ | Setting | Default |
41
+ | ----------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
42
+ | Condition | `passive` |
43
+ | Trial count | `1` |
44
+ | Pass threshold | `1`: all assessed trials must pass; any unassessed trial prevents a pass |
45
+ | Parallel trial limit (`--jobs`) | `3` |
46
+ | Project root | Invoking current directory |
47
+ | Results root | `<project-root>/.sevro/results` |
48
+ | Configuration root | Project root |
49
+ | Run-state root | Results root |
50
+ | Runtime policy | Discover `sevro.json` at project root; none when absent |
51
+ | Native binary | Resolve only the explicitly selected `codex` or `claude` from `PATH`; `--codex-bin` / `--claude-bin` override it |
52
+ | Native execution timeout | `600000` ms (10 minutes); Codex accepts `--codex-timeout-ms` |
53
+ | Codex entrypoint | `exec`; a native-goal runtime policy selects `app-server` |
54
+ | Codex agent concurrency | `agents.max_concurrent_threads_per_session` from `.codex/config.toml` at configuration root, otherwise the host default |
55
+ | Shell-check expected exit | `0` unless the check declares `expectedExitCode` |
56
+ | Shell-check timeout | `30000` ms unless the check declares `timeoutMs` (maximum `120000`) |
57
+ | Shell isolation, dry preparation, host diagnostic retention | Off |
58
+
59
+ Every run file/directory option accepts a relative path based on the invoking
60
+ current directory, including adapter modules, extension source files, native
61
+ binary overrides and protected roots. Sevro resolves them to canonical absolute
62
+ paths before constructing protection lists; missing output-directory suffixes
63
+ resolve through their nearest existing parent. A different `--project-root`
64
+ does not change that base. The default results directory is relative to the
65
+ selected project root. Paths inside runtime policy files retain their
66
+ [runtime-specific resolution rules](runtime-v1.md).
67
+ Extension command JSON still requires an absolute executable argv; arbitrary
68
+ argv entries are not treated as CLI path options.
69
+
70
+ Sevro prints a whitelist of effective run settings and routes on stderr before
71
+ candidate execution, including resolved storage paths, native executables,
72
+ timeouts and concurrency. JSON stdout remains one result document. The preview
73
+ does not print credential bytes, runtime environment values or native diagnostics.
74
+ The resolved executable is retained as `sevro.host.executable` in each used native
75
+ role's redacted host configuration; selecting a different path changes that
76
+ configuration's identity.
77
+
78
+ Use `sevro init` with `--template response`, `coding` or
79
+ `repository-skill` and `--directory <new-path>`. It refuses existing destinations
80
+ and writes runnable assertions, a manifest and template instructions. Follow the
81
+ [demo-to-iteration workflow](evaluation-workflow.md) for preparation, execution
82
+ and negative controls. Repository-skill requires explicit native model, effort
83
+ and authentication; dry preparation does not establish dispatch.
84
+
85
+ Actual preparation, candidate, grading and evidence-retention stage events use
86
+ stderr. Human completion includes each trial's separate states, failed-check
87
+ reasons, measured candidate time, known/unknown usage and retained paths. JSON
88
+ stdout remains one result. Each retained CLI run writes `result.json` beside run
89
+ evidence and `<results-root>/latest.json`. `sevro report --latest` reads the current
90
+ directory's default results root; add `--results-root <path>` for another root.
91
+ Dry and failed runs can be latest.
92
+
93
+ Project root identifies the evaluated project and extension discovery. It does
94
+ not populate the participant workspace: declare inline files, generated history
95
+ or a repository source in the case's fixture. See [case authoring](creating-cases.md).
96
+ Keep `.sevro/` out of Git. Results and run-state paths are excluded from project
97
+ snapshots and untracked Git identity; tracked source changes still count.
98
+
99
+ ## Explicit run settings
100
+
101
+ To repeat these selections, use the versioned [saved run settings](run-settings-v1.md)
102
+ with `--run-manifest-file ./evaluation.json`. Built-in defaults are replaced by
103
+ saved settings, then by explicit CLI options. `sevro.json` keeps its separate
104
+ runtime scope. Saved file paths use the manifest's directory; explicit CLI
105
+ paths use the invoking directory.
106
+
13
107
  An installed package records its name, version, and a digest of its packaged
14
108
  runtime and public contract files without reading runner Git metadata. The CLI
15
109
  derives the project digest from its revision and dirty patch, or from a bounded
16
110
  content snapshot when the project has no Git revision. Result and run-state
17
- directories are excluded from that snapshot. When running this source checkout
111
+ directories are excluded from that snapshot and untracked Git identity. When running this source checkout
18
112
  for coordinated development, pass `--runner-checkout-root` with the absolute
19
113
  path to this checkout. Sevro verifies that it is the code actually running and
20
114
  records its revision and dirty-patch digest instead of package provenance.
@@ -22,7 +116,7 @@ records its revision and dirty-patch digest instead of package provenance.
22
116
  temporary project without runner Git metadata.
23
117
 
24
118
  ```sh
25
- bun src/cli.ts run --json \
119
+ sevro run --json \
26
120
  --case-file /absolute/path/case.json \
27
121
  --adapter-module /absolute/path/host-adapter.ts \
28
122
  --project-root /absolute/path/project \
@@ -35,7 +129,7 @@ chosen by the operator. The runner does not load it from a case file or infer
35
129
  it from an installed extension. A bundled Codex route is also available:
36
130
 
37
131
  ```sh
38
- bun src/cli.ts run --json \
132
+ sevro run --json \
39
133
  --case-file /absolute/path/case.json \
40
134
  --host codex --codex-bin /absolute/path/codex \
41
135
  --codex-auth-file /absolute/path/auth.json \
@@ -52,6 +146,61 @@ only passive conditions. `--host` and `--adapter-module` are exclusive. Use
52
146
  `--protected-root` to add private roots for Codex, including when no shell
53
147
  checks are selected.
54
148
 
149
+ Use `--codex-timeout-ms <milliseconds>` to set the native Codex execution
150
+ timeout. It accepts an integer from `1` through `1800000` (30 minutes) and
151
+ defaults to `600000` (10 minutes) when omitted. It applies to every selected
152
+ Codex route, including semantic and advisory roles, and to both `exec` and
153
+ `app-server` entrypoints. For a 20-minute app-server evaluation, add
154
+ `--codex-entrypoint app-server --codex-timeout-ms 1200000` to the Codex command
155
+ above. The option requires a Codex host route; invalid values fail before a run.
156
+ For `app-server`, this is the only deadline for the whole session, including
157
+ startup requests such as `thread/start`. If it expires while a request is
158
+ unanswered, the failure names that request, for example
159
+ `App-server evaluation time bound reached awaiting thread/start`.
160
+
161
+ ### Retain native host diagnostics
162
+
163
+ Add `--retain-host-diagnostics` to a failing invocation to retain private
164
+ diagnostics from bundled Codex and Claude hosts. The switch defaults to off,
165
+ applies to every selected native role, and is independent of runtime
166
+ `nativeTranscripts`. It does not enable transcript access or change the
167
+ candidate's permissions.
168
+
169
+ For example, add the switch to the Codex command above:
170
+
171
+ ```sh
172
+ sevro run --json \
173
+ --case-file /absolute/path/case.json \
174
+ --host codex --codex-bin /absolute/path/codex \
175
+ --codex-auth-file /absolute/path/auth.json \
176
+ --model <model> --effort medium \
177
+ --project-root /absolute/path/project \
178
+ --results-root /absolute/path/results \
179
+ --condition passive --trials 1 --threshold 1 \
180
+ --retain-host-diagnostics
181
+ ```
182
+
183
+ Failed preparation or execution retains `sevro.host.diagnostics`, including
184
+ when no native session or final response exists. Its private JSON records the
185
+ failing stage, original error/cause chain, and recent subprocess receipts.
186
+ Receipts contain actual exit code or signal, monotonic duration, bounded
187
+ stdout/stderr prefixes, and truncation markers. App-server protocol failure is
188
+ separate from its process exit code.
189
+
190
+ The CLI's failure diagnostic names the artifact's file URL when it fits the
191
+ diagnostic length limit. The result's `evidencePath` and each trial's
192
+ `artifactPath` always lead to retained artifact references; semantic and
193
+ advisory artifacts carry their existing role prefixes. Files have private
194
+ permissions and are persisted before native state cleanup. The
195
+ [results contract](results-v1.md#native-host-diagnostics) defines the format,
196
+ bounds, redaction, and failure semantics.
197
+
198
+ Enabled native roles record `sevro.host.retain-diagnostics: true` in redacted
199
+ host configuration. This changes configuration identity, so a diagnostic rerun
200
+ is not an exact-repeat comparison with an invocation that omitted the switch.
201
+ Injected adapters own their diagnostic behavior; the CLI switch configures the
202
+ bundled native routes.
203
+
55
204
  ### Trial concurrency
56
205
 
57
206
  `--jobs <positive integer>` bounds simultaneous trials within one case and
@@ -106,10 +255,10 @@ The same worktree protection applies to other declared source and private roots;
106
255
  a package without Git metadata remains usable. Result and active-run storage
107
256
  stay independent through `--results-root` and `--run-state-root`.
108
257
 
109
- A bundled Claude Code candidate route is available on macOS:
258
+ A bundled Claude Code candidate route is available on macOS and Linux:
110
259
 
111
260
  ```sh
112
- bun src/cli.ts run --json \
261
+ sevro run --json \
113
262
  --case-file /absolute/path/case.json \
114
263
  --host claude --claude-bin /absolute/path/claude \
115
264
  --model sonnet --effort medium \
@@ -132,11 +281,16 @@ values are excluded from retained evidence and configuration digests. Pass
132
281
  `--claude-credential-file` with an absolute path to select a separate saved login.
133
282
  It accepts declared Claude
134
283
  plugin directories and explicit skill invocations from extension preparation.
135
- It runs candidate tools under Claude Code's native macOS sandbox with private,
136
- source, and result paths denied. The route disables hooks and does not expose
284
+ It runs candidate tools under Claude Code's native sandbox with private,
285
+ source, and result paths denied. The route disables hooks by default and does not expose
137
286
  the Write tool. It currently supports passive candidate turns only. Use
138
287
  `--protected-root` to exclude additional private paths from the candidate's
139
- filesystem access. For plugins that run locked UV backends, use
288
+ filesystem access. Configure shared host tools, private or reusable caches, goals, and selected
289
+ plugin hooks with [`sevro.json` or `--runtime-config-file`](runtime-v1.md).
290
+ The same policy reaches isolated checks and native grading hosts.
291
+
292
+ The deprecated options remain available when no runtime file is selected.
293
+ For plugins that run locked UV backends, use
140
294
  `--claude-uv-cache-dir /absolute/path/to/curated-cache` to copy a prepared UV
141
295
  cache into the trial's Git-private runtime directory before the turn. Use
142
296
  `--toolchain-bin-dir /absolute/path/to/bin` for a compatible Python and other
@@ -160,9 +314,10 @@ Without that option, the host does not advertise
160
314
  `sevro.claude.repository-invocation` and refuses explicit repository dispatch
161
315
  before launching Claude. This avoids recording an unknown command as a usable
162
316
  repository-skill route.
163
- The host reads only bounded Skill metadata from completed child Agent sessions
164
- in its temporary private configuration, then removes those session files. A
165
- missing or inconsistent graph leaves `sevro.claude.nested-skills` partial.
317
+ The host collects successful `Skill` calls through the existing structured
318
+ stream as [skill activation evidence](native-hosts.md#skill-activation-evidence).
319
+ It uses the same collector for parent and nested actors. Missing or unmatched
320
+ results remain partial; separate transcript-based skill detectors are retired.
166
321
 
167
322
  A case's `followUpPrompt` starts a UUID-bound session and resumes that same
168
323
  session after a complete successful initial result. Both results must name
@@ -181,7 +336,8 @@ For cases with `sevro.semantic` checks, also pass
181
336
  explicit second `HostAdapter` for grading. Alternatively, select the bundled
182
337
  Codex route with `--semantic-host codex --semantic-model <model>
183
338
  --semantic-effort <effort>`. That route also requires `--codex-bin` and
184
- `--codex-auth-file`, shared with a Codex candidate route when present. The two
339
+ `--codex-auth-file`, shared with a Codex candidate route when present. The binary
340
+ defaults to the explicitly selected `codex` on `PATH`. The two
185
341
  semantic route options are exclusive. The candidate and semantic routes are
186
342
  recorded separately in evidence and evaluation identity. The semantic adapter
187
343
  runs after a complete candidate response in its own empty workspace; missing
@@ -235,7 +391,7 @@ verdict and rejects unsolicited recommendations.
235
391
 
236
392
  If the extension needs configuration, supply both
237
393
  `--extension-configuration-file` and
238
- `--extension-redacted-configuration-file` as absolute paths to JSON objects.
394
+ `--extension-redacted-configuration-file` as paths to JSON objects.
239
395
  The latter replaces secret values for the retained configuration digest. Keep
240
396
  secrets out of the command argv and the redacted file.
241
397
 
@@ -265,7 +421,13 @@ isolated shell checks receive `.git/fixture-bin` on `PATH`. Host adapters
265
421
  receive `fixtureBinDir` and must add it to their native tool environment; the
266
422
  bundled Codex adapter also preserves it across login shells. A negotiated
267
423
  fixture setup command may then prepare the clone before the host runs.
268
- Repository submodules and preparation artifacts targeting `.git/` are refused.
424
+ Repository fixtures preserve committed `.gitmodules` files and submodule gitlink
425
+ revisions. Trial clones leave submodules uninitialized and do not fetch their
426
+ contents, even when the source has initialized submodules. A fixture that needs
427
+ those contents must initialize them during its negotiated setup. Modified or
428
+ untracked files and revision changes in initialized source submodules are
429
+ refused, including when Git's submodule ignore settings hide them. Preparation
430
+ artifacts targeting `.git/` are refused.
269
431
 
270
432
  A direct case or extension can declare a generated Git fixture:
271
433
 
@@ -289,9 +451,9 @@ fixture digest.
289
451
 
290
452
  The case file follows the `ResolvedCase`
291
453
  interface in `src/engine.ts`; this slice accepts inline files, generated Git
292
- history, or a declared repository, built-in output and semantic checks, and
293
- isolated shell checks. Add `{{sevro.workspace}}` to a case prompt when the host
294
- needs the trial's absolute fixture path. Sevro resolves it after fixture
454
+ history, or a declared repository, built-in output, semantic, and Git HEAD
455
+ checks, and isolated shell checks. Add `{{sevro.workspace}}` to a case prompt
456
+ when the host needs the trial's absolute fixture path. Sevro resolves it after fixture
295
457
  creation for each trial and retains the template in evaluation identity. For
296
458
  cases with two participant turns, set `followUpPrompt` to a nonempty second
297
459
  prompt. Sevro renders the workspace token in both prompts and requires a host
@@ -311,8 +473,8 @@ For shell checks, add
311
473
  `--shell-isolation` and repeat `--protected-root /absolute/path` for every
312
474
  additional source worktree or private root. The engine always protects the
313
475
  selected project, results, runner source, user home, configured host homes,
314
- and active peer fixtures. Shell checks require macOS `sandbox-exec` in this
315
- development slice.
476
+ and active peer fixtures. Shell checks require macOS `sandbox-exec` or Linux
477
+ `bubblewrap`.
316
478
  Injected host adapters may return namespaced observations and bounded evidence
317
479
  artifacts. A case can list their IDs in `requiredEvidence`; missing or partial
318
480
  host evidence produces unavailable grading rather than a passing task. The
@@ -325,9 +487,10 @@ Its retained trials record `not_run` / `not_requested` / `not_assessed` and exit
325
487
  successfully when preparation succeeds. Dry and executed runs have different
326
488
  evaluation identities.
327
489
  Run evidence and trial files live under `--results-root`. A packaged runner
328
- needs no Git checkout. This private development checkout records its Git
329
- revision and dirty content. `--runner-build-digest` and `--project-digest`
330
- remain optional explicit overrides for test fixtures and coordinated
490
+ needs no Git checkout. Source runs also use package provenance by default;
491
+ pass `--runner-checkout-root` with the absolute path to the running checkout
492
+ to record its Git revision and dirty content. `--runner-build-digest` and
493
+ `--project-digest` remain optional explicit overrides for test fixtures and coordinated
331
494
  development; normal CLI runs derive both values.
332
495
  Use `--run-state-root /absolute/path/state` to keep active records and trial
333
496
  checkpoints separate from results; it defaults to `--results-root`. Shell
@@ -356,6 +519,3 @@ Claude also advertises `sevro.host.native-goal`. Its observer binds one persiste
356
519
  transcript to the original successful native session and retains goal status
357
520
  and objective length. Missing, ambiguous, malformed or oversized evidence is
358
521
  unavailable; an unavailable observation cannot prove goal absence.
359
-
360
- These additions require the `0.1.0-rc.2` candidate. The published `rc.1` lacks
361
- the app-server selector and native goal observations.
@@ -0,0 +1,61 @@
1
+ # Documentation quality
2
+
3
+ Every page should answer one reader need: tutorial, how-to, reference, or
4
+ explanation. Landing pages can route to multiple modes. Lead with the outcome,
5
+ use plain language, and keep commands, prerequisites, limits, and recovery steps.
6
+
7
+ ## Local checks
8
+
9
+ Run `bun run check:docs`. The Markdown parser checks local targets/anchors,
10
+ image alternatives, asset references, fence languages, and exact guide mirrors.
11
+ It validates the guide inventory's source/static destinations and case coverage.
12
+ It ignores code contents as links and excludes inactive fixture snapshots.
13
+ Local checks need no network. Run `bun run test:docs-examples` for the exact
14
+ marked tutorial commands in fresh consumer/contributor directories, including
15
+ expected verdicts and saved evidence. Candidate and released-package runs are
16
+ reported separately. These commands create and clean temporary directories.
17
+ The [recipe verifier](../scripts/documentation-recipes.ts) runs the new packaged
18
+ projects separately from the current published version. It executes actual
19
+ isolated tool/check positive and negative controls and both native hosts' dry
20
+ preparation; authenticated model, plugin-hook and goal behavior remain
21
+ unexecuted by that check. Its [prerequisites](recipes.md#prepare-a-recipe-project)
22
+ are mandatory, including UV and mise's declared Node installation.
23
+
24
+ `package.json.version` is the authoritative current version. `bun run docs:sync`
25
+ updates only the marked [Current release](installing.md#current-release) section
26
+ with its exact installation command. Keep its markers and heading in place;
27
+ the command refuses missing, duplicate, or reversed markers and invalid versions.
28
+ The rest of the page stays ordinary Markdown. `check:docs` compares this section
29
+ without writing; release preparation and package-install validation also reject
30
+ stale output. Run synchronization after a version bump and include the resulting
31
+ documentation change. Link installation and update instructions to this section.
32
+ Keep historical versions, licensing transitions, and minimum supported versions
33
+ fixed and explain their purpose beside each reference.
34
+ Link to the current-release section instead of repeating the current Sevro
35
+ version elsewhere. Describe features for the latest version, using the installed
36
+ `sevro` command in user workflows. Keep source-checkout instructions in contributor
37
+ guidance and omit notes about feature unavailability in older releases.
38
+
39
+ ## External links
40
+
41
+ Run `bun run check:docs:external` separately. Transient failures are retried
42
+ twice. The report names the referring page and URL. Fix permanent missing
43
+ destinations; triage authentication walls, rate limits, timeouts, and bot blocks
44
+ as network limits and retry later. Do not change a valid destination just to
45
+ make a network job green. External success does not establish a claim's truth.
46
+
47
+ ## Human review
48
+
49
+ - Can a new user reach installation, first success, results, troubleshooting,
50
+ architecture, and contributing without the guide?
51
+ - Are supported environments, credentials, side effects, and prerequisites
52
+ explicit beside the relevant commands?
53
+ - Do descriptive links, meaningful headings, source order, readable tables,
54
+ image alternatives, and words rather than color support accessibility?
55
+ - Are current contracts, accepted choices, research, and past evidence distinct?
56
+ - Are unique knowledge and existing destinations preserved?
57
+ - Do source citations support material guide claims? Are unknowns/conflicts visible?
58
+
59
+ Guide changes need [native evals](guide-evaluation.md). A structural check is
60
+ not proof of selection or a substitute for human review. #1's
61
+ [TypeScript quality contract](https://github.com/BjRo/sevro/issues/1) owns code standards.
@@ -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](usability-study.md) records deferred human measurements.
109
+ [Runnable recipes](recipes.md) cover Claude, plugins/hooks, goals, semantic grading
110
+ and host tools.
@@ -0,0 +1,64 @@
1
+ # Code Mode control evidence for issue 71
2
+
3
+ On 2026-10-14, the implementation for [issue 71](https://github.com/BjRo/sevro/issues/71)
4
+ replayed the four retained complete Codex native transcript bundles named in
5
+ that ticket through the changed Sevro observers. This is artifact rechecking,
6
+ not a fresh authenticated model trial. The original task checks and activation
7
+ outcomes were preserved separately from the new control-absence assessment.
8
+ Private native bundles, commands and output remain outside Git.
9
+
10
+ | Case | Inspected exec submissions | Submitted tool calls | Rechecked control absence | Original task checks | Original activation |
11
+ | -------------------------------------- | -------------------------- | -------------------- | ------------------------- | ----------------------- | ------------------- |
12
+ | guide-mutation | 2 | 4 | passed | 7 passed, 1 unavailable | passed |
13
+ | guide-orchestration | 3 | 6 | passed | 8 passed, 1 unavailable | passed |
14
+ | code-review-empty-diff | 6 | 8 | passed | 6 passed, 1 unavailable | passed |
15
+ | code-review-reviewer-route-unavailable | 11 | 12 | passed | 6 passed, 1 unavailable | unavailable |
16
+
17
+ The recheck found no submitted agent launch or prohibited goal mutation in any
18
+ case. All submission receipts had complete inspection and matching native
19
+ ordinals. No accepted-agent count was substituted for invocation evidence.
20
+ The older Darrow consumer still requires zero submitted exec calls; it needs
21
+ to adopt the [receipt validation contract](../native-controls.md) to grade
22
+ these new observations. Its original unavailable outcomes were not rewritten.
23
+
24
+ The reviewer-route case's first read used a literal Git environment reset and
25
+ repository-root query before its final mounted skill read. Its retained output
26
+ ended with the exact 20,627-character skill body still present in the Darrow
27
+ validation checkout. Rehydrating that independently matching mount and rebasing
28
+ its expired private path let the changed skill-read observer establish a
29
+ complete `code-review` receipt. This rechecked skill-file receipt is separate
30
+ from the original unavailable activation outcome; no historical trial was
31
+ changed to passed.
32
+
33
+ Durable Bun regressions exercise the host's public observations for completed
34
+ and rejected submissions, opaque code, and the repository-prefixed skill read.
35
+ Additional real session/file regressions cover malformed/truncated completion,
36
+ missing and duplicate receipts, forged textual labels, ambiguous code, namespace
37
+ and size limits, and contradictory receipt counts/ordinals. Existing integration
38
+ tests remain in place.
39
+
40
+ ## Observed test-first slices
41
+
42
+ Each command below was run with its new regression present and its corresponding
43
+ product behavior unchanged, then rerun after the product fix. Commands invoke
44
+ the existing Bun harness; the shell routed their output through lean-ctx.
45
+
46
+ 1. Red — `bun test tests/codex-native-calls.test.ts -t "Code Mode exposes completed literal"`: missing submitted-call inventory.
47
+ Green — `bun test tests/codex-native-calls.test.ts -t "Code Mode exposes completed literal"`: 1 passed.
48
+ 2. Red — `bun test tests/codex-native-calls.test.ts -t "Code Mode portable"`: rejected request receipt missing and opaque submission reported complete.
49
+ Green — `bun test tests/codex-native-calls.test.ts -t "Code Mode portable"`: 2 passed.
50
+ 3. Red — `bun test tests/codex-native-calls.test.ts -t "Code Mode inspects the retained"`: both retained parallel-read shapes reported partial.
51
+ Green — `bun test tests/codex-native-calls.test.ts -t "Code Mode inspects the retained"`: 2 passed.
52
+ 4. Red — `bun test tests/codex-native-calls.test.ts -t "Code Mode refuses malformed"`: malformed and truncated completion envelopes reported complete.
53
+ Green — `bun test tests/codex-native-calls.test.ts -t "Code Mode refuses malformed"`: 2 passed.
54
+ 5. Red — `bun test tests/codex-native-calls.test.ts -t "Code Mode accepts native array"`: the native array envelope reported partial.
55
+ Green — `bun test tests/codex-native-calls.test.ts -t "Code Mode accepts native array"`: 1 passed.
56
+ 6. Red — `bun test tests/codex-host.test.ts -t "reviewer-route repository-prefixed"`: complete mounted body did not establish a skill read.
57
+ Green — `bun test tests/codex-host.test.ts -t "reviewer-route repository-prefixed"`: 1 passed.
58
+ 7. Red — `bun test tests/native-controls.test.ts -t "contradictory Code Mode"`: mismatched submission ordinal reported complete.
59
+ Green — `bun test tests/native-controls.test.ts -t "contradictory Code Mode"`: 1 passed.
60
+ 8. Red — `bun test tests/codex-native-calls.test.ts -t "attributable control evidence"`: foreign namespace and oversized tool labels reported complete.
61
+ Green — `bun test tests/codex-native-calls.test.ts -t "attributable control evidence"`: 2 passed.
62
+
63
+ These focused slices do not substitute for the full GitHub CI acceptance gate
64
+ on the PR's exact published commit.
@@ -0,0 +1,64 @@
1
+ # Template and batch inspection for issue 85
2
+
3
+ On 2026-10-15, the implementation for [issue #85](https://github.com/BjRo/sevro/issues/85)
4
+ replayed the two original Codex native transcript bundles through the changed
5
+ Sevro observers and Darrow's checkpoint `67f4fcdb` extension. Bundle and decoded
6
+ source SHA-256 values matched the issue before replay. Raw bundles and output
7
+ remain private and outside Git.
8
+
9
+ | Original case | Exec submissions | Complete receipts after replay | Regraded no-agent assertion |
10
+ | --------------------------------- | ---------------- | ------------------------------ | --------------------------- |
11
+ | goal-placement-direct-same-route | 11 | 11 | passed |
12
+ | goal-placement-coupled-sequential | 10 | 10 | passed |
13
+
14
+ The five exact [retained program fixtures](../../tests/fixtures/code-mode-85/README.md)
15
+ now preserve these native ordinals and ordered submission-local labels:
16
+
17
+ - Direct 45: three `exec_command` calls.
18
+ - Direct 69 and 77: `apply_patch`, then `exec_command`.
19
+ - Coupled 30: three `exec_command` calls.
20
+ - Coupled 68: two `exec_command` calls.
21
+
22
+ Regrading replaced only the native-call and portable native-control observations
23
+ with newly inspected observations and invoked the original case's extension
24
+ checks. Both `darrow.evals.transcript.1` results changed from unavailable to
25
+ passed. These are artifact rechecks, not new candidate runs or rewritten
26
+ historical task verdicts. Deterministic consumer coverage separately confirms
27
+ that a submitted `spawn_agent` fails the no-agent assertion even when the
28
+ accepted-agent count is zero, and partial receipts remain unavailable.
29
+
30
+ ## Observed test-first slices
31
+
32
+ 1. Red — `bun test tests/codex-native-calls.test.ts -t 'retained direct ordinal 45'`: the template-command receipt was partial.
33
+ Green — `bun test tests/codex-native-calls.test.ts -t 'retained direct ordinal 45'`: 1 passed, with three bound call labels.
34
+ 2. Red — `bun test tests/codex-native-calls.test.ts -t 'retained coupled ordinal'`: both destructured batch receipts were partial.
35
+ Green — `bun test tests/codex-native-calls.test.ts -t 'retained coupled ordinal'`: 2 passed, with three and two bound call labels respectively.
36
+
37
+ Additional regressions preserve submitted spawns inside interpolated and
38
+ concatenated output, reject ambiguous bindings and composition, and keep
39
+ private source bytes out of observations. The focused native-call/control
40
+ suite passed 94 tests. These checks do not replace the full GitHub CI gate
41
+ on the PR's exact published commit.
42
+
43
+ ## Fresh native trials
44
+
45
+ Fresh trials use Darrow checkpoint `67f4fcdb`, native Codex 0.162.1 app-server,
46
+ candidate and semantic grader `gpt-6-luna/medium`, passive ownership, N=1,
47
+ jobs=1, threshold=1, and a 1,200,000 ms timeout with retained diagnostics.
48
+ They explicitly select the changed Sevro source worktree through
49
+ `SEVRO_CHECKOUT`; they are development evidence, not published-package trials.
50
+
51
+ The direct trial, run `510f99df-882f-48fe-b893-d4b6fba8864d`, completed with
52
+ 9/10 checks passing and the no-agent assertion unavailable. Its new submission
53
+ 29 maps a callback that invokes tools over a command array; submission 74 uses
54
+ an output callback with a conditional expression. Both forms remain outside
55
+ the [bounded inspection contract](../native-controls.md) and correctly retain
56
+ partial receipts. The five original programs no longer cause that limitation.
57
+
58
+ The coupled trial, run `7f9f5d8a-641e-4744-a986-05298100541c`, completed with
59
+ 10/11 checks passing and the no-agent assertion unavailable. Submissions 29,
60
+ 45, and 68 each use a `for ... of` output loop with a conditional expression
61
+ and `String(...)` conversion. That output body is also outside the bounded
62
+ subset and remains partial. Neither fresh run is a passing placement trial;
63
+ their unavailable verdicts are preserved rather than treating zero accepted
64
+ agents as proof of absence.