@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,28 +1,22 @@
1
1
  import { existsSync } from "node:fs";
2
- import {
3
- requireCandidateRuntime,
4
- requireCandidateArtifactRoots,
5
- } from "../candidate-artifacts";
6
- import { mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
2
+ import { candidateCodexStateRetained } from "../candidate-codex-state";
3
+ import { lstat, mkdtemp, rm, writeFile } from "node:fs/promises";
7
4
  import { tmpdir } from "node:os";
8
5
  import { isAbsolute, join } from "node:path";
9
6
  import type { HostAdapter, HostResult } from "../engine";
10
- import {
11
- allocateNativeState,
12
- requireNativeTranscriptView,
13
- } from "../native-transcript-state";
7
+ import { allocateNativeState } from "../native-transcript-state";
14
8
  import {
15
9
  failedNativeTranscripts,
16
10
  retainEnabledNativeTranscripts,
17
11
  } from "../native-transcripts";
18
- import { runtimeNativeGoalEnabled } from "../runtime-config";
12
+ import { runtimeNativeGoalEnabled } from "../runtime/config";
19
13
  import {
20
14
  releaseRuntimeHooks,
21
15
  runtimeHookObservation,
22
16
  type HookMounts,
23
- } from "../runtime-hooks";
24
- import { runtimeObservations } from "../runtime-state";
25
- import { isOptionalNonblankString } from "../value-guards";
17
+ } from "../runtime/hooks";
18
+ import { runtimeObservations } from "../runtime/state";
19
+ import { validateNativeHostRequest, validHostTimeout } from "./native-request";
26
20
  import { runCodexAppServer } from "./codex-app-server";
27
21
  import { summarizeCodexEvents, type CodexEventSummary } from "./codex-events";
28
22
  import { verifyCodexInvocation } from "./codex-invocation";
@@ -30,10 +24,8 @@ import { installCodexPlugins } from "./codex-marketplace";
30
24
  import {
31
25
  codexNativeCallObservation,
32
26
  codexNativeSessionLastOrdinal,
33
- codexNativeSkillReadRecovery,
34
27
  } from "./codex-native-calls";
35
28
  import { runCodexProcess, CodexProcessFailure } from "./codex-process";
