@bjoernrochel/sevro 0.1.0-rc.8 → 1.1.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 (582) hide show
  1. package/CONTRIBUTING.md +52 -6
  2. package/README.md +12 -7
  3. package/dist/examples/basic/graded.json +13 -0
  4. package/dist/examples/basic/host.js +9 -0
  5. package/dist/examples/basic/host.js.map +1 -0
  6. package/dist/examples/basic/prompt-only.json +7 -0
  7. package/dist/examples/recipes/candidate.js +23 -0
  8. package/dist/examples/recipes/candidate.js.map +1 -0
  9. package/dist/examples/recipes/cases/coding-change.json +21 -0
  10. package/dist/examples/recipes/cases/host-tools.json +21 -0
  11. package/dist/examples/recipes/cases/mise.json +21 -0
  12. package/dist/examples/recipes/cases/node.json +21 -0
  13. package/dist/examples/recipes/cases/python-uv.json +21 -0
  14. package/dist/examples/recipes/cases/semantic.json +17 -0
  15. package/dist/examples/recipes/coding-change/check.js +16 -0
  16. package/dist/examples/recipes/coding-change/check.js.map +1 -0
  17. package/dist/examples/recipes/executable.js +20 -0
  18. package/dist/examples/recipes/executable.js.map +1 -0
  19. package/dist/examples/recipes/extension-artifacts.js +56 -0
  20. package/dist/examples/recipes/extension-artifacts.js.map +1 -0
  21. package/dist/examples/recipes/extension-methods.js +167 -0
  22. package/dist/examples/recipes/extension-methods.js.map +1 -0
  23. package/dist/examples/recipes/extension.js +28 -0
  24. package/dist/examples/recipes/extension.js.map +1 -0
  25. package/dist/examples/recipes/modules.js +9 -0
  26. package/dist/examples/recipes/modules.js.map +1 -0
  27. package/dist/examples/recipes/repository-skill/.agents/skills/startup-guide/SKILL.md +7 -0
  28. package/dist/examples/recipes/repository-skill/.claude/skills/startup-guide/SKILL.md +7 -0
  29. package/dist/examples/recipes/repository-skill/README.md +3 -0
  30. package/dist/examples/recipes/run-inputs.js +144 -0
  31. package/dist/examples/recipes/run-inputs.js.map +1 -0
  32. package/dist/examples/recipes/run-options.js +103 -0
  33. package/dist/examples/recipes/run-options.js.map +1 -0
  34. package/dist/examples/recipes/run.js +62 -0
  35. package/dist/examples/recipes/run.js.map +1 -0
  36. package/dist/examples/recipes/runtime/empty.json +1 -0
  37. package/dist/examples/recipes/runtime/goals.json +1 -0
  38. package/dist/examples/recipes/runtime/mise.json +6 -0
  39. package/dist/examples/recipes/runtime/path.json +1 -0
  40. package/dist/examples/recipes/runtime/plugins.json +4 -0
  41. package/dist/examples/recipes/runtime/python-uv.json +10 -0
  42. package/dist/examples/recipes/semantic-judge.js +27 -0
  43. package/dist/examples/recipes/semantic-judge.js.map +1 -0
  44. package/dist/examples/templates/coding/adapter.js +14 -0
  45. package/dist/examples/templates/coding/adapter.js.map +1 -0
  46. package/dist/examples/templates/coding/case.json +15 -0
  47. package/dist/examples/templates/repository-skill/.agents/skills/startup-guide/SKILL.md +6 -0
  48. package/dist/examples/templates/repository-skill/extension-data.js +61 -0
  49. package/dist/examples/templates/repository-skill/extension-data.js.map +1 -0
  50. package/dist/examples/templates/repository-skill/extension.js +29 -0
  51. package/dist/examples/templates/repository-skill/extension.js.map +1 -0
  52. package/dist/examples/templates/response/adapter.js +13 -0
  53. package/dist/examples/templates/response/adapter.js.map +1 -0
  54. package/dist/examples/templates/response/case.json +13 -0
  55. package/dist/src/advisory.js +86 -0
  56. package/dist/src/advisory.js.map +1 -0
  57. package/dist/src/candidate-artifacts.js +139 -0
  58. package/dist/src/candidate-artifacts.js.map +1 -0
  59. package/dist/src/candidate-codex-state.js +110 -0
  60. package/dist/src/candidate-codex-state.js.map +1 -0
  61. package/dist/src/case-validation.js +92 -0
  62. package/dist/src/case-validation.js.map +1 -0
  63. package/dist/src/cli/cancellation.js +21 -0
  64. package/dist/src/cli/cancellation.js.map +1 -0
  65. package/dist/src/cli/command.js +60 -0
  66. package/dist/src/cli/command.js.map +1 -0
  67. package/dist/src/cli/completion.js +14 -0
  68. package/dist/src/cli/completion.js.map +1 -0
  69. package/dist/src/cli/demo.js +45 -0
  70. package/dist/src/cli/demo.js.map +1 -0
  71. package/dist/src/cli/evaluation.js +40 -0
  72. package/dist/src/cli/evaluation.js.map +1 -0
  73. package/dist/src/cli/extension.js +54 -0
  74. package/dist/src/cli/extension.js.map +1 -0
  75. package/dist/src/cli/help.js +190 -0
  76. package/dist/src/cli/help.js.map +1 -0
  77. package/dist/src/cli/hosts.js +33 -0
  78. package/dist/src/cli/hosts.js.map +1 -0
  79. package/dist/src/cli/init-settings.js +29 -0
  80. package/dist/src/cli/init-settings.js.map +1 -0
  81. package/dist/src/cli/init.js +82 -0
  82. package/dist/src/cli/init.js.map +1 -0
  83. package/dist/src/cli/invocation.js +431 -0
  84. package/dist/src/cli/invocation.js.map +1 -0
  85. package/dist/src/cli/loading.js +110 -0
  86. package/dist/src/cli/loading.js.map +1 -0
  87. package/dist/src/cli/preparation.js +88 -0
  88. package/dist/src/cli/preparation.js.map +1 -0
  89. package/dist/src/cli/presentation.js +61 -0
  90. package/dist/src/cli/presentation.js.map +1 -0
  91. package/dist/src/cli/progress.js +5 -0
  92. package/dist/src/cli/progress.js.map +1 -0
  93. package/dist/src/cli/run-manifest.js +108 -0
  94. package/dist/src/cli/run-manifest.js.map +1 -0
  95. package/dist/src/cli/run-options.js +367 -0
  96. package/dist/src/cli/run-options.js.map +1 -0
  97. package/dist/src/cli/run-overrides.js +51 -0
  98. package/dist/src/cli/run-overrides.js.map +1 -0
  99. package/dist/src/cli/settings.js +127 -0
  100. package/dist/src/cli/settings.js.map +1 -0
  101. package/dist/src/cli/summary.js +28 -0
  102. package/dist/src/cli/summary.js.map +1 -0
  103. package/dist/src/cli.js +20 -0
  104. package/dist/src/cli.js.map +1 -0
  105. package/dist/src/contract-types.js +2 -0
  106. package/dist/src/contract-types.js.map +1 -0
  107. package/dist/src/engine.js +4 -0
  108. package/dist/src/engine.js.map +1 -0
  109. package/dist/src/evaluation/advisory.js +85 -0
  110. package/dist/src/evaluation/advisory.js.map +1 -0
  111. package/dist/src/evaluation/check-plan.js +292 -0
  112. package/dist/src/evaluation/check-plan.js.map +1 -0
  113. package/dist/src/evaluation/collection.js +61 -0
  114. package/dist/src/evaluation/collection.js.map +1 -0
  115. package/dist/src/evaluation/context.js +2 -0
  116. package/dist/src/evaluation/context.js.map +1 -0
  117. package/dist/src/evaluation/grading-host.js +28 -0
  118. package/dist/src/evaluation/grading-host.js.map +1 -0
  119. package/dist/src/evaluation/grading.js +154 -0
  120. package/dist/src/evaluation/grading.js.map +1 -0
  121. package/dist/src/evaluation/invocation-plan.js +312 -0
  122. package/dist/src/evaluation/invocation-plan.js.map +1 -0
  123. package/dist/src/evaluation/plan.js +376 -0
  124. package/dist/src/evaluation/plan.js.map +1 -0
  125. package/dist/src/evaluation/progress.js +14 -0
  126. package/dist/src/evaluation/progress.js.map +1 -0
  127. package/dist/src/evaluation/resources.js +159 -0
  128. package/dist/src/evaluation/resources.js.map +1 -0
  129. package/dist/src/evaluation/run.js +148 -0
  130. package/dist/src/evaluation/run.js.map +1 -0
  131. package/dist/src/evaluation/scheduler.js +27 -0
  132. package/dist/src/evaluation/scheduler.js.map +1 -0
  133. package/dist/src/evaluation/semantic.js +183 -0
  134. package/dist/src/evaluation/semantic.js.map +1 -0
  135. package/dist/src/evaluation/trial.js +593 -0
  136. package/dist/src/evaluation/trial.js.map +1 -0
  137. package/dist/src/evaluation/types.js +20 -0
  138. package/dist/src/evaluation/types.js.map +1 -0
  139. package/dist/src/evidence/host-results.js +67 -0
  140. package/dist/src/evidence/host-results.js.map +1 -0
  141. package/dist/src/evidence/retained-artifacts.js +17 -0
  142. package/dist/src/evidence/retained-artifacts.js.map +1 -0
  143. package/dist/src/evidence/trial-writer.js +131 -0
  144. package/dist/src/evidence/trial-writer.js.map +1 -0
  145. package/dist/src/evidence/usage.js +14 -0
  146. package/dist/src/evidence/usage.js.map +1 -0
  147. package/dist/src/executable.js +20 -0
  148. package/dist/src/executable.js.map +1 -0
  149. package/dist/src/extension-client.js +212 -0
  150. package/dist/src/extension-client.js.map +1 -0
  151. package/dist/src/extension-session.js +236 -0
  152. package/dist/src/extension-session.js.map +1 -0
  153. package/dist/src/fixtures/advisory.js +206 -0
  154. package/dist/src/fixtures/advisory.js.map +1 -0
  155. package/dist/src/fixtures/bin.js +41 -0
  156. package/dist/src/fixtures/bin.js.map +1 -0
  157. package/dist/src/fixtures/cleanup.js +43 -0
  158. package/dist/src/fixtures/cleanup.js.map +1 -0
  159. package/dist/src/fixtures/create.js +94 -0
  160. package/dist/src/fixtures/create.js.map +1 -0
  161. package/dist/src/fixtures/generated.js +181 -0
  162. package/dist/src/fixtures/generated.js.map +1 -0
  163. package/dist/src/fixtures/git-hooks.js +16 -0
  164. package/dist/src/fixtures/git-hooks.js.map +1 -0
  165. package/dist/src/fixtures/preparation.js +201 -0
  166. package/dist/src/fixtures/preparation.js.map +1 -0
  167. package/dist/src/fixtures/repository.js +255 -0
  168. package/dist/src/fixtures/repository.js.map +1 -0
  169. package/dist/src/fixtures/setup.js +175 -0
  170. package/dist/src/fixtures/setup.js.map +1 -0
  171. package/dist/src/fixtures/tools.js +57 -0
  172. package/dist/src/fixtures/tools.js.map +1 -0
  173. package/dist/src/fixtures/workspace-state.js +155 -0
  174. package/dist/src/fixtures/workspace-state.js.map +1 -0
  175. package/dist/src/generated/cli-result.cjs +2 -0
  176. package/dist/src/generated/extension.cjs +2 -0
  177. package/dist/src/generated/report.cjs +2 -0
  178. package/dist/src/generated/run-evidence.cjs +2 -0
  179. package/dist/src/generated/runtime.cjs +2 -0
  180. package/dist/src/git.js +72 -0
  181. package/dist/src/git.js.map +1 -0
  182. package/dist/src/graders/artifact.js +68 -0
  183. package/dist/src/graders/artifact.js.map +1 -0
  184. package/dist/src/graders/git-head.js +112 -0
  185. package/dist/src/graders/git-head.js.map +1 -0
  186. package/dist/src/graders/output.js +345 -0
  187. package/dist/src/graders/output.js.map +1 -0
  188. package/dist/src/graders/semantic.js +132 -0
  189. package/dist/src/graders/semantic.js.map +1 -0
  190. package/dist/src/graders/shell.js +321 -0
  191. package/dist/src/graders/shell.js.map +1 -0
  192. package/dist/src/host-diagnostic-redaction.js +52 -0
  193. package/dist/src/host-diagnostic-redaction.js.map +1 -0
  194. package/dist/src/host-diagnostics.js +248 -0
  195. package/dist/src/host-diagnostics.js.map +1 -0
  196. package/dist/src/hosts/claude-continuation.js +89 -0
  197. package/dist/src/hosts/claude-continuation.js.map +1 -0
  198. package/dist/src/hosts/claude-credential.js +121 -0
  199. package/dist/src/hosts/claude-credential.js.map +1 -0
  200. package/dist/src/hosts/claude-events.js +136 -0
  201. package/dist/src/hosts/claude-events.js.map +1 -0
  202. package/dist/src/hosts/claude-keychain.js +100 -0
  203. package/dist/src/hosts/claude-keychain.js.map +1 -0
  204. package/dist/src/hosts/claude-login-recovery.js +67 -0
  205. package/dist/src/hosts/claude-login-recovery.js.map +1 -0
  206. package/dist/src/hosts/claude-login-refresh.js +146 -0
  207. package/dist/src/hosts/claude-login-refresh.js.map +1 -0
  208. package/dist/src/hosts/claude-login-store.js +124 -0
  209. package/dist/src/hosts/claude-login-store.js.map +1 -0
  210. package/dist/src/hosts/claude-login.js +74 -0
  211. package/dist/src/hosts/claude-login.js.map +1 -0
  212. package/dist/src/hosts/claude-native-goal.js +138 -0
  213. package/dist/src/hosts/claude-native-goal.js.map +1 -0
  214. package/dist/src/hosts/claude-process.js +10 -0
  215. package/dist/src/hosts/claude-process.js.map +1 -0
  216. package/dist/src/hosts/claude-refresh-lock.js +76 -0
  217. package/dist/src/hosts/claude-refresh-lock.js.map +1 -0
  218. package/dist/src/hosts/claude-repository-invocation.js +229 -0
  219. package/dist/src/hosts/claude-repository-invocation.js.map +1 -0
  220. package/dist/src/hosts/claude-settings.js +156 -0
  221. package/dist/src/hosts/claude-settings.js.map +1 -0
  222. package/dist/src/hosts/claude-skill-activations.js +131 -0
  223. package/dist/src/hosts/claude-skill-activations.js.map +1 -0
  224. package/dist/src/hosts/claude-state.js +237 -0
  225. package/dist/src/hosts/claude-state.js.map +1 -0
  226. package/dist/src/hosts/claude-tool-calls.js +150 -0
  227. package/dist/src/hosts/claude-tool-calls.js.map +1 -0
  228. package/dist/src/hosts/claude.js +373 -0
  229. package/dist/src/hosts/claude.js.map +1 -0
  230. package/dist/src/hosts/codex-app-server.js +764 -0
  231. package/dist/src/hosts/codex-app-server.js.map +1 -0
  232. package/dist/src/hosts/codex-configuration.js +91 -0
  233. package/dist/src/hosts/codex-configuration.js.map +1 -0
  234. package/dist/src/hosts/codex-events.js +104 -0
  235. package/dist/src/hosts/codex-events.js.map +1 -0
  236. package/dist/src/hosts/codex-exec-controls.js +434 -0
  237. package/dist/src/hosts/codex-exec-controls.js.map +1 -0
  238. package/dist/src/hosts/codex-invocation.js +54 -0
  239. package/dist/src/hosts/codex-invocation.js.map +1 -0
  240. package/dist/src/hosts/codex-marketplace.js +185 -0
  241. package/dist/src/hosts/codex-marketplace.js.map +1 -0
  242. package/dist/src/hosts/codex-native-calls.js +516 -0
  243. package/dist/src/hosts/codex-native-calls.js.map +1 -0
  244. package/dist/src/hosts/codex-process.js +10 -0
  245. package/dist/src/hosts/codex-process.js.map +1 -0
  246. package/dist/src/hosts/codex-profile.js +206 -0
  247. package/dist/src/hosts/codex-profile.js.map +1 -0
  248. package/dist/src/hosts/codex-session-files.js +89 -0
  249. package/dist/src/hosts/codex-session-files.js.map +1 -0
  250. package/dist/src/hosts/codex-state.js +310 -0
  251. package/dist/src/hosts/codex-state.js.map +1 -0
  252. package/dist/src/hosts/codex.js +527 -0
  253. package/dist/src/hosts/codex.js.map +1 -0
  254. package/dist/src/hosts/isolation-common.js +43 -0
  255. package/dist/src/hosts/isolation-common.js.map +1 -0
  256. package/dist/src/hosts/isolation-roots.js +64 -0
  257. package/dist/src/hosts/isolation-roots.js.map +1 -0
  258. package/dist/src/hosts/isolation.js +12 -0
  259. package/dist/src/hosts/isolation.js.map +1 -0
  260. package/dist/src/hosts/linux-sandbox.js +127 -0
  261. package/dist/src/hosts/linux-sandbox.js.map +1 -0
  262. package/dist/src/hosts/mac-sandbox.js +137 -0
  263. package/dist/src/hosts/mac-sandbox.js.map +1 -0
  264. package/dist/src/hosts/native-controls.js +151 -0
  265. package/dist/src/hosts/native-controls.js.map +1 -0
  266. package/dist/src/hosts/native-request.js +33 -0
  267. package/dist/src/hosts/native-request.js.map +1 -0
  268. package/dist/src/hosts/process-lifecycle.js +167 -0
  269. package/dist/src/hosts/process-lifecycle.js.map +1 -0
  270. package/dist/src/hosts/protected-worktrees.js +81 -0
  271. package/dist/src/hosts/protected-worktrees.js.map +1 -0
  272. package/dist/src/hosts/skill-hook-catalog.js +100 -0
  273. package/dist/src/hosts/skill-hook-catalog.js.map +1 -0
  274. package/dist/src/hosts/skill-hook-handler.js +228 -0
  275. package/dist/src/hosts/skill-hook-handler.js.map +1 -0
  276. package/dist/src/hosts/skill-hooks.js +423 -0
  277. package/dist/src/hosts/skill-hooks.js.map +1 -0
  278. package/dist/src/hosts/workspace-fingerprint.js +72 -0
  279. package/dist/src/hosts/workspace-fingerprint.js.map +1 -0
  280. package/dist/src/identity.js +167 -0
  281. package/dist/src/identity.js.map +1 -0
  282. package/dist/src/instrumentation.js +83 -0
  283. package/dist/src/instrumentation.js.map +1 -0
  284. package/dist/src/native-transcript-state.js +85 -0
  285. package/dist/src/native-transcript-state.js.map +1 -0
  286. package/dist/src/native-transcript-view.js +65 -0
  287. package/dist/src/native-transcript-view.js.map +1 -0
  288. package/dist/src/native-transcripts.js +208 -0
  289. package/dist/src/native-transcripts.js.map +1 -0
  290. package/dist/src/paths.js +13 -0
  291. package/dist/src/paths.js.map +1 -0
  292. package/dist/src/process-lifecycle.js +101 -0
  293. package/dist/src/process-lifecycle.js.map +1 -0
  294. package/dist/src/provenance.js +263 -0
  295. package/dist/src/provenance.js.map +1 -0
  296. package/dist/src/prune.js +228 -0
  297. package/dist/src/prune.js.map +1 -0
  298. package/dist/src/report.js +276 -0
  299. package/dist/src/report.js.map +1 -0
  300. package/dist/src/resolved-case.js +29 -0
  301. package/dist/src/resolved-case.js.map +1 -0
  302. package/dist/src/results-lock.js +40 -0
  303. package/dist/src/results-lock.js.map +1 -0
  304. package/dist/src/results.js +127 -0
  305. package/dist/src/results.js.map +1 -0
  306. package/dist/src/run-owner.js +283 -0
  307. package/dist/src/run-owner.js.map +1 -0
  308. package/dist/src/runner-paths.js +11 -0
  309. package/dist/src/runner-paths.js.map +1 -0
  310. package/dist/src/runtime/config.js +323 -0
  311. package/dist/src/runtime/config.js.map +1 -0
  312. package/dist/src/runtime/discovery-apple.js +65 -0
  313. package/dist/src/runtime/discovery-apple.js.map +1 -0
  314. package/dist/src/runtime/discovery-providers.js +37 -0
  315. package/dist/src/runtime/discovery-providers.js.map +1 -0
  316. package/dist/src/runtime/discovery.js +40 -0
  317. package/dist/src/runtime/discovery.js.map +1 -0
  318. package/dist/src/runtime/hook-processes.js +81 -0
  319. package/dist/src/runtime/hook-processes.js.map +1 -0
  320. package/dist/src/runtime/hooks.js +304 -0
  321. package/dist/src/runtime/hooks.js.map +1 -0
  322. package/dist/src/runtime/paths.js +244 -0
  323. package/dist/src/runtime/paths.js.map +1 -0
  324. package/dist/src/runtime/query.js +76 -0
  325. package/dist/src/runtime/query.js.map +1 -0
  326. package/dist/src/runtime/seeds.js +98 -0
  327. package/dist/src/runtime/seeds.js.map +1 -0
  328. package/dist/src/runtime/shared-cache.js +81 -0
  329. package/dist/src/runtime/shared-cache.js.map +1 -0
  330. package/dist/src/runtime/state.js +106 -0
  331. package/dist/src/runtime/state.js.map +1 -0
  332. package/dist/src/runtime-process.js +148 -0
  333. package/dist/src/runtime-process.js.map +1 -0
  334. package/dist/src/schema-types.js +2 -0
  335. package/dist/src/schema-types.js.map +1 -0
  336. package/dist/src/schema.js +16 -0
  337. package/dist/src/schema.js.map +1 -0
  338. package/dist/src/shell.js +5 -0
  339. package/dist/src/shell.js.map +1 -0
  340. package/dist/src/sqlite-lock.js +18 -0
  341. package/dist/src/sqlite-lock.js.map +1 -0
  342. package/dist/src/storage.js +21 -0
  343. package/dist/src/storage.js.map +1 -0
  344. package/dist/src/transcript-retention.js +109 -0
  345. package/dist/src/transcript-retention.js.map +1 -0
  346. package/dist/src/value-guards.js +26 -0
  347. package/dist/src/value-guards.js.map +1 -0
  348. package/docs/README.md +19 -15
  349. package/docs/architecture.md +141 -17
  350. package/docs/assets/README.md +5 -4
  351. package/docs/builtin-graders-v1.md +9 -2
  352. package/docs/codex-host.md +155 -57
  353. package/docs/contracts.md +2 -1
  354. package/docs/creating-cases.md +10 -4
  355. package/docs/development-cli.md +197 -24
  356. package/docs/documentation-quality.md +16 -5
  357. package/docs/evaluation-workflow.md +110 -0
  358. package/docs/extension-protocol-v1.md +26 -3
  359. package/docs/getting-started.md +29 -7
  360. package/docs/guide-evaluation.md +34 -2
  361. package/docs/identity-v1.md +29 -3
  362. package/docs/installing.md +35 -17
  363. package/docs/licensing.md +2 -2
  364. package/docs/native-controls.md +76 -5
  365. package/docs/native-hosts.md +197 -8
  366. package/docs/reading-results.md +102 -0
  367. package/docs/recipes.md +490 -0
  368. package/docs/releases.md +48 -13
  369. package/docs/report-v1.md +29 -1
  370. package/docs/results-v1.md +122 -4
  371. package/docs/run-settings-v1.md +147 -0
  372. package/docs/runtime-v1.md +255 -22
  373. package/docs/specs/repository-guide.md +1 -1
  374. package/docs/troubleshooting.md +12 -12
  375. package/docs/typescript-quality.md +106 -26
  376. package/examples/recipes/candidate.ts +26 -0
  377. package/examples/recipes/cases/coding-change.json +21 -0
  378. package/examples/recipes/cases/host-tools.json +21 -0
  379. package/examples/recipes/cases/mise.json +21 -0
  380. package/examples/recipes/cases/node.json +21 -0
  381. package/examples/recipes/cases/python-uv.json +21 -0
  382. package/examples/recipes/cases/semantic.json +17 -0
  383. package/examples/recipes/coding-change/check.ts +23 -0
  384. package/examples/recipes/executable.ts +19 -0
  385. package/examples/recipes/extension-artifacts.ts +65 -0
  386. package/examples/recipes/extension-methods.ts +174 -0
  387. package/examples/recipes/extension.ts +38 -0
  388. package/examples/recipes/modules.ts +9 -0
  389. package/examples/recipes/repository-skill/.agents/skills/startup-guide/SKILL.md +7 -0
  390. package/examples/recipes/repository-skill/.claude/skills/startup-guide/SKILL.md +7 -0
  391. package/examples/recipes/repository-skill/README.md +3 -0
  392. package/examples/recipes/run-inputs.ts +183 -0
  393. package/examples/recipes/run-options.ts +132 -0
  394. package/examples/recipes/run.ts +77 -0
  395. package/examples/recipes/runtime/empty.json +1 -0
  396. package/examples/recipes/runtime/goals.json +1 -0
  397. package/examples/recipes/runtime/mise.json +6 -0
  398. package/examples/recipes/runtime/path.json +1 -0
  399. package/examples/recipes/runtime/plugins.json +4 -0
  400. package/examples/recipes/runtime/python-uv.json +10 -0
  401. package/examples/recipes/semantic-judge.ts +29 -0
  402. package/examples/templates/coding/adapter.ts +17 -0
  403. package/examples/templates/coding/case.json +15 -0
  404. package/examples/templates/repository-skill/.agents/skills/startup-guide/SKILL.md +6 -0
  405. package/examples/templates/repository-skill/extension-data.ts +64 -0
  406. package/examples/templates/repository-skill/extension.ts +32 -0
  407. package/examples/templates/response/adapter.ts +12 -0
  408. package/examples/templates/response/case.json +13 -0
  409. package/package.json +23 -9
  410. package/schemas/report-v1.schema.json +9 -0
  411. package/schemas/run-evidence-v1.schema.json +2 -1
  412. package/schemas/runtime-v1.schema.json +43 -7
  413. package/src/advisory.ts +2 -2
  414. package/src/candidate-artifacts.ts +42 -11
  415. package/src/candidate-codex-state.ts +185 -0
  416. package/src/case-validation.ts +73 -50
  417. package/src/cli/cancellation.ts +20 -0
  418. package/src/cli/command.ts +87 -0
  419. package/src/cli/completion.ts +15 -0
  420. package/src/cli/demo.ts +61 -0
  421. package/src/cli/evaluation.ts +55 -0
  422. package/src/cli/extension.ts +79 -0
  423. package/src/cli/help.ts +199 -0
  424. package/src/cli/hosts.ts +55 -0
  425. package/src/cli/init-settings.ts +31 -0
  426. package/src/cli/init.ts +112 -0
  427. package/src/{cli-invocation.ts → cli/invocation.ts} +215 -218
  428. package/src/cli/loading.ts +151 -0
  429. package/src/cli/preparation.ts +154 -0
  430. package/src/cli/presentation.ts +93 -0
  431. package/src/cli/progress.ts +6 -0
  432. package/src/cli/run-manifest.ts +128 -0
  433. package/src/cli/run-options.ts +403 -0
  434. package/src/cli/run-overrides.ts +69 -0
  435. package/src/cli/settings.ts +154 -0
  436. package/src/cli/summary.ts +43 -0
  437. package/src/cli.ts +14 -592
  438. package/src/contract-types.ts +94 -0
  439. package/src/engine.ts +9 -5
  440. package/src/evaluation/advisory.ts +150 -0
  441. package/src/{evaluation-check-plan.ts → evaluation/check-plan.ts} +103 -67
  442. package/src/evaluation/collection.ts +88 -0
  443. package/src/evaluation/context.ts +10 -0
  444. package/src/{evaluation-grading-host.ts → evaluation/grading-host.ts} +5 -5
  445. package/src/evaluation/grading.ts +235 -0
  446. package/src/{evaluation-invocation-plan.ts → evaluation/invocation-plan.ts} +147 -58
  447. package/src/{evaluation-plan.ts → evaluation/plan.ts} +208 -141
  448. package/src/evaluation/progress.ts +19 -0
  449. package/src/evaluation/resources.ts +241 -0
  450. package/src/evaluation/run.ts +206 -0
  451. package/src/{evaluation-semantic.ts → evaluation/semantic.ts} +77 -87
  452. package/src/evaluation/trial.ts +800 -0
  453. package/src/{evaluation-types.ts → evaluation/types.ts} +79 -29
  454. package/src/evidence/host-results.ts +85 -0
  455. package/src/evidence/retained-artifacts.ts +18 -0
  456. package/src/evidence/trial-writer.ts +203 -0
  457. package/src/evidence/usage.ts +17 -0
  458. package/src/executable.ts +19 -0
  459. package/src/extension-client.ts +40 -108
  460. package/src/extension-session.ts +24 -48
  461. package/src/{advisory-fixture.ts → fixtures/advisory.ts} +12 -72
  462. package/src/{fixture-bin.ts → fixtures/bin.ts} +1 -1
  463. package/src/{fixture-cleanup.ts → fixtures/cleanup.ts} +13 -7
  464. package/src/fixtures/create.ts +183 -0
  465. package/src/{generated-fixture.ts → fixtures/generated.ts} +10 -53
  466. package/src/{git-hooks.ts → fixtures/git-hooks.ts} +1 -1
  467. package/src/{preparation.ts → fixtures/preparation.ts} +6 -16
  468. package/src/{repository-fixture.ts → fixtures/repository.ts} +30 -64
  469. package/src/{fixture-setup.ts → fixtures/setup.ts} +36 -53
  470. package/src/{fixture-tools.ts → fixtures/tools.ts} +1 -1
  471. package/src/{workspace-state.ts → fixtures/workspace-state.ts} +5 -5
  472. package/src/generated/cli-result.d.cts +2 -1
  473. package/src/generated/extension.d.cts +2 -1
  474. package/src/generated/report.cjs +1 -1
  475. package/src/generated/report.d.cts +2 -1
  476. package/src/generated/run-evidence.cjs +1 -1
  477. package/src/generated/run-evidence.d.cts +2 -1
  478. package/src/generated/runtime.cjs +1 -1
  479. package/src/generated/runtime.d.cts +2 -1
  480. package/src/git.ts +94 -0
  481. package/src/graders/git-head.ts +31 -85
  482. package/src/graders/shell.ts +54 -71
  483. package/src/host-diagnostic-redaction.ts +52 -0
  484. package/src/host-diagnostics.ts +331 -0
  485. package/src/hosts/claude-continuation.ts +57 -40
  486. package/src/hosts/claude-credential.ts +160 -63
  487. package/src/hosts/claude-events.ts +34 -18
  488. package/src/hosts/claude-keychain.ts +79 -21
  489. package/src/hosts/claude-login-recovery.ts +85 -0
  490. package/src/hosts/claude-login-refresh.ts +179 -0
  491. package/src/hosts/claude-login-store.ts +162 -0
  492. package/src/hosts/claude-login.ts +107 -0
  493. package/src/hosts/claude-native-goal.ts +15 -12
  494. package/src/hosts/claude-process.ts +10 -50
  495. package/src/hosts/claude-refresh-lock.ts +82 -0
  496. package/src/hosts/claude-repository-invocation.ts +9 -34
  497. package/src/hosts/claude-settings.ts +46 -9
  498. package/src/hosts/claude-skill-activations.ts +169 -0
  499. package/src/hosts/claude-state.ts +28 -15
  500. package/src/hosts/claude-tool-calls.ts +13 -10
  501. package/src/hosts/claude.ts +121 -81
  502. package/src/hosts/codex-app-server.ts +78 -52
  503. package/src/hosts/codex-configuration.ts +5 -10
  504. package/src/hosts/codex-exec-controls.ts +516 -0
  505. package/src/hosts/codex-marketplace.ts +12 -10
  506. package/src/hosts/codex-native-calls.ts +15 -122
  507. package/src/hosts/codex-process.ts +10 -183
  508. package/src/hosts/codex-profile.ts +36 -21
  509. package/src/hosts/codex-session-files.ts +1 -9
  510. package/src/hosts/codex-state.ts +134 -18
  511. package/src/hosts/codex.ts +210 -183
  512. package/src/hosts/isolation-common.ts +8 -11
  513. package/src/hosts/isolation-roots.ts +5 -4
  514. package/src/hosts/linux-sandbox.ts +15 -2
  515. package/src/hosts/mac-sandbox.ts +87 -18
  516. package/src/hosts/native-controls.ts +72 -22
  517. package/src/hosts/native-request.ts +55 -0
  518. package/src/hosts/process-lifecycle.ts +215 -49
  519. package/src/hosts/protected-worktrees.ts +3 -2
  520. package/src/hosts/skill-hook-catalog.ts +131 -0
  521. package/src/hosts/skill-hook-handler.ts +374 -0
  522. package/src/hosts/skill-hooks.ts +585 -0
  523. package/src/instrumentation.ts +7 -8
  524. package/src/native-transcript-state.ts +22 -3
  525. package/src/native-transcript-view.ts +52 -13
  526. package/src/native-transcripts.ts +26 -11
  527. package/src/paths.ts +22 -0
  528. package/src/process-lifecycle.ts +150 -0
  529. package/src/provenance.ts +34 -13
  530. package/src/prune.ts +300 -0
  531. package/src/report.ts +63 -36
  532. package/src/resolved-case.ts +1 -1
  533. package/src/results-lock.ts +42 -0
  534. package/src/results.ts +14 -18
  535. package/src/run-owner.ts +15 -9
  536. package/src/runner-paths.ts +21 -0
  537. package/src/{runtime-config.ts → runtime/config.ts} +160 -46
  538. package/src/{runtime-discovery-apple.ts → runtime/discovery-apple.ts} +3 -3
  539. package/src/{runtime-discovery-providers.ts → runtime/discovery-providers.ts} +3 -9
  540. package/src/{runtime-discovery.ts → runtime/discovery.ts} +4 -4
  541. package/src/{runtime-hook-processes.ts → runtime/hook-processes.ts} +3 -2
  542. package/src/{runtime-hooks.ts → runtime/hooks.ts} +40 -28
  543. package/src/{runtime-paths.ts → runtime/paths.ts} +5 -19
  544. package/src/{runtime-query.ts → runtime/query.ts} +5 -5
  545. package/src/{runtime-seeds.ts → runtime/seeds.ts} +3 -3
  546. package/src/runtime/shared-cache.ts +130 -0
  547. package/src/{runtime-state.ts → runtime/state.ts} +28 -11
  548. package/src/runtime-process.ts +194 -0
  549. package/src/schema-types.ts +73 -161
  550. package/src/shell.ts +4 -0
  551. package/src/sqlite-lock.ts +25 -0
  552. package/src/transcript-retention.ts +146 -0
  553. package/src/value-guards.ts +22 -0
  554. package/docs/assets/sevro-logo.png +0 -0
  555. package/docs/assets/sevro-symbol.svg +0 -1
  556. package/docs/assets/sevro-wordmark.svg +0 -1
  557. package/docs/cache-ownership-validation.md +0 -49
  558. package/docs/claude-continuation-validation.md +0 -47
  559. package/docs/concurrency-validation.md +0 -86
  560. package/docs/configuration-root-validation.md +0 -70
  561. package/docs/engine-slice.md +0 -114
  562. package/docs/evidence/runtime-startup-30/README.md +0 -185
  563. package/docs/evidence/runtime-startup-30/after.json +0 -319
  564. package/docs/evidence/runtime-startup-30/baseline-timeout.jsonl +0 -2
  565. package/docs/evidence/runtime-startup-30/before.json +0 -403
  566. package/docs/evidence/runtime-startup-30/consumer-smoke.json +0 -63
  567. package/docs/evidence/runtime-startup-30/full-policy-diagnostic.jsonl +0 -3
  568. package/docs/evidence/runtime-startup-30/minimal-policy-diagnostic.jsonl +0 -3
  569. package/docs/evidence/runtime-startup-30/plugin-template-assessment.json +0 -20
  570. package/docs/evidence/runtime-startup-30/seedless-timeout.jsonl +0 -2
  571. package/docs/evidence.md +0 -17
  572. package/docs/fixture-cleanup-validation.md +0 -73
  573. package/docs/guide-verification.json +0 -239
  574. package/src/evaluation-context.ts +0 -259
  575. package/src/evaluation-fixture.ts +0 -302
  576. package/src/evaluation-run.ts +0 -200
  577. package/src/evaluation-trial.ts +0 -1016
  578. package/src/hosts/claude-nested-skills.ts +0 -272
  579. package/src/hosts/codex-command-output.ts +0 -510
  580. package/src/hosts/codex-executor-command.ts +0 -291
  581. package/src/hosts/codex-skill-reads.ts +0 -783
  582. /package/src/{trial-scheduler.ts → evaluation/scheduler.ts} +0 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=schema-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-types.js","sourceRoot":"","sources":["schema-types.ts"],"names":[],"mappings":"","sourcesContent":["import type { AdvisoryAssessment } from \"./advisory\";\nimport type {\n ArtifactReference,\n Assessment,\n CheckOutcome,\n Diagnostic,\n DomainOutcome,\n EvidenceRoute,\n ExecutionStatus,\n ExitCode,\n GradingStatus,\n MetricEvidence,\n ObservationCompleteness,\n ObservationEvidence,\n OutcomeStatus,\n RawResultReference,\n TaskVerdict,\n UsageEvidence,\n} from \"./contract-types\";\nimport type { IdentityDimensions } from \"./identity\";\nimport type { InstrumentationRequest } from \"./instrumentation\";\n\n/** Wire assessments additionally allow optional serialized error codes. */\nexport type WireAssessment = {\n execution: Assessment[\"execution\"] & { errorCode?: string };\n grading: Assessment[\"grading\"] & { errorCode?: string };\n task: Assessment[\"task\"];\n};\n\n/** Validated v1 wire data also represents failures before run allocation. */\nexport type CliResultData = WireAssessment & {\n format: \"sevro.cli-result.v1\";\n runId: string | null;\n exitCode: ExitCode;\n evidencePath: string | null;\n cases: Array<CliResultDataCase>;\n diagnostic?: Diagnostic;\n};\nexport type CliResultDataTrial = WireAssessment & {\n trial: number;\n checks: Array<CheckOutcome>;\n domainOutcomes?: Array<DomainOutcome>;\n artifactPath: string | null;\n};\nexport type CliResultDataCase = WireAssessment & {\n caseId: string;\n trials: Array<CliResultDataTrial>;\n};\n\n/** Structural contracts for data validated by the versioned JSON schemas. */\nexport type RunEvidenceData = {\n format: \"sevro.run-evidence.v1\";\n runId: string;\n evaluationIdentity: {\n algorithm: \"sevro.identity.v1\";\n digest: RunEvidenceDataDigest;\n dimensions: IdentityDimensions;\n };\n configuration: {\n digest: RunEvidenceDataDigest;\n redacted: Record<string, unknown>;\n resolved?: Record<string, unknown>;\n };\n runner: RunEvidenceDataRunner;\n project: {\n root: RunEvidenceDataFileUrl;\n revision: string | null;\n dirtyPatchDigest: RunEvidenceDataDigest | null;\n };\n extension: null | RunEvidenceDataExtension;\n condition: {\n requested: \"passive\" | \"enforced\";\n actual: \"passive\" | \"enforced\" | \"unknown\";\n requestedInstrumentation: InstrumentationRequest[];\n appliedInstrumentation: InstrumentationRequest[];\n };\n graders: {\n active: Array<RunEvidenceDataGrader>;\n replacedDefaults: Array<string>;\n };\n routes: Array<EvidenceRoute>;\n result: CliResultData;\n trials: Array<RunEvidenceDataTrialEvidence>;\n diagnostic?: Diagnostic;\n};\ntype RunEvidenceDataDigest = string;\ntype RunEvidenceDataFileUrl = string;\ntype RunEvidenceDataRunner =\n | {\n source: \"package\";\n packageName: string;\n version: string;\n buildDigest: RunEvidenceDataDigest;\n }\n | {\n source: \"checkout\";\n root: RunEvidenceDataFileUrl;\n revision: string;\n dirtyPatchDigest: RunEvidenceDataDigest | null;\n buildDigest: RunEvidenceDataDigest;\n };\ntype RunEvidenceDataExtension = {\n id: string;\n version: string;\n sourceDigest: RunEvidenceDataDigest;\n configurationDigest: RunEvidenceDataDigest;\n protocol: \"sevro.extension.v1\";\n capabilities: Array<string>;\n replacements: { graders: Array<string>; taskVerdictPolicy: string | null };\n};\ntype RunEvidenceDataGrader = {\n id: string;\n source: \"builtin\" | \"extension\";\n version: string;\n};\nexport type AdvisoryReviewData = {\n status: \"completed\" | \"failed\" | \"not_run\";\n assessment: AdvisoryAssessment | null;\n usage: UsageEvidence;\n rawResult: RawResultReference;\n};\nexport type RunEvidenceDataTrialEvidence = {\n caseId: string;\n trial: number;\n executionMode: \"executed\" | \"dry\" | \"unknown\";\n candidateDurationMs?: number | null;\n condition: {\n requested: \"passive\" | \"enforced\";\n actual: \"passive\" | \"enforced\" | \"unknown\";\n appliedInstrumentation: InstrumentationRequest[];\n };\n observationCompleteness: ObservationCompleteness;\n observations: Array<ObservationEvidence>;\n metrics: Array<MetricEvidence>;\n domainOutcomes?: Array<DomainOutcome>;\n taskVerdictPolicy: null | {\n id: string;\n recommendation: TaskVerdict | null;\n };\n advisoryReview?: AdvisoryReviewData | null;\n routes: Array<EvidenceRoute>;\n usage: UsageEvidence;\n rawResult: RawResultReference;\n artifactRefs: Array<ArtifactReference>;\n};\nexport type ReportData = {\n format: \"sevro.report.v1\";\n inputs: Array<ReportDataInput>;\n rows: Array<ReportDataRow>;\n summary: {\n cases: number;\n passed: number;\n failed: number;\n notAssessed: number;\n };\n};\ntype ReportDataPath = string;\ntype ReportDataDigest = string;\n/** The report wire schema deliberately allows either state family in rows. */\ntype ReportDataState = ExecutionStatus | GradingStatus;\ntype ReportDataInput = {\n resultFile: ReportDataPath;\n execution: ExecutionStatus;\n grading: GradingStatus;\n task: TaskVerdict;\n exitCode: ExitCode;\n caseCount: number;\n};\ntype ReportDataRoute = Omit<EvidenceRoute, \"role\">;\ntype ReportDataOutcome = {\n trial: number;\n id: string;\n status: OutcomeStatus;\n};\ntype ReportDataRow = {\n nativeTranscripts?: { retained: number; pruned: number };\n resultFile: ReportDataPath;\n evidencePath: string | null;\n runId: string | null;\n caseId: string;\n execution: ReportDataState;\n grading: ReportDataState;\n task: TaskVerdict;\n exitCode: ExitCode;\n trialCount: number;\n taskPassRate: number | null;\n candidateDurationMs: number | null;\n inputTokens: number | null;\n outputTokens: number | null;\n costUsd: number | null;\n runnerBuildDigest: ReportDataDigest | null;\n evaluationDigest: ReportDataDigest | null;\n requestedCondition: \"passive\" | \"enforced\" | null;\n actualCondition: \"passive\" | \"enforced\" | \"unknown\" | null;\n candidateRoute: ReportDataRoute | null;\n routes: Array<EvidenceRoute>;\n domainOutcomes: Array<ReportDataOutcome>;\n};\n"]}
