@bjoernrochel/sevro 0.1.0-rc.7 → 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 (230) 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 +17 -3
  7. package/docs/codex-host.md +155 -49
  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 +141 -4
  25. package/docs/run-settings-v1.md +147 -0
  26. package/docs/runtime-v1.md +307 -18
  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 +63 -7
  64. package/src/advisory.ts +2 -2
  65. package/src/candidate-artifacts.ts +206 -0
  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 +13 -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} +133 -115
  103. package/src/evaluation/trial.ts +800 -0
  104. package/src/evaluation/types.ts +207 -0
  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} +15 -76
  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/fixtures/workspace-state.ts +212 -0
  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 +57 -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 +91 -14
  148. package/src/hosts/claude-skill-activations.ts +169 -0
  149. package/src/hosts/claude-state.ts +46 -16
  150. package/src/hosts/claude-tool-calls.ts +13 -10
  151. package/src/hosts/claude.ts +122 -73
  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 -54
  158. package/src/hosts/codex-profile.ts +50 -21
  159. package/src/hosts/codex-session-files.ts +1 -9
  160. package/src/hosts/codex-state.ts +141 -19
  161. package/src/hosts/codex.ts +221 -179
  162. package/src/hosts/isolation-common.ts +15 -11
  163. package/src/hosts/isolation-roots.ts +13 -20
  164. package/src/hosts/linux-sandbox.ts +27 -3
  165. package/src/hosts/mac-sandbox.ts +111 -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 +221 -45
  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 +34 -15
  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/run-owner.ts +4 -4
  186. package/src/{runtime-config.ts → runtime/config.ts} +182 -44
  187. package/src/{runtime-discovery-apple.ts → runtime/discovery-apple.ts} +3 -3
  188. package/src/{runtime-discovery-providers.ts → runtime/discovery-providers.ts} +3 -9
  189. package/src/{runtime-discovery.ts → runtime/discovery.ts} +4 -4
  190. package/src/{runtime-hook-processes.ts → runtime/hook-processes.ts} +1 -1
  191. package/src/{runtime-hooks.ts → runtime/hooks.ts} +33 -22
  192. package/src/{runtime-paths.ts → runtime/paths.ts} +6 -18
  193. package/src/{runtime-query.ts → runtime/query.ts} +5 -5
  194. package/src/{runtime-seeds.ts → runtime/seeds.ts} +3 -3
  195. package/src/runtime/shared-cache.ts +130 -0
  196. package/src/{runtime-state.ts → runtime/state.ts} +28 -11
  197. package/src/schema-types.ts +73 -161
  198. package/src/shell.ts +4 -0
  199. package/src/transcript-retention.ts +146 -0
  200. package/src/value-guards.ts +22 -0
  201. package/docs/assets/sevro-logo.png +0 -0
  202. package/docs/assets/sevro-symbol.svg +0 -1
  203. package/docs/assets/sevro-wordmark.svg +0 -1
  204. package/docs/cache-ownership-validation.md +0 -49
  205. package/docs/claude-continuation-validation.md +0 -47
  206. package/docs/concurrency-validation.md +0 -86
  207. package/docs/configuration-root-validation.md +0 -70
  208. package/docs/engine-slice.md +0 -114
  209. package/docs/evidence/runtime-startup-30/README.md +0 -185
  210. package/docs/evidence/runtime-startup-30/after.json +0 -319
  211. package/docs/evidence/runtime-startup-30/baseline-timeout.jsonl +0 -2
  212. package/docs/evidence/runtime-startup-30/before.json +0 -403
  213. package/docs/evidence/runtime-startup-30/consumer-smoke.json +0 -63
  214. package/docs/evidence/runtime-startup-30/full-policy-diagnostic.jsonl +0 -3
  215. package/docs/evidence/runtime-startup-30/minimal-policy-diagnostic.jsonl +0 -3
  216. package/docs/evidence/runtime-startup-30/plugin-template-assessment.json +0 -20
  217. package/docs/evidence/runtime-startup-30/seedless-timeout.jsonl +0 -2
  218. package/docs/evidence.md +0 -17
  219. package/docs/fixture-cleanup-validation.md +0 -70
  220. package/docs/guide-verification.json +0 -239
  221. package/src/evaluation-context.ts +0 -257
  222. package/src/evaluation-fixture.ts +0 -313
  223. package/src/evaluation-run.ts +0 -198
  224. package/src/evaluation-trial.ts +0 -946
  225. package/src/evaluation-types.ts +0 -149
  226. package/src/hosts/claude-nested-skills.ts +0 -272
  227. package/src/hosts/codex-command-output.ts +0 -510
  228. package/src/hosts/codex-executor-command.ts +0 -291
  229. package/src/hosts/codex-skill-reads.ts +0 -609
  230. /package/src/{trial-scheduler.ts → evaluation/scheduler.ts} +0 -0