36
- import { codexSkillReadObservation } from "./codex-skill-reads";
37
29
  import {
38
30
  codexHookMounts,
39
31
  prepareCodexState,
@@ -41,10 +33,23 @@ import {
41
33
  } from "./codex-state";
42
34
  import { codexNativeControls } from "./native-controls";
43
35
  import { workspaceFingerprint } from "./workspace-fingerprint";
36
+ import { codexSkillCatalogRoots } from "./skill-hook-catalog";
37
+ import {
38
+ prepareSkillTracking,
39
+ skillTrackingObservation,
40
+ skillActivationClaims,
41
+ skillExposureClaims,
42
+ type SkillTracking,
43
+ } from "./skill-hooks";
44
+ import {
45
+ cleanupNativeState,
46
+ createHostDiagnostics,
47
+ diagnoseHostRequest,
48
+ diagnosticConfiguration,
49
+ type HostDiagnostics,
50
+ } from "../host-diagnostics";
44
51
  export type { CodexHostOptions } from "./codex-state";
45
- const MAX_EVENT_BYTES = 8 * 1024 * 1024;
46
52
  const DEFAULT_TIMEOUT_MS = 10 * 60_000;
47
- const MAX_TIMEOUT_MS = 30 * 60_000;
48
53
 
49
54
  type Request = Parameters<HostAdapter["run"]>[0];
50
55
  type ProcessResult = Pick<
@@ -63,8 +68,9 @@ interface ExecutionContext {
63
68
  request: Request;
64
69
  state: CodexState;
65
70
  timeoutMs: number;
66
- installedPluginRoots: string[];
67
- hooks?: HookMounts;
71
+ hooks: HookMounts;
72
+ skillTracking: SkillTracking;
73
+ diagnostics: HostDiagnostics;
68
74
  }
69
75
  interface TurnResult {
70
76
  execution: ProcessResult;
@@ -73,7 +79,6 @@ interface TurnResult {
73
79
  followUpSummary: CodexEventSummary | null;
74
80
  appServer: AppServerResult | null;
75
81
  continuation: Observation | undefined;
76
- observedEvents: string;
77
82
  }
78
83
 
79
84
  function validCodexPaths(options: CodexHostOptions): boolean {
@@ -96,13 +101,7 @@ function validEntrypoint(entrypoint: CodexHostOptions["entrypoint"]): boolean {
96
101
  entrypoint === undefined || ["exec", "app-server"].includes(entrypoint)
97
102
  );
98
103
  }
99
- function validCodexTimeout(timeoutMs: number): boolean {
100
- return (
101
- Number.isSafeInteger(timeoutMs) &&
102
- timeoutMs >= 1 &&
103
- timeoutMs <= MAX_TIMEOUT_MS
104
- );
105
- }
104
+
106
105
  function validCodexIdentity(
107
106
  options: CodexHostOptions,
108
107
  limit: number | null,
@@ -113,7 +112,7 @@ function validCodexIdentity(
113
112
  !!options.effort &&
114
113
  validEntrypoint(options.entrypoint) &&
115
114
  validConcurrencyLimit(limit) &&
116
- validCodexTimeout(timeoutMs)
115
+ validHostTimeout(timeoutMs)
117
116
  );
118
117
  }
119
118
  function codexCapabilities(
@@ -124,21 +123,24 @@ function codexCapabilities(
124
123
  "sevro.host.runtime",
125
124
  "sevro.host.native-transcripts",
126
125
  "sevro.host.hooks",
126
+ "sevro.host.skill-activations",
127
+ "sevro.host.skill-activation-claims",
128
+ "sevro.host.skill-exposure-claims",
127
129
  ...(entrypoint === "app-server" ? ["sevro.host.native-goal"] : []),
128
130
  "sevro.codex.plugin-marketplace",
129
131
  "sevro.codex.explicit-invocation",
130
132
  "sevro.codex.repository-invocation",
131
133
  "sevro.codex.native-calls",
132
134
  "sevro.host.native-controls",
133
- "sevro.codex.initial-skill-reads",
134
- "sevro.codex.follow-up-skill-reads",
135
135
  ];
136
136
  }
137
137
  function codexConfiguration(
138
138
  limit: number | null,
139
139
  entrypoint: CodexHostOptions["entrypoint"],
140
+ retainDiagnostics?: boolean,
140
141
  ) {
141
142
  return {
143
+ ...diagnosticConfiguration(retainDiagnostics),
142
144
  "sevro.codex.agent-concurrency-limit": limit,
143
145
  ...(entrypoint === "app-server"
144
146
  ? { "sevro.codex.entrypoint": "app-server" }
@@ -160,30 +162,17 @@ export function createCodexHost(options: CodexHostOptions): HostAdapter {
160
162
  hostCapabilities: codexCapabilities(options.entrypoint),
161
163
  model: options.model,
162
164
  effort: options.effort,
163
- configuration: codexConfiguration(limit, options.entrypoint),
165
+ configuration: codexConfiguration(
166
+ limit,
167
+ options.entrypoint,
168
+ options.retainHostDiagnostics,
169
+ ),
164
170
  run(request) {
165
171
  return runCodexRequest(options, timeoutMs, limit, request);
166
172
  },
167
173
  };
168
174
  }
169
175
 
170
- function requireCodexFollowUp(request: Request): void {
171
- if (!isOptionalNonblankString(request.followUpPrompt))
172
- throw new Error("Codex follow-up prompt must be nonempty");
173
- }
174
- function requireCodexFixtureBin(request: Request): void {
175
- if (
176
- request.fixtureBinDir !== undefined &&
177
- request.fixtureBinDir !== join(request.workspace, ".git", "fixture-bin")
178
- )
179
- throw new Error("fixture binary path is outside the workspace");
180
- }
181
- function requirePassiveCodexRequest(request: Request): void {
182
- if (request.instrumentation?.length)
183
- throw new Error("Codex instrumentation is unavailable");
184
- if (request.condition !== "passive")
185
- throw new Error("Codex enforcement instrumentation is unavailable");
186
- }
187
176
  function allocateCodexRequestState(request: Request): Promise<string> {
188
177
  return allocateNativeState(
189
178
  "codex-",
@@ -197,19 +186,27 @@ async function runCodexRequest(
197
186
  limit: number | null,
198
187
  request: Request,
199
188
  ): Promise<HostResult> {
200
- requireCodexFollowUp(request);
201
- await requireNativeTranscriptView(request.candidateTranscriptRoot);
202
- await requireCandidateRuntime(
203
- request.candidateRuntimeRoot,
204
- request.runtimeRole,
189
+ const diagnostics = createHostDiagnostics(
190
+ "codex",
191
+ options.retainHostDiagnostics,
192
+ request,
205
193
  );
206
- await requireCandidateArtifactRoots(request.candidateArtifactRoots);
207
- requireCodexFixtureBin(request);
208
- requirePassiveCodexRequest(request);
209
- requireCodexGoalRoute(request, options);
210
- await verifyCodexInvocation(request);
211
- if (existsSync(join(request.workspace, ".codex")))
212
- throw new Error("fixture Codex configuration is unsupported");
194
+ return diagnoseHostRequest(diagnostics, async () => {
195
+ diagnostics.stage = "request-validation";
196
+ await diagnostics.readCredentials(options.authFile);
197
+ return executeCodexRequest(options, timeoutMs, limit, request, diagnostics);
198
+ });
199
+ }
200
+
201
+ async function executeCodexRequest(
202
+ options: CodexHostOptions,
203
+ timeoutMs: number,
204
+ limit: number | null,
205
+ request: Request,
206
+ diagnostics: HostDiagnostics,
207
+ ): Promise<HostResult> {
208
+ await validateCodexRequest(options, request);
209
+ diagnostics.stage = "state-allocation";
213
210
  const stateRoot = await allocateCodexRequestState(request);
214
211
  const helperRoot =
215
212
  process.platform === "linux"
@@ -217,6 +214,7 @@ async function runCodexRequest(
217
214
  : undefined;
218
215
  let activeHooks: HookMounts | undefined;
219
216
  try {
217
+ diagnostics.stage = "state-preparation";
220
218
  const state = await prepareCodexState(
221
219
  stateRoot,
222
220
  options,
@@ -229,29 +227,29 @@ async function runCodexRequest(
229
227
  env: state.env,
230
228
  pluginCacheRoot: state.pluginCacheRoot,
231
229
  request,
230
+ diagnostics,
232
231
  });
232
+ diagnostics.stage = "hooks-preparation";
233
233
  const hooks = await codexHookMounts(request, state, installedPluginRoots);
234
234
  activeHooks = hooks;
235
- await codexPreflight(options, request, state);
235
+ const skillTracking = await prepareCodexSkillTracking(
236
+ state,
237
+ request,
238
+ installedPluginRoots,
239
+ );
240
+ await codexPreflight(options, request, state, diagnostics);
236
241
  const context: ExecutionContext = {
237
242
  options,
238
243
  request,
239
244
  state,
240
245
  timeoutMs,
241
- installedPluginRoots,
242
246
  hooks,
247
+ skillTracking,
248
+ diagnostics,
243
249
  };
244
250
  const turns = await new CodexTurnExecution(context).run();
245
- const result = await codexHostResult(context, turns);
246
- await retainEnabledNativeTranscripts(
247
- result,
248
- request.runtimePolicy,
249
- join(state.codexHome, "sessions"),
250
- "codex",
251
- request.runtimeRole,
252
- turns.summary.threadId,
253
- );
254
- return result;
251
+ if (turns.summary.complete) diagnostics.stage = "result-processing";
252
+ return await retainCodexResult(context, turns);
255
253
  } catch (cause) {
256
254
  return await failedNativeTranscripts(
257
255
  cause,
@@ -259,14 +257,92 @@ async function runCodexRequest(
259
257
  join(stateRoot, "codex-home", "sessions"),
260
258
  "codex",
261
259
  request.runtimeRole,
260
+ diagnostics,
262
261
  );
263
262
  } finally {
264
- await releaseRuntimeHooks(activeHooks);
265
- await rm(stateRoot, { recursive: true, force: true });
266
- if (helperRoot) await rm(helperRoot, { recursive: true, force: true });
263
+ await cleanupNativeState(diagnostics, async () => {
264
+ await releaseRuntimeHooks(activeHooks);
265
+ if (!candidateCodexStateRetained(request.candidateRuntimeRoot, stateRoot))
266
+ await rm(stateRoot, { recursive: true, force: true });
267
+ if (helperRoot) await rm(helperRoot, { recursive: true, force: true });
268
+ });
267
269
  }
268
270
  }
269
271
 
272
+ async function retainCodexResult(context: ExecutionContext, turns: TurnResult) {
273
+ const result = await codexHostResult(context, turns);
274
+ await context.diagnostics.retainFailure(
275
+ result,
276
+ "Codex host execution did not complete",
277
+ );
278
+ await retainEnabledNativeTranscripts(
279
+ result,
280
+ context.request.runtimePolicy,
281
+ join(context.state.codexHome, "sessions"),
282
+ "codex",
283
+ context.request.runtimeRole,
284
+ turns.summary.threadId,
285
+ );
286
+ return result;
287
+ }
288
+
289
+ async function prepareCodexSkillTracking(
290
+ state: CodexState,
291
+ request: Request,
292
+ pluginRoots: string[],
293
+ ): Promise<SkillTracking> {
294
+ const roots = await codexSkillCatalogRoots(request.workspace, pluginRoots, [
295
+ { directory: join(state.codexHome, "skills"), boundary: state.codexHome },
296
+ {
297
+ directory: join(state.parentHome, ".agents/skills"),
298
+ boundary: state.parentHome,
299
+ },
300
+ {
301
+ directory: join(state.commandHome, ".agents/skills"),
302
+ boundary: state.commandHome,
303
+ },
304
+ {
305
+ directory: join(state.commandHome, ".codex/skills"),
306
+ boundary: state.commandHome,
307
+ },
308
+ ]);
309
+ const tracking = await prepareSkillTracking({
310
+ privateRoot: state.codexHome,
311
+ host: "codex",
312
+ roots,
313
+ });
314
+ await writeFile(
315
+ join(state.codexHome, "hooks.json"),
316
+ JSON.stringify({ hooks: tracking.hooks }),
317
+ {
318
+ flag: "wx",
319
+ mode: 0o600,
320
+ },
321
+ );
322
+ return tracking;
323
+ }
324
+
325
+ async function validateCodexRequest(
326
+ options: CodexHostOptions,
327
+ request: Request,
328
+ ): Promise<void> {
329
+ await validateNativeHostRequest(request, "Codex");
330
+ requireCodexGoalRoute(request, options);
331
+ await verifyCodexInvocation(request);
332
+ await requireCodexFixtureConfiguration(request);
333
+ }
334
+
335
+ async function requireCodexFixtureConfiguration(
336
+ request: Request,
337
+ ): Promise<void> {
338
+ const path = join(request.workspace, ".codex");
339
+ if (!existsSync(path)) return;
340
+ if (request.runtimePolicy?.codexState !== true)
341
+ throw new Error("fixture Codex configuration is unsupported");
342
+ if (!(await lstat(path)).isDirectory())
343
+ throw new Error("fixture Codex configuration must be a physical directory");
344
+ }
345
+
270
346
  function requireCodexGoalRoute(
271
347
  request: Request,
272
348
  options: CodexHostOptions,
@@ -296,8 +372,10 @@ async function sandboxPreflight(
296
372
  state: CodexState,
297
373
  request: Request,
298
374
  command: string[],
375
+ diagnostics: HostDiagnostics,
299
376
  ) {
300
377
  return runCodexProcess({
378
+ diagnostics,
301
379
  argv: sandboxArgs(state, request, command),
302
380
  cwd: request.workspace,
303
381
  env: state.env,
@@ -310,20 +388,33 @@ async function codexPreflight(
310
388
  options: CodexHostOptions,
311
389
  request: Request,
312
390
  state: CodexState,
391
+ diagnostics: HostDiagnostics,
313
392
  ): Promise<void> {
393
+ diagnostics.stage = "isolation-preflight";
314
394
  const probe = join(state.commandTemp, "isolation-probe");
315
395
  await writeFile(probe, "probe\n", { flag: "wx", mode: 0o600 });
316
- const checked = await sandboxPreflight(state, request, [
317
- "/bin/sh",
318
- "-c",
319
- '/bin/cat "$1" >/dev/null && ! /bin/ls "$2" >/dev/null 2>&1 && ! /bin/cat "$3" >/dev/null 2>&1 && ! /bin/cat "$4" >/dev/null 2>&1 || exit 70; "$5" --version >/dev/null 2>&1 || exit 71',
320
- "sevro-probe",
321
- probe,
322
- options.projectRoot,
323
- join(state.codexHome, "auth.json"),
324
- join(state.codexHome, "config.toml"),
325
- state.sandboxBinary,
326
- ]);
396
+ const checked = await sandboxPreflight(
397
+ state,
398
+ request,
399
+ [
400
+ "/bin/sh",
401
+ "-c",
402
+ '/bin/cat "$1" >/dev/null && ! /bin/ls "$2" >/dev/null 2>&1 && ! /bin/cat "$3" >/dev/null 2>&1 && ! /bin/cat "$4" >/dev/null 2>&1 || exit 70; "$5" --version >/dev/null 2>&1 || exit 71',
403
+ "sevro-probe",
404
+ probe,
405
+ options.projectRoot,
406
+ join(state.codexHome, "auth.json"),
407
+ // The opt-in config read is tested separately; credentials always stay denied.
408
+ join(
409
+ state.codexHome,
410
+ request.runtimePolicy?.codexState === true
411
+ ? "auth.json"
412
+ : "config.toml",
413
+ ),
414
+ state.sandboxBinary,
415
+ ],
416
+ diagnostics,
417
+ );
327
418
  if (checked.code === 71)
328
419
  throw new CodexProcessFailure("executable-preflight", checked);
329
420
  if (checked.code !== 0)
@@ -342,7 +433,7 @@ function routeArgs(context: ExecutionContext): string[] {
342
433
  "-c",
343
434
  'approval_policy="never"',
344
435
  "-c",
345
- `features.hooks=${Boolean(context.hooks)}`,
436
+ "features.hooks=true",
346
437
  ];
347
438
  }
348
439
  function initialTurnArgs(context: ExecutionContext): string[] {
@@ -357,7 +448,7 @@ function initialTurnArgs(context: ExecutionContext): string[] {
357
448
  ? []
358
449
  : ["--ephemeral"]),
359
450
  "--ignore-rules",
360
- ...(context.hooks ? ["--dangerously-bypass-hook-trust"] : []),
451
+ "--dangerously-bypass-hook-trust",
361
452
  "-C",
362
453
  context.request.workspace,
363
454
  ...routeArgs(context),
@@ -376,7 +467,7 @@ function followUpTurnArgs(
376
467
  "--strict-config",
377
468
  "--skip-git-repo-check",
378
469
  "--ignore-rules",
379
- ...(context.hooks ? ["--dangerously-bypass-hook-trust"] : []),
470
+ "--dangerously-bypass-hook-trust",
380
471
  ...routeArgs(context),
381
472
  threadId,
382
473
  "-",
@@ -387,7 +478,9 @@ async function codexProcessTurn(
387
478
  argv: string[],
388
479
  input: string,
389
480
  ): Promise<ProcessResult> {
390
- return runCodexProcess({
481
+ context.diagnostics.stage = "exec";
482
+ const result = await runCodexProcess({
483
+ diagnostics: context.diagnostics,
391
484
  argv,
392
485
  cwd: context.request.workspace,
393
486
  env: context.state.env,
@@ -395,6 +488,7 @@ async function codexProcessTurn(
395
488
  timeoutMs: context.timeoutMs,
396
489
  signal: context.request.signal,
397
490
  });
491
+ return result;
398
492
  }
399
493
  async function initialFingerprint(request: Request): Promise<string | null> {
400
494
  return request.followUpPrompt
@@ -442,43 +536,26 @@ function requireFollowUpCompletion(
442
536
  "Codex follow-up turn did not complete in the original thread",
443
537
  );
444
538
  }
445
- async function appServerSummary(
446
- result: AppServerResult,
447
- workspace: string,
448
- ): Promise<CodexEventSummary> {
539
+ function appServerSummary(result: AppServerResult): CodexEventSummary {
449
540
  return {
450
541
  threadId: result.evidence.threadId ?? "",
451
542
  complete: result.code === 0,
452
- finalMessage:
453
- result.code === 0
454
- ? await readFile(join(workspace, ".git", "last-message.md"), "utf8")
455
- : null,
543
+ finalMessage: result.finalMessage,
544
+ // App-server reports cumulative thread totals, not per-turn usage. Keep
545
+ // usage unknown rather than count continuations or feedback more than once.
456
546
  inputTokens: null,
457
547
  outputTokens: null,
458
548
  usageComplete: false,
459
549
  };
460
550
  }
461
- async function initialSummary(
551
+ function initialSummary(
462
552
  appServer: AppServerResult | null,
463
553
  execution: ProcessResult,
464
- request: Request,
465
- ): Promise<CodexEventSummary> {
554
+ ): CodexEventSummary {
466
555
  return appServer
467
- ? appServerSummary(appServer, request.workspace)
556
+ ? appServerSummary(appServer)
468
557
  : summarizeCodexEvents(execution.out, execution.code);
469
558
  }
470
- function combinedEvents(
471
- execution: ProcessResult,
472
- followUp: ProcessResult | null,
473
- ): string {
474
- const out = followUp
475
- ? `${execution.out.trimEnd()}\n${followUp.out.trimStart()}`
476
- : execution.out;
477
- if (Buffer.byteLength(out, "utf8") > MAX_EVENT_BYTES)
478
- throw new Error("Codex combined event stream exceeds the size limit");
479
- return out;
480
- }
481
-
482
559
  class CodexTurnExecution {
483
560
  private appServerContinuation?: Observation;
484
561
  constructor(private context: ExecutionContext) {}
@@ -492,11 +569,7 @@ class CodexTurnExecution {
492
569
  initialTurnArgs(this.context),
493
570
  this.context.request.prompt,
494
571
  ));
495
- const summary = await initialSummary(
496
- appServer,
497
- execution,
498
- this.context.request,
499
- );
572
+ const summary = initialSummary(appServer, execution);
500
573
  requireInitialCompletion(summary, appServer);
501
574
  const follow = await this.maybeFollowUp(summary, appServer, fingerprint);
502
575
  return {
@@ -504,7 +577,6 @@ class CodexTurnExecution {
504
577
  summary,
505
578
  appServer,
506
579
  ...follow,
507
- observedEvents: combinedEvents(execution, follow.followUp),
508
580
  };
509
581
  }
510
582
 
@@ -513,7 +585,9 @@ class CodexTurnExecution {
513
585
  ): Promise<AppServerResult | null> {
514
586
  const { options, request, state, timeoutMs } = this.context;
515
587
  if (options.entrypoint !== "app-server") return null;
588
+ this.context.diagnostics.stage = "app-server";
516
589
  return runCodexAppServer({
590
+ diagnostics: this.context.diagnostics,
517
591
  argv: [
518
592
  options.binary,
519
593
  "app-server",
@@ -522,11 +596,11 @@ class CodexTurnExecution {
522
596
  "-c",
523
597
  `default_permissions=${JSON.stringify(state.profileId)}`,
524
598
  "-c",
525
- `features.hooks=${Boolean(this.context.hooks)}`,
599
+ "features.hooks=true",
526
600
  ],
527
601
  env: state.env,
528
602
  permissionProfile: state.profileId,
529
- vettedHooks: Boolean(this.context.hooks),
603
+ vettedHooks: true,
530
604
  request: {
531
605
  repoDir: request.workspace,
532
606
  prompt: request.prompt,
@@ -583,62 +657,20 @@ class CodexTurnExecution {
583
657
  }
584
658
  }
585
659
 
586
- type SkillReads = Awaited<ReturnType<typeof codexSkillReadObservation>>;
587
- async function phaseSkillReads(
588
- context: ExecutionContext,
589
- turns: TurnResult,
590
- recovered: Awaited<ReturnType<typeof codexNativeSkillReadRecovery>>,
591
- ) {
592
- if (!turns.followUp) return { initial: null, followUp: null };
593
- const initial = {
594
- ...(await codexSkillReadObservation(
595
- turns.execution.out,
596
- context.request.workspace,
597
- context.installedPluginRoots,
598
- recovered,
599
- )),
600
- id: "sevro.codex.initial-skill-reads",
601
- };
602
- const followUp = {
603
- ...(await codexSkillReadObservation(
604
- turns.followUp.out,
605
- context.request.workspace,
606
- context.installedPluginRoots,
607
- recovered,
608
- )),
609
- id: "sevro.codex.follow-up-skill-reads",
610
- };
611
- return { initial, followUp };
612
- }
613
660
  function explicitInvocationReceipt(
614
661
  selected: Request["explicitSkillInvocation"],
615
- reads: SkillReads,
662
+ completed: boolean,
616
663
  ) {
617
664
  if (!selected) return null;
618
665
  return {
619
666
  id: "sevro.codex.explicit-invocation",
620
- completeness: reads.completeness,
667
+ completeness: completed ? ("complete" as const) : ("partial" as const),
621
668
  data: {
622
669
  method: "explicit_invocation",
623
670
  primarySkill: selected.skillName,
624
- observedSkills: [
625
- selected.skillName,
626
- ...reads.data.observedSkills.filter(
627
- (skill) => skill !== selected.skillName,
628
- ),
629
- ],
630
671
  },
631
672
  };
632
673
  }
633
- function nativeSkillContext(context: ExecutionContext) {
634
- return {
635
- workspace: context.request.workspace,
636
- installedPluginRoots: context.installedPluginRoots,
637
- ...(context.request.followUpPrompt
638
- ? { followUpPrompt: context.request.followUpPrompt }
639
- : {}),
640
- };
641
- }
642
674
  function appServerObservation(result: AppServerResult | null): Observation[] {
643
675
  return result
644
676
  ? [
@@ -651,45 +683,40 @@ function appServerObservation(result: AppServerResult | null): Observation[] {
651
683
  : [];
652
684
  }
653
685
  async function codexObservations(context: ExecutionContext, turns: TurnResult) {
654
- const recovered = await codexNativeSkillReadRecovery(
655
- context.state.codexHome,
686
+ const tracking = await skillTrackingObservation(
687
+ context.skillTracking,
656
688
  turns.summary.threadId,
689
+ turns.summary.complete,
657
690
  );
658
- const reads = await codexSkillReadObservation(
659
- turns.observedEvents,
660
- context.request.workspace,
661
- context.installedPluginRoots,
662
- recovered,
663
- );
664
- const phases = await phaseSkillReads(context, turns, recovered);
665
691
  const native = await codexNativeCallObservation(
666
692
  context.state.codexHome,
667
693
  turns.summary.threadId,
668
- nativeSkillContext(context),
694
+ { followUpPrompt: context.request.followUpPrompt },
669
695
  );
670
696
  const explicit = explicitInvocationReceipt(
671
697
  context.request.explicitSkillInvocation,
672
- reads,
698
+ turns.summary.complete,
673
699
  );
674
700
  return [
675
- ...(await codexHookObservations(context.hooks)),
701
+ ...(await codexHookObservations(context)),
676
702
  ...runtimeObservations(
677
703
  context.request.runtimePolicy,
678
704
  context.request.runtimeRole,
679
705
  ),
680
706
  ...appServerObservation(turns.appServer),
681
- reads,
682
- ...(phases.initial ? [phases.initial] : []),
683
- ...(phases.followUp ? [phases.followUp] : []),
684
707
  native,
685
708
  codexNativeControls(native),
686
709
  ...(turns.continuation ? [turns.continuation] : []),
687
710
  ...(explicit ? [explicit] : []),
711
+ tracking,
712
+ ...skillActivationClaims(tracking),
713
+ ...skillExposureClaims(tracking),
688
714
  ];
689
715
  }
690
716
 
691
- async function codexHookObservations(hooks: HookMounts | undefined) {
692
- return hooks ? [await runtimeHookObservation(hooks)] : [];
717
+ async function codexHookObservations(context: ExecutionContext) {
718
+ if (!context.request.runtimePolicy) return [];
719
+ return [await runtimeHookObservation(context.hooks)];
693
720
  }
694
721
  function codexArtifacts(turns: TurnResult) {
695
722
  return [