@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
@@ -6,30 +6,219 @@ Claude Code), a supported native CLI, and model
6
6
  authentication. Complete commands/rules live in the [CLI reference](development-cli.md)
7
7
  and [Codex host reference](codex-host.md).
8
8
 
9
+ ## Validated platform scope
10
+
11
+ The full source quality gate has passed on macOS arm64 and Ubuntu 24.04 x64.
12
+ Ubuntu evidence includes [the successful source CI run for `cd7542bf`](https://github.com/BjRo/sevro/actions/runs/38692971517).
13
+ That run exercises deterministic native-host protocols and real filesystem,
14
+ process, network and shell isolation with the pinned prerequisites in
15
+ [the quality contract](typescript-quality.md#environment-and-ci). It does not
16
+ establish authenticated model success for every host/model combination.
17
+ This is prior source evidence; changed candidates still need their own green CI.
18
+ Other Linux distributions and Windows are unverified.
19
+
20
+ On Ubuntu, install `bubblewrap`, `ripgrep`, and `socat`. Unprivileged user
21
+ namespaces must work; Ubuntu's AppArmor policy may need a `bwrap` profile.
22
+ [CI's setup script](../scripts/setup-ci-linux.sh) supplies and probes the
23
+ supported runner setup. Use it as an explicit development setup step where
24
+ appropriate; do not assume all Linux hosts have that configuration.
25
+
9
26
  ## Codex
10
27
 
11
28
  Select `--host codex`, absolute `--codex-bin` and `--codex-auth-file` paths,
12
29
  and the desired model/effort. Sevro prepares an isolated host environment.
13
30
  Keep authentication private and outside candidate/evaluator-visible inputs.
14
31
  The default entrypoint is `exec`; app-server selection and native-goal
15
- observations require `rc.2` or later. Unsupported instrumentation is refused.
32
+ observations are also available. Unsupported instrumentation is refused.
16
33
 
17
34
  ## Claude Code
18
35
 
19
36
  Select `--host claude`, an absolute `--claude-bin`, and the desired model/effort.
20
37
  The route supports passive candidate turns. Explicit `--claude-credential-file`
21
38
  takes precedence. Otherwise this checkout forwards inherited API/OAuth
22
- credentials, then tries a saved credential file and macOS Keychain.
23
- These improvements require `rc.3` or later; check the exact installed
24
- release before relying on them.
39
+ credentials, then uses the saved login from the macOS Keychain or saved credential
40
+ file. Trials receive only an access token; the parent refreshes a saved login and
41
+ writes it back, so evaluations leave your normal Claude login working. See the
42
+ [CLI reference](development-cli.md) for refresh and failure behavior.
25
43
 
26
44
  Repository skill mounts under `.claude/skills` require explicit
27
45
  `--claude-project-settings`; otherwise repository dispatch is refused before
28
46
  launch. The bundled route disables hooks by default and omits candidate Write
29
47
  access. [Runtime configuration](runtime-v1.md) enables native goals and selected
30
- plugin hooks and reuses declared host tools with private caches. These changes
31
- require `rc.3` or later. The CLI reference covers credential scrubbing
32
- and follow-ups.
48
+ plugin hooks and reuses declared host tools with private or explicitly shared caches.
49
+ The CLI reference covers credential scrubbing and follow-ups.
50
+
51
+ ## Skill activation evidence
52
+
53
+ Both bundled adapters advertise `sevro.host.skill-activations`. Its observation
54
+ retains qualified `observedSkills`, bounded call identities, and explicit
55
+ `complete` or `partial` collection status. This is the sole activation collector
56
+ for each host. It replaces Codex's command-pattern and native output-recovery
57
+ detectors and Claude's separate nested-skill collector. Consumers must require
58
+ this observation; the retired observation IDs are no longer emitted.
59
+
60
+ Codex installs passive runner-owned hooks in its private home for each request.
61
+ The `tool_result_body_match` method compares returned tool content against a
62
+ snapshot of prepared repository, plugin and private user skill bodies. It does
63
+ not parse shell commands, so variables, pipelines, Python and nested Code Mode
64
+ calls use the same collector. Pre/post call pairs and session start/stop markers
65
+ establish collection health. Unselected plugin handlers are removed before
66
+ hooks are enabled, and fixture-local Codex configuration remains untrusted.
67
+ No global hook installation or root privileges are required.
68
+
69
+ This Codex receipt proves exact body exposure to the tool caller. Code Mode can
70
+ discard that output before returning to the model. An identical ordinary
71
+ document also matches; the receipt does not prove its source file was opened.
72
+ Identical bodies registered under different names are reported as
73
+ `ambiguousSkills`, with partial evidence. Exact pages can establish a body match
74
+ across tool results from the same session and turn. Coverage is tied to the
75
+ prepared body digest; overlapping or repeated pages cannot fill a missing range.
76
+ The call that completes coverage receives the activation receipt. Fragments
77
+ from different sessions or turns never combine.
78
+
79
+ Page matching uses complete nonblank lines as anchors and exact fragments of
80
+ at least 32 string code units. Fragments with multiple possible positions in a
81
+ body cannot establish coverage. Recognizable unfinished fragments appear in
82
+ `partialSkills` and keep the observation partial; a later complete match resolves
83
+ them. Within each tool result, text covered by unambiguous complete-body matches
84
+ does not also imply partial reads of skills sharing that text. Fragments returned
85
+ outside those complete-body spans or in other tool results remain independent
86
+ partial-read evidence. Comparison and anchor budgets also fail closed. Private receipts retain
87
+ body offsets rather than tool text; the public observation omits those offsets.
88
+ Shorter, transformed or unanchored fragments remain outside this matching scope.
89
+ Newly created or changed skill bodies are outside the prepared snapshot. A
90
+ complete empty observation is limited to this scope and the supported local
91
+ tool hook paths.
92
+
93
+ Codex separates per-skill exposure from collection health in the same
94
+ observation. `skillExposures` contains one `{ skill, status }` entry per prepared
95
+ catalog entry, in catalog order, with qualified skill names:
96
+
97
+ | Status | Meaning |
98
+ | ----------- | ----------------------------------------------------------------------- |
99
+ | `full` | The complete prepared body was exposed, in one result or exact pages. |
100
+ | `partial` | Recognizable fragments were exposed without establishing the full body. |
101
+ | `none` | No exposure was detected within a complete collection's matching scope. |
102
+ | `unknown` | No exposure was detected, but collection gaps prevent an absence claim. |
103
+ | `ambiguous` | Body exposure could not distinguish identically registered bodies. |
104
+
105
+ `collectionStatus` is `complete`, `partial`, or `unavailable`. No parsed hook
106
+ receipts means `unavailable`; otherwise collection gaps mean `partial`.
107
+ Recognized partial bodies and ambiguous identities alone do not indicate a
108
+ collection failure. Their existing `incompleteReasons` still keep the aggregate
109
+ activation observation partial for compatibility. Other reason codes, including
110
+ truncated call diagnostics, keep collection partial. Older observations without
111
+ these new fields have unknown exposure and collection status; do not infer them
112
+ from an empty `observedSkills` list.
113
+
114
+ Exposure statuses use all parsed receipts before the diagnostic `calls` list is
115
+ bounded. A proven `full` or `partial` exposure survives collection gaps, including
116
+ an earlier pending call, missing lifecycle hooks or an invalid receipt tail.
117
+ Full exposure takes precedence over fragments; ambiguous identities cannot
118
+ establish exposure of a particular named skill. `none` does not establish that
119
+ the skill was never used outside the prepared catalog and matching scope.
120
+ Recognizable fragments may be shared by several skill bodies. These statuses
121
+ describe content exposure to a tool caller, not instruction compliance, model
122
+ visibility or selection order.
123
+
124
+ The Codex adapter also advertises `sevro.host.skill-exposure-claims`. When at
125
+ least one skill has `full` or `partial` exposure, it emits that observation with
126
+ `completeness: complete`, `method: tool_result_body_match`,
127
+ `scope: positive_exposure`, the original `collectionStatus`, and `skillExposures`
128
+ containing only those positive entries. It is absent when no unambiguous
129
+ positive exposure is available. Extensions can require this evidence for a
130
+ specific positive assertion: accept only `full` for complete body exposure,
131
+ or explicitly accept `partial` when recognizable exposure suffices. A `partial`
132
+ entry is not a full activation. This receipt cannot establish absence, first
133
+ selection, a complete sequence or successful execution; collection remains
134
+ independently qualified. Existing activation and primary-selection requirements
135
+ are unchanged. Claude's native `Skill` seam does not emit body-exposure statuses
136
+ or these positive body-exposure claims.
137
+
138
+ Codex observations include `incompleteReasons`: an empty array for a complete
139
+ aggregate activation observation, or all applicable reason codes for a partial
140
+ aggregate observation. The separate `collectionStatus` isolates collection
141
+ health from partial bodies and body ambiguity. Older
142
+ observations without this field have unknown reasons; their missing details
143
+ cannot be reconstructed from balanced native call/return counts.
144
+
145
+ | Reason | Meaning |
146
+ | ------------------------------------------------ | -------------------------------------------------------------------------------------------------- |
147
+ | `host_incomplete` | Host execution did not complete. |
148
+ | `catalog_incomplete` | The prepared catalog could not be collected completely. |
149
+ | `receipts_unavailable` | The receipt file is missing or unreadable. |
150
+ | `invalid_receipts` | A malformed receipt stopped processing; earlier valid receipts remain available. |
151
+ | `receipt_limit` | The receipt file exceeds the collection byte limit. |
152
+ | `observer_failure` | The hook recorded a failure or writer limit, including input, nesting or matching-budget failures. |
153
+ | `session_identity_missing` | No root session identity was available. |
154
+ | `session_start_missing` / `session_stop_missing` | The root session lacks the corresponding lifecycle hook. |
155
+ | `pending_tool_calls` | Pre-tool hooks remain without matching post-tool hooks. |
156
+ | `unmatched_post_tool_use` | Post-tool hooks were received without pending pre-tool hooks. |
157
+ | `duplicate_tool_calls` | A pre-tool identity was already pending or finished. |
158
+ | `partial_hook_events` | A hook receipt is partial independently of body ambiguity. |
159
+ | `ambiguous_skill_bodies` | Complete body exposure could not distinguish skill names. |
160
+ | `partial_skill_bodies` | Recognized fragments remain without complete body exposure. |
161
+ | `calls_truncated` | Relevant call evidence exceeded its public count or byte budget. |
162
+
163
+ The `collection` summary reports `eventCount`, `preToolUseCount`,
164
+ `postToolUseCount`, `pendingToolCallCount`, `unmatchedPostToolUseCount`,
165
+ `duplicateToolCallCount` and `partialEventCount`, plus `sessionIdentified`,
166
+ `sessionStarted` and `sessionStopped` for the root session. Counts cover all
167
+ successfully parsed receipts, including receipts omitted from `calls`; an
168
+ unreadable or invalid tail remains unknown. Tool pairing spans the observed
169
+ sessions and uses session and tool-use identities. A later balanced pair is
170
+ still counted after an earlier anomaly.
171
+
172
+ `calls` is a bounded selection of complete matches, fragment-only matches,
173
+ ambiguous or partial receipts, and receipts associated with pending, orphaned
174
+ or duplicate tool identities. Each entry's `fragmentSkills` names recognizable
175
+ fragments without exposing their body offsets or digests. A fragment entry can
176
+ remain in `calls` after later complete exposure resolves `partialSkills`.
177
+ Neither `partial: false` on an individual receipt nor an empty `partialSkills`
178
+ array proves aggregate completeness. `truncated` describes this selected call
179
+ list, which is never the complete observer event ledger. A pending tool hook
180
+ can follow a rejected launch or a missing hook; it does not establish either
181
+ cause, and a tool error with a balanced hook pair does not itself imply an
182
+ observer gap. These diagnostics preserve unknown activation verdicts and do
183
+ not recover activation from native transcripts.
184
+
185
+ Codex also reports `primarySkill` and `primarySkillCompleteness` separately
186
+ from whole-collection completeness. A complete collection establishes its first
187
+ observed skill when the first matching receipt credits exactly one skill, or
188
+ `null` when none was observed. Multiple bodies credited by the first receipt
189
+ leave primary selection unknown even with complete collection; their catalog
190
+ order does not prove selection order. A partial collection can still
191
+ establish the primary skill when its only gap is pending tool calls, exactly one
192
+ skill was credited by the first matching receipt, and every call started through
193
+ that receipt has a matching post hook. A later pending call cannot change that
194
+ established first selection. An earlier or overlapping pending call leaves the
195
+ primary unknown (`null` with `primarySkillCompleteness: partial`). Other
196
+ collection gaps remain conservative. Consumers may use the established primary
197
+ for first-selection assertions while retaining the partial collection status;
198
+ this claim does not establish exclusions or a complete supporting sequence.
199
+ When a partial collection establishes the primary, the same collector emits
200
+ `sevro.host.skill-activation-claims` as complete evidence with scope
201
+ `primary_and_positive_presence`, the qualified `primarySkill`, and `presentSkills`.
202
+ It retains `collectionCompleteness: partial`. Consumers cite this receipt for
203
+ those specific claims, preserving the protocol's requirement that passing
204
+ results cite complete evidence. It cannot establish an exclusion or an
205
+ unobserved supporting read and is absent when the primary is unknown.
206
+
207
+ Claude's `skill_tool_result` method observes its existing structured `Skill`
208
+ stream without enabling additional command hooks. It pairs each call with a
209
+ successful result under the same session, parent actor and tool-use ID.
210
+ Failed calls remain failed; unmatched attempts and malformed or conflicting
211
+ records remain partial. Native explicit command expansion can load a skill
212
+ without a `Skill` call. Explicit-dispatch receipts describe dispatch only;
213
+ they do not add entries to the activation observation. A direct Claude `Read`
214
+ also falls outside the `Skill` seam and is not inferred from its file path.
215
+
216
+ The collectors retain no tool arguments, outputs or skill bodies in the new
217
+ observation. Codex catalogs at most 128 skills, each at most 1 MiB, with an
218
+ 8 MiB total body budget. Call receipts are bounded; missing collection,
219
+ unfinished calls, catalog or receipt limits, and failed execution remain
220
+ partial. Required evidence must not interpret these states as proof that a
221
+ skill was unused.
33
222
 
34
223
  ## Keep sources and credentials separate
35
224
 
@@ -18,18 +18,120 @@ aggregation, and exit-code precedence.
18
18
  Completed trial evidence is saved under `--results-root` before cleanup.
19
19
  Do not assume a run-directory name or publish private host artifacts.
20
20
 
21
+ Human output lists each trial, failed/unavailable check
22
+ reasons, measured candidate duration, unknown/known usage and retained paths.
23
+ Preparation/candidate/grading/evidence progress appears on stderr. Stage completion
24
+ means the attempt ended; read the three result states to determine its outcome.
25
+ See the [evaluation workflow](evaluation-workflow.md) for the complete progression.
26
+
27
+ ## Interpret skill exposure
28
+
29
+ In retained Codex `sevro.host.skill-activations` observations, read
30
+ `data.skillExposures` alongside `data.collectionStatus`. A skill may have `full`
31
+ or `partial` exposure even when collection is incomplete. `none` means no
32
+ exposure was detected within a complete collection's scope; `unknown` means
33
+ collection gaps prevent that conclusion. `ambiguous` means identical bodies
34
+ could not identify a named skill. Missing fields in older evidence remain
35
+ unknown.
36
+
37
+ Full exposure establishes that a tool caller received the complete prepared
38
+ body, not that the model followed it. Partial exposure establishes only
39
+ recognizable fragments. Cases that accept partial exposure must say so in
40
+ their extension policy. The separate `sevro.host.skill-exposure-claims`
41
+ observation supports positive exposure checks without treating gaps as absence
42
+ or first selection. [Native host evidence](native-hosts.md#skill-activation-evidence)
43
+ defines the fields and limits; Claude's native skill-tool evidence has a
44
+ different scope. Task verdicts and existing activation requirements retain their
45
+ current meaning.
46
+
21
47
  ## Summarize runs
22
48
 
23
49
  ```sh
24
50
  sevro report --json --result-file /absolute/path/sevro-result.json
25
51
  ```
26
52
 
53
+ `sevro report --latest` uses the most recently retained CLI result in
54
+ `<cwd>/.sevro/results`. Add
55
+ `--results-root ./other-results` to select another root. Dry/failed runs may be
56
+ latest; a pre-run error does not replace it. CLI `--result-file` also accepts
57
+ cwd-relative paths. Missing result or referenced evidence is an error, never
58
+ a fabricated row.
59
+
27
60
  The command assumes [Sevro is on `PATH`](installing.md#make-the-command-available).
28
61
  For a contributor checkout, use `bun src/cli.ts` in place of `sevro`.
29
62
  [Report v1](report-v1.md) defines fields and limits. Missing cost, usage, or
30
63
  duration is unknown, not zero. Advisory recommendations remain independent
31
64
  of the task verdict.
32
65
 
66
+ ## Prune retained results
67
+
68
+ Run `sevro prune` to permanently delete older retained evidence. With no options,
69
+ it keeps the newest **10 results** under `<cwd>/.sevro/results`. Each completed
70
+ attempt counts separately, including repeated evaluations, dry runs, failures,
71
+ and interrupted runs that retained a CLI result.
72
+
73
+ ```sh
74
+ sevro prune
75
+ sevro prune --results-root ./other-results --keep 5
76
+ sevro prune --older-than 30d
77
+ sevro prune --latest
78
+ ```
79
+
80
+ Choose at most one explicit policy. `--keep` accepts a positive safe integer;
81
+ `--latest` is equivalent to `--keep 1`. `--older-than` accepts a positive integer
82
+ followed by `ms`, `s`, `m`, `h`, `d`, or `w` (milliseconds through weeks). It
83
+ deletes results strictly older than that duration at invocation. Age and newest
84
+ ordering use each retained `result.json` file's modification time; copying or
85
+ editing that file can change its retention age. Equal timestamps sort by
86
+ absolute result-directory path, ascending. Relative roots resolve from the
87
+ invoking directory.
88
+
89
+ Pruning finds retained result directories inside the selected root, including
90
+ nested `attempts` trees, validates results and their colocated run evidence, and
91
+ removes each selected result's entire directory. Directories without a retained
92
+ `result.json` are not themselves deleted. Active and unrecognized ownership states
93
+ are excluded from the retention count. Descendant directory links are not
94
+ followed; linked result, evidence, ownership and lock files are refused. The
95
+ selected root itself may be a directory alias. Invalid policies or unreadable,
96
+ malformed, inconsistent or unsafe retained inputs return exit `64` with a
97
+ diagnostic. Validation completes before any result deletion or latest update.
98
+
99
+ Pruning and CLI result publication serialize access to the root. Before deleting
100
+ evidence, pruning atomically points `latest.json` at the newest remaining
101
+ completed result, or removes the index if none remain. `sevro report --latest`
102
+ and explicit reports for surviving results keep working; reports naming deleted
103
+ results fail. An empty or missing results root is a successful no-op. Ownership
104
+ coordination metadata, partial attempts without CLI results, temporary fixtures,
105
+ and a separate `--run-state-root` remain outside evidence pruning.
106
+
107
+ ### Remove native transcript bundles
108
+
109
+ Use `--native-transcripts` to permanently remove captured native bundles while
110
+ keeping every result, recorded hash, observation, and other artifact:
111
+
112
+ ```sh
113
+ sevro prune --native-transcripts
114
+ sevro prune --native-transcripts --older-than 30d
115
+ sevro prune --native-transcripts --keep 5
116
+ sevro report --latest
117
+ ```
118
+
119
+ Without a policy, this mode removes bundles from all completed results. With
120
+ `--keep 5`, it preserves the newest five results' bundles and removes bundles
121
+ from older results. `--latest` preserves the newest result's bundles;
122
+ `--older-than` removes bundles only from results older than the given duration.
123
+ Age, ordering, root selection, active-run protection, and input validation follow
124
+ the rules above. The mode includes candidate, semantic, and advisory bundles.
125
+
126
+ `result.json`, `run.json`, trial evidence, and `latest.json` stay unchanged.
127
+ Before removing bytes, pruning atomically saves a private
128
+ `native-transcripts-pruned.json` receipt beside `run.json`. Keep that receipt
129
+ with the evidence: reports require it to distinguish intentional pruning from
130
+ missing evidence. Reports show retained and pruned bundle counts while preserving
131
+ the original verdicts and measurements. Pruned native bytes cannot be decoded
132
+ or recovered from hashes. Repeating the command safely resumes interrupted
133
+ deletions; ordinary whole-result pruning still works afterward.
134
+
33
135
  ## Compare carefully
34
136
 
35
137
  [Identity v1](identity-v1.md) binds inputs, evaluator content, host/model/effort,