@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,6 +1,7 @@
1
1
  # TypeScript quality
2
2
 
3
- `bun run check:typescript` is the local and CI acceptance command. It performs a
3
+ `bun run check:typescript` is the complete local acceptance command. CI runs the
4
+ same checks in parallel phases. The complete command performs a
4
5
  frozen dependency installation, checks the complete source inventory, verifies
5
6
  generated schemas, documentation contracts, formatting, type-aware lint and typing,
6
7
  checks the Codex guide evaluation in dry mode and runs documentation examples, exercises coverage
@@ -14,13 +15,47 @@ schemas, documentation contracts, formatting, lint and types without the full in
14
15
  or package installation. Install dependencies with `bun install --frozen-lockfile`
15
16
  first. Quality dependencies are development dependencies pinned in `bun.lock`.
16
17
 
18
+ After frozen installation, `bun run check:typescript --phase <name>` runs one
19
+ phase and checks the complete source inventory. Each phase reports its elapsed
20
+ time, including when it fails. The complete command runs these same phases in
21
+ order; `--fast` runs only `static` without installing dependencies.
22
+
23
+ | Phase | Checks |
24
+ | --------- | --------------------------------------------------------------------------------------------- |
25
+ | `static` | Schema freshness, documentation contracts, formatting, type-aware lint and typing |
26
+ | `docs` | All guide dry runs, tutorial examples and recipe checks |
27
+ | `tests` | Coverage integrity controls, the complete instrumented Bun suite and both coverage thresholds |
28
+ | `package` | Packed-package installation and installed CLI workflows on Bun and Node |
29
+
30
+ Use the same prerequisites as the corresponding complete-gate checks. A single
31
+ phase is partial evidence; full acceptance requires all four on the same candidate.
32
+ CI assigns every test file to exactly one of four duration-balanced shards, then
33
+ enforces both coverage thresholds on their combined counters over the complete
34
+ production inventory. Local `--phase tests` and the complete command still run
35
+ the suite in one process. See the [shard commands](../scripts/coverage/README.md#test-shards)
36
+ for reproducing the CI split.
37
+
17
38
  ## Source dispositions
18
39
 
19
- [`typescript-sources.json`](../typescript-sources.json) explicitly lists every
20
- TypeScript and JavaScript source. The guard refuses new, missing or duplicated
21
- files and declarations outside the configured TypeScript project. Changing a
22
- source disposition requires review; adding a glob is not a substitute for the
23
- inventory. The coverage baseline includes the platform-reachable subset of
40
+ The [inventory guard](../scripts/typescript-inventory.ts) derives every TypeScript
41
+ and JavaScript source disposition from Git paths, following the
42
+ [maintainer decision in #143](https://github.com/BjRo/sevro/issues/143#issuecomment-6382662399).
43
+ It classifies `git ls-files --cached --others --exclude-standard -z` output using
44
+ the checked path rules, so supported additions and staged renames or deletions
45
+ need no manual manifest edit. Non-ignored untracked sources are included in local
46
+ candidate checks; committed CI checkouts use their tracked paths. Declarations
47
+ take precedence over directory roles, and only the validators in the shared
48
+ [schema catalog](../scripts/schema-catalog.ts) receive the generated disposition.
49
+ Generated `dist/` output is ignored by Git, lint and the authored-source inventory.
50
+ It is rebuilt from inventoried TypeScript and validated through installed-package
51
+ workflows; it never substitutes for authored production coverage.
52
+ Unknown or ambiguous paths, missing tracked files, an incomplete generated set,
53
+ and sources outside lint or typing are refused. An independent filesystem audit
54
+ also refuses ignored authored sources rather than silently dropping them.
55
+ Changing a disposition rule still requires review. Isolated coverage snapshots
56
+ index their copied candidate independently, preserving additions and deletions
57
+ without changing the source checkout's index.
58
+ The coverage baseline includes the platform-reachable subset of
24
59
  `inventory.production`; `scripts/coverage/platform-scope.ts` names each excluded
25
60
  host-specific file. Every production file remains inventoried, typed and linted,
26
61
  and the opposite platform measures it. Current instrumentation supports authored
@@ -29,14 +64,14 @@ validators in `inventory.generated` are excluded from instrumentation and the
29
64
  coverage denominator. New `.tsx`, `.mts`, `.cts` or JavaScript
30
65
  production requires an explicit instrumentation and quality-policy change first.
31
66
 
32
- | Inventory | Lint and typing | Test and coverage disposition |
33
- | -------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
34
- | `production` | Type-aware strict lint and strict compiler | All platform-reachable authored executable `src` statements and branch outcomes, including unimported files in that scope |
35
- | `generated` | CommonJS syntax parsing, exact `schemas:check` freshness, and checked `.d.cts` boundary declarations | Real Bun schema tests; the five declared generated validators are outside the coverage denominator |
36
- | `declarations` | Type-aware lint and compiler | Declaration-only files have no executable counters |
37
- | `tooling` | Same type-aware lint and strict compiler; `.mjs`/`.cjs` use `checkJs` and explicit JSDoc contracts | Durable public gate probes, schema freshness, release and installed-package tests; outside the runner-production denominator |
38
- | `tests` | Same type-aware lint and strict compiler, including fixtures | Real Bun filesystem/process/protocol tests; outside the production denominator |
39
- | `examples` | Same type-aware lint and strict compiler | Packaged demonstration host adapters are synthetic consumer fixtures, exercised by installed-package validation; they implement no runner behavior and are outside the runner-production denominator |
67
+ | Inventory | Lint and typing | Test and coverage disposition |
68
+ | -------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
69
+ | `production` | Type-aware strict lint and strict compiler | All platform-reachable authored executable `src` statements and branch outcomes, including unimported files in that scope |
70
+ | `generated` | CommonJS syntax parsing, exact `schemas:check` freshness, and checked `.d.cts` boundary declarations | Real Bun schema tests; the five declared generated validators are outside the coverage denominator |
71
+ | `declarations` | Type-aware lint and compiler | Declaration-only files have no executable counters |
72
+ | `tooling` | Same type-aware lint and strict compiler; `.mjs`/`.cjs` use `checkJs` and explicit JSDoc contracts | Durable public gate probes, schema freshness, release and installed-package tests; outside the runner-production denominator |
73
+ | `tests` | Same type-aware lint and strict compiler, including fixtures | Real Bun filesystem/process/protocol tests; outside the production denominator |
74
+ | `examples` | Same type-aware lint and strict compiler | Packaged recipe adapters, extensions and evaluator checks are consumer examples, exercised by tutorial and installed-package validation; they implement no runner behavior and are outside the runner-production denominator |
40
75
 
41
76
  Generated AJV CommonJS is deliberately not rewritten to conform to authored-code
42
77
  rules. An earlier audit of the original four generated files using ESLint's
@@ -45,8 +80,8 @@ recommended JavaScript rules found 879 redeclarations, 281 useless assignments,
45
80
  generation freshness, typed public boundaries and runtime behavior remain checked.
46
81
  Generated compiler output is excluded from coverage because the coverage target
47
82
  measures authored runner behavior. This applies only to
48
- `src/generated/cli-result.cjs`, `extension.cjs`, `report.cjs`, `run-evidence.cjs` and `runtime.cjs`
49
- as explicitly declared in the inventory. This disposition does not apply to authored CommonJS, including
83
+ the exact validator paths derived from the [schema catalog](../scripts/schema-catalog.ts),
84
+ which also drives schema generation. This disposition does not apply to authored CommonJS, including
50
85
  the coverage capture hook.
51
86
 
52
87
  ## Types, functions and review
@@ -120,7 +155,7 @@ macOS `sandbox-exec`, Keychain and Apple metadata modules are excluded; on macOS
120
155
  `bubblewrap` module is excluded. Shared isolation and credential code is counted
121
156
  on both.
122
157
 
123
- Apple developer-tool discovery lives in `src/runtime-discovery-apple.ts`, which
158
+ Apple developer-tool discovery lives in `src/runtime/discovery-apple.ts`, which
124
159
  the public loader imports only under its explicit Darwin guard. Linux excludes
125
160
  that exact native module; macOS measures it, and both platforms still typecheck
126
161
  and lint it. The provider lookup, bounded query and read-root safeguards remain
@@ -146,12 +181,24 @@ summary, process ledger, Bun test log, unmodified source snapshot, LCOV and HTML
146
181
  production files, branch exclusions, and exact projected counts.
147
182
  `coverage-raw.json` and the raw summary preserve all validated counters before
148
183
  platform projection.
184
+ CI also retains `.quality/shards/<index>/` with each shard's source snapshot,
185
+ process ledger, test log, raw and portable counters, and manifest. Process IDs
186
+ remain scoped to their original shard. Aggregation verifies candidate contents,
187
+ workflow run, platform, architecture, Bun version, instrumentation
188
+ layout, and exact test assignments before combining counters with normalized
189
+ source paths. Missing, repeated, incomplete, or mismatched shards fail the gate.
190
+ Failed-job reruns can reuse successful shards from earlier attempts of the same
191
+ workflow run; manifests retain each attempt, and rerun shards replace only their
192
+ own artifacts. Another candidate or workflow run cannot supply missing evidence.
149
193
  `--coverage [Bun test arguments]` is a diagnostic measurement; it still enforces
150
194
  both thresholds and writes `.quality/coverage-targeted`, keeping it distinct from
151
195
  the full-suite evidence. Sparse runs are expected to fail the full denominator.
152
196
 
153
197
  The durable public probes are `--probe snapshot`, `--probe scope`, `--probe branch`,
154
198
  `--probe missing-reports`, `--probe integrity`, and `--probe source-map`.
199
+ `tests/scripts/typescript-quality.test.ts` invokes each probe once during the suite;
200
+ the phase entrypoint and shard merge do not rerun them. The commands remain
201
+ available for targeted diagnostics.
155
202
  The scope probe records a zero-seeded baseline and merged real process report
156
203
  under `.quality/coverage-scope`; it verifies that ordinary generated CommonJS
157
204
  validation still runs. Branch and missing-report controls
@@ -159,6 +206,20 @@ deliberately exit 1. A five-of-five statement, one-of-two branch sample must fai
159
206
  with `Below 95%: branches`. The integration suite retains real CLI/extension,
160
207
  graceful SIGINT/SIGTERM cancellation, filesystem isolation and owned-child paths.
161
208
 
209
+ ## Installed runtime acceptance
210
+
211
+ Bun 1.3.13 remains the contributor runtime and test runner. `bun run build`
212
+ emits JavaScript and source maps under `dist/`; `prepack` builds before ordinary
213
+ `npm pack`. Packing with lifecycle scripts disabled requires an explicit build.
214
+ `bun run test:runtime-node` installs the candidate archive with npm, removes Bun
215
+ from the consumer PATH, and exercises the Node 24.13.0 CLI, templates and recipes.
216
+ It also interrupts a real isolated shell check, verifies the interruption exit
217
+ and retained evidence, and refuses a surviving owned child process.
218
+ It reuses the installed-package workflow checks, including synthetic native
219
+ fixtures, with Node selected explicitly. The package quality phase requires
220
+ both the existing Bun package checks and Node acceptance. These deterministic
221
+ checks do not establish authenticated model behavior.
222
+
162
223
  ## Environment and CI
163
224
 
164
225
  The discovery backend was observed with Bun 1.3.13, macOS arm64 and Node 24.13.0.
@@ -167,21 +228,40 @@ Codex 0.160.1 and Claude Code 2.1.284 for deterministic native hook tests. Hoste
167
228
  CI targets `ubuntu-24.04` x64 with Bun 1.3.13 and Node 24.13.0. Its first
168
229
  successful hosted run is required before describing that environment as validated.
169
230
  GitHub documents the [Ubuntu runner labels](https://docs.github.com/en/actions/reference/runners/github-hosted-runners).
170
- Ubuntu installs `bubblewrap` and `socat` and runs the same native isolation cases;
171
- local macOS runs retain `sandbox-exec`. Windows remains unverified.
231
+ Ubuntu installs `bubblewrap`, `ripgrep`, and `socat` and runs the same native isolation cases;
232
+ local macOS runs retain `sandbox-exec`. The macOS quality and coverage gate is
233
+ local-only; the hosted workflow does not run a macOS gate. Windows remains unverified.
234
+
235
+ Ordinary changes and explicit workflow dispatches run the four canonical phases
236
+ concurrently. The tests phase consists of four shard jobs followed by a combined
237
+ coverage job. Each job installs locked dependencies; native host tools are
238
+ installed for `docs` and the test shards, and UV and mise for `docs`. Each shard
239
+ retains its evidence, and the combined `tests` job uploads `.quality` even when
240
+ coverage fails. Shards do not cancel their siblings on failure. A new commit to
241
+ the same pull request cancels its superseded workflow run; main pushes and manual
242
+ runs have independent concurrency groups. The stable aggregate `TypeScript quality`
243
+ status requires every phase and all four shards to succeed. A missing, cancelled,
244
+ skipped or failed phase or shard cannot turn that status green.
172
245
 
173
- Ordinary changes and explicit workflow dispatches invoke the canonical gate,
174
- upload `.quality` even when coverage fails, and publish the stable aggregate
175
- `TypeScript quality` status. A cancelled or failed gate cannot turn that status
176
- green.
246
+ CI caches Bun's package downloads by Bun version, OS, architecture and `bun.lock`;
247
+ every job still performs frozen installation. The docs job and test shards also
248
+ cache the installed Codex and Claude packages by OS, architecture and the setup
249
+ script's content hash, which includes both pinned versions and their installation
250
+ layout. There are no fallback keys for native tools. On a hit, setup copies the
251
+ cached packages into a fresh temporary tool root and verifies both native versions
252
+ before publishing their paths. The cache never contains credentials or replaces
253
+ the isolation prerequisites or required checks.
177
254
 
178
255
  Release metadata changes follow [the release workflow](releases.md) and reuse a
179
256
  successful full gate from an ancestor on `main`, with identical code,
180
257
  dependencies, schemas, tests, and other quality inputs. The selector permits
181
258
  only version/distribution-tag changes and its exact release-file inventory.
182
- It verifies the original full-gate step, so a reused release run cannot serve
183
- as fresh test evidence. Release CI runs `check:typescript --fast`, records the
184
- tested source and CI run URL, and skips the test/coverage job. The aggregate
259
+ It verifies each original phase job and its gate step, including every shard and
260
+ the combined tests job for sharded runs, or a historical complete gate job and
261
+ step. A partial matrix or reused release run cannot serve as fresh test evidence.
262
+ Duplicate phase or shard jobs are ambiguous and refused. Release CI
263
+ runs `check:typescript --fast`, records the tested source and CI run URL, and
264
+ skips all four full-gate phase jobs. The aggregate
185
265
  status requires both verified prior evidence and successful static checks;
186
266
  missing, cancelled, failed, or ambiguous evidence cannot establish a pass.
187
267
  Reused results remain attributed to their original run rather than being
@@ -0,0 +1,26 @@
1
+ import { readFile, writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+
4
+ /** Trusted, deterministic participant for exercising the recipe's real graders. */
5
+ const host = {
6
+ id: "recipes.deterministic",
7
+ model: "fixture-editor",
8
+ effort: "none",
9
+ async run({ workspace }: { workspace: string }) {
10
+ const task = await readFile(join(workspace, "README.md"), "utf8");
11
+ const failing = process.env.SEVRO_RECIPE_FAIL === "1";
12
+ if (task.includes("Fix add")) {
13
+ await writeFile(
14
+ join(workspace, "math.cjs"),
15
+ `exports.add = (a, b) => a ${failing ? "-" : "+"} b;\n`,
16
+ );
17
+ }
18
+ return {
19
+ finalMessage: failing
20
+ ? "Start with npm start on port 9000."
21
+ : "Run bun run dev on port 3000.",
22
+ complete: true,
23
+ };
24
+ },
25
+ };
26
+ export default host;
@@ -0,0 +1,21 @@
1
+ {
2
+ "id": "recipe-coding-change",
3
+ "prompt": "Fix add in math.cjs so it adds its two numeric arguments. Do not modify README.md. Explain how to start the application.",
4
+ "fixture": {
5
+ "files": {
6
+ "README.md": "Fix add in math.cjs. Start the application with bun run dev on port 3000.\n",
7
+ "math.cjs": "exports.add = (a, b) => a - b;\n"
8
+ }
9
+ },
10
+ "checks": [
11
+ {
12
+ "id": "addition",
13
+ "grader": "sevro.shell",
14
+ "configuration": {
15
+ "run": "{{evaluator-test}}",
16
+ "expectExact": "coding checks passed"
17
+ }
18
+ }
19
+ ],
20
+ "requiredEvidence": []
21
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "id": "recipe-host-tools",
3
+ "prompt": "Read app.env with rg, then explain the application's start command and port.",
4
+ "fixture": {
5
+ "files": {
6
+ "README.md": "Start with bun run dev on port 3000.\n",
7
+ "app.env": "port=3000\n"
8
+ }
9
+ },
10
+ "checks": [
11
+ {
12
+ "id": "rg-access",
13
+ "grader": "sevro.shell",
14
+ "configuration": {
15
+ "run": "rg '^port=3000$' app.env",
16
+ "expectExact": "port=3000"
17
+ }
18
+ }
19
+ ],
20
+ "requiredEvidence": []
21
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "id": "recipe-mise",
3
+ "prompt": "Use node from PATH to read app.json, then explain the application's start command and port. The operator has resolved mise's existing node@24.13.0 installation; do not download anything.",
4
+ "fixture": {
5
+ "files": {
6
+ "README.md": "Start with bun run dev on port 3000.\n",
7
+ "app.json": "{\"port\":3000}\n"
8
+ }
9
+ },
10
+ "checks": [
11
+ {
12
+ "id": "mise-node-access",
13
+ "grader": "sevro.shell",
14
+ "configuration": {
15
+ "run": "node -e 'if (process.version !== \"v24.13.0\") process.exit(1); const a = require(\"./app.json\"); if (a.port !== 3000) process.exit(1); console.log(a.port)'",
16
+ "expectExact": "3000"
17
+ }
18
+ }
19
+ ],
20
+ "requiredEvidence": []
21
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "id": "recipe-node",
3
+ "prompt": "Read app.json with Node and explain the application's start command and port.",
4
+ "fixture": {
5
+ "files": {
6
+ "README.md": "Start with bun run dev on port 3000.\n",
7
+ "app.json": "{\"port\":3000}\n"
8
+ }
9
+ },
10
+ "checks": [
11
+ {
12
+ "id": "node-access",
13
+ "grader": "sevro.shell",
14
+ "configuration": {
15
+ "run": "node -e 'const a = require(\"./app.json\"); if (a.port !== 3000) process.exit(1); console.log(a.port)'",
16
+ "expectExact": "3000"
17
+ }
18
+ }
19
+ ],
20
+ "requiredEvidence": []
21
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "id": "recipe-python-uv",
3
+ "prompt": "Use uv run --offline --no-project --python \"$RECIPE_PYTHON\" python to read app.json, then explain the application's start command and port.",
4
+ "fixture": {
5
+ "files": {
6
+ "README.md": "Start with bun run dev on port 3000.\n",
7
+ "app.json": "{\"port\":3000}\n"
8
+ }
9
+ },
10
+ "checks": [
11
+ {
12
+ "id": "uv-python-access",
13
+ "grader": "sevro.shell",
14
+ "configuration": {
15
+ "run": "uv run --offline --no-project --python \"$RECIPE_PYTHON\" python -c 'import json; p=json.load(open(\"app.json\"))[\"port\"]; assert p == 3000; print(p)'",
16
+ "expectExact": "3000"
17
+ }
18
+ }
19
+ ],
20
+ "requiredEvidence": []
21
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "id": "recipe-semantic",
3
+ "prompt": "Read README.md and explain how to start the application, including its port.",
4
+ "fixture": {
5
+ "files": { "README.md": "Start with bun run dev on port 3000.\n" }
6
+ },
7
+ "checks": [
8
+ {
9
+ "id": "startup-meaning",
10
+ "grader": "sevro.semantic",
11
+ "configuration": {
12
+ "proposition": "The response tells the reader to run bun run dev and says that the application listens on port 3000."
13
+ }
14
+ }
15
+ ],
16
+ "requiredEvidence": []
17
+ }
@@ -0,0 +1,23 @@
1
+ import assert from "node:assert/strict";
2
+ import { join } from "node:path";
3
+ import { pathToFileURL } from "node:url";
4
+
5
+ interface Addition {
6
+ add: (left: number, right: number) => number;
7
+ }
8
+ function isAddition(value: unknown): value is Addition {
9
+ return (
10
+ typeof value === "object" &&
11
+ value !== null &&
12
+ "add" in value &&
13
+ typeof value.add === "function"
14
+ );
15
+ }
16
+ const candidate: unknown = await import(
17
+ pathToFileURL(join(process.cwd(), "math.cjs")).href
18
+ );
19
+ assert.ok(isAddition(candidate), "Candidate must export add");
20
+ assert.equal(candidate.add(2, 3), 5);
21
+ assert.equal(candidate.add(-2, 3), 1);
22
+ assert.equal(candidate.add(0, 0), 0);
23
+ console.log("coding checks passed");
@@ -0,0 +1,19 @@
1
+ import { accessSync, constants, statSync } from "node:fs";
2
+ import { delimiter, resolve } from "node:path";
3
+
4
+ export function which(name: string, path?: string): string | null {
5
+ for (const directory of executablePath(path).split(delimiter)) {
6
+ const candidate = resolve(directory, name);
7
+ try {
8
+ accessSync(candidate, constants.X_OK);
9
+ if (statSync(candidate).isFile()) return candidate;
10
+ } catch {
11
+ /* Continue searching the declared executable path. */
12
+ }
13
+ }
14
+ return null;
15
+ }
16
+
17
+ function executablePath(path: string | undefined): string {
18
+ return path ?? process.env.PATH ?? "";
19
+ }
@@ -0,0 +1,65 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readFile } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+
5
+ export function artifact(relativePath: string, content: string) {
6
+ return {
7
+ id: `recipes.${createHash("sha256").update(relativePath).digest("hex").slice(0, 16)}`,
8
+ relativePath,
9
+ sha256: createHash("sha256").update(content).digest("hex"),
10
+ contentBase64: Buffer.from(content).toString("base64"),
11
+ gitExclude: true,
12
+ };
13
+ }
14
+
15
+ export async function repositoryArtifacts(host: string) {
16
+ const directory = host === "claude" ? ".claude" : ".agents";
17
+ const relative = `${directory}/skills/startup-guide/SKILL.md`;
18
+ const body = await readFile(
19
+ join(import.meta.dirname, "repository-skill", relative),
20
+ "utf8",
21
+ );
22
+ return [artifact(relative, body)];
23
+ }
24
+
25
+ export function pluginArtifacts() {
26
+ const files = {
27
+ "marketplace/.claude-plugin/marketplace.json": JSON.stringify({
28
+ name: "recipes",
29
+ owner: { name: "Sevro examples" },
30
+ plugins: [
31
+ { name: "startup", source: "./plugin", description: "Startup recipe" },
32
+ ],
33
+ }),
34
+ "marketplace/plugin/.claude-plugin/plugin.json": JSON.stringify({
35
+ name: "startup",
36
+ version: "1.0.0",
37
+ }),
38
+ "marketplace/plugin/.codex-plugin/plugin.json": JSON.stringify({
39
+ name: "startup",
40
+ version: "1.0.0",
41
+ skills: "./skills/",
42
+ }),
43
+ "marketplace/plugin/skills/startup-guide/SKILL.md":
44
+ "---\nname: startup-guide\ndescription: Explain application startup.\n---\nRead README.md. Explain its command and port.\n",
45
+ "marketplace/plugin/hooks/hooks.json": JSON.stringify({
46
+ hooks: {
47
+ SessionStart: [
48
+ {
49
+ hooks: [
50
+ {
51
+ type: "command",
52
+ command: '/bin/sh "${CLAUDE_PLUGIN_ROOT}/hooks/start.sh"',
53
+ },
54
+ ],
55
+ },
56
+ ],
57
+ },
58
+ }),
59
+ "marketplace/plugin/hooks/start.sh":
60
+ "#!/bin/sh\nprintf 'hook ran\\n' > \"$PWD/hook-ran.txt\"\n",
61
+ };
62
+ return Object.entries(files).map(([path, content]) =>
63
+ artifact(path, content),
64
+ );
65
+ }
@@ -0,0 +1,174 @@
1
+ import {
2
+ artifact,
3
+ pluginArtifacts,
4
+ repositoryArtifacts,
5
+ } from "./extension-artifacts";
6
+
7
+ export function record(value: unknown): Record<string, unknown> {
8
+ if (value === null || typeof value !== "object" || Array.isArray(value))
9
+ throw new Error("Expected a JSON object");
10
+ return value as Record<string, unknown>;
11
+ }
12
+
13
+ export function describe(mode: string, host: string) {
14
+ const capabilities: Record<string, string[]> = {
15
+ lifecycle: [],
16
+ "repository-skill": [`sevro.${host}.repository-invocation`],
17
+ plugins:
18
+ host === "codex"
19
+ ? ["sevro.codex.plugin-marketplace", "sevro.codex.explicit-invocation"]
20
+ : ["sevro.claude.plugin-dirs", "sevro.claude.explicit-invocation"],
21
+ };
22
+ const requiredCapabilities = capabilities[mode];
23
+ if (!requiredCapabilities) throw new Error("Unknown extension recipe");
24
+ return {
25
+ extension: { id: "recipes.startup", version: "1.0.0" },
26
+ protocols: ["sevro.extension.v1"],
27
+ requiredCapabilities,
28
+ optionalCapabilities: [],
29
+ graders: ["recipes.startup"],
30
+ taskVerdictPolicies: [],
31
+ };
32
+ }
33
+
34
+ function requiredInvocation(mode: string, host: string): string[] {
35
+ if (mode !== "repository-skill") return [];
36
+ return [
37
+ host === "codex"
38
+ ? "sevro.codex.explicit-invocation"
39
+ : "sevro.claude.repository-invocation",
40
+ ];
41
+ }
42
+
43
+ export function resolveCase(mode: string, host: string, fail: boolean) {
44
+ const invocation = mode === "lifecycle" ? "" : "{{sevro.skill_invocation}} ";
45
+ const prompt = fail
46
+ ? "Deliberate negative control: return only wrong."
47
+ : "Read README.md. Explain the application's start command and port. Do not change files.";
48
+ const requiredEvidence = requiredInvocation(mode, host);
49
+ return {
50
+ cases: [
51
+ {
52
+ id: "recipe-extension",
53
+ prompt: invocation + prompt,
54
+ fixture: {
55
+ kind: "generated",
56
+ commits: [
57
+ {
58
+ message: "chore: initialize sample",
59
+ files: { "README.md": "Run bun run dev on port 3000.\n" },
60
+ },
61
+ ],
62
+ },
63
+ checks: [
64
+ {
65
+ id: "startup-command",
66
+ grader: "sevro.regex",
67
+ configuration: { pattern: "bun run dev" },
68
+ },
69
+ {
70
+ id: "prepared-input",
71
+ grader: "sevro.shell",
72
+ configuration: {
73
+ run: "test \"$(cat startup.txt)\" = 'prepared startup data'",
74
+ },
75
+ },
76
+ ...(mode === "plugins"
77
+ ? [
78
+ {
79
+ id: "plugin-hook",
80
+ grader: "sevro.shell",
81
+ configuration: {
82
+ run: "cat hook-ran.txt",
83
+ expectExact: "hook ran",
84
+ },
85
+ },
86
+ ]
87
+ : []),
88
+ {
89
+ id: "recipes.startup.answer",
90
+ grader: "recipes.startup",
91
+ configuration: {},
92
+ },
93
+ ],
94
+ requiredEvidence,
95
+ extensionData: { "recipes.startup": { mode, host } },
96
+ },
97
+ ],
98
+ };
99
+ }
100
+
101
+ export async function prepare(mode: string, host: string) {
102
+ const base = {
103
+ artifacts: [artifact("startup.txt", "prepared startup data\n")],
104
+ requestedInstrumentation: [],
105
+ extensionData: { "recipes.startup": { mode, host } },
106
+ };
107
+ switch (mode) {
108
+ case "repository-skill":
109
+ return {
110
+ ...base,
111
+ artifacts: [...base.artifacts, ...(await repositoryArtifacts(host))],
112
+ ...(host === "codex"
113
+ ? { codexRepositorySkillInvocation: { skillName: "startup-guide" } }
114
+ : {
115
+ claudeRepositorySkillInvocation: { skillName: "startup-guide" },
116
+ }),
117
+ };
118
+ case "plugins":
119
+ return {
120
+ ...base,
121
+ artifacts: [...base.artifacts, ...pluginArtifacts()],
122
+ ...(host === "codex"
123
+ ? {
124
+ codexMarketplace: {
125
+ artifactRoot: "marketplace",
126
+ marketplaceName: "recipes",
127
+ pluginNames: ["startup"],
128
+ },
129
+ codexSkillInvocation: {
130
+ pluginName: "startup",
131
+ skillName: "startup-guide",
132
+ },
133
+ }
134
+ : {
135
+ claudePluginDirs: { artifactRoots: ["marketplace/plugin"] },
136
+ claudeSkillInvocation: {
137
+ pluginName: "startup",
138
+ skillName: "startup-guide",
139
+ },
140
+ }),
141
+ };
142
+ default:
143
+ return base;
144
+ }
145
+ }
146
+
147
+ function answerStatus(observation: Record<string, unknown>) {
148
+ if (observation.completeness !== "complete") return "unavailable";
149
+ const text = record(observation.data).text;
150
+ return typeof text === "string" && /\b3000\b/.test(text)
151
+ ? "passed"
152
+ : "failed";
153
+ }
154
+
155
+ export function evaluate(params: Record<string, unknown>) {
156
+ if (!Array.isArray(params.observations))
157
+ throw new Error("Missing observations");
158
+ const observations: unknown[] = params.observations;
159
+ const observation = observations
160
+ .map(record)
161
+ .find((item) => item.id === "sevro.observation.final-message");
162
+ if (!observation) throw new Error("Missing final-message observation");
163
+ const status = answerStatus(observation);
164
+ return {
165
+ checks: [
166
+ {
167
+ id: "recipes.startup.answer",
168
+ status,
169
+ evidenceRefs: ["sevro.observation.final-message"],
170
+ },
171
+ ],
172
+ metrics: [],
173
+ };
174
+ }