@velum-labs/routekit-eval-setup 1.3.2 → 1.5.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 (342) hide show
  1. package/dist/adapters/authoring-responses-request.d.ts +5 -0
  2. package/dist/adapters/authoring-responses-request.js +38 -0
  3. package/dist/adapters/evaluation-evidence-freshness.d.ts +7 -0
  4. package/dist/adapters/evaluation-evidence-freshness.js +76 -0
  5. package/dist/adapters/git-task-history.d.ts +67 -0
  6. package/dist/adapters/git-task-history.js +171 -0
  7. package/dist/adapters/integrated-repository-history.d.ts +21 -0
  8. package/dist/adapters/integrated-repository-history.js +175 -0
  9. package/dist/adapters/repository-command-diagnostic.d.ts +8 -0
  10. package/dist/adapters/repository-command-diagnostic.js +46 -0
  11. package/dist/adapters/repository-command-evidence.d.ts +13 -0
  12. package/dist/adapters/repository-command-evidence.js +102 -0
  13. package/dist/adapters/repository-command-runner.d.ts +238 -0
  14. package/dist/adapters/repository-command-runner.js +1483 -0
  15. package/dist/adapters/repository-import-context.d.ts +47 -0
  16. package/dist/adapters/repository-import-context.js +469 -0
  17. package/dist/adapters/repository-node-test-reporter.d.ts +3 -0
  18. package/dist/adapters/repository-node-test-reporter.js +27 -0
  19. package/dist/adapters/repository-review-evidence.d.ts +39 -0
  20. package/dist/adapters/repository-review-evidence.js +632 -0
  21. package/dist/adapters/repository-seed-selection.d.ts +7 -0
  22. package/dist/adapters/repository-seed-selection.js +79 -0
  23. package/dist/adapters/repository-solution-edits.d.ts +49 -0
  24. package/dist/adapters/repository-solution-edits.js +136 -0
  25. package/dist/adapters/repository-vitest-phase-adapter.d.ts +8 -0
  26. package/dist/adapters/repository-vitest-phase-adapter.js +310 -0
  27. package/dist/adapters/repository-vitest-reporter.d.ts +24 -0
  28. package/dist/adapters/repository-vitest-reporter.js +314 -0
  29. package/dist/adapters/strict-authoring-schema.d.ts +5 -0
  30. package/dist/adapters/strict-authoring-schema.js +158 -0
  31. package/dist/adapters/test-discovery.d.ts +30 -0
  32. package/dist/adapters/test-discovery.js +124 -0
  33. package/dist/adapters/typescript-repository-index.d.ts +51 -0
  34. package/dist/adapters/typescript-repository-index.js +226 -0
  35. package/dist/agentic-capabilities-protocol.d.ts +1373 -0
  36. package/dist/agentic-capabilities-protocol.js +786 -0
  37. package/dist/case-checkpoint-store.d.ts +29 -0
  38. package/dist/case-checkpoint-store.js +133 -0
  39. package/dist/case-pipeline-protocol-v2.d.ts +184 -0
  40. package/dist/case-pipeline-protocol-v2.js +193 -0
  41. package/dist/case-pipeline-protocol.d.ts +2626 -0
  42. package/dist/case-pipeline-protocol.js +371 -0
  43. package/dist/effect-api.d.ts +74 -10
  44. package/dist/effect-api.js +56 -6
  45. package/dist/errors.d.ts +31 -0
  46. package/dist/errors.js +10 -0
  47. package/dist/eval-capability-execution-envelope.d.ts +64 -0
  48. package/dist/eval-capability-execution-envelope.js +98 -0
  49. package/dist/eval-capability-policy.d.ts +90 -0
  50. package/dist/eval-capability-policy.js +107 -0
  51. package/dist/eval-event-log.d.ts +140 -0
  52. package/dist/eval-event-log.js +220 -0
  53. package/dist/evaluation-authoring-policy.d.ts +18 -0
  54. package/dist/evaluation-authoring-policy.js +19 -0
  55. package/dist/evaluation-authoring-validation.d.ts +22 -0
  56. package/dist/evaluation-authoring-validation.js +72 -0
  57. package/dist/evaluation-evidence.d.ts +20 -0
  58. package/dist/evaluation-evidence.js +319 -0
  59. package/dist/evaluation-grader-calibration-protocol.d.ts +108 -0
  60. package/dist/evaluation-grader-calibration-protocol.js +80 -0
  61. package/dist/evaluation-grader-calibration.d.ts +18 -0
  62. package/dist/evaluation-grader-calibration.js +334 -0
  63. package/dist/evaluation-grading-policy.d.ts +24 -0
  64. package/dist/evaluation-grading-policy.js +54 -0
  65. package/dist/evaluation-proposal-policy.d.ts +4 -0
  66. package/dist/evaluation-proposal-policy.js +91 -0
  67. package/dist/evaluation-source-retrieval.d.ts +68 -0
  68. package/dist/evaluation-source-retrieval.js +513 -0
  69. package/dist/evaluation-structure-policy.d.ts +29 -0
  70. package/dist/evaluation-structure-policy.js +138 -0
  71. package/dist/index.d.ts +124 -17
  72. package/dist/index.js +69 -11
  73. package/dist/inspection.js +2 -3
  74. package/dist/project-artifacts.d.ts +7 -2
  75. package/dist/project-artifacts.js +49 -136
  76. package/dist/project-authoring.d.ts +66 -5
  77. package/dist/project-authoring.js +783 -109
  78. package/dist/project-contracts.d.ts +419 -84
  79. package/dist/project-contracts.js +160 -52
  80. package/dist/project-store.js +2 -1
  81. package/dist/project-workflow.d.ts +5 -4
  82. package/dist/project-workflow.js +154 -35
  83. package/dist/repository-adversary-protocol.d.ts +64 -0
  84. package/dist/repository-adversary-protocol.js +105 -0
  85. package/dist/repository-behavior-protocol.d.ts +188 -0
  86. package/dist/repository-behavior-protocol.js +202 -0
  87. package/dist/repository-benchmark-protocol.d.ts +487 -0
  88. package/dist/repository-benchmark-protocol.js +96 -0
  89. package/dist/repository-execution-protocol.d.ts +150 -0
  90. package/dist/repository-execution-protocol.js +38 -0
  91. package/dist/repository-fixture-instructions.d.ts +3 -0
  92. package/dist/repository-fixture-instructions.js +91 -0
  93. package/dist/repository-fixture-protocol.d.ts +79 -0
  94. package/dist/repository-fixture-protocol.js +79 -0
  95. package/dist/repository-foundry-plan-protocol.d.ts +118 -0
  96. package/dist/repository-foundry-plan-protocol.js +296 -0
  97. package/dist/repository-foundry-progress-protocol.d.ts +52 -0
  98. package/dist/repository-foundry-progress-protocol.js +52 -0
  99. package/dist/repository-improvement-protocol.d.ts +100 -0
  100. package/dist/repository-improvement-protocol.js +106 -0
  101. package/dist/repository-language-model-protocol.d.ts +43 -0
  102. package/dist/repository-language-model-protocol.js +146 -0
  103. package/dist/repository-oracle-coverage-protocol.d.ts +18 -0
  104. package/dist/repository-oracle-coverage-protocol.js +39 -0
  105. package/dist/repository-oracle-execution-binding.d.ts +27 -0
  106. package/dist/repository-oracle-execution-binding.js +59 -0
  107. package/dist/repository-oracle-protocol.d.ts +230 -0
  108. package/dist/repository-oracle-protocol.js +156 -0
  109. package/dist/repository-oracle-scope-policy.d.ts +22 -0
  110. package/dist/repository-oracle-scope-policy.js +92 -0
  111. package/dist/repository-quality-policy.d.ts +15 -0
  112. package/dist/repository-quality-policy.js +357 -0
  113. package/dist/repository-routing-benchmark-protocol.d.ts +176 -0
  114. package/dist/repository-routing-benchmark-protocol.js +103 -0
  115. package/dist/repository-routing-model-protocol.d.ts +36 -0
  116. package/dist/repository-routing-model-protocol.js +89 -0
  117. package/dist/repository-routing-plan-protocol.d.ts +112 -0
  118. package/dist/repository-routing-plan-protocol.js +58 -0
  119. package/dist/repository-routing-quality-policy.d.ts +9 -0
  120. package/dist/repository-routing-quality-policy.js +191 -0
  121. package/dist/repository-seed-qualification-progress-protocol.d.ts +205 -0
  122. package/dist/repository-seed-qualification-progress-protocol.js +28 -0
  123. package/dist/repository-semantic-calibration-protocol.d.ts +768 -0
  124. package/dist/repository-semantic-calibration-protocol.js +276 -0
  125. package/dist/repository-semantic-calibration.d.ts +163 -0
  126. package/dist/repository-semantic-calibration.js +581 -0
  127. package/dist/repository-specification-contract-facts-protocol.d.ts +224 -0
  128. package/dist/repository-specification-contract-facts-protocol.js +276 -0
  129. package/dist/repository-specification-critique-protocol.d.ts +189 -0
  130. package/dist/repository-specification-critique-protocol.js +103 -0
  131. package/dist/repository-task-family-protocol.d.ts +24 -0
  132. package/dist/repository-task-family-protocol.js +37 -0
  133. package/dist/repository-task-seed-protocol.d.ts +384 -0
  134. package/dist/repository-task-seed-protocol.js +236 -0
  135. package/dist/repository-trajectory-protocol.d.ts +20 -0
  136. package/dist/repository-trajectory-protocol.js +42 -0
  137. package/dist/service.js +1 -1
  138. package/dist/services/adversary/service.d.ts +64 -0
  139. package/dist/services/adversary/service.js +330 -0
  140. package/dist/services/benchmark-compiler/service.d.ts +450 -0
  141. package/dist/services/benchmark-compiler/service.js +9 -0
  142. package/dist/services/budgeted-model/service.d.ts +118 -0
  143. package/dist/services/budgeted-model/service.js +460 -0
  144. package/dist/services/case-authoring/service.d.ts +163 -0
  145. package/dist/services/case-authoring/service.js +1456 -0
  146. package/dist/services/case-finalization/service.d.ts +283 -0
  147. package/dist/services/case-finalization/service.js +370 -0
  148. package/dist/services/case-generation/service.d.ts +619 -0
  149. package/dist/services/case-generation/service.js +2628 -0
  150. package/dist/services/case-pipeline/service.d.ts +31 -0
  151. package/dist/services/case-pipeline/service.js +485 -0
  152. package/dist/services/case-pipeline-v2/service.d.ts +70 -0
  153. package/dist/services/case-pipeline-v2/service.js +477 -0
  154. package/dist/services/command-observability/service.d.ts +13 -0
  155. package/dist/services/command-observability/service.js +3 -0
  156. package/dist/services/dimension-labeling/service.d.ts +77 -0
  157. package/dist/services/dimension-labeling/service.js +188 -0
  158. package/dist/services/eval-candidate/service.d.ts +208 -0
  159. package/dist/services/eval-candidate/service.js +64 -0
  160. package/dist/services/eval-capabilities/service.d.ts +183 -0
  161. package/dist/services/eval-capabilities/service.js +1433 -0
  162. package/dist/services/eval-environment/service.d.ts +173 -0
  163. package/dist/services/eval-environment/service.js +127 -0
  164. package/dist/services/evidence-reconstruction/service.d.ts +36 -0
  165. package/dist/services/evidence-reconstruction/service.js +145 -0
  166. package/dist/services/fixture-builder/service.d.ts +62 -0
  167. package/dist/services/fixture-builder/service.js +36 -0
  168. package/dist/services/fixture-validation/service.d.ts +75 -0
  169. package/dist/services/fixture-validation/service.js +295 -0
  170. package/dist/services/foundry/service.d.ts +831 -0
  171. package/dist/services/foundry/service.js +442 -0
  172. package/dist/services/foundry-progress/service.d.ts +62 -0
  173. package/dist/services/foundry-progress/service.js +149 -0
  174. package/dist/services/foundry-v2/service.d.ts +54 -0
  175. package/dist/services/foundry-v2/service.js +28 -0
  176. package/dist/services/grounded-authoring/service.d.ts +126 -0
  177. package/dist/services/grounded-authoring/service.js +822 -0
  178. package/dist/services/historical-case/service.d.ts +722 -0
  179. package/dist/services/historical-case/service.js +177 -0
  180. package/dist/services/improvement-loop/service.d.ts +59 -0
  181. package/dist/services/improvement-loop/service.js +176 -0
  182. package/dist/services/language-model/service.d.ts +52 -0
  183. package/dist/services/language-model/service.js +194 -0
  184. package/dist/services/oracle-builder/service.d.ts +146 -0
  185. package/dist/services/oracle-builder/service.js +513 -0
  186. package/dist/services/oracle-coverage/service.d.ts +28 -0
  187. package/dist/services/oracle-coverage/service.js +50 -0
  188. package/dist/services/oracle-coverage-witness/service.d.ts +130 -0
  189. package/dist/services/oracle-coverage-witness/service.js +538 -0
  190. package/dist/services/pipeline-challenge/service.d.ts +551 -0
  191. package/dist/services/pipeline-challenge/service.js +427 -0
  192. package/dist/services/pipeline-controls/service.d.ts +130 -0
  193. package/dist/services/pipeline-controls/service.js +483 -0
  194. package/dist/services/pipeline-oracle/service.d.ts +8 -0
  195. package/dist/services/pipeline-oracle/service.js +256 -0
  196. package/dist/services/pipeline-seed/service.d.ts +298 -0
  197. package/dist/services/pipeline-seed/service.js +428 -0
  198. package/dist/services/pipeline-spec/service.d.ts +103 -0
  199. package/dist/services/pipeline-spec/service.js +619 -0
  200. package/dist/services/pipeline-tournament/service.d.ts +258 -0
  201. package/dist/services/pipeline-tournament/service.js +476 -0
  202. package/dist/services/quality-gate/service.d.ts +233 -0
  203. package/dist/services/quality-gate/service.js +136 -0
  204. package/dist/services/repository-bundle/service.d.ts +33 -0
  205. package/dist/services/repository-bundle/service.js +114 -0
  206. package/dist/services/repository-model/service.d.ts +105 -0
  207. package/dist/services/repository-model/service.js +250 -0
  208. package/dist/services/repository-public-artifact/service.d.ts +133 -0
  209. package/dist/services/repository-public-artifact/service.js +330 -0
  210. package/dist/services/routing-benchmark/service.d.ts +362 -0
  211. package/dist/services/routing-benchmark/service.js +96 -0
  212. package/dist/services/specification-critic/service.d.ts +92 -0
  213. package/dist/services/specification-critic/service.js +172 -0
  214. package/dist/services/task-family/service.d.ts +40 -0
  215. package/dist/services/task-family/service.js +55 -0
  216. package/dist/services/task-seed/service.d.ts +906 -0
  217. package/dist/services/task-seed/service.js +1406 -0
  218. package/dist/services/task-specification/service.d.ts +27 -0
  219. package/dist/services/task-specification/service.js +40 -0
  220. package/dist/services/trajectory-policy/service.d.ts +110 -0
  221. package/dist/services/trajectory-policy/service.js +216 -0
  222. package/dist/test/agentic-capabilities-protocol.test.d.ts +1 -0
  223. package/dist/test/agentic-capabilities-protocol.test.js +570 -0
  224. package/dist/test/agentic-capabilities.test.d.ts +1 -0
  225. package/dist/test/agentic-capabilities.test.js +1461 -0
  226. package/dist/test/agentic-environment.test.d.ts +1 -0
  227. package/dist/test/agentic-environment.test.js +213 -0
  228. package/dist/test/case-pipeline-foundation.test.d.ts +1 -0
  229. package/dist/test/case-pipeline-foundation.test.js +535 -0
  230. package/dist/test/case-pipeline-protocol-v2.test.d.ts +1 -0
  231. package/dist/test/case-pipeline-protocol-v2.test.js +124 -0
  232. package/dist/test/case-pipeline-v2.test.d.ts +1 -0
  233. package/dist/test/case-pipeline-v2.test.js +286 -0
  234. package/dist/test/case-pipeline.test.d.ts +1 -0
  235. package/dist/test/case-pipeline.test.js +851 -0
  236. package/dist/test/eval-capability-policy.test.d.ts +1 -0
  237. package/dist/test/eval-capability-policy.test.js +50 -0
  238. package/dist/test/eval-event-log.test.d.ts +1 -0
  239. package/dist/test/eval-event-log.test.js +125 -0
  240. package/dist/test/evaluation-evidence-freshness.test.d.ts +1 -0
  241. package/dist/test/evaluation-evidence-freshness.test.js +44 -0
  242. package/dist/test/evaluation-evidence.test.d.ts +1 -0
  243. package/dist/test/evaluation-evidence.test.js +230 -0
  244. package/dist/test/evaluation-grader-calibration.test.d.ts +1 -0
  245. package/dist/test/evaluation-grader-calibration.test.js +373 -0
  246. package/dist/test/evaluation-proposal-digest.test.d.ts +1 -0
  247. package/dist/test/evaluation-proposal-digest.test.js +187 -0
  248. package/dist/test/evaluation-source-retrieval.test.d.ts +1 -0
  249. package/dist/test/evaluation-source-retrieval.test.js +237 -0
  250. package/dist/test/evaluation-structure-policy.test.d.ts +1 -0
  251. package/dist/test/evaluation-structure-policy.test.js +196 -0
  252. package/dist/test/fixtures/repository-resource-panel.d.ts +39 -0
  253. package/dist/test/fixtures/repository-resource-panel.js +111 -0
  254. package/dist/test/fixtures/vitest-boundary-panel.d.ts +84 -0
  255. package/dist/test/fixtures/vitest-boundary-panel.js +120 -0
  256. package/dist/test/fixtures/vitest-phase-panel.d.ts +135 -0
  257. package/dist/test/fixtures/vitest-phase-panel.js +213 -0
  258. package/dist/test/fixtures/vitest-reporter-results.d.ts +76 -0
  259. package/dist/test/fixtures/vitest-reporter-results.js +94 -0
  260. package/dist/test/grounded-authoring.test.d.ts +1 -0
  261. package/dist/test/grounded-authoring.test.js +565 -0
  262. package/dist/test/integrated-repository-history.test.d.ts +1 -0
  263. package/dist/test/integrated-repository-history.test.js +227 -0
  264. package/dist/test/project-authoring.test.js +593 -43
  265. package/dist/test/project-workflow.test.js +419 -40
  266. package/dist/test/repository-authoring-artifacts.test.d.ts +1 -0
  267. package/dist/test/repository-authoring-artifacts.test.js +185 -0
  268. package/dist/test/repository-bundle.test.d.ts +1 -0
  269. package/dist/test/repository-bundle.test.js +52 -0
  270. package/dist/test/repository-case-generation.test.d.ts +1 -0
  271. package/dist/test/repository-case-generation.test.js +3465 -0
  272. package/dist/test/repository-command-diagnostic.test.d.ts +1 -0
  273. package/dist/test/repository-command-diagnostic.test.js +55 -0
  274. package/dist/test/repository-command-signals.test.d.ts +1 -0
  275. package/dist/test/repository-command-signals.test.js +124 -0
  276. package/dist/test/repository-fixture-scope-coverage.test.d.ts +1 -0
  277. package/dist/test/repository-fixture-scope-coverage.test.js +127 -0
  278. package/dist/test/repository-fixture-validation.test.d.ts +1 -0
  279. package/dist/test/repository-fixture-validation.test.js +362 -0
  280. package/dist/test/repository-foundry-progress.test.d.ts +1 -0
  281. package/dist/test/repository-foundry-progress.test.js +110 -0
  282. package/dist/test/repository-foundry-quality.test.d.ts +1 -0
  283. package/dist/test/repository-foundry-quality.test.js +1138 -0
  284. package/dist/test/repository-import-context.test.d.ts +1 -0
  285. package/dist/test/repository-import-context.test.js +354 -0
  286. package/dist/test/repository-model-authoring.test.d.ts +1 -0
  287. package/dist/test/repository-model-authoring.test.js +544 -0
  288. package/dist/test/repository-model.test.d.ts +1 -0
  289. package/dist/test/repository-model.test.js +2195 -0
  290. package/dist/test/repository-node-test-reporter.test.d.ts +1 -0
  291. package/dist/test/repository-node-test-reporter.test.js +104 -0
  292. package/dist/test/repository-oracle-concurrency.test.d.ts +1 -0
  293. package/dist/test/repository-oracle-concurrency.test.js +542 -0
  294. package/dist/test/repository-oracle-coverage-witness.test.d.ts +1 -0
  295. package/dist/test/repository-oracle-coverage-witness.test.js +511 -0
  296. package/dist/test/repository-oracle-coverage.test.d.ts +1 -0
  297. package/dist/test/repository-oracle-coverage.test.js +168 -0
  298. package/dist/test/repository-oracle-evidence.test.d.ts +1 -0
  299. package/dist/test/repository-oracle-evidence.test.js +185 -0
  300. package/dist/test/repository-oracle-plan.test.d.ts +1 -0
  301. package/dist/test/repository-oracle-plan.test.js +176 -0
  302. package/dist/test/repository-overlay-isolation.test.d.ts +1 -0
  303. package/dist/test/repository-overlay-isolation.test.js +85 -0
  304. package/dist/test/repository-preparation-cache.test.d.ts +1 -0
  305. package/dist/test/repository-preparation-cache.test.js +414 -0
  306. package/dist/test/repository-public-artifact.test.d.ts +1 -0
  307. package/dist/test/repository-public-artifact.test.js +273 -0
  308. package/dist/test/repository-qualification-diagnostics.test.d.ts +1 -0
  309. package/dist/test/repository-qualification-diagnostics.test.js +524 -0
  310. package/dist/test/repository-reference-authoring.test.d.ts +1 -0
  311. package/dist/test/repository-reference-authoring.test.js +1633 -0
  312. package/dist/test/repository-review-evidence-v2.test.d.ts +1 -0
  313. package/dist/test/repository-review-evidence-v2.test.js +183 -0
  314. package/dist/test/repository-review-evidence.test.d.ts +1 -0
  315. package/dist/test/repository-review-evidence.test.js +124 -0
  316. package/dist/test/repository-seed-exclusions.test.d.ts +1 -0
  317. package/dist/test/repository-seed-exclusions.test.js +96 -0
  318. package/dist/test/repository-seed-selection.test.d.ts +1 -0
  319. package/dist/test/repository-seed-selection.test.js +504 -0
  320. package/dist/test/repository-semantic-calibration.test.d.ts +1 -0
  321. package/dist/test/repository-semantic-calibration.test.js +688 -0
  322. package/dist/test/repository-solution-edits.test.d.ts +1 -0
  323. package/dist/test/repository-solution-edits.test.js +377 -0
  324. package/dist/test/repository-specification-budget.test.d.ts +1 -0
  325. package/dist/test/repository-specification-budget.test.js +171 -0
  326. package/dist/test/repository-specification-contract-checkpoint.test.d.ts +1 -0
  327. package/dist/test/repository-specification-contract-checkpoint.test.js +228 -0
  328. package/dist/test/repository-specification-contract-facts.test.d.ts +1 -0
  329. package/dist/test/repository-specification-contract-facts.test.js +177 -0
  330. package/dist/test/repository-trajectory-authoring.test.d.ts +1 -0
  331. package/dist/test/repository-trajectory-authoring.test.js +176 -0
  332. package/dist/test/repository-valid-control-plan.test.d.ts +1 -0
  333. package/dist/test/repository-valid-control-plan.test.js +45 -0
  334. package/dist/test/repository-vitest-phase.test.d.ts +1 -0
  335. package/dist/test/repository-vitest-phase.test.js +848 -0
  336. package/dist/test/repository-vitest-reporter.test.d.ts +1 -0
  337. package/dist/test/repository-vitest-reporter.test.js +158 -0
  338. package/dist/test/repository-workspace-build.test.d.ts +1 -0
  339. package/dist/test/repository-workspace-build.test.js +160 -0
  340. package/dist/test/strict-authoring-schema.test.d.ts +1 -0
  341. package/dist/test/strict-authoring-schema.test.js +169 -0
  342. package/package.json +48 -6
