@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
@@ -1,83 +1,65 @@
1
- /** Structural contracts for data validated by the versioned JSON schemas. */
2
- export type CliResultData = {
1
+ import type { AdvisoryAssessment } from "./advisory";
2
+ import type {
3
+ ArtifactReference,
4
+ Assessment,
5
+ CheckOutcome,
6
+ Diagnostic,
7
+ DomainOutcome,
8
+ EvidenceRoute,
9
+ ExecutionStatus,
10
+ ExitCode,
11
+ GradingStatus,
12
+ MetricEvidence,
13
+ ObservationCompleteness,
14
+ ObservationEvidence,
15
+ OutcomeStatus,
16
+ RawResultReference,
17
+ TaskVerdict,
18
+ UsageEvidence,
19
+ } from "./contract-types";
20
+ import type { IdentityDimensions } from "./identity";
21
+ import type { InstrumentationRequest } from "./instrumentation";
22
+
23
+ /** Wire assessments additionally allow optional serialized error codes. */
24
+ export type WireAssessment = {
25
+ execution: Assessment["execution"] & { errorCode?: string };
26
+ grading: Assessment["grading"] & { errorCode?: string };
27
+ task: Assessment["task"];
28
+ };
29
+
30
+ /** Validated v1 wire data also represents failures before run allocation. */
31
+ export type CliResultData = WireAssessment & {
3
32
  format: "sevro.cli-result.v1";
4
33
  runId: string | null;
5
- execution: CliResultDataExecution;
6
- grading: CliResultDataGrading;
7
- task: CliResultDataTask;
8
- exitCode: 0 | 1 | 2 | 3 | 4 | 64 | 70 | 130 | 143;
34
+ exitCode: ExitCode;
9
35
  evidencePath: string | null;
10
36
  cases: Array<CliResultDataCase>;
11
- diagnostic?: CliResultDataDiagnostic;
12
- };
13
- type CliResultDataExecution = {
14
- status: "completed" | "failed" | "cancelled" | "not_run";
15
- errorCode?: string;
16
- };
17
- type CliResultDataGrading = {
18
- status: "completed" | "error" | "unavailable" | "not_requested";
19
- errorCode?: string;
20
- };
21
- type CliResultDataTask = { verdict: "passed" | "failed" | "not_assessed" };
22
- type CliResultDataCheck = {
23
- id: string;
24
- grader: string;
25
- status: "passed" | "failed" | "unavailable";
26
- detail?: string;
27
- evidenceRefs?: Array<string>;
37
+ diagnostic?: Diagnostic;
28
38
  };
29
- type CliResultDataDomainOutcome = {
30
- id: string;
31
- status: "passed" | "failed" | "unavailable";
32
- detail?: string;
33
- evidenceRefs: Array<string>;
34
- data?: Record<string, unknown>;
35
- };
36
- type CliResultDataTrial = {
39
+ export type CliResultDataTrial = WireAssessment & {
37
40
  trial: number;
38
- execution: CliResultDataExecution;
39
- grading: CliResultDataGrading;
40
- task: CliResultDataTask;
41
- checks: Array<CliResultDataCheck>;
42
- domainOutcomes?: Array<CliResultDataDomainOutcome>;
41
+ checks: Array<CheckOutcome>;
42
+ domainOutcomes?: Array<DomainOutcome>;
43
43
  artifactPath: string | null;
44
44
  };
45
- type CliResultDataCase = {
45
+ export type CliResultDataCase = WireAssessment & {
46
46
  caseId: string;
47
- execution: CliResultDataExecution;
48
- grading: CliResultDataGrading;
49
- task: CliResultDataTask;
50
47
  trials: Array<CliResultDataTrial>;
51
48
  };
52
- type CliResultDataDiagnostic = { code: string; message: string };
49
+
50
+ /** Structural contracts for data validated by the versioned JSON schemas. */
53
51
  export type RunEvidenceData = {
54
52
  format: "sevro.run-evidence.v1";
55
53
  runId: string;
56
54
  evaluationIdentity: {
57
55
  algorithm: "sevro.identity.v1";
58
56
  digest: RunEvidenceDataDigest;
59
- dimensions: {
60
- runnerBuildDigest: RunEvidenceDataDigest;
61
- projectDigest: RunEvidenceDataDigest;
62
- configurationDigest: RunEvidenceDataDigest;
63
- extensionDigest: RunEvidenceDataDigest | null;
64
- extensionProtocol: "sevro.extension.v1" | null;
65
- caseDigest: RunEvidenceDataDigest;
66
- fixtureDigest: RunEvidenceDataDigest;
67
- checksDigest: RunEvidenceDataDigest;
68
- requiredEvidenceDigest: RunEvidenceDataDigest;
69
- evaluatorDigest: RunEvidenceDataDigest;
70
- graderDigest: RunEvidenceDataDigest;
71
- instrumentationDigest: RunEvidenceDataDigest;
72
- routeDigest: RunEvidenceDataDigest;
73
- condition: "passive" | "enforced";
74
- trialCount: number;
75
- passThreshold: number;
76
- };
57
+ dimensions: IdentityDimensions;
77
58
  };
78
59
  configuration: {
79
60
  digest: RunEvidenceDataDigest;
80
61
  redacted: Record<string, unknown>;
62
+ resolved?: Record<string, unknown>;
81
63
  };
82
64
  runner: RunEvidenceDataRunner;
83
65
  project: {
@@ -89,17 +71,17 @@ export type RunEvidenceData = {
89
71
  condition: {
90
72
  requested: "passive" | "enforced";
91
73
  actual: "passive" | "enforced" | "unknown";
92
- requestedInstrumentation: RunEvidenceDataInstrumentationList;
93
- appliedInstrumentation: RunEvidenceDataInstrumentationList;
74
+ requestedInstrumentation: InstrumentationRequest[];
75
+ appliedInstrumentation: InstrumentationRequest[];
94
76
  };
95
77
  graders: {
96
78
  active: Array<RunEvidenceDataGrader>;
97
79
  replacedDefaults: Array<string>;
98
80
  };
99
- routes: Array<RunEvidenceDataRoute>;
81
+ routes: Array<EvidenceRoute>;
100
82
  result: CliResultData;
101
83
  trials: Array<RunEvidenceDataTrialEvidence>;
102
- diagnostic?: RunEvidenceDataDiagnostic;
84
+ diagnostic?: Diagnostic;
103
85
  };
104
86
  type RunEvidenceDataDigest = string;
105
87
  type RunEvidenceDataFileUrl = string;
@@ -126,49 +108,18 @@ type RunEvidenceDataExtension = {
126
108
  capabilities: Array<string>;
127
109
  replacements: { graders: Array<string>; taskVerdictPolicy: string | null };
128
110
  };
129
- type RunEvidenceDataInstrumentationList = Array<{
130
- id: string;
131
- configuration: Record<string, unknown>;
132
- }>;
133
111
  type RunEvidenceDataGrader = {
134
112
  id: string;
135
113
  source: "builtin" | "extension";
136
114
  version: string;
137
115
  };
138
- type RunEvidenceDataRoute = {
139
- role: "candidate" | "semantic" | "advisory";
140
- host: string;
141
- model: string;
142
- effort: string;
143
- };
144
- type RunEvidenceDataAdvisoryReview = null | {
116
+ export type AdvisoryReviewData = {
145
117
  status: "completed" | "failed" | "not_run";
146
- assessment: null | {
147
- verdict: "pass" | "fail";
148
- overallScore: number;
149
- dimensions: {
150
- correctness: number;
151
- maintainability: number;
152
- testQuality: number;
153
- scopeDiscipline: number;
154
- };
155
- strengths: Array<string>;
156
- weaknesses: Array<string>;
157
- summary: string;
158
- };
159
- usage: {
160
- inputTokens: number | null;
161
- outputTokens: number | null;
162
- costUsd: number | null;
163
- complete: boolean;
164
- };
165
- rawResult: {
166
- source: string;
167
- path: RunEvidenceDataFileUrl | null;
168
- sha256: RunEvidenceDataDigest | null;
169
- };
118
+ assessment: AdvisoryAssessment | null;
119
+ usage: UsageEvidence;
120
+ rawResult: RawResultReference;
170
121
  };
171
- type RunEvidenceDataTrialEvidence = {
122
+ export type RunEvidenceDataTrialEvidence = {
172
123
  caseId: string;
173
124
  trial: number;
174
125
  executionMode: "executed" | "dry" | "unknown";
@@ -176,50 +127,22 @@ type RunEvidenceDataTrialEvidence = {
176
127
  condition: {
177
128
  requested: "passive" | "enforced";
178
129
  actual: "passive" | "enforced" | "unknown";
179
- appliedInstrumentation: RunEvidenceDataInstrumentationList;
130
+ appliedInstrumentation: InstrumentationRequest[];
180
131
  };
181
- observationCompleteness: "complete" | "partial" | "unavailable";
182
- observations: Array<{
183
- id: string;
184
- source: string;
185
- completeness: "complete" | "partial" | "unavailable";
186
- data: Record<string, unknown>;
187
- }>;
188
- metrics: Array<RunEvidenceDataMetric>;
189
- domainOutcomes?: Array<{
190
- id: string;
191
- status: "passed" | "failed" | "unavailable";
192
- detail?: string;
193
- evidenceRefs: Array<string>;
194
- data?: Record<string, unknown>;
195
- }>;
132
+ observationCompleteness: ObservationCompleteness;
133
+ observations: Array<ObservationEvidence>;
134
+ metrics: Array<MetricEvidence>;
135
+ domainOutcomes?: Array<DomainOutcome>;
196
136
  taskVerdictPolicy: null | {
197
137
  id: string;
198
- recommendation: "passed" | "failed" | "not_assessed" | null;
199
- };
200
- advisoryReview?: RunEvidenceDataAdvisoryReview;
201
- routes: Array<RunEvidenceDataRoute>;
202
- usage: {
203
- inputTokens: number | null;
204
- outputTokens: number | null;
205
- costUsd: number | null;
206
- complete: boolean;
138
+ recommendation: TaskVerdict | null;
207
139
  };
208
- rawResult: {
209
- source: string;
210
- path: RunEvidenceDataFileUrl | null;
211
- sha256: RunEvidenceDataDigest | null;
212
- };
213
- artifactRefs: Array<{
214
- id: string;
215
- path: RunEvidenceDataFileUrl;
216
- sha256: RunEvidenceDataDigest;
217
- gitExclude?: boolean;
218
- executable?: boolean;
219
- }>;
140
+ advisoryReview?: AdvisoryReviewData | null;
141
+ routes: Array<EvidenceRoute>;
142
+ usage: UsageEvidence;
143
+ rawResult: RawResultReference;
144
+ artifactRefs: Array<ArtifactReference>;
220
145
  };
221
- type RunEvidenceDataDiagnostic = { code: string; message: string };
222
- type RunEvidenceDataMetric = { id: string; value: number | null; unit: string };
223
146
  export type ReportData = {
224
147
  format: "sevro.report.v1";
225
148
  inputs: Array<ReportDataInput>;
@@ -233,38 +156,32 @@ export type ReportData = {
233
156
  };
234
157
  type ReportDataPath = string;
235
158
  type ReportDataDigest = string;
236
- type ReportDataState =
237
- | "completed"
238
- | "failed"
239
- | "cancelled"
240
- | "not_run"
241
- | "error"
242
- | "unavailable"
243
- | "not_requested";
244
- type ReportDataVerdict = "passed" | "failed" | "not_assessed";
159
+ /** The report wire schema deliberately allows either state family in rows. */
160
+ type ReportDataState = ExecutionStatus | GradingStatus;
245
161
  type ReportDataInput = {
246
162
  resultFile: ReportDataPath;
247
- execution: "completed" | "failed" | "cancelled" | "not_run";
248
- grading: "completed" | "error" | "unavailable" | "not_requested";
249
- task: ReportDataVerdict;
250
- exitCode: 0 | 1 | 2 | 3 | 4 | 64 | 70 | 130 | 143;
163
+ execution: ExecutionStatus;
164
+ grading: GradingStatus;
165
+ task: TaskVerdict;
166
+ exitCode: ExitCode;
251
167
  caseCount: number;
252
168
  };
253
- type ReportDataRoute = { host: string; model: string; effort: string };
169
+ type ReportDataRoute = Omit<EvidenceRoute, "role">;
254
170
  type ReportDataOutcome = {
255
171
  trial: number;
256
172
  id: string;
257
- status: "passed" | "failed" | "unavailable";
173
+ status: OutcomeStatus;
258
174
  };
259
175
  type ReportDataRow = {
176
+ nativeTranscripts?: { retained: number; pruned: number };
260
177
  resultFile: ReportDataPath;
261
178
  evidencePath: string | null;
262
179
  runId: string | null;
263
180
  caseId: string;
264
181
  execution: ReportDataState;
265
182
  grading: ReportDataState;
266
- task: ReportDataVerdict;
267
- exitCode: 0 | 1 | 2 | 3 | 4 | 64 | 70 | 130 | 143;
183
+ task: TaskVerdict;
184
+ exitCode: ExitCode;
268
185
  trialCount: number;
269
186
  taskPassRate: number | null;
270
187
  candidateDurationMs: number | null;
@@ -276,11 +193,6 @@ type ReportDataRow = {
276
193
  requestedCondition: "passive" | "enforced" | null;
277
194
  actualCondition: "passive" | "enforced" | "unknown" | null;
278
195
  candidateRoute: ReportDataRoute | null;
279
- routes: Array<{
280
- role: "candidate" | "semantic" | "advisory";
281
- host: string;
282
- model: string;
283
- effort: string;
284
- }>;
196
+ routes: Array<EvidenceRoute>;
285
197
  domainOutcomes: Array<ReportDataOutcome>;
286
198
  };
package/src/shell.ts ADDED
@@ -0,0 +1,4 @@
1
+ /** Encode one literal argument for a POSIX shell, including empty strings. */
2
+ export function shellQuote(value: string): string {
3
+ return `'${value.replaceAll("'", `'"'"'`)}'`;
4
+ }
@@ -0,0 +1,25 @@
1
+ import { createRequire } from "node:module";
2
+
3
+ const require = createRequire(import.meta.url);
4
+
5
+ interface LockDatabase {
6
+ exec(sql: string): unknown;
7
+ close(): void;
8
+ }
9
+
10
+ /** Both drivers use SQLite file locks, including across Node and Bun runners. */
11
+ export function openLockDatabase(path: string): LockDatabase {
12
+ if (process.versions.bun) {
13
+ const { Database } = require("bun:sqlite") as typeof import("bun:sqlite");
14
+ const database = new Database(path);
15
+ return {
16
+ exec: (sql) => database.run(sql),
17
+ close() {
18
+ database.close();
19
+ },
20
+ };
21
+ }
22
+ const { DatabaseSync } =
23
+ require("node:sqlite") as typeof import("node:sqlite");
24
+ return new DatabaseSync(path);
25
+ }
@@ -0,0 +1,146 @@
1
+ import { readFile, rm } from "node:fs/promises";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import type { RunEvidenceData } from "./schema-types";
5
+ import { canonicalJson, sha256 } from "./identity";
6
+ import type { ArtifactReference } from "./contract-types";
7
+ import { retainedFile } from "./results-lock";
8
+ import { atomicWriteJson } from "./storage";
9
+
10
+ function isNativeTranscript(artifact: ArtifactReference) {
11
+ return /^(?:sevro\.(?:semantic(?:\.[a-f0-9]{64})?|advisory)\.)?sevro\.native-transcripts\.bundle$/.test(
12
+ artifact.id,
13
+ );
14
+ }
15
+
16
+ function transcriptArtifacts(evidence: RunEvidenceData) {
17
+ return evidence.trials.flatMap((trial) =>
18
+ trial.artifactRefs.filter(isNativeTranscript).map((artifact) => ({
19
+ caseId: trial.caseId,
20
+ trial: trial.trial,
21
+ ...artifact,
22
+ })),
23
+ );
24
+ }
25
+
26
+ function pruningRecord(evidence: RunEvidenceData) {
27
+ return {
28
+ format: "sevro.pruned-native-transcripts.v1",
29
+ runId: evidence.runId,
30
+ artifacts: transcriptArtifacts(evidence),
31
+ };
32
+ }
33
+
34
+ function pruningPath(evidence: RunEvidenceData) {
35
+ if (evidence.result.evidencePath === null)
36
+ throw new Error(
37
+ "native transcript retention requires a retained evidence path",
38
+ );
39
+ return join(
40
+ dirname(evidence.result.evidencePath),
41
+ "native-transcripts-pruned.json",
42
+ );
43
+ }
44
+
45
+ function transcriptPath(
46
+ evidence: RunEvidenceData,
47
+ artifact: ArtifactReference,
48
+ ) {
49
+ const path = fileURLToPath(artifact.path);
50
+ if (dirname(path) !== dirname(pruningPath(evidence)))
51
+ throw new Error(
52
+ "native transcript artifact is outside its retained result directory",
53
+ );
54
+ if (metadataPaths(evidence).includes(path))
55
+ throw new Error(
56
+ "native transcript artifact aliases retained result metadata",
57
+ );
58
+ if (otherArtifactPaths(evidence).includes(path))
59
+ throw new Error(
60
+ "native transcript artifact aliases other retained evidence",
61
+ );
62
+ return path;
63
+ }
64
+
65
+ function otherArtifactPaths(evidence: RunEvidenceData) {
66
+ return evidence.trials
67
+ .flatMap((trial) => [
68
+ trial.rawResult.path,
69
+ trial.advisoryReview?.rawResult.path,
70
+ ...trial.artifactRefs
71
+ .filter((ref) => !isNativeTranscript(ref))
72
+ .map((ref) => ref.path),
73
+ ])
74
+ .filter((path): path is string => path != null)
75
+ .map((path) => fileURLToPath(path));
76
+ }
77
+
78
+ function metadataPaths(evidence: RunEvidenceData) {
79
+ const receipt = pruningPath(evidence);
80
+ return [
81
+ receipt,
82
+ evidence.result.evidencePath,
83
+ join(dirname(receipt), "result.json"),
84
+ join(dirname(receipt), "latest.json"),
85
+ ...evidence.result.cases.flatMap((selected) =>
86
+ selected.trials.map((trial) => trial.artifactPath),
87
+ ),
88
+ ];
89
+ }
90
+
91
+ async function transcriptPresent(
92
+ evidence: RunEvidenceData,
93
+ artifact: ArtifactReference,
94
+ ) {
95
+ const path = transcriptPath(evidence, artifact);
96
+ if (!(await retainedFile(path))) return false;
97
+ if (sha256(await readFile(path)) !== artifact.sha256)
98
+ throw new Error("retained native transcript evidence hash differs");
99
+ return true;
100
+ }
101
+
102
+ /** Keep capture evidence immutable; a separate receipt records intentional removal. */
103
+ export async function pruneNativeTranscripts(evidence: RunEvidenceData) {
104
+ const artifacts = transcriptArtifacts(evidence);
105
+ if (!artifacts.length) return 0;
106
+ await atomicWriteJson(pruningPath(evidence), pruningRecord(evidence));
107
+ let removed = 0;
108
+ for (const artifact of artifacts) {
109
+ const path = transcriptPath(evidence, artifact);
110
+ if (!(await retainedFile(path))) continue;
111
+ await rm(path);
112
+ removed++;
113
+ }
114
+ return removed;
115
+ }
116
+
117
+ /** Missing native bytes require an exact receipt bound to their original references. */
118
+ async function hasPruningRecord(evidence: RunEvidenceData) {
119
+ const path = pruningPath(evidence);
120
+ const marked = await retainedFile(path);
121
+ if (marked) {
122
+ const receipt: unknown = JSON.parse(await readFile(path, "utf8"));
123
+ if (canonicalJson(receipt) !== canonicalJson(pruningRecord(evidence)))
124
+ throw new Error(
125
+ "native transcript pruning record differs from retained evidence",
126
+ );
127
+ }
128
+ return marked !== null;
129
+ }
130
+
131
+ export async function nativeTranscriptRetention(
132
+ evidence: RunEvidenceData | null,
133
+ ) {
134
+ if (!evidence) return [];
135
+ const marked = await hasPruningRecord(evidence);
136
+ const states = [];
137
+ for (const artifact of transcriptArtifacts(evidence)) {
138
+ const present = await transcriptPresent(evidence, artifact);
139
+ if (!present && !marked)
140
+ throw new Error(
141
+ "retained native transcript evidence is missing without a pruning record",
142
+ );
143
+ states.push({ caseId: artifact.caseId, pruned: !present });
144
+ }
145
+ return states;
146
+ }
@@ -3,6 +3,28 @@ export function isRecord(value: unknown): value is Record<string, unknown> {
3
3
  return value !== null && typeof value === "object" && !Array.isArray(value);
4
4
  }
5
5
 
6
+ export function requireRecord(
7
+ value: unknown,
8
+ message: string,
9
+ ): Record<string, unknown> {
10
+ if (!isRecord(value)) throw new Error(message);
11
+ return value;
12
+ }
13
+
14
+ export function validQualifiedId(value: unknown): value is string {
15
+ return (
16
+ typeof value === "string" &&
17
+ /^[a-z][a-z0-9]*(?:[.-][a-z0-9]+)+$/.test(value)
18
+ );
19
+ }
20
+
21
+ export function containsControl(value: string): boolean {
22
+ return Array.from(value).some(
23
+ (character) =>
24
+ character.charCodeAt(0) < 0x20 || character.charCodeAt(0) === 0x7f,
25
+ );
26
+ }
27
+
6
28
  export function isUnknownArray(value: unknown): value is unknown[] {
7
29
  return Array.isArray(value);
8
30
  }
Binary file