@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
@@ -0,0 +1,88 @@
1
+ # Install, update, or remove Sevro
2
+
3
+ Use Bun 1.3.13 for this TypeScript/Bun CLI. Installation does not make it a
4
+ Node-only executable. Full validation and native isolation target macOS and
5
+ Ubuntu 24.04 x64. See the [bounded platform evidence](native-hosts.md#validated-platform-scope);
6
+ Windows remains unverified.
7
+
8
+ ## Install locally
9
+
10
+ ```sh
11
+ mkdir sevro-demo
12
+ cd sevro-demo
13
+ bun init -y
14
+ ```
15
+
16
+ Then install the [current release](#current-release) in that directory.
17
+
18
+ Run the [packaged deterministic example](getting-started.md#from-an-installed-package)
19
+ to verify installation. It needs neither model credentials nor Darrow.
20
+ Local installation records the selected version in the project lockfile.
21
+
22
+ <!-- sevro-current-release:start -->
23
+
24
+ ## Current release
25
+
26
+ The current release is `0.1.0-rc.21`. Install this exact version:
27
+
28
+ ```sh
29
+ bun add --exact @bjoernrochel/sevro@0.1.0-rc.21
30
+ ```
31
+
32
+ <!-- sevro-current-release:end -->
33
+
34
+ ## Make the command available
35
+
36
+ The examples call `sevro` from `PATH`. For a local installation, run this from
37
+ the directory containing its `node_modules`:
38
+
39
+ ```sh
40
+ export PATH="$PWD/node_modules/.bin:$PATH"
41
+ ```
42
+
43
+ This selects the locally installed version for the current shell, including
44
+ after changing directories. If your installed `sevro` is already on `PATH`,
45
+ no adjustment is needed. Bun must also be on `PATH`: the executable uses
46
+ `#!/usr/bin/env bun`.
47
+
48
+ ## Published package and checkout
49
+
50
+ See [licensing](licensing.md) for Sevro's source-available terms and historical
51
+ licensing transitions.
52
+
53
+ The npm package contains sources, schemas, examples, documentation,
54
+ LICENSE, and contribution guidance. It excludes tests, developer scripts, Git
55
+ metadata, and repository guide mounts. Use a source checkout for the guide.
56
+
57
+ Source checkouts can include changes beyond their package version; compare the
58
+ exact release tag when establishing provenance.
59
+
60
+ ## Work from source
61
+
62
+ ```sh
63
+ git clone https://github.com/BjRo/sevro.git
64
+ cd sevro
65
+ bun install --frozen-lockfile
66
+ ```
67
+
68
+ Run the [checkout tutorial](getting-started.md#from-a-contributor-checkout).
69
+ `bun run test:package-install` packs and installs a local tarball in temporary
70
+ directories; it does not publish. [Contributing](../CONTRIBUTING.md) lists checks.
71
+
72
+ ## Update
73
+
74
+ Review a release's license and compatibility, then use the exact installation
75
+ command for the [current release](#current-release) from your existing project.
76
+ To select a different published version, substitute that exact version in the
77
+ command, then rerun the [packaged example](getting-started.md#from-an-installed-package).
78
+ Rollback uses the prior exact version and another verification run.
79
+ [Releases](releases.md) explains artifact provenance.
80
+
81
+ ## Remove
82
+
83
+ ```sh
84
+ bun remove @bjoernrochel/sevro
85
+ ```
86
+
87
+ This updates the dependency and lockfile, not saved cases, results, or model
88
+ logins. Remove those separately only when wanted.
@@ -0,0 +1,159 @@
1
+ Business Source License 1.1
2
+
3
+ License text copyright (c) 2017 MariaDB Corporation Ab, All Rights Reserved.
4
+ "Business Source License" is a trademark of MariaDB Corporation Ab.
5
+
6
+ -----------------------------------------------------------------------------
7
+
8
+ Parameters
9
+
10
+ Licensor: Björn Rochel <bjoern@bjro.de>
11
+
12
+ Licensed Work: Sevro — a standalone evaluation runner for coding agents.
13
+ The Licensed Work is (c) 2026 Björn Rochel.
14
+
15
+ Additional Use Grant: You may make production use of the Licensed Work only
16
+ as follows:
17
+
18
+ (a) use within your own organization, for any
19
+ purpose, commercial or non-commercial, provided
20
+ that such use is not Commercial Educational
21
+ Production Use;
22
+
23
+ (b) use while performing professional, consulting,
24
+ or contract services for your own clients,
25
+ provided that those services do not include
26
+ Commercial Educational Production Use;
27
+
28
+ (c) use in preparing or delivering training,
29
+ workshops, courses, talks, presentations, or
30
+ other educational offerings, or in creating or
31
+ publishing blog posts, articles, or other
32
+ educational content, provided that such
33
+ production use is not Commercial Educational
34
+ Production Use;
35
+
36
+ (d) use in research, evaluation, and personal
37
+ projects, provided that such use is not
38
+ Commercial Educational Production Use;
39
+
40
+ provided that such production use does not include
41
+ distributing, selling, sublicensing, hosting, or
42
+ otherwise offering the Licensed Work, or a derivative
43
+ work of the Licensed Work, to third parties as a
44
+ product or service whose principal value is the
45
+ functionality of the Licensed Work.
46
+
47
+ For purposes of this Additional Use Grant,
48
+ "Commercial Educational Production Use" means
49
+ production use of the Licensed Work in preparing,
50
+ delivering, or publishing any educational offering or
51
+ content where you or anyone acting on your behalf:
52
+
53
+ (i) receives or expects to receive, directly or
54
+ indirectly, a fee, compensation, sponsorship, or
55
+ other consideration in connection with it;
56
+
57
+ (ii) supplies it as part of, or uses it to advertise
58
+ or promote, a paid product, service, membership,
59
+ or engagement; or
60
+
61
+ (iii) uses it to generate leads or obtain any other
62
+ direct or indirect commercial benefit.
63
+
64
+ Reasonable reimbursement of expenses alone does not
65
+ constitute Commercial Educational Production Use.
66
+ Commercial Educational Production Use is not included
67
+ in this Additional Use Grant.
68
+
69
+ For clarity, nothing in this Additional Use Grant
70
+ limits the non-production rights granted under the
71
+ Terms below.
72
+
73
+ For clarity, contributing modifications back to the
74
+ Licensed Work, and publishing forks that are
75
+ themselves offered free of charge under this License,
76
+ are permitted.
77
+
78
+ Change Date: Two years from the date on which the applicable
79
+ version of the Licensed Work is first made publicly
80
+ available. The Change Date is determined separately
81
+ for each released version.
82
+
83
+ Change License: Mozilla Public License, version 2.0
84
+
85
+ For information about alternative licensing arrangements for the Licensed Work,
86
+ please contact: bjoern@bjro.de
87
+
88
+ -----------------------------------------------------------------------------
89
+
90
+ Notice
91
+
92
+ Business Source License 1.1
93
+
94
+ Terms
95
+
96
+ The Licensor hereby grants you the right to copy, modify, create derivative
97
+ works, redistribute, and make non-production use of the Licensed Work. The
98
+ Licensor may make an Additional Use Grant, above, permitting limited
99
+ production use.
100
+
101
+ Effective on the Change Date, or the fourth anniversary of the first publicly
102
+ available distribution of a specific version of the Licensed Work under this
103
+ License, whichever comes first, the Licensor hereby grants you rights under
104
+ the terms of the Change License, and the rights granted in the paragraph
105
+ above terminate.
106
+
107
+ If your use of the Licensed Work does not comply with the requirements
108
+ currently in effect as described in this License, you must purchase a
109
+ commercial license from the Licensor, its affiliated entities, or authorized
110
+ resellers, or you must refrain from using the Licensed Work.
111
+
112
+ All copies of the original and modified Licensed Work, and derivative works
113
+ of the Licensed Work, are subject to this License. This License applies
114
+ separately for each version of the Licensed Work and the Change Date may vary
115
+ for each version of the Licensed Work released by Licensor.
116
+
117
+ You must conspicuously display this License on each original or modified copy
118
+ of the Licensed Work. If you receive the Licensed Work in original or
119
+ modified form from a third party, the terms and conditions set forth in this
120
+ License apply to your use of that work.
121
+
122
+ Any use of the Licensed Work in violation of this License will automatically
123
+ terminate your rights under this License for the current and all other
124
+ versions of the Licensed Work.
125
+
126
+ This License does not grant you any right in any trademark or logo of
127
+ Licensor or its affiliates (provided that you may use a trademark or logo of
128
+ Licensor as expressly required by this License).
129
+
130
+ TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON
131
+ AN "AS IS" BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,
132
+ EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF
133
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND
134
+ TITLE.
135
+
136
+ MariaDB hereby grants you permission to use this License's text to license
137
+ your works, and to refer to it using the trademark "Business Source License",
138
+ as long as you comply with the Covenants of Licensor below.
139
+
140
+ Covenants of Licensor
141
+
142
+ In consideration of the right to use this License's text and the "Business
143
+ Source License" name and trademark, Licensor covenants to MariaDB, and to all
144
+ other recipients of the licensed work to be provided by Licensor:
145
+
146
+ 1. To specify as the Change License the GPL Version 2.0 or any later version,
147
+ or a license that is compatible with GPL Version 2.0 or a later version,
148
+ where "compatible" means that software provided under the Change License
149
+ can be included in a program with software provided under GPL Version 2.0
150
+ or a later version. Licensor may specify additional Change Licenses
151
+ without limitation.
152
+
153
+ 2. To either: (a) specify an additional grant of rights to use that does not
154
+ impose any additional restriction on the right granted in this License, as
155
+ the Additional Use Grant; or (b) insert the text "None".
156
+
157
+ 3. To specify a Change Date.
158
+
159
+ 4. Not to modify this License in any other way.
@@ -0,0 +1,42 @@
1
+ # Sevro licensing
2
+
3
+ [LICENSE](../LICENSE) is authoritative for this checkout. Sevro Source Available
4
+ License 1.0 allows free use in all contexts, modification, and free redistribution
5
+ under the same terms. Commercial work, paid education, research, CI, and
6
+ consulting are permitted.
7
+
8
+ Charging for copies, licensing, or hosted access to Sevro's functionality,
9
+ including modified/rebranded versions, requires a separate license. Charging
10
+ for independent work performed using Sevro is allowed. A hosting label cannot
11
+ disguise a charge for the runner. Retain copyright, license, origin, and
12
+ modification notices. This is source-available, not an OSI open-source license.
13
+
14
+ ## Contributions and alternative terms
15
+
16
+ [Contribution terms](../CONTRIBUTING.md#contribution-licensing) give recipients
17
+ the public license and grant Björn Rochel additional copyright relicensing
18
+ rights. Contributors keep copyright. Other recipients do not automatically
19
+ receive those broader rights. The project describes its current free terms;
20
+ it does not promise that alternative licenses will never be offered.
21
+
22
+ ## Earlier releases
23
+
24
+ Published `0.1.0-rc.1` and `0.1.0-rc.2` retain BUSL-1.1, their original
25
+ production grant, and their per-version change date. Each changes to MPL-2.0
26
+ two years after its first public availability. This checkout does not revoke
27
+ or rewrite earlier grants. The [retained rc.2 license](licenses/BUSL-1.1-0.1.0-rc.2.txt)
28
+ records those terms.
29
+
30
+ Package metadata from `0.1.0-rc.3` uses `SEE LICENSE IN LICENSE`: the new license
31
+ has no SPDX identifier. The matching LICENSE travels in the tarball. These
32
+ terms do not alter the already published `rc.1` or `rc.2` artifacts.
33
+
34
+ ## Branding and independently authored material
35
+
36
+ [Brand permissions](assets/README.md) are separate. Björn Rochel created the
37
+ logo; Pierce Brown's _Red Rising_ inspired the name. [Acknowledgements](acknowledgements.md)
38
+ credit that inspiration without implying affiliation or ownership.
39
+
40
+ The runner license does not automatically govern independently authored cases,
41
+ datasets, extensions, prompts, or outputs. Their authors/input licenses
42
+ determine those rights. Copies of covered Sevro code remain covered.
@@ -5,7 +5,8 @@ retain an observation with that ID. It exposes host facts for extension policy:
5
5
 
6
6
  - `method: native_control_calls`;
7
7
  - ordered `calls` containing only `ordinal`, `namespace`, and `name`;
8
- - `acceptedAgentCount`, a verified Codex acceptance count or `null` on Claude;
8
+ - `acceptedAgentCount`, a verified direct native Codex acceptance count when
9
+ overall coverage is complete, otherwise `null` (also `null` on Claude);
9
10
  - `submittedExecCalls`, the Codex submitted-code count or `null` on Claude; and
10
11
  - `truncated`, which is `false` for a complete record and may be unknown (`null`)
11
12
  for an incomplete Codex record.
@@ -15,9 +16,71 @@ tool arguments, task messages, command bodies, or results. Call labels prove an
15
16
  invocation attempt, not success. Extensions decide which calls are prohibited.
16
17
  An unknown acceptance count cannot establish agent acceptance.
17
18
 
18
- Codex projects labels and counts from its bound native-session observation and
19
- preserves its completeness. Incomplete counts remain `null`. Submitted code remains explicit: extensions cannot
20
- infer absence of controls inside code that this observer did not inspect.
19
+ Codex projects labels and counts from its bound native-session observation.
20
+ It additionally retains `directAcceptedAgentCount`, the number of positively
21
+ correlated direct native spawn acceptances in that source, independently of exec
22
+ inspection. This is an observed count, not a total across unknown launch paths.
23
+ `coverage.nativeCalls` records native-session completeness;
24
+ `coverage.execInspection` records whether all submitted exec sources were
25
+ understood and matched to the direct submission inventory;
26
+ `coverage.acceptedAgents: direct_native_calls` names the scope of both acceptance
27
+ counts. Accepted launches through exec are not included in these direct counts.
28
+ When native capture is incomplete, even a zero observed count cannot establish
29
+ absence. Native labels remain usable as positive attempt evidence regardless
30
+ of an unrelated exec inspection gap. A rejected attempt is never an acceptance.
31
+
32
+ When submitted code is present, both observations also retain `execCalls`:
33
+ one receipt per native `exec` submission, with its native `ordinal`, inspection
34
+ `completeness`, and ordered `calls` containing `index`, `namespace`, and `name`.
35
+ The index is local to that submission; native ordinals are not synthesized.
36
+ The original direct-call list and total `submittedExecCalls` stay unchanged.
37
+
38
+ Sevro statically inspects bounded straight-line Code Mode
39
+ programs without executing them. It accepts literal tool calls, constant result
40
+ bindings, template interpolation and `+` composition of inspected expressions,
41
+ direct `text`/`store` output, and literal `Promise.all`/`allSettled` batches.
42
+ Batch results may use flat constant array bindings or result-only
43
+ `forEach(text)` or `for ... of` output, including blocks and conditional
44
+ result-field selection. `JSON.stringify`, `String`, object spread/shorthand,
45
+ and nested result fields are supported. Numeric output loops must use the
46
+ bounded shape `for (let i = 0; i < results.length; i++)`, indexing the known
47
+ batch with that loop variable. Output loops and conditional expressions cannot
48
+ invoke tools. Destructuring defaults, rest elements,
49
+ holes, nested bindings, duplicate names, and shadowed globals remain unsupported.
50
+ Tool argument strings, comments and printed tool-looking text
51
+ do not become call labels. A rejected tool request returned by a completed
52
+ script still appears in its submitted-call inventory. This inventory proves
53
+ submission of those requests, not successful effects or acceptance; the existing
54
+ acceptance count describes independently correlated direct native spawns.
55
+
56
+ Dynamic lookup, aliases, shadowed globals, callbacks that invoke tools,
57
+ conditional tool execution, and nested executors keep source inspection partial.
58
+ Each receipt's `inspectionReason` is `null` on success, or `unsupported_source`,
59
+ `malformed_source`, `source_limit`, or `foreign_namespace`. Unsupported syntax
60
+ and expression/call-budget exhaustion use `unsupported_source`.
61
+ Source is bounded at
62
+ 64 KiB, traversed expressions at 2,048, and calls at 128 per submission; tool
63
+ labels are bounded at 64 characters. Private source and output bytes are discarded.
64
+ The portable observation becomes partial if any submission is uninspected or
65
+ receipt counts/ordinals disagree with the native list. `acceptedAgentCount`
66
+ remains `null` in that case, while native coverage, direct acceptance facts and
67
+ the native `submittedExecCalls` count remain independently available.
68
+ `submittedExecCalls` and `truncated` depend on native capture, not exec output.
69
+
70
+ Receipt `completeness` describes source inspection, independently of execution
71
+ or displayed output. `execution` is `completed`, `failed`, or `incomplete`;
72
+ `output` is `complete`, `truncated`, or `unavailable`. Output evidence requires
73
+ a unique later output bound to the same native call ID, with recognized text
74
+ blocks. `complete` describes the displayed receipt, not the whole program's
75
+ execution. Execution status additionally requires a successful or failed script
76
+ header. Missing, ambiguous or
77
+ malformed output yields `incomplete`/`unavailable`; a yielded or unrecognized
78
+ header stays `incomplete`. Displayed truncation does not change source coverage.
79
+ A fully inspected source with no launch call proves that absence even if its
80
+ shell output was truncated or the exec cell failed. Source inspection cannot
81
+ prove execution or success. Missing fields in historical receipts are unknown;
82
+ historical artifacts retain their original results and meanings.
83
+
21
84
  Claude records every tool-use label from the bounded stream, with namespace
22
85
  `claude`, without filtering to Skill or Agent. It requires a completed successful
23
86
  turn, valid unique tool-use IDs and names, and a non-truncated list of at most
@@ -26,4 +89,12 @@ Tool-looking text in arguments or output does not become a native call.
26
89
 
27
90
  Consumers must verify the source, completeness, shape, ordering, and counts
28
91
  before using an empty call list to establish absence. Missing or partial
29
- evidence cannot establish a negative assertion.
92
+ source coverage cannot establish a negative assertion. For Codex, consumers must
93
+ inspect every `execCalls` receipt in addition to the direct `calls` list,
94
+ validate receipt ordinals against the direct `exec` submissions, and require
95
+ all receipts to be complete with counts matching `submittedExecCalls`.
96
+ They can use positively observed native attempt labels before requiring complete
97
+ coverage for an absence pass. They must examine submitted labels for prohibited controls even when
98
+ `acceptedAgentCount` is zero. Older consumers that require
99
+ `submittedExecCalls === 0` remain conservative but cannot use this new evidence
100
+ until they adopt receipt validation.
@@ -0,0 +1,228 @@
1
+ # Run native model hosts
2
+
3
+ The basic tutorial needs none of this setup. Bundled model routes and isolated
4
+ shell checks require macOS `sandbox-exec` or Linux `bubblewrap` (and `socat` for
5
+ Claude Code), a supported native CLI, and model
6
+ authentication. Complete commands/rules live in the [CLI reference](development-cli.md)
7
+ and [Codex host reference](codex-host.md).
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
+
26
+ ## Codex
27
+
28
+ Select `--host codex`, absolute `--codex-bin` and `--codex-auth-file` paths,
29
+ and the desired model/effort. Sevro prepares an isolated host environment.
30
+ Keep authentication private and outside candidate/evaluator-visible inputs.
31
+ The default entrypoint is `exec`; app-server selection and native-goal
32
+ observations require `rc.2` or later. Unsupported instrumentation is refused.
33
+
34
+ ## Claude Code
35
+
36
+ Select `--host claude`, an absolute `--claude-bin`, and the desired model/effort.
37
+ The route supports passive candidate turns. Explicit `--claude-credential-file`
38
+ takes precedence. Otherwise this checkout forwards inherited API/OAuth
39
+ credentials, then tries a saved credential file and macOS Keychain.
40
+ These improvements require `rc.3` or later; check the exact installed
41
+ release before relying on them.
42
+
43
+ Repository skill mounts under `.claude/skills` require explicit
44
+ `--claude-project-settings`; otherwise repository dispatch is refused before
45
+ launch. The bundled route disables hooks by default and omits candidate Write
46
+ access. [Runtime configuration](runtime-v1.md) enables native goals and selected
47
+ plugin hooks and reuses declared host tools with private or explicitly shared caches. These changes
48
+ require `rc.3` or later. The CLI reference covers credential scrubbing
49
+ 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.
222
+
223
+ ## Keep sources and credentials separate
224
+
225
+ Declare source/private roots as documented. Never put credentials in prompts,
226
+ argv, redacted configuration, or public evidence. Injected adapters are trusted
227
+ code and must implement their execution contract. A synthetic native packaging
228
+ fixture proves packaging behavior, not a successful authenticated model trial.