@@ -0,0 +1,29 @@
1
+ import { Effect, Option, Schema } from "effect";
2
+ import { PipelineLedgerEntryV1, PipelineStateV1, type PipelineStageV1, type PipelineWorkCheckpointStoreV1 } from "./case-pipeline-protocol.js";
3
+ import { RepositoryFoundryError } from "./errors.js";
4
+ /**
5
+ * Durable per-case pipeline state. Layout under `caseDirectory`:
6
+ * state.json, ledger.jsonl, <stage>.json for each pipeline stage, calls/, work/.
7
+ * Every JSON write is atomic (tmp + rename, mode 0o600) so a crash never
8
+ * leaves a half-written checkpoint; a checkpoint that fails to decode is
9
+ * treated as absent and regenerated.
10
+ */
11
+ export type CaseCheckpointStoreV1 = PipelineWorkCheckpointStoreV1 & {
12
+ readonly caseDirectory: string;
13
+ readonly stagePath: (stage: PipelineStageV1) => string;
14
+ readonly readStage: <A>(stage: PipelineStageV1, schema: Schema.Codec<A, unknown, never, unknown>) => Effect.Effect<Option.Option<A>, RepositoryFoundryError>;
15
+ readonly writeStage: (stage: PipelineStageV1, value: unknown) => Effect.Effect<void, RepositoryFoundryError>;
16
+ /** Remove this stage's checkpoint and every later stage's checkpoint. */
17
+ readonly deleteFrom: (stage: PipelineStageV1) => Effect.Effect<void, RepositoryFoundryError>;
18
+ readonly readState: Effect.Effect<Option.Option<PipelineStateV1>, RepositoryFoundryError>;
19
+ readonly writeState: (state: PipelineStateV1) => Effect.Effect<void, RepositoryFoundryError>;
20
+ readonly appendLedger: (entry: PipelineLedgerEntryV1) => Effect.Effect<void, RepositoryFoundryError>;
21
+ readonly readLedger: Effect.Effect<readonly PipelineLedgerEntryV1[], RepositoryFoundryError>;
22
+ readonly writeCall: (operationId: string, attempt: number, payload: {
23
+ readonly request: unknown;
24
+ readonly response: unknown;
25
+ }) => Effect.Effect<void, RepositoryFoundryError>;
26
+ };
27
+ export declare const makeCaseCheckpointStoreV1: (input: {
28
+ readonly caseDirectory: string;
29
+ }) => CaseCheckpointStoreV1;
@@ -0,0 +1,133 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { appendFile, mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
3
+ import { dirname, join } from "node:path";
4
+ import { Data, Effect, Option, Schema } from "effect";
5
+ import { PIPELINE_STAGES, PipelineLedgerEntryV1, PipelineStateV1, pipelineStageIndexV1 } from "./case-pipeline-protocol.js";
6
+ import { RepositoryFoundryError } from "./errors.js";
7
+ const failure = (detail, cause) => new RepositoryFoundryError({
8
+ operation: "checkpoint-store",
9
+ detail,
10
+ ...(cause === undefined ? {} : { cause })
11
+ });
12
+ const isMissingFile = (cause) => typeof cause === "object" &&
13
+ cause !== null &&
14
+ "code" in cause &&
15
+ cause.code === "ENOENT";
16
+ /** Typed carrier so every catch callback keeps the error channel typed. */
17
+ class CheckpointIoErrorV1 extends Data.TaggedError("CheckpointIoErrorV1") {
18
+ }
19
+ const describe = (cause) => cause instanceof Error && cause.message.trim().length > 0 ? cause.message : String(cause);
20
+ /** File-name safe identifier; identifiers only, never natural language or code. */
21
+ const fileSafe = (value) => value.replace(/[^A-Za-z0-9._-]/gu, "_");
22
+ export const makeCaseCheckpointStoreV1 = (input) => {
23
+ const caseDirectory = input.caseDirectory;
24
+ const statePath = join(caseDirectory, "state.json");
25
+ const ledgerPath = join(caseDirectory, "ledger.jsonl");
26
+ const callsDirectory = join(caseDirectory, "calls");
27
+ const workDirectory = join(caseDirectory, "work");
28
+ const stagePath = (stage) => join(caseDirectory, `${stage}.json`);
29
+ const workPath = (name) => join(workDirectory, `${fileSafe(name)}.json`);
30
+ const ensureDirectory = (directory) => Effect.tryPromise({
31
+ try: () => mkdir(directory, { recursive: true, mode: 0o700 }),
32
+ catch: (cause) => failure(`could not create ${directory}: ${describe(cause)}`, cause)
33
+ });
34
+ const writeJsonAtomically = Effect.fnUntraced(function* (target, value) {
35
+ yield* ensureDirectory(dirname(target));
36
+ const temporary = `${target}.${randomUUID()}.tmp`;
37
+ const text = `${JSON.stringify(value, null, 2)}\n`;
38
+ yield* Effect.ensuring(Effect.gen(function* () {
39
+ yield* Effect.tryPromise({
40
+ try: () => writeFile(temporary, text, { encoding: "utf8", mode: 0o600 }),
41
+ catch: (cause) => failure(`could not write ${target}: ${describe(cause)}`, cause)
42
+ });
43
+ yield* Effect.tryPromise({
44
+ try: () => rename(temporary, target),
45
+ catch: (cause) => failure(`could not commit ${target}: ${describe(cause)}`, cause)
46
+ });
47
+ }), Effect.tryPromise(() => rm(temporary, { force: true })).pipe(Effect.ignore));
48
+ });
49
+ /** Missing file => none. Corrupt JSON or schema violation => none plus a warning. */
50
+ const readJsonLeniently = (target, schema) => Effect.gen(function* () {
51
+ const text = yield* Effect.tryPromise({
52
+ try: () => readFile(target, "utf8"),
53
+ catch: (cause) => new CheckpointIoErrorV1({ cause })
54
+ }).pipe(Effect.map(Option.some), Effect.catchIf((error) => isMissingFile(error.cause), () => Effect.succeed(Option.none())), Effect.mapError((error) => failure(`could not read ${target}: ${describe(error.cause)}`, error.cause)));
55
+ if (Option.isNone(text))
56
+ return Option.none();
57
+ const parsed = yield* Effect.try({
58
+ try: () => JSON.parse(text.value),
59
+ catch: (cause) => new CheckpointIoErrorV1({ cause })
60
+ }).pipe(Effect.result);
61
+ if (parsed._tag === "Failure") {
62
+ yield* Effect.logWarning(`checkpoint ${target} is not valid JSON and will be regenerated: ${describe(parsed.failure.cause)}`);
63
+ return Option.none();
64
+ }
65
+ const decoded = yield* Schema.decodeUnknownEffect(schema)(parsed.success).pipe(Effect.result);
66
+ if (decoded._tag === "Failure") {
67
+ yield* Effect.logWarning(`checkpoint ${target} failed schema decode and will be regenerated: ${describe(decoded.failure)}`);
68
+ return Option.none();
69
+ }
70
+ return Option.some(decoded.success);
71
+ });
72
+ const removeFile = (target) => Effect.tryPromise({
73
+ try: () => rm(target, { force: true }),
74
+ catch: (cause) => failure(`could not remove ${target}: ${describe(cause)}`, cause)
75
+ });
76
+ return {
77
+ caseDirectory,
78
+ stagePath,
79
+ readStage: (stage, schema) => readJsonLeniently(stagePath(stage), schema),
80
+ writeStage: (stage, value) => writeJsonAtomically(stagePath(stage), value),
81
+ deleteFrom: (stage) => Effect.forEach(PIPELINE_STAGES.filter((candidate) => pipelineStageIndexV1(candidate) >= pipelineStageIndexV1(stage)), (candidate) => removeFile(stagePath(candidate)), { discard: true }),
82
+ readState: Effect.gen(function* () {
83
+ const text = yield* Effect.tryPromise({
84
+ try: () => readFile(statePath, "utf8"),
85
+ catch: (cause) => new CheckpointIoErrorV1({ cause })
86
+ }).pipe(Effect.map(Option.some), Effect.catchIf((error) => isMissingFile(error.cause), () => Effect.succeed(Option.none())), Effect.mapError((error) => failure(`could not read ${statePath}: ${describe(error.cause)}`, error.cause)));
87
+ if (Option.isNone(text))
88
+ return Option.none();
89
+ // State carries the cumulative budget; a corrupt state file is a typed
90
+ // failure rather than a silent budget reset.
91
+ const parsed = yield* Effect.try({
92
+ try: () => JSON.parse(text.value),
93
+ catch: (cause) => failure(`${statePath} is not valid JSON: ${describe(cause)}`, cause)
94
+ });
95
+ const state = yield* Schema.decodeUnknownEffect(PipelineStateV1)(parsed).pipe(Effect.mapError((cause) => failure(`${statePath} failed schema decode: ${describe(cause)}`, cause)));
96
+ return Option.some(state);
97
+ }),
98
+ writeState: (state) => writeJsonAtomically(statePath, state),
99
+ appendLedger: (entry) => Effect.gen(function* () {
100
+ yield* ensureDirectory(caseDirectory);
101
+ yield* Effect.tryPromise({
102
+ try: () => appendFile(ledgerPath, `${JSON.stringify(entry)}\n`, { encoding: "utf8", mode: 0o600 }),
103
+ catch: (cause) => failure(`could not append ${ledgerPath}: ${describe(cause)}`, cause)
104
+ });
105
+ }),
106
+ readLedger: Effect.gen(function* () {
107
+ const text = yield* Effect.tryPromise({
108
+ try: () => readFile(ledgerPath, "utf8"),
109
+ catch: (cause) => new CheckpointIoErrorV1({ cause })
110
+ }).pipe(Effect.map(Option.some), Effect.catchIf((error) => isMissingFile(error.cause), () => Effect.succeed(Option.none())), Effect.mapError((error) => failure(`could not read ${ledgerPath}: ${describe(error.cause)}`, error.cause)));
111
+ if (Option.isNone(text))
112
+ return [];
113
+ const entries = [];
114
+ const lines = text.value.split("\n").filter((line) => line.trim().length > 0);
115
+ for (const [index, line] of lines.entries()) {
116
+ const decoded = yield* Effect.try({
117
+ try: () => JSON.parse(line),
118
+ catch: (cause) => new CheckpointIoErrorV1({ cause })
119
+ }).pipe(Effect.flatMap((value) => Schema.decodeUnknownEffect(PipelineLedgerEntryV1)(value)), Effect.result);
120
+ if (decoded._tag === "Failure") {
121
+ yield* Effect.logWarning(`ledger line ${String(index + 1)} of ${ledgerPath} is unreadable and was skipped: ${describe(decoded.failure)}`);
122
+ continue;
123
+ }
124
+ entries.push(decoded.success);
125
+ }
126
+ return entries;
127
+ }),
128
+ writeCall: (operationId, attempt, payload) => writeJsonAtomically(join(callsDirectory, `${fileSafe(operationId)}.attempt-${String(attempt)}.json`), { operationId, attempt, request: payload.request, response: payload.response }),
129
+ readWorkCheckpoint: (name, schema) => readJsonLeniently(workPath(name), schema),
130
+ writeWorkCheckpoint: (name, value) => writeJsonAtomically(workPath(name), value),
131
+ deleteWorkCheckpoint: (name) => removeFile(workPath(name))
132
+ };
133
+ };
@@ -0,0 +1,184 @@
1
+ import { type Effect, Schema } from "effect";
2
+ import type { RepositoryCommandObservationV1 } from "./repository-execution-protocol.js";
3
+ export declare const PIPELINE_PROTOCOL_VERSION_V2: 2;
4
+ export declare const PIPELINE_STAGES_V2: readonly ["seed", "spec", "oracle", "controls", "tournament", "challenge", "admit"];
5
+ export declare const pipelineDigestV2: (value: unknown) => string;
6
+ export declare const PipelineStageV2: Schema.Literals<readonly ["seed", "spec", "oracle", "controls", "tournament", "challenge", "admit"]>;
7
+ export type PipelineStageV2 = typeof PipelineStageV2.Type;
8
+ export declare const PipelineDimensionV2: Schema.Struct<{
9
+ readonly id: Schema.String;
10
+ readonly description: Schema.String;
11
+ readonly includes: Schema.$Array<Schema.String>;
12
+ readonly excludes: Schema.$Array<Schema.String>;
13
+ }>;
14
+ export type PipelineDimensionV2 = typeof PipelineDimensionV2.Type;
15
+ export declare const PipelineModelRoleV2: Schema.Literals<readonly ["seed-author", "specification-author", "specification-reviewer", "oracle-author", "control-author", "adversary-author", "oracle-critic", "admission-reviewer"]>;
16
+ export type PipelineModelRoleV2 = typeof PipelineModelRoleV2.Type;
17
+ export declare const PipelineModelBindingV2: Schema.Struct<{
18
+ readonly role: Schema.Literals<readonly ["seed-author", "specification-author", "specification-reviewer", "oracle-author", "control-author", "adversary-author", "oracle-critic", "admission-reviewer"]>;
19
+ readonly model: Schema.String;
20
+ readonly reasoningEffort: Schema.Literals<readonly ["low", "medium", "high", "xhigh"]>;
21
+ readonly maximumCalls: Schema.Finite;
22
+ readonly maximumOutputTokens: Schema.Finite;
23
+ }>;
24
+ export type PipelineModelBindingV2 = typeof PipelineModelBindingV2.Type;
25
+ export declare const PipelineScientificIdentityV2: Schema.Struct<{
26
+ readonly version: Schema.Literal<2>;
27
+ readonly repository: Schema.Struct<{
28
+ readonly repositoryId: Schema.String;
29
+ readonly repository: Schema.String;
30
+ readonly commitSha: Schema.String;
31
+ readonly treeSha: Schema.String;
32
+ }>;
33
+ readonly caseId: Schema.String;
34
+ readonly coverageCellId: Schema.String;
35
+ readonly dimension: Schema.Struct<{
36
+ readonly id: Schema.String;
37
+ readonly description: Schema.String;
38
+ readonly includes: Schema.$Array<Schema.String>;
39
+ readonly excludes: Schema.$Array<Schema.String>;
40
+ }>;
41
+ readonly source: Schema.Struct<{
42
+ readonly referenceCommitSha: Schema.String;
43
+ readonly referenceTaskDigest: Schema.String;
44
+ readonly basisDigest: Schema.String;
45
+ }>;
46
+ readonly modelPlan: Schema.$Array<Schema.Struct<{
47
+ readonly role: Schema.Literals<readonly ["seed-author", "specification-author", "specification-reviewer", "oracle-author", "control-author", "adversary-author", "oracle-critic", "admission-reviewer"]>;
48
+ readonly model: Schema.String;
49
+ readonly reasoningEffort: Schema.Literals<readonly ["low", "medium", "high", "xhigh"]>;
50
+ readonly maximumCalls: Schema.Finite;
51
+ readonly maximumOutputTokens: Schema.Finite;
52
+ }>>;
53
+ readonly policy: Schema.Struct<{
54
+ readonly foundryPolicyVersion: Schema.String;
55
+ readonly admissionPolicyVersion: Schema.String;
56
+ readonly repositoryModelDigest: Schema.String;
57
+ readonly oracleRepetitions: Schema.Finite;
58
+ readonly oracleConcurrency: Schema.Finite;
59
+ readonly foldLimit: Schema.Finite;
60
+ }>;
61
+ readonly budget: Schema.Struct<{
62
+ readonly maximumModelCalls: Schema.Finite;
63
+ readonly maximumWallTimeMs: Schema.Finite;
64
+ readonly maximumArtifactBytes: Schema.Finite;
65
+ }>;
66
+ }>;
67
+ export type PipelineScientificIdentityV2 = typeof PipelineScientificIdentityV2.Type;
68
+ export declare const decodePipelineScientificIdentityV2: (value: unknown) => PipelineScientificIdentityV2;
69
+ export declare const pipelineScientificIdentityDigestV2: (identity: PipelineScientificIdentityV2) => string;
70
+ export declare const PipelineCheckpointKindV2: Schema.Literals<readonly ["stage", "loop", "terminal"]>;
71
+ export type PipelineCheckpointKindV2 = typeof PipelineCheckpointKindV2.Type;
72
+ export declare const PipelineCheckpointDescriptorV2: Schema.Struct<{
73
+ readonly version: Schema.Literal<2>;
74
+ readonly checkpointId: Schema.String;
75
+ readonly identityDigest: Schema.String;
76
+ readonly attemptGeneration: Schema.Finite;
77
+ readonly sequence: Schema.Finite;
78
+ readonly kind: Schema.Literals<readonly ["stage", "loop", "terminal"]>;
79
+ readonly stage: Schema.Literals<readonly ["seed", "spec", "oracle", "controls", "tournament", "challenge", "admit"]>;
80
+ readonly loopName: Schema.optionalKey<Schema.String>;
81
+ readonly loopIteration: Schema.optionalKey<Schema.Finite>;
82
+ readonly parentDigest: Schema.String;
83
+ readonly payloadDigest: Schema.String;
84
+ readonly payloadBytes: Schema.Finite;
85
+ readonly createdAt: Schema.String;
86
+ }>;
87
+ export type PipelineCheckpointDescriptorV2 = typeof PipelineCheckpointDescriptorV2.Type;
88
+ export declare const decodePipelineCheckpointDescriptorV2: (value: unknown) => PipelineCheckpointDescriptorV2;
89
+ export declare const pipelineCheckpointDescriptorDigestV2: (descriptor: PipelineCheckpointDescriptorV2) => string;
90
+ export declare const assertPipelineCheckpointChainV2: (identity: PipelineScientificIdentityV2, checkpoints: readonly PipelineCheckpointDescriptorV2[]) => void;
91
+ export declare const assertPipelineCheckpointReplayV2: (accepted: PipelineCheckpointDescriptorV2, replay: PipelineCheckpointDescriptorV2) => void;
92
+ export declare const PipelineArtifactVisibilityV2: Schema.Literals<readonly ["private", "public"]>;
93
+ export type PipelineArtifactVisibilityV2 = typeof PipelineArtifactVisibilityV2.Type;
94
+ export declare const PipelineArtifactDescriptorV2: Schema.Struct<{
95
+ readonly artifactId: Schema.String;
96
+ readonly identityDigest: Schema.String;
97
+ readonly checkpointDigest: Schema.String;
98
+ readonly kind: Schema.String;
99
+ readonly visibility: Schema.Literals<readonly ["private", "public"]>;
100
+ readonly sha256: Schema.String;
101
+ readonly bytes: Schema.Finite;
102
+ readonly mediaType: Schema.String;
103
+ }>;
104
+ export type PipelineArtifactDescriptorV2 = typeof PipelineArtifactDescriptorV2.Type;
105
+ export declare const PipelineModelCallV2: Schema.Struct<{
106
+ readonly operationId: Schema.String;
107
+ readonly caseId: Schema.String;
108
+ readonly stage: Schema.Literals<readonly ["seed", "spec", "oracle", "controls", "tournament", "challenge", "admit"]>;
109
+ readonly role: Schema.Literals<readonly ["seed-author", "specification-author", "specification-reviewer", "oracle-author", "control-author", "adversary-author", "oracle-critic", "admission-reviewer"]>;
110
+ readonly model: Schema.String;
111
+ readonly reasoningEffort: Schema.Literals<readonly ["low", "medium", "high", "xhigh"]>;
112
+ readonly input: Schema.String;
113
+ readonly maximumOutputTokens: Schema.Finite;
114
+ }>;
115
+ export type PipelineModelCallV2 = typeof PipelineModelCallV2.Type;
116
+ declare const PipelinePortErrorV2_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
117
+ readonly _tag: "PipelinePortErrorV2";
118
+ } & Readonly<A>;
119
+ export declare class PipelinePortErrorV2 extends PipelinePortErrorV2_base<{
120
+ readonly port: "repository" | "model" | "checkpoint" | "artifact" | "execution" | "progress" | "clock";
121
+ readonly operation: string;
122
+ readonly detail: string;
123
+ readonly retryable: boolean;
124
+ readonly cause?: unknown;
125
+ }> {
126
+ }
127
+ export type PipelineRepositoryPortV2 = {
128
+ readonly materialize: (identity: PipelineScientificIdentityV2, runtimeRoot: string) => Effect.Effect<void, PipelinePortErrorV2>;
129
+ readonly verify: (identity: PipelineScientificIdentityV2, runtimeRoot: string) => Effect.Effect<void, PipelinePortErrorV2>;
130
+ };
131
+ export type PipelineModelPortV2 = {
132
+ readonly complete: (call: PipelineModelCallV2) => Effect.Effect<{
133
+ readonly callId: string;
134
+ readonly text: string;
135
+ }, PipelinePortErrorV2>;
136
+ };
137
+ export type PipelineCheckpointPortV2 = {
138
+ readonly list: (identityDigest: string) => Effect.Effect<readonly PipelineCheckpointDescriptorV2[], PipelinePortErrorV2>;
139
+ readonly read: (descriptor: PipelineCheckpointDescriptorV2) => Effect.Effect<Uint8Array, PipelinePortErrorV2>;
140
+ readonly put: (descriptor: PipelineCheckpointDescriptorV2, payload: Uint8Array) => Effect.Effect<PipelineCheckpointDescriptorV2, PipelinePortErrorV2>;
141
+ };
142
+ export type PipelineArtifactPortV2 = {
143
+ readonly put: (descriptor: PipelineArtifactDescriptorV2, payload: Uint8Array) => Effect.Effect<PipelineArtifactDescriptorV2, PipelinePortErrorV2>;
144
+ readonly read: (descriptor: PipelineArtifactDescriptorV2) => Effect.Effect<Uint8Array, PipelinePortErrorV2>;
145
+ };
146
+ export type PipelineExecutionPortV2 = {
147
+ readonly run: (input: {
148
+ readonly operationId: string;
149
+ readonly runtimeRoot: string;
150
+ readonly command: readonly string[];
151
+ readonly timeoutMs: number;
152
+ }) => Effect.Effect<{
153
+ readonly exitCode: number;
154
+ readonly stdout: string;
155
+ readonly stderr: string;
156
+ }, PipelinePortErrorV2>;
157
+ };
158
+ export type PipelineProgressPortV2 = {
159
+ readonly emit: (event: {
160
+ readonly identityDigest: string;
161
+ readonly sequence: number;
162
+ readonly stage: PipelineStageV2;
163
+ readonly detail: string;
164
+ }) => Effect.Effect<void, PipelinePortErrorV2>;
165
+ /**
166
+ * Best-effort live command telemetry. Implementations enqueue synchronously;
167
+ * pipeline execution never waits for delivery.
168
+ */
169
+ readonly observeCommand?: (event: RepositoryCommandObservationV1) => void;
170
+ };
171
+ export type PipelineClockPortV2 = {
172
+ readonly now: Effect.Effect<Date, PipelinePortErrorV2>;
173
+ readonly sleep: (milliseconds: number) => Effect.Effect<void, PipelinePortErrorV2>;
174
+ };
175
+ export type PipelinePortsV2 = {
176
+ readonly repository: PipelineRepositoryPortV2;
177
+ readonly model: PipelineModelPortV2;
178
+ readonly checkpoints: PipelineCheckpointPortV2;
179
+ readonly artifacts: PipelineArtifactPortV2;
180
+ readonly execution: PipelineExecutionPortV2;
181
+ readonly progress: PipelineProgressPortV2;
182
+ readonly clock: PipelineClockPortV2;
183
+ };
184
+ export {};
@@ -0,0 +1,193 @@
1
+ import { createHash } from "node:crypto";
2
+ import { assertExplicitEvalModel } from "@velum-labs/routekit-eval-contracts";
3
+ import { Data, Schema } from "effect";
4
+ export const PIPELINE_PROTOCOL_VERSION_V2 = 2;
5
+ export const PIPELINE_STAGES_V2 = [
6
+ "seed",
7
+ "spec",
8
+ "oracle",
9
+ "controls",
10
+ "tournament",
11
+ "challenge",
12
+ "admit"
13
+ ];
14
+ const Sha256V2 = Schema.String.pipe(Schema.check(Schema.makeFilter((value) => /^[a-f0-9]{64}$/u.test(value) ? undefined : "must be a lowercase SHA-256 digest")));
15
+ const CommitShaV2 = Schema.String.pipe(Schema.check(Schema.makeFilter((value) => /^[a-f0-9]{40}$/u.test(value) ? undefined : "must be a lowercase Git commit SHA")));
16
+ const BoundedIdV2 = Schema.String.pipe(Schema.check(Schema.makeFilter((value) => value.length >= 1 && value.length <= 256 && value.trim() === value
17
+ ? undefined
18
+ : "must be a trimmed identifier between 1 and 256 characters")));
19
+ const PositiveIntegerV2 = Schema.Finite.pipe(Schema.check(Schema.makeFilter((value) => Number.isInteger(value) && value > 0 ? undefined : "must be a positive integer")));
20
+ const NonNegativeIntegerV2 = Schema.Finite.pipe(Schema.check(Schema.makeFilter((value) => Number.isInteger(value) && value >= 0 ? undefined : "must be a non-negative integer")));
21
+ const ExplicitModelV2 = Schema.String.pipe(Schema.check(Schema.makeFilter((value) => {
22
+ try {
23
+ assertExplicitEvalModel(value, "author");
24
+ return undefined;
25
+ }
26
+ catch (error) {
27
+ return error instanceof Error ? error.message : "model must be explicit";
28
+ }
29
+ })));
30
+ const stableJsonV2 = (value) => JSON.stringify(value, (_key, entry) => {
31
+ if (entry === null || typeof entry !== "object" || Array.isArray(entry))
32
+ return entry;
33
+ const record = entry;
34
+ return Object.fromEntries(Object.keys(record)
35
+ .sort()
36
+ .map((key) => [key, record[key]]));
37
+ });
38
+ export const pipelineDigestV2 = (value) => createHash("sha256").update(stableJsonV2(value), "utf8").digest("hex");
39
+ export const PipelineStageV2 = Schema.Literals(PIPELINE_STAGES_V2);
40
+ export const PipelineDimensionV2 = Schema.Struct({
41
+ id: BoundedIdV2,
42
+ description: Schema.String,
43
+ includes: Schema.Array(Schema.String),
44
+ excludes: Schema.Array(Schema.String)
45
+ });
46
+ export const PipelineModelRoleV2 = Schema.Literals([
47
+ "seed-author",
48
+ "specification-author",
49
+ "specification-reviewer",
50
+ "oracle-author",
51
+ "control-author",
52
+ "adversary-author",
53
+ "oracle-critic",
54
+ "admission-reviewer"
55
+ ]);
56
+ export const PipelineModelBindingV2 = Schema.Struct({
57
+ role: PipelineModelRoleV2,
58
+ model: ExplicitModelV2,
59
+ reasoningEffort: Schema.Literals(["low", "medium", "high", "xhigh"]),
60
+ maximumCalls: PositiveIntegerV2,
61
+ maximumOutputTokens: PositiveIntegerV2
62
+ });
63
+ export const PipelineScientificIdentityV2 = Schema.Struct({
64
+ version: Schema.Literal(PIPELINE_PROTOCOL_VERSION_V2),
65
+ repository: Schema.Struct({
66
+ repositoryId: BoundedIdV2,
67
+ repository: Schema.String,
68
+ commitSha: CommitShaV2,
69
+ treeSha: CommitShaV2
70
+ }),
71
+ caseId: BoundedIdV2,
72
+ coverageCellId: BoundedIdV2,
73
+ dimension: PipelineDimensionV2,
74
+ source: Schema.Struct({
75
+ referenceCommitSha: CommitShaV2,
76
+ referenceTaskDigest: Sha256V2,
77
+ basisDigest: Sha256V2
78
+ }),
79
+ modelPlan: Schema.Array(PipelineModelBindingV2),
80
+ policy: Schema.Struct({
81
+ foundryPolicyVersion: BoundedIdV2,
82
+ admissionPolicyVersion: BoundedIdV2,
83
+ repositoryModelDigest: Sha256V2,
84
+ oracleRepetitions: PositiveIntegerV2,
85
+ oracleConcurrency: PositiveIntegerV2,
86
+ foldLimit: PositiveIntegerV2
87
+ }),
88
+ budget: Schema.Struct({
89
+ maximumModelCalls: PositiveIntegerV2,
90
+ maximumWallTimeMs: PositiveIntegerV2,
91
+ maximumArtifactBytes: PositiveIntegerV2
92
+ })
93
+ });
94
+ export const decodePipelineScientificIdentityV2 = (value) => {
95
+ const decoded = Schema.decodeUnknownSync(PipelineScientificIdentityV2, {
96
+ onExcessProperty: "error"
97
+ })(value);
98
+ if (decoded.modelPlan.length === 0) {
99
+ throw new Error("portable foundry V2 requires at least one explicit model binding");
100
+ }
101
+ const roles = decoded.modelPlan.map(({ role }) => role);
102
+ if (new Set(roles).size !== roles.length) {
103
+ throw new Error("portable foundry V2 model roles must be unique");
104
+ }
105
+ return decoded;
106
+ };
107
+ export const pipelineScientificIdentityDigestV2 = (identity) => pipelineDigestV2(decodePipelineScientificIdentityV2(identity));
108
+ export const PipelineCheckpointKindV2 = Schema.Literals(["stage", "loop", "terminal"]);
109
+ export const PipelineCheckpointDescriptorV2 = Schema.Struct({
110
+ version: Schema.Literal(PIPELINE_PROTOCOL_VERSION_V2),
111
+ checkpointId: BoundedIdV2,
112
+ identityDigest: Sha256V2,
113
+ attemptGeneration: PositiveIntegerV2,
114
+ sequence: PositiveIntegerV2,
115
+ kind: PipelineCheckpointKindV2,
116
+ stage: PipelineStageV2,
117
+ loopName: Schema.optionalKey(BoundedIdV2),
118
+ loopIteration: Schema.optionalKey(NonNegativeIntegerV2),
119
+ parentDigest: Sha256V2,
120
+ payloadDigest: Sha256V2,
121
+ payloadBytes: NonNegativeIntegerV2,
122
+ createdAt: Schema.String
123
+ });
124
+ export const decodePipelineCheckpointDescriptorV2 = (value) => {
125
+ const decoded = Schema.decodeUnknownSync(PipelineCheckpointDescriptorV2, {
126
+ onExcessProperty: "error"
127
+ })(value);
128
+ const loopFieldsPresent = decoded.loopName !== undefined && decoded.loopIteration !== undefined;
129
+ if ((decoded.kind === "loop") !== loopFieldsPresent) {
130
+ throw new Error("loop checkpoints require both loopName and loopIteration, and only loops use them");
131
+ }
132
+ return decoded;
133
+ };
134
+ export const pipelineCheckpointDescriptorDigestV2 = (descriptor) => pipelineDigestV2(decodePipelineCheckpointDescriptorV2(descriptor));
135
+ export const assertPipelineCheckpointChainV2 = (identity, checkpoints) => {
136
+ const identityDigest = pipelineScientificIdentityDigestV2(identity);
137
+ let parentDigest = identityDigest;
138
+ let priorSequence = 0;
139
+ let priorStageIndex = -1;
140
+ let attemptGeneration = 0;
141
+ for (const checkpointValue of checkpoints) {
142
+ const checkpoint = decodePipelineCheckpointDescriptorV2(checkpointValue);
143
+ if (checkpoint.identityDigest !== identityDigest) {
144
+ throw new Error("checkpoint scientific identity does not match");
145
+ }
146
+ if (checkpoint.sequence !== priorSequence + 1) {
147
+ throw new Error("checkpoint sequence must be contiguous and start at one");
148
+ }
149
+ if (checkpoint.parentDigest !== parentDigest) {
150
+ throw new Error("checkpoint parent digest does not match the accepted chain head");
151
+ }
152
+ const stageIndex = PIPELINE_STAGES_V2.indexOf(checkpoint.stage);
153
+ if (stageIndex < priorStageIndex) {
154
+ throw new Error("checkpoint stages cannot move backwards");
155
+ }
156
+ if (checkpoint.attemptGeneration < attemptGeneration) {
157
+ throw new Error("checkpoint attempt generation cannot move backwards");
158
+ }
159
+ parentDigest = pipelineCheckpointDescriptorDigestV2(checkpoint);
160
+ priorSequence = checkpoint.sequence;
161
+ priorStageIndex = stageIndex;
162
+ attemptGeneration = checkpoint.attemptGeneration;
163
+ }
164
+ };
165
+ export const assertPipelineCheckpointReplayV2 = (accepted, replay) => {
166
+ if (accepted.checkpointId !== replay.checkpointId ||
167
+ pipelineCheckpointDescriptorDigestV2(accepted) !== pipelineCheckpointDescriptorDigestV2(replay)) {
168
+ throw new Error("checkpoint replay conflicts with the accepted immutable checkpoint");
169
+ }
170
+ };
171
+ export const PipelineArtifactVisibilityV2 = Schema.Literals(["private", "public"]);
172
+ export const PipelineArtifactDescriptorV2 = Schema.Struct({
173
+ artifactId: BoundedIdV2,
174
+ identityDigest: Sha256V2,
175
+ checkpointDigest: Sha256V2,
176
+ kind: BoundedIdV2,
177
+ visibility: PipelineArtifactVisibilityV2,
178
+ sha256: Sha256V2,
179
+ bytes: NonNegativeIntegerV2,
180
+ mediaType: BoundedIdV2
181
+ });
182
+ export const PipelineModelCallV2 = Schema.Struct({
183
+ operationId: BoundedIdV2,
184
+ caseId: BoundedIdV2,
185
+ stage: PipelineStageV2,
186
+ role: PipelineModelRoleV2,
187
+ model: ExplicitModelV2,
188
+ reasoningEffort: Schema.Literals(["low", "medium", "high", "xhigh"]),
189
+ input: Schema.String,
190
+ maximumOutputTokens: PositiveIntegerV2
191
+ });
192
+ export class PipelinePortErrorV2 extends Data.TaggedError("PipelinePortErrorV2") {
193
+ }