@@ -0,0 +1,16 @@
1
+ import cliValidator from "./generated/cli-result.cjs";
2
+ import runValidator from "./generated/run-evidence.cjs";
3
+ import reportValidator from "./generated/report.cjs";
4
+ export function assertCliResult(value) {
5
+ if (!cliValidator(value))
6
+ throw new Error("invalid Sevro CLI result");
7
+ }
8
+ export function assertRunEvidence(value) {
9
+ if (!runValidator(value))
10
+ throw new Error("invalid Sevro retained evidence");
11
+ }
12
+ export function assertReport(value) {
13
+ if (!reportValidator(value))
14
+ throw new Error("invalid Sevro report");
15
+ }
16
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["schema.ts"],"names":[],"mappings":"AAKA,OAAO,YAAY,mCAAmC;AACtD,OAAO,YAAY,qCAAqC;AACxD,OAAO,eAAe,+BAA+B;AAErD,MAAM,UAAU,eAAe,CAC7B,KAAc;IAEd,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,KAAc;IAEd,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;AACvE,CAAC","sourcesContent":["import type {\n CliResultData,\n RunEvidenceData,\n ReportData,\n} from \"./schema-types\";\nimport cliValidator from \"./generated/cli-result.cjs\";\nimport runValidator from \"./generated/run-evidence.cjs\";\nimport reportValidator from \"./generated/report.cjs\";\n\nexport function assertCliResult(\n value: unknown,\n): asserts value is CliResultData {\n if (!cliValidator(value)) throw new Error(\"invalid Sevro CLI result\");\n}\n\nexport function assertRunEvidence(\n value: unknown,\n): asserts value is RunEvidenceData {\n if (!runValidator(value)) throw new Error(\"invalid Sevro retained evidence\");\n}\n\nexport function assertReport(value: unknown): asserts value is ReportData {\n if (!reportValidator(value)) throw new Error(\"invalid Sevro report\");\n}\n"]}
@@ -0,0 +1,5 @@
1
+ /** Encode one literal argument for a POSIX shell, including empty strings. */
2
+ export function shellQuote(value) {
3
+ return `'${value.replaceAll("'", `'"'"'`)}'`;
4
+ }
5
+ //# sourceMappingURL=shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["shell.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC;AAC/C,CAAC","sourcesContent":["/** Encode one literal argument for a POSIX shell, including empty strings. */\nexport function shellQuote(value: string): string {\n return `'${value.replaceAll(\"'\", `'\"'\"'`)}'`;\n}\n"]}
@@ -0,0 +1,18 @@
1
+ import { createRequire } from "node:module";
2
+ const require = createRequire(import.meta.url);
3
+ /** Both drivers use SQLite file locks, including across Node and Bun runners. */
4
+ export function openLockDatabase(path) {
5
+ if (process.versions.bun) {
6
+ const { Database } = require("bun:sqlite");
7
+ const database = new Database(path);
8
+ return {
9
+ exec: (sql) => database.run(sql),
10
+ close() {
11
+ database.close();
12
+ },
13
+ };
14
+ }
15
+ const { DatabaseSync } = require("node:sqlite");
16
+ return new DatabaseSync(path);
17
+ }
18
+ //# sourceMappingURL=sqlite-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-lock.js","sourceRoot":"","sources":["sqlite-lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAO/C,iFAAiF;AACjF,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,YAAY,CAAgC,CAAC;QAC1E,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;QACpC,OAAO;YACL,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;YAChC,KAAK;gBACH,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnB,CAAC;SACF,CAAC;IACJ,CAAC;IACD,MAAM,EAAE,YAAY,EAAE,GACpB,OAAO,CAAC,aAAa,CAAiC,CAAC;IACzD,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC","sourcesContent":["import { createRequire } from \"node:module\";\n\nconst require = createRequire(import.meta.url);\n\ninterface LockDatabase {\n exec(sql: string): unknown;\n close(): void;\n}\n\n/** Both drivers use SQLite file locks, including across Node and Bun runners. */\nexport function openLockDatabase(path: string): LockDatabase {\n if (process.versions.bun) {\n const { Database } = require(\"bun:sqlite\") as typeof import(\"bun:sqlite\");\n const database = new Database(path);\n return {\n exec: (sql) => database.run(sql),\n close() {\n database.close();\n },\n };\n }\n const { DatabaseSync } =\n require(\"node:sqlite\") as typeof import(\"node:sqlite\");\n return new DatabaseSync(path);\n}\n"]}
@@ -0,0 +1,21 @@
1
+ import { mkdir, rename, unlink, writeFile } from "node:fs/promises";
2
+ import { basename, dirname, join } from "node:path";
3
+ import { randomUUID } from "node:crypto";
4
+ /** Write a private JSON artifact and publish it with one atomic rename. */
5
+ export async function atomicWriteJson(path, value) {
6
+ const parent = dirname(path);
7
+ await mkdir(parent, { recursive: true, mode: 0o700 });
8
+ const temporary = join(parent, `.${basename(path)}.${randomUUID()}.tmp`);
9
+ try {
10
+ await writeFile(temporary, `${JSON.stringify(value, null, 2)}\n`, {
11
+ flag: "wx",
12
+ mode: 0o600,
13
+ });
14
+ await rename(temporary, path);
15
+ }
16
+ catch (error) {
17
+ await unlink(temporary).catch(() => { });
18
+ throw error;
19
+ }
20
+ }
21
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,yBAAyB;AACpE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB;AACpD,OAAO,EAAE,UAAU,EAAE,oBAAoB;AAEzC,2EAA2E;AAC3E,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAY,EACZ,KAAc;IAEd,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,UAAU,EAAE,MAAM,CAAC,CAAC;IACzE,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YAChE,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACxC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC","sourcesContent":["import { mkdir, rename, unlink, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, join } from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\n\n/** Write a private JSON artifact and publish it with one atomic rename. */\nexport async function atomicWriteJson(\n path: string,\n value: unknown,\n): Promise<void> {\n const parent = dirname(path);\n await mkdir(parent, { recursive: true, mode: 0o700 });\n const temporary = join(parent, `.${basename(path)}.${randomUUID()}.tmp`);\n try {\n await writeFile(temporary, `${JSON.stringify(value, null, 2)}\\n`, {\n flag: \"wx\",\n mode: 0o600,\n });\n await rename(temporary, path);\n } catch (error) {\n await unlink(temporary).catch(() => {});\n throw error;\n }\n}\n"]}
@@ -0,0 +1,109 @@
1
+ import { readFile, rm } from "node:fs/promises";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { canonicalJson, sha256 } from "./identity.js";
5
+ import { retainedFile } from "./results-lock.js";
6
+ import { atomicWriteJson } from "./storage.js";
7
+ function isNativeTranscript(artifact) {
8
+ return /^(?:sevro\.(?:semantic(?:\.[a-f0-9]{64})?|advisory)\.)?sevro\.native-transcripts\.bundle$/.test(artifact.id);
9
+ }
10
+ function transcriptArtifacts(evidence) {
11
+ return evidence.trials.flatMap((trial) => trial.artifactRefs.filter(isNativeTranscript).map((artifact) => ({
12
+ caseId: trial.caseId,
13
+ trial: trial.trial,
14
+ ...artifact,
15
+ })));
16
+ }
17
+ function pruningRecord(evidence) {
18
+ return {
19
+ format: "sevro.pruned-native-transcripts.v1",
20
+ runId: evidence.runId,
21
+ artifacts: transcriptArtifacts(evidence),
22
+ };
23
+ }
24
+ function pruningPath(evidence) {
25
+ if (evidence.result.evidencePath === null)
26
+ throw new Error("native transcript retention requires a retained evidence path");
27
+ return join(dirname(evidence.result.evidencePath), "native-transcripts-pruned.json");
28
+ }
29
+ function transcriptPath(evidence, artifact) {
30
+ const path = fileURLToPath(artifact.path);
31
+ if (dirname(path) !== dirname(pruningPath(evidence)))
32
+ throw new Error("native transcript artifact is outside its retained result directory");
33
+ if (metadataPaths(evidence).includes(path))
34
+ throw new Error("native transcript artifact aliases retained result metadata");
35
+ if (otherArtifactPaths(evidence).includes(path))
36
+ throw new Error("native transcript artifact aliases other retained evidence");
37
+ return path;
38
+ }
39
+ function otherArtifactPaths(evidence) {
40
+ return evidence.trials
41
+ .flatMap((trial) => [
42
+ trial.rawResult.path,
43
+ trial.advisoryReview?.rawResult.path,
44
+ ...trial.artifactRefs
45
+ .filter((ref) => !isNativeTranscript(ref))
46
+ .map((ref) => ref.path),
47
+ ])
48
+ .filter((path) => path != null)
49
+ .map((path) => fileURLToPath(path));
50
+ }
51
+ function metadataPaths(evidence) {
52
+ const receipt = pruningPath(evidence);
53
+ return [
54
+ receipt,
55
+ evidence.result.evidencePath,
56
+ join(dirname(receipt), "result.json"),
57
+ join(dirname(receipt), "latest.json"),
58
+ ...evidence.result.cases.flatMap((selected) => selected.trials.map((trial) => trial.artifactPath)),
59
+ ];
60
+ }
61
+ async function transcriptPresent(evidence, artifact) {
62
+ const path = transcriptPath(evidence, artifact);
63
+ if (!(await retainedFile(path)))
64
+ return false;
65
+ if (sha256(await readFile(path)) !== artifact.sha256)
66
+ throw new Error("retained native transcript evidence hash differs");
67
+ return true;
68
+ }
69
+ /** Keep capture evidence immutable; a separate receipt records intentional removal. */
70
+ export async function pruneNativeTranscripts(evidence) {
71
+ const artifacts = transcriptArtifacts(evidence);
72
+ if (!artifacts.length)
73
+ return 0;
74
+ await atomicWriteJson(pruningPath(evidence), pruningRecord(evidence));
75
+ let removed = 0;
76
+ for (const artifact of artifacts) {
77
+ const path = transcriptPath(evidence, artifact);
78
+ if (!(await retainedFile(path)))
79
+ continue;
80
+ await rm(path);
81
+ removed++;
82
+ }
83
+ return removed;
84
+ }
85
+ /** Missing native bytes require an exact receipt bound to their original references. */
86
+ async function hasPruningRecord(evidence) {
87
+ const path = pruningPath(evidence);
88
+ const marked = await retainedFile(path);
89
+ if (marked) {
90
+ const receipt = JSON.parse(await readFile(path, "utf8"));
91
+ if (canonicalJson(receipt) !== canonicalJson(pruningRecord(evidence)))
92
+ throw new Error("native transcript pruning record differs from retained evidence");
93
+ }
94
+ return marked !== null;
95
+ }
96
+ export async function nativeTranscriptRetention(evidence) {
97
+ if (!evidence)
98
+ return [];
99
+ const marked = await hasPruningRecord(evidence);
100
+ const states = [];
101
+ for (const artifact of transcriptArtifacts(evidence)) {
102
+ const present = await transcriptPresent(evidence, artifact);
103
+ if (!present && !marked)
104
+ throw new Error("retained native transcript evidence is missing without a pruning record");
105
+ states.push({ caseId: artifact.caseId, pruned: !present });
106
+ }
107
+ return states;
108
+ }
109
+ //# sourceMappingURL=transcript-retention.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-retention.js","sourceRoot":"","sources":["transcript-retention.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile, rm } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { RunEvidenceData } from \"./schema-types\";\nimport { canonicalJson, sha256 } from \"./identity\";\nimport type { ArtifactReference } from \"./contract-types\";\nimport { retainedFile } from \"./results-lock\";\nimport { atomicWriteJson } from \"./storage\";\n\nfunction isNativeTranscript(artifact: ArtifactReference) {\n return /^(?:sevro\\.(?:semantic(?:\\.[a-f0-9]{64})?|advisory)\\.)?sevro\\.native-transcripts\\.bundle$/.test(\n artifact.id,\n );\n}\n\nfunction transcriptArtifacts(evidence: RunEvidenceData) {\n return evidence.trials.flatMap((trial) =>\n trial.artifactRefs.filter(isNativeTranscript).map((artifact) => ({\n caseId: trial.caseId,\n trial: trial.trial,\n ...artifact,\n })),\n );\n}\n\nfunction pruningRecord(evidence: RunEvidenceData) {\n return {\n format: \"sevro.pruned-native-transcripts.v1\",\n runId: evidence.runId,\n artifacts: transcriptArtifacts(evidence),\n };\n}\n\nfunction pruningPath(evidence: RunEvidenceData) {\n if (evidence.result.evidencePath === null)\n throw new Error(\n \"native transcript retention requires a retained evidence path\",\n );\n return join(\n dirname(evidence.result.evidencePath),\n \"native-transcripts-pruned.json\",\n );\n}\n\nfunction transcriptPath(\n evidence: RunEvidenceData,\n artifact: ArtifactReference,\n) {\n const path = fileURLToPath(artifact.path);\n if (dirname(path) !== dirname(pruningPath(evidence)))\n throw new Error(\n \"native transcript artifact is outside its retained result directory\",\n );\n if (metadataPaths(evidence).includes(path))\n throw new Error(\n \"native transcript artifact aliases retained result metadata\",\n );\n if (otherArtifactPaths(evidence).includes(path))\n throw new Error(\n \"native transcript artifact aliases other retained evidence\",\n );\n return path;\n}\n\nfunction otherArtifactPaths(evidence: RunEvidenceData) {\n return evidence.trials\n .flatMap((trial) => [\n trial.rawResult.path,\n trial.advisoryReview?.rawResult.path,\n ...trial.artifactRefs\n .filter((ref) => !isNativeTranscript(ref))\n .map((ref) => ref.path),\n ])\n .filter((path): path is string => path != null)\n .map((path) => fileURLToPath(path));\n}\n\nfunction metadataPaths(evidence: RunEvidenceData) {\n const receipt = pruningPath(evidence);\n return [\n receipt,\n evidence.result.evidencePath,\n join(dirname(receipt), \"result.json\"),\n join(dirname(receipt), \"latest.json\"),\n ...evidence.result.cases.flatMap((selected) =>\n selected.trials.map((trial) => trial.artifactPath),\n ),\n ];\n}\n\nasync function transcriptPresent(\n evidence: RunEvidenceData,\n artifact: ArtifactReference,\n) {\n const path = transcriptPath(evidence, artifact);\n if (!(await retainedFile(path))) return false;\n if (sha256(await readFile(path)) !== artifact.sha256)\n throw new Error(\"retained native transcript evidence hash differs\");\n return true;\n}\n\n/** Keep capture evidence immutable; a separate receipt records intentional removal. */\nexport async function pruneNativeTranscripts(evidence: RunEvidenceData) {\n const artifacts = transcriptArtifacts(evidence);\n if (!artifacts.length) return 0;\n await atomicWriteJson(pruningPath(evidence), pruningRecord(evidence));\n let removed = 0;\n for (const artifact of artifacts) {\n const path = transcriptPath(evidence, artifact);\n if (!(await retainedFile(path))) continue;\n await rm(path);\n removed++;\n }\n return removed;\n}\n\n/** Missing native bytes require an exact receipt bound to their original references. */\nasync function hasPruningRecord(evidence: RunEvidenceData) {\n const path = pruningPath(evidence);\n const marked = await retainedFile(path);\n if (marked) {\n const receipt: unknown = JSON.parse(await readFile(path, \"utf8\"));\n if (canonicalJson(receipt) !== canonicalJson(pruningRecord(evidence)))\n throw new Error(\n \"native transcript pruning record differs from retained evidence\",\n );\n }\n return marked !== null;\n}\n\nexport async function nativeTranscriptRetention(\n evidence: RunEvidenceData | null,\n) {\n if (!evidence) return [];\n const marked = await hasPruningRecord(evidence);\n const states = [];\n for (const artifact of transcriptArtifacts(evidence)) {\n const present = await transcriptPresent(evidence, artifact);\n if (!present && !marked)\n throw new Error(\n \"retained native transcript evidence is missing without a pruning record\",\n );\n states.push({ caseId: artifact.caseId, pruned: !present });\n }\n return states;\n}\n"]}
@@ -0,0 +1,26 @@
1
+ /** Narrow JSON containers before accessing untrusted members. */
2
+ export function isRecord(value) {
3
+ return value !== null && typeof value === "object" && !Array.isArray(value);
4
+ }
5
+ export function requireRecord(value, message) {
6
+ if (!isRecord(value))
7
+ throw new Error(message);
8
+ return value;
9
+ }
10
+ export function validQualifiedId(value) {
11
+ return (typeof value === "string" &&
12
+ /^[a-z][a-z0-9]*(?:[.-][a-z0-9]+)+$/.test(value));
13
+ }
14
+ export function containsControl(value) {
15
+ return Array.from(value).some((character) => character.charCodeAt(0) < 0x20 || character.charCodeAt(0) === 0x7f);
16
+ }
17
+ export function isUnknownArray(value) {
18
+ return Array.isArray(value);
19
+ }
20
+ export function isStringArray(value) {
21
+ return (isUnknownArray(value) && value.every((item) => typeof item === "string"));
22
+ }
23
+ export function isOptionalNonblankString(value) {
24
+ return (value === undefined || (typeof value === "string" && Boolean(value.trim())));
25
+ }
26
+ //# sourceMappingURL=value-guards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"value-guards.js","sourceRoot":"","sources":["value-guards.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,KAAc,EACd,OAAe;IAEf,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,oCAAoC,CAAC,IAAI,CAAC,KAAK,CAAC,CACjD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAC3B,CAAC,SAAS,EAAE,EAAE,CACZ,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CACrE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,CACL,cAAc,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CACzE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACrD,OAAO,CACL,KAAK,KAAK,SAAS,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAC5E,CAAC;AACJ,CAAC","sourcesContent":["/** Narrow JSON containers before accessing untrusted members. */\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function requireRecord(\n value: unknown,\n message: string,\n): Record<string, unknown> {\n if (!isRecord(value)) throw new Error(message);\n return value;\n}\n\nexport function validQualifiedId(value: unknown): value is string {\n return (\n typeof value === \"string\" &&\n /^[a-z][a-z0-9]*(?:[.-][a-z0-9]+)+$/.test(value)\n );\n}\n\nexport function containsControl(value: string): boolean {\n return Array.from(value).some(\n (character) =>\n character.charCodeAt(0) < 0x20 || character.charCodeAt(0) === 0x7f,\n );\n}\n\nexport function isUnknownArray(value: unknown): value is unknown[] {\n return Array.isArray(value);\n}\n\nexport function isStringArray(value: unknown): value is string[] {\n return (\n isUnknownArray(value) && value.every((item) => typeof item === \"string\")\n );\n}\n\nexport function isOptionalNonblankString(value: unknown): boolean {\n return (\n value === undefined || (typeof value === \"string\" && Boolean(value.trim()))\n );\n}\n"]}
package/docs/README.md CHANGED
@@ -1,22 +1,25 @@
1
1
  # Sevro documentation
2
2
 
3
- <img src="assets/sevro-wordmark.svg" alt="Sevro wordmark" width="220">
3
+ <img src="https://raw.githubusercontent.com/BjRo/sevro/main/docs/assets/sevro-wordmark.svg" alt="Sevro wordmark" width="220">
4
4
 
5
5
  Start with the task you want to complete. These pages work without an agent.
6
6
 
7
- | I want to… | Read |
8
- | --------------------------------------------- | -------------------------------------------------------- |
9
- | Get a result without a model account | [Your first evaluation](getting-started.md) |
10
- | Install, update, remove, or use a checkout | [Installation](installing.md) |
11
- | Run evaluations and select a host | [Running evaluations](running-evaluations.md) |
12
- | Create cases and reusable policy | [Cases and extensions](creating-cases.md) |
13
- | Interpret verdicts, evidence, and comparisons | [Reading results](reading-results.md) |
14
- | Run Codex or Claude with isolation | [Native hosts](native-hosts.md) |
15
- | Reuse host tools or enable goals and hooks | [Runtime configuration](runtime-v1.md) |
16
- | Resolve a symptom | [Troubleshooting](troubleshooting.md) |
17
- | Understand runner responsibilities | [Architecture](architecture.md) |
18
- | Change Sevro or its documentation | [Contributing](../CONTRIBUTING.md) |
19
- | Understand licensing and branding | [Licensing](licensing.md) and [assets](assets/README.md) |
7
+ | I want to… | Read |
8
+ | ---------------------------------------------- | -------------------------------------------------------- |
9
+ | Get a result without a model account | [Your first evaluation](getting-started.md) |
10
+ | Initialize, prepare, run and iterate | [Evaluation workflow](evaluation-workflow.md) |
11
+ | Install, update, remove, or use a checkout | [Installation](installing.md) |
12
+ | Run evaluations and select a host | [Running evaluations](running-evaluations.md) |
13
+ | Create cases and reusable policy | [Cases and extensions](creating-cases.md) |
14
+ | Copy a complete coding, skill or runtime setup | [Runnable recipes](recipes.md) |
15
+ | Interpret verdicts, evidence, and comparisons | [Reading results](reading-results.md) |
16
+ | Run Codex or Claude with isolation | [Native hosts](native-hosts.md) |
17
+ | Reuse host tools or enable goals and hooks | [Runtime configuration](runtime-v1.md) |
18
+ | Save recurring evaluation selections | [Run settings](run-settings-v1.md) |
19
+ | Resolve a symptom | [Troubleshooting](troubleshooting.md) |
20
+ | Trace runner lifecycle, ownership, and changes | [Architecture](architecture.md) |
21
+ | Change Sevro or its documentation | [Contributing](../CONTRIBUTING.md) |
22
+ | Understand licensing and branding | [Licensing](licensing.md) and [assets](assets/README.md) |
20
23
 
21
24
  ## Ask the guide
22
25
 
@@ -30,11 +33,12 @@ It belongs to this repository, not an npm installation.
30
33
 
31
34
  [Current contracts](contracts.md) define interfaces. The
32
35
  [guide specification](specs/repository-guide.md) defines the repository assistant.
33
- [Historical validation](evidence.md) records observations, not current guarantees.
36
+ [Historical validation](https://github.com/BjRo/sevro/blob/main/docs/evidence.md) records observations, not current guarantees.
34
37
  There is no accepted Rust migration decision here;
35
38
  [issue #2](https://github.com/BjRo/sevro/issues/2) tracks research.
36
39
 
37
40
  Read [documentation quality](documentation-quality.md),
41
+ [the usability study protocol](https://github.com/BjRo/sevro/blob/main/docs/usability-study.md),
38
42
  [guide evaluation](guide-evaluation.md), [releases](releases.md), and
39
43
  [acknowledgements](acknowledgements.md) for maintenance.
40
44
  Return to the [Sevro introduction](../README.md).
@@ -4,22 +4,146 @@ Sevro owns generic execution/evidence contracts. Projects own cases and policy.
4
4
  This lets Darrow and other integrations use the same runner without importing
5
5
  their benchmark policy into it.
6
6
 
7
- | Responsibility | Sources |
8
- | ------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
9
- | Parse commands/select explicit routes | [CLI](../src/cli.ts), [CLI reference](development-cli.md) |
10
- | Prepare, execute, grade, retain, clean up | [Engine](../src/engine.ts), [engine slice](engine-slice.md) |
11
- | Negotiate trusted extension calls | [Client](../src/extension-client.ts), [session](../src/extension-session.ts), [protocol](extension-protocol-v1.md) |
12
- | Run native hosts and retain bounded observations | [Codex](codex-host.md), [native controls](native-controls.md), [host sources](../src/hosts/) |
13
- | Reduce execution/grading/task states | [Result source](../src/results.ts), [contract](results-v1.md) |
14
- | Bind comparison identities and release provenance | [Identity](identity-v1.md), [releases](releases.md) |
15
- | Summarize retained results | [Report](report-v1.md) |
16
-
17
- Completed evidence is retained before cleanup. Missing observations remain
18
- unavailable; unknown measurements do not become zero. Extensions cannot
19
- silently replace isolation/persistence or built-in policy. The
7
+ This page explains Sevro's implementation and points to acceptance
8
+ tests for changes. [Current contracts](contracts.md) define public behavior;
9
+ [historical validation](https://github.com/BjRo/sevro/blob/main/docs/evidence.md) records bounded past observations. The
10
+ [engine slice](https://github.com/BjRo/sevro/blob/main/docs/engine-slice.md) retains its earlier scope and detailed lifecycle
11
+ explanation. Implementation paths and test scenarios here are navigation, not
12
+ evidence that a particular candidate passed validation.
13
+
14
+ [`engine.ts`](../src/engine.ts) remains the programmatic facade, and
15
+ [`cli.ts`](../src/cli.ts) builds to the installed `dist/src/cli.js` entrypoint.
16
+ The package runs on Node.js and Bun; contributor commands still use Bun.
17
+ [Process adapters](../src/runtime-process.ts) normalize child processes and
18
+ Web Streams. [SQLite locking](../src/sqlite-lock.ts) selects the runtime's native driver, preserving shared file-lock semantics. The CLI
19
+ loads and assembles evaluation options; evaluation modules coordinate the run
20
+ and its trials.
21
+
22
+ ## Evaluation lifecycle
23
+
24
+ [`runEvaluation`](../src/evaluation/run.ts) prepares inputs before allocating
25
+ run resources, retains preparation artifacts, and reserves candidate and
26
+ semantic workspace roots as needed before calling the trial scheduler. The map
27
+ follows the path of a retained trial; individual stages can be skipped or fail.
28
+
29
+ ```mermaid
30
+ flowchart TD
31
+ P["Validate and prepare evaluation inputs"] --> R["Allocate run storage and owner; reserve workspace roots"]
32
+ R --> W["Admit trial and materialize its reserved fixture"]
33
+ subgraph Trial["Each admitted trial"]
34
+ W --> C["Initialize grading bases; execute candidate"]
35
+ C --> E["Retain candidate artifacts; observe output; prepare grading views"]
36
+ E --> G["Output, shell, Git, semantic, and extension grading"]
37
+ G --> A["Assess execution, grading, and task separately"]
38
+ A --> V["Optional independent advisory review"]
39
+ V --> T["Retain raw candidate response; atomically write trial evidence"]
40
+ T --> K["Collect completed trial and checkpoint its reference"]
41
+ K --> D["Release temporary views; clear or retain fixture contents"]
42
+ end
43
+ D --> J["All admitted trials drain"]
44
+ J --> F["Write final run evidence; finalize owner checkpoint"]
45
+ F --> X["Finalize retained workspaces; release other reservations"]
46
+ ```
47
+
48
+ [`scheduleTrials`](../src/evaluation/scheduler.ts) bounds active work by the
49
+ prepared job limit. It admits a trial before
50
+ [`prepareTrialWorkspace`](../src/evaluation/resources.ts) materializes that
51
+ trial's fixture. Each [`EvaluationTrial`](../src/evaluation/trial.ts) owns its
52
+ mutable state and writer. Its `run()` method keeps candidate execution,
53
+ artifact retention, grading, assessment, advisory review, persistence, and
54
+ cleanup in one visible order. Grading helpers return checks, observations,
55
+ and failures; the coordinator incorporates those results and stops new
56
+ admission when an execution or required grading error is detected, before
57
+ advisory work, persistence, or cleanup. The scheduler also stops admission on
58
+ cancellation and waits for active workers. A failed task check alone does not
59
+ close admission. Already admitted peers drain and retain their evidence, including
60
+ when they finish out of order.
61
+
62
+ [`runAdvisoryReview`](../src/evaluation/advisory.ts) handles its own host call,
63
+ assessment, retained response, and auxiliary workspace cleanup. It depends on
64
+ candidate completion, independently of the task assessment. The
20
65
  [advisory fixture](advisory-fixture.md) gives review a separate Git view with
21
- evaluator inputs withheld.
66
+ evaluator inputs withheld. Its recommendation or host failure does not change
67
+ task grading; a failure to retain its evidence remains a persistence error.
68
+
69
+ Successful [semantic response parsing](../src/evaluation/semantic.ts) clears
70
+ auxiliary fixture contents; successful advisory response parsing removes its
71
+ auxiliary fixture. Both retain response evidence first, including valid failed
72
+ check verdicts or advisory recommendations.
73
+
74
+ The [trial writer](../src/evidence/trial-writer.ts) writes the trial artifact
75
+ before the coordinator marks it persisted and hands it to the
76
+ [result collector](../src/evaluation/collection.ts). The collector registers
77
+ the completed record, orders records by trial number, and checkpoints retained
78
+ artifact paths. After active work drains, the run coordinator validates and
79
+ writes `run.json` before finalizing the owner as complete or interrupted.
80
+ Persistence failures cannot produce a successful result; the run's failure
81
+ path attempts a diagnostic checkpoint while preserving the original failure.
82
+
83
+ Trial cleanup releases candidate artifact runtimes and transcript views even
84
+ when the trial fails. Persisted successful fixture contents are cleared while
85
+ their empty reserved roots remain until active work drains. Failed, cancelled,
86
+ grading-error, unavailable-evidence, and failed-task fixtures are retained;
87
+ [workspace ownership](../src/fixtures/workspace-state.ts) tracks their inactive
88
+ retention and startup expiry after 24 hours. Saved evidence stays outside that
89
+ cleanup. See the [results retention contract](results-v1.md#identity-and-provenance)
90
+ for the public boundary, including ownership that cannot be verified.
91
+
92
+ Dry preparation still validates and materializes fixtures, including declared
93
+ fixture setup, and retains trial records. It skips candidate execution and
94
+ grading, recording `not_run` / `not_requested` / `not_assessed`, as exercised by
95
+ the [engine trial suite](../tests/src/engine-trials.test.ts). Missing observations
96
+ remain unavailable; missing required evidence cannot become a pass. Optional
97
+ unknown measurements remain unknown rather than becoming zero. Extensions
98
+ cannot silently replace isolation, persistence,
99
+ or built-in policy. The [results](results-v1.md) and
100
+ [extension protocol](extension-protocol-v1.md) contracts define those semantics.
101
+
102
+ ## State ownership
103
+
104
+ [`EvaluationContext`](../src/evaluation/context.ts) carries four explicit
105
+ collaborators: prepared inputs, run resources, the result collector, and retained
106
+ preparation-artifact references. It does not combine mutable trial fields with
107
+ the preparation plan.
108
+
109
+ | Data or state | Owner | Boundary |
110
+ | ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
111
+ | Prepared inputs | [`PreparedEvaluation` in `plan.ts`](../src/evaluation/plan.ts) | Named fixture, check, and invocation groups plus routes, provenance, redacted configuration, and comparison identity. Preparation completes before run allocation. |
112
+ | Run resources and reservations | [`RunResources` and `RunWorkspaceReservations` in `resources.ts`](../src/evaluation/resources.ts) | Run ID, evidence/state locations, process owner, and candidate/semantic reservations. Reservations outlive completed fixture contents; retained workspaces are tracked separately from completed roots. |
113
+ | Mutable trial state | [`TrialRuntimeState` and `EvaluationTrial` in `trial.ts`](../src/evaluation/trial.ts) | Candidate result, observations, checks, assessment, temporary views, advisory result, and persisted milestone belong to one admitted trial. Grading receives narrow inputs and explicit effects rather than this state object. |
114
+ | Collected run results | [`ResultCollector` in `collection.ts`](../src/evaluation/collection.ts) | Private completed summaries, evidence, and diagnostics; trial-number ordering, snapshots for aggregation, and checkpoint requests. [`run-owner.ts`](../src/run-owner.ts) verifies process ownership and writes owner/checkpoint state. |
115
+ | Evidence writes | [`TrialEvidenceWriter`](../src/evidence/trial-writer.ts), [preparation retention](../src/evaluation/resources.ts), [run finalization](../src/evaluation/run.ts) | The trial writer owns filenames, private writes, hashes, artifact references, and typed trial-persistence failures. Resource helpers retain preparation bytes; run finalization writes aggregate evidence. [`storage.ts`](../src/storage.ts) supplies atomic private JSON writes. |
116
+
117
+ Fixture modules own materialization and workspace preparation. Runtime modules
118
+ own declared host runtime policy and private state. Evidence modules validate
119
+ host observations and artifacts, verify retained bytes, and normalize optional
120
+ usage without constructing fixtures. Native host implementations and graders
121
+ remain in their own families.
122
+
123
+ ## Where to change behavior
124
+
125
+ Start with the responsibility, then inspect its observable acceptance scenarios.
126
+ These are useful starting suites, not an exhaustive validation list. The
127
+ [contribution checks](../CONTRIBUTING.md#quality-contract-and-checks) still govern
128
+ candidate acceptance.
129
+
130
+ | Responsibility | Implementation and reference | Relevant acceptance tests |
131
+ | ----------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
132
+ | Parse commands/select explicit routes | [CLI entrypoint](../src/cli.ts), [invocation parsing](../src/cli/invocation.ts), [CLI reference](development-cli.md) | [Invalid invocations](../tests/src/cli/invocation-validation.test.ts) |
133
+ | Load and prepare a CLI evaluation | [Input loading](../src/cli/loading.ts), [preparation](../src/cli/preparation.ts), [host construction](../src/cli/hosts.ts), [extension resolution](../src/cli/extension.ts), [evaluation assembly](../src/cli/evaluation.ts) | [Case/configuration validation](../tests/src/cli/case-validation.test.ts) |
134
+ | Present CLI results and own cancellation | [Presentation](../src/cli/presentation.ts), [cancellation](../src/cli/cancellation.ts), [command lifecycle](../src/cli/command.ts) | [CLI states and exits](../tests/src/cli/results.test.ts), [signal retention](../tests/src/cli/trial-retention.test.ts) |
135
+ | Prepare evaluation inputs and grade trials | [Engine facade](../src/engine.ts), [plan](../src/evaluation/plan.ts), [grading](../src/evaluation/grading.ts), [semantic grading](../src/evaluation/semantic.ts), [evaluation modules](../src/evaluation/), [engine slice](https://github.com/BjRo/sevro/blob/main/docs/engine-slice.md) | [Preparation refusals](../tests/src/evaluation/preparation-validation.test.ts), [semantic grading failures](../tests/src/evaluation/semantic-grading-failures.test.ts), [engine lifecycle](../tests/src/engine-lifecycle.test.ts) |
136
+ | Schedule trials, retain evidence, and finalize ownership | [Scheduler](../src/evaluation/scheduler.ts), [trial coordinator](../src/evaluation/trial.ts), [reservations](../src/evaluation/resources.ts), [collection](../src/evaluation/collection.ts), [run owner](../src/run-owner.ts) | [Concurrent admission and ordering](../tests/src/cli/concurrency.test.ts), [trial failures and retention](../tests/src/evaluation/trial-retention.test.ts), [checkpoint refusals](../tests/src/run-owner-checkpoints.test.ts) |
137
+ | Prepare, construct, and clean up fixtures | [Fixture modules](../src/fixtures/), [construction](../src/fixtures/create.ts), [preparation artifacts](../src/fixtures/preparation.ts), [content cleanup](../src/fixtures/cleanup.ts), [workspace ownership](../src/fixtures/workspace-state.ts) | [Artifact preparation](../tests/src/fixtures/artifact-preparation.test.ts), [workspace lifecycle](../tests/src/fixtures/workspace-lifecycle.test.ts) |
138
+ | Resolve runtime policy, discovery, and private state | [Runtime modules](../src/runtime/), [configuration](../src/runtime/config.ts) | [Runtime environment](../tests/src/runtime/environment.test.ts), [candidate artifact lifetime](../tests/src/candidate-artifacts.test.ts) |
139
+ | Validate host results and retain bounded evidence | [Host results](../src/evidence/host-results.ts), [trial writer](../src/evidence/trial-writer.ts), [retained artifacts](../src/evidence/retained-artifacts.ts), [usage](../src/evidence/usage.ts) | [Host evidence refusals](../tests/src/evaluation/host-evidence.test.ts), [failed-host evidence retention](../tests/src/evaluation/trial-retention.test.ts) |
140
+ | Negotiate trusted extension calls | [Client](../src/extension-client.ts), [session](../src/extension-session.ts), [extension grading](../src/evaluation/grading.ts), [protocol](extension-protocol-v1.md) | [Negotiated engine behavior](../tests/src/evaluation/extension-engine.test.ts), [extension grading outcomes](../tests/src/evaluation/extension-grading.test.ts) |
141
+ | Run independent advisory review | [Advisory execution](../src/evaluation/advisory.ts), [blind fixture](../src/fixtures/advisory.ts), [advisory fixture explanation](advisory-fixture.md) | [Advisory failures](../tests/src/evaluation/advisory-failures.test.ts), [blind change view](../tests/src/fixtures/advisory.test.ts) |
142
+ | Run native hosts and retain bounded observations | [Codex](codex-host.md), [native controls](native-controls.md), [host sources](../src/hosts/), [shared process mechanics](../src/process-lifecycle.ts), [native waiting](../src/hosts/process-lifecycle.ts) | [Native process admission and byte bounds](../tests/src/hosts/native-process-boundaries.test.ts) |
143
+ | Reduce execution/grading/task states and maintain contract shapes | [Result reduction](../src/results.ts), [shared semantic types](../src/contract-types.ts), [wire types](../src/schema-types.ts), [runtime schema boundary](../src/schema.ts), [results contract](results-v1.md) | [State and exit precedence](../tests/src/results.test.ts), [evidence schema boundaries](../tests/src/schema/evidence-boundaries.test.ts) |
144
+ | Bind comparison identities and release provenance | [Preparation identity inputs](../src/evaluation/plan.ts), [identity hashing](../src/identity.ts), [provenance](../src/provenance.ts), [identity contract](identity-v1.md), [releases](releases.md) | [CLI identity](../tests/src/cli/identity.test.ts), [package release provenance](../tests/scripts/release.test.ts) |
145
+ | Summarize retained results | [Report implementation](../src/report.ts), [report contract](report-v1.md) | [Report states and CLI](../tests/src/report.test.ts) |
22
146
 
23
- These paths describe this checkout. [Historical validation](evidence.md) records
24
- bounded past observations. [Rust research](https://github.com/BjRo/sevro/issues/2)
25
- does not establish a migration; public interfaces remain useful independently.
147
+ [Rust research](https://github.com/BjRo/sevro/issues/2) does not establish a
148
+ migration; public interfaces remain useful independently. Return to the
149
+ [documentation hub](README.md).
@@ -1,11 +1,12 @@
1
1
  # Sevro brand assets
2
2
 
3
3
  Björn Rochel created the supplied logo in 2026. Its original artwork and white
4
- background are preserved in `sevro-logo.png`.
4
+ background are preserved in `sevro-logo.png` in the repository. The npm package
5
+ retains these permissions; download the artwork from the links below.
5
6
 
6
- - [Full logo](sevro-logo.png): supplied 1254 × 1254 PNG including the wordmark.
7
- - [Compact symbol](sevro-symbol.svg): the same artwork framed around the S track.
8
- - [Wordmark](sevro-wordmark.svg): the same artwork framed around the name.
7
+ - [Full logo](https://raw.githubusercontent.com/BjRo/sevro/main/docs/assets/sevro-logo.png): supplied 1254 × 1254 PNG including the wordmark.
8
+ - [Compact symbol](https://raw.githubusercontent.com/BjRo/sevro/main/docs/assets/sevro-symbol.svg): the same artwork framed around the S track.
9
+ - [Wordmark](https://raw.githubusercontent.com/BjRo/sevro/main/docs/assets/sevro-wordmark.svg): the same artwork framed around the name.
9
10
 
10
11
  SVG variants embed the supplied PNG; they are not traced vector redrawings.
11
12
  Keep a white backing on dark pages; no transparent variant is claimed. Use the
@@ -38,8 +38,10 @@ The shell-check process runner accepts a bounded evaluator-owned `run` string,
38
38
  optional `expectedExitCode` and `timeoutMs`, plus `expectExact`, `expectRegex`,
39
39
  `notRegex`, and regex `flags` for stdout. Exact matching removes one final
40
40
  newline; regex matching always uses multiline mode. The runner executes with
41
- `sh -e`. On macOS and Linux it runs through the outer sandbox with network access denied,
42
- a credential-free environment, and caller-declared protected roots. Without a
41
+ `sh -e`. On macOS and Linux it runs through the outer sandbox with network access denied
42
+ by default, a credential-free environment, and caller-declared protected roots.
43
+ The runtime [local HTTP option](runtime-v1.md#local-http-test-servers) permits
44
+ socket-using upstream tests while retaining outbound isolation. Without a
43
45
  stdout assertion, process output is discarded. With one, the runner captures
44
46
  at most 1 MiB in memory and retains only its digest and byte length. Oversized
45
47
  or invalid UTF-8 output is a grading error.
@@ -54,6 +56,11 @@ include any other source worktrees or private roots. A peer path already
54
56
  canonicalized by the engine remains in the deny profile if that peer is
55
57
  removed before the sandbox starts; unverified missing roots still fail.
56
58
 
59
+ On macOS, validated runtime grants also permit limited
60
+ [ancestor metadata reads](runtime-v1.md#macos-ancestor-metadata) so libc can
61
+ canonicalize granted paths. Protected ancestor listings and ungranted sibling
62
+ data remain inaccessible.
63
+
57
64
  `sevro.git-head` accepts `kind: "changed"`, `"unchanged"`, or
58
65
  `"base-ancestor"` for a generated or repository Git fixture. The engine
59
66
  captures the fixture's base HEAD before the candidate turn, then compares the