@@ -20,21 +20,13 @@ The bounded JSONL stream is retained per trial as the private
20
20
  `sevro.codex.events` host artifact. Its file URL and digest appear in trial
21
21
  evidence and are available to extension grading; the stream bytes stay out of
22
22
  the run JSON.
23
- The host also retains a bounded `sevro.codex.skill-reads` observation. It
24
- records the first verified mounted skill and ordered skill names, without
25
- commands or skill bodies. A completed direct `cat` of one mounted `SKILL.md`,
26
- alone or alongside literal documentation paths, counts only when the command
27
- output contains that file's exact body. Batched reads naming multiple
28
- `SKILL.md` files or more than 64 paths remain partial. Direct
29
- `sed -n` pages count after their verified line ranges cover the whole body. An
30
- exact `cat` wrapped by `lean-ctx -c` is accepted only when its reported output
31
- still contains the full body; a compressed summary cannot prove the read. An
32
- attempted indirect, malformed, or incomplete read makes the observation
33
- partial. This is a host observation; an extension decides what selection means
34
- for its case.
35
- The same check accepts skill files below the exact installed plugin roots from
36
- Codex's installation receipts. It does not infer activation from arbitrary
37
- files in the private plugin cache.
23
+ Skill activation uses the common `sevro.host.skill-activations` observation
24
+ from passive hooks in the request's private Codex home. The collector matches
25
+ prepared skill bodies in returned tool content without interpreting shell
26
+ syntax or recovering command output from native sessions. See
27
+ [skill activation evidence](native-hosts.md#skill-activation-evidence) for the
28
+ scope, limits, privacy boundaries, and incomplete collection states.
29
+
38
30
  The `sevro.codex.native-calls` capability retains allowlisted direct goal and
39
31
  agent control calls from the native session bound to the completed thread. Its
40
32
  observation contains only call names, namespaces, and source ordinals, plus the
@@ -59,33 +51,10 @@ only when plaintext is readable. It retains neither message nor prompt bytes.
59
51
  For a second prompt, `sevro.codex.continuation` retains the last validated
60
52
  native-session ordinal before resume. Extensions can compare later call
61
53
  ordinals with that boundary without reading private arguments.
62
- The host also retains separate `sevro.codex.initial-skill-reads` and
63
- `sevro.codex.follow-up-skill-reads` observations. Each applies the same exact
64
- mounted-skill read check to one completed turn, so an extension can grade read
65
- order or a missing repeat read without inferring it from the combined list.
66
-
67
- It also checks native parent command records for exact mounted skill bodies,
68
- including sessions with no spawn request. The bounded diagnostic distinguishes
69
- no read from an incomplete read without claiming skill activation.
70
- It retains the skill name and native ordinal when verified reads complete a
71
- whole body. Repeated complete reads produce separate receipts; paged reads
72
- produce one receipt when their ranges first cover the body. An incomplete
73
- later reread makes the diagnostic partial. Extensions can compare these
74
- ordinals with an accepted owner boundary without retaining commands or output.
75
- Earlier yielded output can complete a read only when its process and unique
76
- call identity bind it to that actor's native command completion. Completed
77
- literal command calls use a bounded TypeScript parser; conditional or ambiguous
78
- code cannot establish that binding. Recovery verifies the exact mounted bytes
79
- and recomputes completeness for the matching CLI command. Private commands,
80
- submitted code and recovered skill bodies stay out of public observations.
81
- For accepted spawns, it also checks up to eight child thread rollouts and
54
+ For accepted spawns, the host checks up to eight child thread rollouts and
82
55
  reports whether each is available, unavailable, ambiguous, or partial, with an
83
- explicit truncation flag. An available rollout includes bounded diagnostics for
84
- native child commands: the number of commands and skill read attempts, whether
85
- the exact mounted `SKILL.md` body was read, and whether the check was complete
86
- or truncated. A rollout with no read differs from a missing or malformed
87
- rollout. These diagnostics do not establish skill activation or task completion
88
- by themselves and retain no child prompt, command, or output.
56
+ explicit truncation flag. Child rollout metadata describes delegation and
57
+ completion; skill activation remains in the common hook observation.
89
58
  An available child rollout also reports whether one nonempty final assistant
90
59
  message matches a later native completion event for the same turn. This proves
91
60
  a returned turn, not the accuracy of the child's work, and retains no message
@@ -101,12 +70,18 @@ discarded. Extensions interpret task names and decide whether a nested reader
101
70
  satisfies their policy.
102
71
  The record proves an invocation attempt, not its success. A missing, ambiguous,
103
72
  unreadable, oversized, or malformed session is unavailable or partial, so its
104
- absence cannot prove that a control was unused. Calls made through submitted
105
- code are not classified by this first observation.
73
+ absence cannot prove that a control was unused. Code Mode submissions now have
74
+ separate bounded `execCalls` inspection receipts, described in the
75
+ [native control contract](native-controls.md). Direct native call ordinals and
76
+ acceptance receipts keep their original meaning; submitted requests do not
77
+ acquire direct native acceptance receipts.
106
78
  For an explicitly declared `$plugin:skill`, the host verifies that the installed
107
79
  skill exists and that the exact token occurs once in the delivered prompt. A
108
- completed turn yields `sevro.codex.explicit-invocation` with the owner first and
109
- verified supporting reads after it. Incomplete reads make that receipt partial.
80
+ completed turn yields a complete `sevro.codex.explicit-invocation` naming the
81
+ dispatched skill. This receipt proves verified dispatch and contains no
82
+ `observedSkills` list. Activation checks require the common hook observation;
83
+ missing hook evidence cannot be repaired by a dispatch receipt or native
84
+ transcript. Failed execution cannot yield a complete dispatch receipt.
110
85
  The `sevro.codex.repository-invocation` capability supports an explicitly
111
86
  declared `$skill` from `.agents/skills/<skill>/SKILL.md`. The host checks that
112
87
  the repository mount is a bounded regular file with no symlink components and
@@ -122,7 +97,11 @@ symlinks, and installs it with `codex plugin marketplace add` followed by
122
97
  `codex plugin add`. It checks each installation receipt against the private
123
98
  plugin cache. Candidate commands can read that cache, while the rest of the
124
99
  private Codex home, including authentication and configuration, remains denied.
125
- It refuses fixture-local `.codex` configuration, unsupported enforced
100
+ With the [Codex state opt-in](runtime-v1.md#candidate-codex-configuration-and-user-skills),
101
+ commands may read generated configuration and write actual non-system user skills;
102
+ graders retain read-only access to that request's original paths. Fixture-local
103
+ configuration is accepted as inert represented input on this route. Otherwise,
104
+ the host refuses fixture-local `.codex` configuration. It also refuses unsupported enforced
126
105
  conditions, unreadable or oversized auth files, malformed event streams, and
127
106
  incomplete turns. The host bounds output and runtime, kills its process group
128
107
  on timeout or cancellation, and removes private state after the turn. It is
@@ -144,14 +123,18 @@ explicit workspace rule, denies all other filesystem roots except minimal
144
123
  runtime files and the selected executable's install directories, and
145
124
  specifically denies protected roots and the private Codex home. An executable
146
125
  inside a protected root is rejected. The profile also disables command
147
- network access and clears inherited command environment variables. The Codex
126
+ network access by default and clears inherited command environment variables.
127
+ The runtime [local HTTP option](runtime-v1.md#local-http-test-servers) enables
128
+ Codex's managed network proxy and local binding for socket-using tests.
129
+ The Codex
148
130
  parent can read authentication before it starts sandboxed commands. Tests
149
131
  invoke the installed `codex sandbox` CLI to prove fixture access, denied
150
132
  source/auth reads, and executable access. The process adapter verifies these
151
133
  properties in one sandbox invocation before each fresh host request, with a
152
134
  60-second bounded startup deadline. The combined probe still requires readable
153
135
  private command storage, denied project listing, denied authentication and
154
- configuration reads, and a successful native executable `--version`. Continuation
136
+ configuration reads (unless configuration access was explicitly enabled), and a
137
+ successful native executable `--version`. Continuation
155
138
  turns reuse the same isolated state. The longer deadline accommodates observed
156
139
  native policy startup; it is not counted as a performance saving.
157
140
 
@@ -162,12 +145,135 @@ wrappers additionally embed that request's runtime, sandbox profile, and receipt
162
145
  paths. Replaying an old installation receipt cannot establish a new installed
163
146
  path. Sevro therefore retains native marketplace/plugin installation and receipt
164
147
  verification, fresh credentials/configuration, hook rewriting, preflight, and
165
- invocation evidence for every request. See the [startup measurements](evidence/runtime-startup-30/README.md)
148
+ invocation evidence for every request. See the [startup measurements](https://github.com/BjRo/sevro/blob/main/docs/evidence/runtime-startup-30/README.md)
166
149
  for measured boundaries, copy-on-write assessment, and limitations.
167
150
 
151
+ ## Retired skill-read evidence
152
+
153
+ The current host no longer emits `sevro.codex.skill-reads`,
154
+ `sevro.codex.initial-skill-reads`, `sevro.codex.follow-up-skill-reads`, or native
155
+ parent/child read diagnostics. Migrate activation checks to
156
+ `sevro.host.skill-activations`; old required evidence remains unavailable rather
157
+ than silently receiving a different meaning. Existing retained run evidence
158
+ keeps its original interpretation.
159
+
160
+ [Issue #70 representative retests](https://github.com/BjRo/sevro/blob/main/docs/evidence/skill-reads-70/results.json) retain
161
+ separate task, activation, and phase-read outcomes from the private candidate,
162
+ plus its source fingerprints and test-first regression results. Private native
163
+ transcripts remain outside the repository.
164
+
165
+ <details>
166
+ <summary>Historical command-pattern and read-recovery contract</summary>
167
+
168
+ The following describes the retired collector before the hook migration.
169
+ These rules are preserved for interpreting older evidence; they do not describe
170
+ the current host.
171
+
172
+ The host also retains a bounded `sevro.codex.skill-reads` observation. It
173
+ records the first verified mounted skill and ordered skill names, without
174
+ commands or skill bodies. A `cat` or `sed -n` attempt counts only when its path
175
+ resolves to a mounted skill or a skill below an installed plugin root verified
176
+ by Codex's installation receipt. Missing targets outside a mounted skill
177
+ directory, listings, and other harmless mentions of `SKILL.md` do not make the
178
+ observation partial. A missing `SKILL.md` target does not count as a read just
179
+ because its parent directory belongs to a mounted skill; an existing mounted
180
+ target that fails or produces incomplete bytes remains partial. A completed direct
181
+ `cat` of one mounted `SKILL.md`, alone or alongside literal documentation
182
+ paths, counts only when the command output contains that file's exact body.
183
+ Batched reads naming more than 64 paths remain partial, as do failed,
184
+ malformed, or incomplete recognized reads. Direct
185
+ `sed -n` pages count after their verified line ranges cover the whole body. An
186
+ exact `cat` wrapped by `lean-ctx -c` is accepted only when its reported output
187
+ still contains the full body; a compressed summary cannot prove the read.
188
+ The same exact-body check accepts a literal read followed by one literal `rg`
189
+ command, separated by a semicolon or newline. It also accepts a single-file
190
+ literal `cat` of the skill followed by one or more literal `cat` reads of
191
+ non-skill files, then one literal `rg` command, with the same separators. For
192
+ example:
193
+
194
+ ```sh
195
+ cat .agents/skills/darrow-guide/SKILL.md; cat docs/specs/repository-guide.md; rg -n -i 'offline|\bsla\b|service.level|guarantee|deployment' --glob '*.md' --glob '!docs/research/**' --glob '!**/SKILL.md' .
196
+ ```
197
+
198
+ This sequence uses the shared stream and native read check. Quoted separators
199
+ remain part of their literal operand. The ordered file bodies must match the
200
+ retained output, so documentation or search output cannot replace an altered
201
+ or incomplete skill read. Literal `cat` commands may read multiple mounted
202
+ skills and documentation, before or after skills, with or without a terminal
203
+ search. Multiple literal terminal `rg` commands are accepted within the command
204
+ bound. Each verified skill receives its own ordered receipt. Documentation
205
+ must resolve within the workspace or a receipt-bound installed plugin root;
206
+ each file is bounded to 1 MiB. Aliases of mounted skills without a literal
207
+ `SKILL.md` operand remain unsupported.
208
+ The 64-operand bound applies across all reads in the sequence. Shell expansions,
209
+ including unquoted glob and tilde operands, are unsupported in this form.
210
+
211
+ The bounded composed-read grammar also accepts `unset` with literal variable
212
+ names, `pwd` or `pwd -P`, `git rev-parse --show-toplevel` (optionally with
213
+ `-C "$PWD"`), `printenv` with literal variable names, and `rg --files` with
214
+ literal arguments before the reads. Prefix `printenv` requires the reads to
215
+ end the command, so environment output cannot replace missing read bytes.
216
+ Literal `printenv` commands may follow reads without prefix `printenv`.
217
+ The fixed pair `repo=$(git -C "$PWD" rev-parse --show-toplevel)` and
218
+ `cd "$repo" && pwd -P` is supported only with absolute read operands. Other
219
+ assignments, substitutions, directory changes, or control flow remain
220
+ unsupported. Prefix and environment output cannot supply skill frontmatter;
221
+ ambiguous repeated output cannot establish an attributable read.
222
+
223
+ The check also accepts a chain of literal
224
+ `cat` fallbacks with `2>/dev/null` and `||`, ending in `true` followed by a newline
225
+ and one literal `rg` discovery command. A fallback chain must resolve to one
226
+ canonical file across all its read operands; absent alternate targets do not
227
+ invalidate the read. Each fallback `cat` names one literal file. Multiple
228
+ existing targets, including unmounted copies,
229
+ cannot establish an attributable read. The total read operands remain bounded
230
+ at 64. The complete command must succeed and expose the mounted file's entire
231
+ exact body. `cat` accepts literal file operands and the optional `--` delimiter;
232
+ other options cannot prove an unchanged read. Substitutions, pipelines, other shell control flow, and dynamic
233
+ search arguments cannot establish a compound read through this check.
234
+ Unrecognized commands remain partial when their output contains the identifying
235
+ `name: <skill>` line from a mounted or receipt-bound installed-plugin skill.
236
+ This is a host observation; an extension decides what selection means for its
237
+ case.
238
+ The same check accepts skill files below the exact installed plugin roots from
239
+ Codex's installation receipts. It does not infer activation from arbitrary
240
+ files in the private plugin cache.
241
+ The host also retains separate `sevro.codex.initial-skill-reads` and
242
+ `sevro.codex.follow-up-skill-reads` observations. Each applies the same exact
243
+ mounted-skill read check to one completed turn, so an extension can grade read
244
+ order or a missing repeat read without inferring it from the combined list.
245
+ For `app-server`, the verified same-thread feedback boundary separates the
246
+ initial phase from the follow-up phase, including subsequent native goal turns.
247
+ Absent, duplicated, foreign-thread, or failed boundaries do not yield phase
248
+ receipts.
249
+
250
+ It also checks native parent command records for exact mounted skill bodies,
251
+ including sessions with no spawn request. The bounded diagnostic distinguishes
252
+ no read from an incomplete read without claiming skill activation.
253
+ It retains the skill name and native ordinal when verified reads complete a
254
+ whole body. Repeated complete reads produce separate receipts; paged reads
255
+ produce one receipt when their ranges first cover the body. An incomplete
256
+ later reread makes the diagnostic partial. Extensions can compare these
257
+ ordinals with an accepted owner boundary without retaining commands or output.
258
+ Earlier yielded output can complete a read only when its process and unique
259
+ call identity bind it to that actor's native command completion. Completed
260
+ literal command calls use a bounded TypeScript parser; conditional or ambiguous
261
+ code cannot establish that binding. Recovery verifies the exact mounted bytes
262
+ and recomputes completeness for the matching CLI command. Private commands,
263
+ submitted code and recovered skill bodies stay out of public observations.
264
+ For accepted spawns, it also checks up to eight child thread rollouts and
265
+ reports whether each is available, unavailable, ambiguous, or partial, with an
266
+ explicit truncation flag. An available rollout includes bounded diagnostics for
267
+ native child commands: the number of commands and skill read attempts, whether
268
+ the exact mounted `SKILL.md` body was read, and whether the check was complete
269
+ or truncated. A rollout with no read differs from a missing or malformed
270
+ rollout. These diagnostics do not establish skill activation or task completion
271
+ by themselves and retain no child prompt, command, or output.
168
272
  Native read diagnostics retain at most 64 `recoverySources` entries. Each
169
273
  records its native ordinal, whether the native completion had output, the
170
274
  yielded chunk count, and separate `completedCall` and `literalCommandCall`
171
275
  flags. These facts distinguish recovery sources without retaining commands,
172
276
  submitted code, or skill bodies. The diagnostic's completeness and truncation
173
277
  fields still determine whether its read evidence can support grading.
278
+
279
+ </details>
package/docs/contracts.md CHANGED
@@ -7,6 +7,7 @@ Read these human contracts and their schemas together:
7
7
  - [Report v1](report-v1.md): summaries and comparison limitations.
8
8
  - [Identity v1](identity-v1.md): versioned comparison dimensions and hashing.
9
9
  - [Runtime configuration v1](runtime-v1.md): environment, tools, private state, goals, and hooks.
10
+ - [Run settings v1](run-settings-v1.md): recurring evaluation selections and CLI overrides.
10
11
  - [Built-in graders v1](builtin-graders-v1.md): output, shell, Git HEAD, and semantic checks.
11
12
  - [Schemas](../schemas/): machine-readable public forms.
12
13
 
@@ -15,4 +16,4 @@ Read these human contracts and their schemas together:
15
16
  [TypeScript quality contract](typescript-quality.md) defines source inventories,
16
17
  development checks, and coverage policy.
17
18
  [Architecture](architecture.md) explains implementation context;
18
- [historical validation](evidence.md) records past observations. Return to the [hub](README.md).
19
+ [historical validation](https://github.com/BjRo/sevro/blob/main/docs/evidence.md) records past observations. Return to the [hub](README.md).
@@ -4,18 +4,25 @@ Start with a direct case for a prompt, fixture, and built-in success criteria.
4
4
  Copy [the basic graded case](../examples/basic/graded.json), give it a stable
5
5
  ID, and replace the prompt/check. Read [built-in graders](builtin-graders-v1.md)
6
6
  for regex, JSON, and bounded schema assertions. No criteria means `not_assessed`.
7
+ For complete coding, repository-skill, runtime, semantic and extension projects,
8
+ follow the [runnable recipes](recipes.md), including their deliberate failures.
7
9
 
8
10
  Run it with the [CLI](running-evaluations.md). Direct cases follow `ResolvedCase`
9
11
  in [the engine](../src/engine.ts). Fixtures can provide inline files, generated
10
12
  Git history, or a declared clean repository. The [CLI reference](development-cli.md)
11
13
  owns required source roots/maps; an arbitrary returned path does not grant access.
12
14
 
15
+ Selecting `--project-root` identifies the project; it does not copy its contents
16
+ into a participant fixture. Declare the files or repository source the participant
17
+ should receive. The [run defaults reference](development-cli.md#run-defaults)
18
+ explains how project identity, fixtures and CLI path resolution interact.
19
+
13
20
  ## Evaluate your repository skills
14
21
 
15
22
  Start with one representative task, your actual skill, and observable success
16
23
  criteria. This example evaluates a documentation guide's answer with Codex.
17
24
  Use [Sevro from `PATH`](installing.md#make-the-command-available).
18
- Live runs require the [native host prerequisites](native-hosts.md), macOS
25
+ Live runs require the [native host prerequisites](native-hosts.md), supported
19
26
  isolation, an authenticated Codex installation, and your chosen model.
20
27
  They consume that account's model quota.
21
28
 
@@ -109,7 +116,7 @@ prepares skill mounts and interprets complete native host evidence. The
109
116
  [extension protocol](extension-protocol-v1.md) defines repository and plugin
110
117
  invocations; the checkout's [guide evals](guide-evaluation.md) demonstrate the
111
118
  approach. Check those capabilities against your exact installed release:
112
- this checkout contains [changes beyond published `rc.2`](installing.md#published-package-and-checkout).
119
+ this checkout can contain [changes beyond its published version](installing.md#published-package-and-checkout).
113
120
 
114
121
  ## Reusable project policy
115
122
 
@@ -8,14 +8,107 @@ grading, evidence, and extension lifecycle.
8
8
  [versioned report contract](report-v1.md). It emits Markdown by default or
9
9
  `sevro.report.v1` with `--json`.
10
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
+
11
15
  Examples assume [Sevro and Bun are on `PATH`](installing.md#make-the-command-available).
12
16
  For a contributor checkout, use `bun src/cli.ts` in place of `sevro`.
13
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
+
14
107
  An installed package records its name, version, and a digest of its packaged
15
108
  runtime and public contract files without reading runner Git metadata. The CLI
16
109
  derives the project digest from its revision and dirty patch, or from a bounded
17
110
  content snapshot when the project has no Git revision. Result and run-state
18
- 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
19
112
  for coordinated development, pass `--runner-checkout-root` with the absolute
20
113
  path to this checkout. Sevro verifies that it is the code actually running and
21
114
  records its revision and dirty-patch digest instead of package provenance.
@@ -60,6 +153,53 @@ Codex route, including semantic and advisory roles, and to both `exec` and
60
153
  `app-server` entrypoints. For a 20-minute app-server evaluation, add
61
154
  `--codex-entrypoint app-server --codex-timeout-ms 1200000` to the Codex command
62
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.
63
203
 
64
204
  ### Trial concurrency
65
205
 
@@ -130,22 +270,45 @@ sevro run --json \
130
270
  The route reuses existing Claude authentication. An explicit
131
271
  `--claude-credential-file` takes precedence over inherited credentials. Otherwise,
132
272
  it forwards `ANTHROPIC_API_KEY` and `CLAUDE_CODE_OAUTH_TOKEN` when present, leaving
133
- their relative precedence to Claude Code. With neither variable present, it
134
- copies `.credentials.json` from `CLAUDE_CONFIG_DIR` or `~/.claude`, then falls back
135
- to the macOS Keychain if the saved file is absent. An unreadable, empty or
136
- oversized selected file fails rather than falling back to another login.
137
- Only credentials enter private per-turn state; user rules, settings and hooks
138
- remain excluded. The host denies both authentication variables to sandboxed
273
+ their relative precedence to Claude Code. With neither variable present, it uses
274
+ the saved login where Claude Code keeps it for `CLAUDE_CONFIG_DIR` or `~/.claude`.
275
+ On macOS that is the configuration's Keychain item, then `.credentials.json` in
276
+ that directory when the item is absent or unreadable. On Linux it is that file.
277
+ An unreadable, empty, oversized or non-login selected file fails rather than
278
+ falling back to another login. Pass `--claude-credential-file` with an absolute
279
+ path to select a separate saved login; Sevro refreshes and updates only that file.
280
+
281
+ A saved login never enters per-turn state. Each turn receives only its access
282
+ token as `CLAUDE_CODE_OAUTH_TOKEN`, so Claude Code in the trial cannot refresh or
283
+ rotate the login. The parent refreshes when the remaining token lifetime cannot
284
+ cover the execution budget: the Claude timeout for each turn, including a
285
+ declared follow-up, plus five minutes. It holds Claude Code's own
286
+ `.oauth_refresh.lock` in the login's configuration directory and reads the login
287
+ again. It then runs `claude auth login` with Claude Code's documented
288
+ `CLAUDE_CODE_OAUTH_REFRESH_TOKEN` in a disposable configuration. Sevro writes the
289
+ rotated tokens back to the original Keychain item or file, preserving other fields.
290
+ It reads that store again to verify them before a turn starts, and leaves a login
291
+ that changed during the refresh untouched. Refresh requires Claude Code 2.1.284 or
292
+ later; an older release fails before its refresh token is used.
293
+
294
+ If the store cannot be updated, the run fails and Sevro keeps the rotated tokens in
295
+ its private native-state directory. The next run restores them once the store is
296
+ writable. If Claude Code cannot refresh the login, run `claude` and `/login`.
297
+ A token that expires or is revoked during a turn fails that turn's
298
+ authentication; the trial never refreshes it. This lifecycle is covered with a
299
+ synthetic Claude CLI and token ledger, not against Anthropic's live endpoint.
300
+
301
+ Only the access token enters private per-turn state; user rules, settings and
302
+ hooks remain excluded. The host denies both authentication variables to sandboxed
139
303
  commands and enables Claude Code's subprocess credential scrubbing. Credential
140
- values are excluded from retained evidence and configuration digests. Pass
141
- `--claude-credential-file` with an absolute path to select a separate saved login.
304
+ values are excluded from retained evidence and configuration digests.
142
305
  It accepts declared Claude
143
306
  plugin directories and explicit skill invocations from extension preparation.
144
307
  It runs candidate tools under Claude Code's native sandbox with private,
145
308
  source, and result paths denied. The route disables hooks by default and does not expose
146
309
  the Write tool. It currently supports passive candidate turns only. Use
147
310
  `--protected-root` to exclude additional private paths from the candidate's
148
- filesystem access. Configure shared host tools, private caches, goals, and selected
311
+ filesystem access. Configure shared host tools, private or reusable caches, goals, and selected
149
312
  plugin hooks with [`sevro.json` or `--runtime-config-file`](runtime-v1.md).
150
313
  The same policy reaches isolated checks and native grading hosts.
151
314
 
@@ -174,9 +337,10 @@ Without that option, the host does not advertise
174
337
  `sevro.claude.repository-invocation` and refuses explicit repository dispatch
175
338
  before launching Claude. This avoids recording an unknown command as a usable
176
339
  repository-skill route.
177
- The host reads only bounded Skill metadata from completed child Agent sessions
178
- in its temporary private configuration, then removes those session files. A
179
- missing or inconsistent graph leaves `sevro.claude.nested-skills` partial.
340
+ The host collects successful `Skill` calls through the existing structured
341
+ stream as [skill activation evidence](native-hosts.md#skill-activation-evidence).
342
+ It uses the same collector for parent and nested actors. Missing or unmatched
343
+ results remain partial; separate transcript-based skill detectors are retired.
180
344
 
181
345
  A case's `followUpPrompt` starts a UUID-bound session and resumes that same
182
346
  session after a complete successful initial result. Both results must name
@@ -195,7 +359,8 @@ For cases with `sevro.semantic` checks, also pass
195
359
  explicit second `HostAdapter` for grading. Alternatively, select the bundled
196
360
  Codex route with `--semantic-host codex --semantic-model <model>
197
361
  --semantic-effort <effort>`. That route also requires `--codex-bin` and
198
- `--codex-auth-file`, shared with a Codex candidate route when present. The two
362
+ `--codex-auth-file`, shared with a Codex candidate route when present. The binary
363
+ defaults to the explicitly selected `codex` on `PATH`. The two
199
364
  semantic route options are exclusive. The candidate and semantic routes are
200
365
  recorded separately in evidence and evaluation identity. The semantic adapter
201
366
  runs after a complete candidate response in its own empty workspace; missing
@@ -249,7 +414,7 @@ verdict and rejects unsolicited recommendations.
249
414
 
250
415
  If the extension needs configuration, supply both
251
416
  `--extension-configuration-file` and
252
- `--extension-redacted-configuration-file` as absolute paths to JSON objects.
417
+ `--extension-redacted-configuration-file` as paths to JSON objects.
253
418
  The latter replaces secret values for the retained configuration digest. Keep
254
419
  secrets out of the command argv and the redacted file.
255
420
 
@@ -279,7 +444,13 @@ isolated shell checks receive `.git/fixture-bin` on `PATH`. Host adapters
279
444
  receive `fixtureBinDir` and must add it to their native tool environment; the
280
445
  bundled Codex adapter also preserves it across login shells. A negotiated
281
446
  fixture setup command may then prepare the clone before the host runs.
282
- Repository submodules and preparation artifacts targeting `.git/` are refused.
447
+ Repository fixtures preserve committed `.gitmodules` files and submodule gitlink
448
+ revisions. Trial clones leave submodules uninitialized and do not fetch their
449
+ contents, even when the source has initialized submodules. A fixture that needs
450
+ those contents must initialize them during its negotiated setup. Modified or
451
+ untracked files and revision changes in initialized source submodules are
452
+ refused, including when Git's submodule ignore settings hide them. Preparation
453
+ artifacts targeting `.git/` are refused.
283
454
 
284
455
  A direct case or extension can declare a generated Git fixture:
285
456
 
@@ -371,6 +542,3 @@ Claude also advertises `sevro.host.native-goal`. Its observer binds one persiste
371
542
  transcript to the original successful native session and retains goal status
372
543
  and objective length. Missing, ambiguous, malformed or oversized evidence is
373
544
  unavailable; an unavailable observation cannot prove goal absence.
374
-
375
- These additions require the `0.1.0-rc.2` candidate. The published `rc.1` lacks
376
- the app-server selector and native goal observations.
@@ -14,6 +14,12 @@ Local checks need no network. Run `bun run test:docs-examples` for the exact
14
14
  marked tutorial commands in fresh consumer/contributor directories, including
15
15
  expected verdicts and saved evidence. Candidate and released-package runs are
16
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.
17
23
 
18
24
  `package.json.version` is the authoritative current version. `bun run docs:sync`
19
25
  updates only the marked [Current release](installing.md#current-release) section
@@ -25,6 +31,10 @@ stale output. Run synchronization after a version bump and include the resulting
25
31
  documentation change. Link installation and update instructions to this section.
26
32
  Keep historical versions, licensing transitions, and minimum supported versions
27
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.
28
38
 
29
39
  ## External links
30
40
 
@@ -38,8 +48,8 @@ make a network job green. External success does not establish a claim's truth.
38
48
 
39
49
  - Can a new user reach installation, first success, results, troubleshooting,
40
50
  architecture, and contributing without the guide?
41
- - Are supported environments, credentials, side effects, and current versus
42
- released behavior explicit beside the relevant commands?
51
+ - Are supported environments, credentials, side effects, and prerequisites
52
+ explicit beside the relevant commands?
43
53
  - Do descriptive links, meaningful headings, source order, readable tables,
44
54
  image alternatives, and words rather than color support accessibility?
45
55
  - Are current contracts, accepted choices, research, and past evidence distinct?