@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,442 @@
1
+ import { Context, Effect, Layer } from "effect";
2
+ import { discoverIntegratedRepositoryHistoryV1, validateIntegratedRepositoryHistoryV1 } from "../../adapters/integrated-repository-history.js";
3
+ import { rankRepositorySeedCandidatesV1 } from "../../adapters/repository-seed-selection.js";
4
+ import { RepositoryFoundryError } from "../../errors.js";
5
+ import { assertRepositoryFoundryGenerationPlanV1, assertRepositoryFoundryReferenceExclusionsV1, REPOSITORY_FOUNDRY_MAXIMUM_SPECIFICATION_REVISIONS, REPOSITORY_FOUNDRY_MAXIMUM_VALID_CONTROL_REGENERATIONS, REPOSITORY_FOUNDRY_MAXIMUM_WALL_TIME_MS, REPOSITORY_FOUNDRY_MINIMUM_WALL_TIME_MS, repositoryFoundryGenerationBudgetV1, repositoryFoundryGenerationPlanDigestV1 } from "../../repository-foundry-plan-protocol.js";
6
+ import { assertRepositoryFoundryModelPlanV1 } from "../../repository-language-model-protocol.js";
7
+ import { generateHistoricalRepositoryCaseV1, reconstructRepositoryGeneratedCaseCheckpointV1 } from "../case-generation/service.js";
8
+ import { reportFoundryStageV1 } from "../foundry-progress/service.js";
9
+ import { RepositoryFoundryLanguageModel } from "../language-model/service.js";
10
+ import { buildRepositoryBehaviorMapV1 } from "../repository-model/service.js";
11
+ import { extractHistoricalTaskSeedsV1, qualifyHistoricalTaskSeedAcrossBatchesV1 } from "../task-seed/service.js";
12
+ export class RepositoryFoundry extends Context.Service()("@velum-labs/routekit-eval-setup/RepositoryFoundry") {
13
+ }
14
+ const failure = (operation, detail, cause) => new RepositoryFoundryError({
15
+ operation,
16
+ detail,
17
+ ...(cause === undefined ? {} : { cause })
18
+ });
19
+ const boundedInteger = (value, fallback, minimum, maximum) => Math.max(minimum, Math.min(maximum, Number.isSafeInteger(value) ? Math.trunc(value) : fallback));
20
+ const deniedSmokePathRoots = ["docs", "examples"];
21
+ const pathUnderDeniedSmokeRoot = (path) => path.split("/").some((segment) => /^(?:docs?|examples?)$/iu.test(segment));
22
+ const seedPaths = (seed) => [
23
+ ...seed.capabilityEvidence.flatMap((evidence) => evidence.path === undefined ? [] : [evidence.path]),
24
+ ...seed.environment.trustedPreparationRecipes.map((recipe) => recipe.cwd),
25
+ ...seed.environment.candidateValidationRecipes.map((recipe) => recipe.cwd),
26
+ ...seed.environment.baselineGradeRecipes.map((recipe) => recipe.cwd),
27
+ ...seed.environment.gradeRecipes.map((recipe) => recipe.cwd),
28
+ ...seed.environment.protectedControlPaths
29
+ ];
30
+ const qualificationDiagnostics = (qualification) => {
31
+ const observations = [
32
+ ...qualification.seed.baselineObservations,
33
+ ...qualification.seed.preChangeObservations,
34
+ ...qualification.seed.postChangeObservations
35
+ ];
36
+ const rendered = observations
37
+ .slice(0, 18)
38
+ .map((observation) => `${observation.id}=${observation.outcome}: ${observation.detail}`)
39
+ .join("\n");
40
+ const bytes = Buffer.from(rendered);
41
+ const bounded = bytes.byteLength <= 24_000
42
+ ? rendered
43
+ : `${bytes.subarray(0, 23_968).toString("utf8")}\n[truncated]`;
44
+ return bounded.length === 0 ? "qualification observations unavailable" : bounded;
45
+ };
46
+ export const planHistoricalRepositoryCaseGenerationV1 = Effect.fn("RepositoryFoundry.planHistorical")(function* (input) {
47
+ yield* Effect.try({
48
+ try: () => {
49
+ assertRepositoryFoundryModelPlanV1(input.modelPlan);
50
+ if (input.specificationContractFactsVersion !== undefined &&
51
+ (input.specificationContractFactsVersion !== 1 ||
52
+ input.maximumSpecificationRevisions === undefined)) {
53
+ throw new Error("specification contract facts require version 1 and an explicit specification revision allowance");
54
+ }
55
+ if (input.oracleRepairFeedbackVersion !== undefined &&
56
+ input.oracleRepairFeedbackVersion !== 1) {
57
+ throw new Error("oracle repair feedback version must be 1");
58
+ }
59
+ if (input.oracleCoverageWitnessRepairVersion !== undefined &&
60
+ (input.oracleCoverageWitnessRepairVersion !== 1 ||
61
+ input.oracleCoverageWitnessVersion === undefined ||
62
+ input.maximumFixtureRepairAttempts === undefined)) {
63
+ throw new Error("coverage witness repair budgeting requires versioned witnesses and an explicit fixture repair allowance");
64
+ }
65
+ if (input.oracleCoverageWitnessVersion !== undefined &&
66
+ (![1, 2].includes(input.oracleCoverageWitnessVersion) ||
67
+ input.maximumOracleCoverageRevisions === undefined ||
68
+ input.maximumOracleCoverageRevisions < 1)) {
69
+ throw new Error("executable coverage witnesses require a versioned, nonzero coverage allowance");
70
+ }
71
+ if ((input.dependencyContextVersion !== undefined &&
72
+ ![1, 2].includes(input.dependencyContextVersion)) ||
73
+ (input.maximumFixtureRepairAttempts !== undefined &&
74
+ (!Number.isSafeInteger(input.maximumFixtureRepairAttempts) ||
75
+ input.maximumFixtureRepairAttempts < 0 ||
76
+ input.maximumFixtureRepairAttempts > 3))) {
77
+ throw new Error("invalid dependency context version or fixture repair allowance");
78
+ }
79
+ if (input.maximumOracleCoverageRevisions !== undefined &&
80
+ (input.maximumSpecificationRevisions === undefined ||
81
+ !Number.isSafeInteger(input.maximumOracleCoverageRevisions) ||
82
+ input.maximumOracleCoverageRevisions < 0 ||
83
+ input.maximumOracleCoverageRevisions > 2 ||
84
+ !input.modelPlan.assignments.some((assignment) => assignment.role === "oracle-critic"))) {
85
+ throw new Error("oracle coverage review requires zero to two revisions, reference grounding, and an assigned oracle critic");
86
+ }
87
+ assertRepositoryFoundryReferenceExclusionsV1(input.excludedReferenceCommits);
88
+ if (input.oracleConcurrency !== undefined &&
89
+ (!Number.isSafeInteger(input.oracleConcurrency) ||
90
+ input.oracleConcurrency < 1 ||
91
+ input.oracleConcurrency > 4)) {
92
+ throw new Error("oracle concurrency must be an integer from 1 to 4");
93
+ }
94
+ if (input.referenceCommit !== undefined && input.excludedReferenceCommits !== undefined) {
95
+ throw new Error("new explicit-reference preparation cannot include automatic seed exclusions");
96
+ }
97
+ if (input.caseId.trim().length === 0 ||
98
+ (input.requestedDimension !== undefined &&
99
+ (input.requestedDimension.trim().length === 0 ||
100
+ input.requestedDimension.trim().length > 2000)) ||
101
+ (input.referenceCommit !== undefined && input.referenceCommit.trim().length === 0) ||
102
+ (input.referenceCommit === undefined && input.requestedDimension === undefined) ||
103
+ (input.maximumSeedCandidates !== undefined &&
104
+ (!Number.isSafeInteger(input.maximumSeedCandidates) ||
105
+ input.maximumSeedCandidates < 1 ||
106
+ input.maximumSeedCandidates > 10)) ||
107
+ (input.maximumSpecificationRevisions !== undefined &&
108
+ (!Number.isSafeInteger(input.maximumSpecificationRevisions) ||
109
+ input.maximumSpecificationRevisions < 0 ||
110
+ input.maximumSpecificationRevisions >
111
+ REPOSITORY_FOUNDRY_MAXIMUM_SPECIFICATION_REVISIONS)) ||
112
+ (input.validControlRegenerationSequence !== undefined &&
113
+ (!Number.isSafeInteger(input.validControlRegenerationSequence) ||
114
+ input.validControlRegenerationSequence < 1 ||
115
+ input.validControlRegenerationSequence >
116
+ REPOSITORY_FOUNDRY_MAXIMUM_VALID_CONTROL_REGENERATIONS)) ||
117
+ (input.validControlReviewVersion !== undefined &&
118
+ ![1, 2].includes(input.validControlReviewVersion)) ||
119
+ (input.wallTimeMs !== undefined &&
120
+ (!Number.isSafeInteger(input.wallTimeMs) ||
121
+ input.wallTimeMs < REPOSITORY_FOUNDRY_MINIMUM_WALL_TIME_MS ||
122
+ input.wallTimeMs > REPOSITORY_FOUNDRY_MAXIMUM_WALL_TIME_MS))) {
123
+ throw new Error("case id, explicit reference or requested dimension, and seed candidate bound (1 to 10) are required");
124
+ }
125
+ },
126
+ catch: (cause) => failure("plan-generation", "repository foundry generation request failed validation", cause)
127
+ });
128
+ const qualification = {
129
+ batches: boundedInteger(input.qualificationBatches, 2, 2, 5),
130
+ repetitionsPerBatch: boundedInteger(input.qualificationRepetitionsPerBatch, 2, 2, 5),
131
+ oracleRepetitions: boundedInteger(input.oracleRepetitions, 2, 2, 5),
132
+ ...(input.oracleConcurrency === undefined ? {} : { oracleConcurrency: input.oracleConcurrency })
133
+ };
134
+ const prepareCandidate = Effect.fnUntraced(function* (referenceCommit, requestedRef) {
135
+ const map = yield* buildRepositoryBehaviorMapV1({
136
+ repositoryRoot: input.repositoryRoot,
137
+ requestedRef,
138
+ ...(input.maximumHistoryEpisodes === undefined
139
+ ? {}
140
+ : { maximumHistoryEpisodes: input.maximumHistoryEpisodes })
141
+ });
142
+ // Only this episode owns the historical environment. Unrelated older build
143
+ // graphs must not prevent a viable candidate from being replayed.
144
+ const seeds = yield* extractHistoricalTaskSeedsV1({
145
+ ...map,
146
+ historyEpisodes: map.historyEpisodes.filter((episode) => episode.commit === referenceCommit)
147
+ });
148
+ const seed = seeds.find((candidate) => candidate.referenceCommit === referenceCommit);
149
+ if (seed === undefined) {
150
+ return yield* failure("plan-generation", `no executable historical task seed was found for reference commit ${referenceCommit}`);
151
+ }
152
+ const preflight = yield* qualifyHistoricalTaskSeedAcrossBatchesV1({
153
+ repositoryRoot: map.repository.root,
154
+ seed,
155
+ batches: qualification.batches,
156
+ repetitionsPerBatch: qualification.repetitionsPerBatch
157
+ });
158
+ if (!preflight.stability.stable || preflight.seed.status !== "qualified") {
159
+ return yield* failure("plan-generation", [
160
+ `historical seed failed replay qualification before planning: ${preflight.stability.rejectionReasons.join("; ")}`,
161
+ qualificationDiagnostics(preflight)
162
+ ].join("\n"));
163
+ }
164
+ return { map, seed };
165
+ });
166
+ let selected;
167
+ let historyProvenance;
168
+ if (input.referenceCommit !== undefined) {
169
+ selected = yield* prepareCandidate(input.referenceCommit, input.requestedRef ?? input.referenceCommit);
170
+ }
171
+ else {
172
+ const discovery = yield* buildRepositoryBehaviorMapV1({
173
+ repositoryRoot: input.repositoryRoot,
174
+ requestedRef: input.requestedRef ?? "HEAD",
175
+ ...(input.maximumHistoryEpisodes === undefined
176
+ ? {}
177
+ : { maximumHistoryEpisodes: input.maximumHistoryEpisodes })
178
+ });
179
+ const retained = yield* discoverIntegratedRepositoryHistoryV1({
180
+ repositoryRoot: discovery.repository.root,
181
+ requestedRef: discovery.repository.requestedRef,
182
+ requestedTipCommit: discovery.repository.commit,
183
+ requestedTipTree: discovery.repository.tree,
184
+ integrationCommits: discovery.historyEpisodes.map(({ commit }) => commit)
185
+ });
186
+ const excludedRoots = discovery.blindSpots.find(({ id }) => id === "blind-excluded-package-roots")?.paths ?? [];
187
+ const excludedReferences = new Set(input.excludedReferenceCommits ?? []);
188
+ const candidates = rankRepositorySeedCandidatesV1({
189
+ ...discovery,
190
+ historyEpisodes: [
191
+ ...discovery.historyEpisodes,
192
+ ...retained
193
+ .filter(({ episode }) => !episode.changedPaths.some(({ path }) => excludedRoots.some((root) => path === root || path.startsWith(`${root}/`))))
194
+ .map(({ episode }) => episode)
195
+ ]
196
+ }, input.requestedDimension.trim())
197
+ .filter(({ episode }) => !excludedReferences.has(episode.commit))
198
+ .slice(0, input.maximumSeedCandidates ?? 3);
199
+ yield* reportFoundryStageV1("replay-qualify", `seed-selection tip=${discovery.repository.commit}; candidates=${String(candidates.length)}; excludedReferences=${excludedReferences.size}`);
200
+ if (candidates.length === 0 && excludedReferences.size > 0) {
201
+ return yield* failure("plan-generation", "no unseen eligible historical seed remains for the requested dimension after admitted-reference exclusions");
202
+ }
203
+ const rejections = [];
204
+ for (const [index, candidate] of candidates.entries()) {
205
+ const referenceCommit = candidate.episode.commit;
206
+ yield* reportFoundryStageV1("replay-qualify", `seed-selection candidate=${referenceCommit}; attempt=${String(index + 1)}; relevance=${String(candidate.relevance)}; matched=${candidate.matchedTerms.join(",")}`);
207
+ // Reindex at the candidate's reference, not at today's possibly renamed
208
+ // package layout; the selected plan then pins that exact historical tree.
209
+ const attempted = yield* prepareCandidate(referenceCommit, referenceCommit).pipe(Effect.match({
210
+ onFailure: (error) => ({ status: "rejected", error }),
211
+ onSuccess: (value) => ({ status: "qualified", value })
212
+ }));
213
+ if (attempted.status === "qualified") {
214
+ selected = attempted.value;
215
+ historyProvenance = retained.find(({ episode }) => episode.commit === referenceCommit)?.provenance;
216
+ yield* reportFoundryStageV1("replay-qualify", `seed-selection candidate=${referenceCommit}; status=selected`);
217
+ break;
218
+ }
219
+ const reason = attempted.error.detail.split("\n")[0].slice(0, 1_000);
220
+ rejections.push(`${referenceCommit}: ${reason}`);
221
+ yield* reportFoundryStageV1("replay-qualify", `seed-selection candidate=${referenceCommit}; status=rejected; reason=${reason}`);
222
+ }
223
+ if (selected === undefined) {
224
+ return yield* failure("plan-generation", `no historical seed qualified within ${String(candidates.length)} candidate attempts for the requested dimension${rejections.length === 0 ? "" : `: ${rejections.join("; ")}`}`);
225
+ }
226
+ }
227
+ const { map, seed } = selected;
228
+ const budget = repositoryFoundryGenerationBudgetV1(input.maximumHillClimbAttempts ?? 2, input.wallTimeMs, input.maximumSpecificationRevisions, input.maximumOracleCoverageRevisions, input.maximumFixtureRepairAttempts, input.reviewInputVersion, input.specificationContractFactsVersion);
229
+ const withoutDigest = {
230
+ version: 1,
231
+ repository: map.repository,
232
+ caseId: input.caseId,
233
+ ...(input.requestedDimension === undefined
234
+ ? {}
235
+ : { requestedDimension: input.requestedDimension.trim() }),
236
+ ...(input.excludedReferenceCommits === undefined
237
+ ? {}
238
+ : {
239
+ excludedReferenceCommits: [...input.excludedReferenceCommits]
240
+ }),
241
+ ...(historyProvenance === undefined ? {} : { historyProvenance }),
242
+ ...(input.validControlRegenerationSequence === undefined
243
+ ? {}
244
+ : { validControlRegenerationSequence: input.validControlRegenerationSequence }),
245
+ ...(input.validControlReviewVersion === undefined
246
+ ? {}
247
+ : { validControlReviewVersion: input.validControlReviewVersion }),
248
+ ...(input.dependencyContextVersion === undefined
249
+ ? {}
250
+ : { dependencyContextVersion: input.dependencyContextVersion }),
251
+ ...(input.oracleCoverageWitnessVersion === undefined
252
+ ? {}
253
+ : { oracleCoverageWitnessVersion: input.oracleCoverageWitnessVersion }),
254
+ ...(input.oracleCoverageWitnessRepairVersion === undefined
255
+ ? {}
256
+ : { oracleCoverageWitnessRepairVersion: input.oracleCoverageWitnessRepairVersion }),
257
+ ...(input.oracleRepairFeedbackVersion === undefined
258
+ ? {}
259
+ : { oracleRepairFeedbackVersion: input.oracleRepairFeedbackVersion }),
260
+ ...(input.reviewInputVersion === undefined
261
+ ? {}
262
+ : { reviewInputVersion: input.reviewInputVersion }),
263
+ ...(input.specificationContractFactsVersion === undefined
264
+ ? {}
265
+ : { specificationContractFactsVersion: input.specificationContractFactsVersion }),
266
+ seedId: seed.id,
267
+ initialCommit: seed.initialState.commit,
268
+ referenceCommit: seed.referenceCommit,
269
+ modelPlan: input.modelPlan,
270
+ qualification,
271
+ budget
272
+ };
273
+ const plan = {
274
+ ...withoutDigest,
275
+ planDigest: repositoryFoundryGenerationPlanDigestV1(withoutDigest)
276
+ };
277
+ yield* Effect.try({
278
+ try: () => assertRepositoryFoundryGenerationPlanV1(plan),
279
+ catch: (cause) => failure("plan-generation", "generated repository foundry plan failed validation", cause)
280
+ });
281
+ return plan;
282
+ });
283
+ export const smokeHistoricalRepositoryQualificationV1 = Effect.fn("RepositoryFoundry.smoke")(function* (input) {
284
+ const map = yield* buildRepositoryBehaviorMapV1({
285
+ repositoryRoot: input.repositoryRoot,
286
+ requestedRef: input.requestedRef ?? input.referenceCommit ?? "HEAD",
287
+ ...(input.maximumHistoryEpisodes === undefined
288
+ ? {}
289
+ : { maximumHistoryEpisodes: input.maximumHistoryEpisodes })
290
+ });
291
+ const seeds = yield* extractHistoricalTaskSeedsV1(map);
292
+ const selectableSeeds = seeds.filter((candidate) => !seedPaths(candidate).some(pathUnderDeniedSmokeRoot));
293
+ const selected = input.referenceCommit === undefined
294
+ ? selectableSeeds.at(-1)
295
+ : selectableSeeds.find((candidate) => candidate.referenceCommit === input.referenceCommit);
296
+ if (selected === undefined) {
297
+ return yield* failure("plan-generation", input.referenceCommit === undefined
298
+ ? "no executable historical task seed remained after denying docs/ and examples/ paths"
299
+ : `no executable historical task seed remained for reference commit ${input.referenceCommit} after denying docs/ and examples/ paths`);
300
+ }
301
+ const qualification = yield* qualifyHistoricalTaskSeedAcrossBatchesV1({
302
+ repositoryRoot: map.repository.root,
303
+ seed: selected,
304
+ batches: boundedInteger(input.qualificationBatches, 2, 2, 5),
305
+ repetitionsPerBatch: boundedInteger(input.qualificationRepetitionsPerBatch, 2, 2, 5)
306
+ });
307
+ if (!qualification.stability.stable || qualification.seed.status !== "qualified") {
308
+ return yield* failure("plan-generation", [
309
+ `historical seed failed replay qualification: ${qualification.stability.rejectionReasons.join("; ")}`,
310
+ qualificationDiagnostics(qualification)
311
+ ].join("\n"));
312
+ }
313
+ const selectedPathsUnderDeniedRoots = seedPaths(qualification.seed)
314
+ .filter(pathUnderDeniedSmokeRoot)
315
+ .sort();
316
+ if (selectedPathsUnderDeniedRoots.length > 0) {
317
+ return yield* failure("plan-generation", `qualified historical seed crossed the docs/examples path deny: ${selectedPathsUnderDeniedRoots.join(", ")}`);
318
+ }
319
+ return {
320
+ version: 1,
321
+ operation: "index-qualify-smoke",
322
+ repository: map.repository,
323
+ index: {
324
+ packages: map.packages.length,
325
+ publicSurfaces: map.publicSurfaces.length,
326
+ protocols: map.protocols.length,
327
+ commands: map.commands.length,
328
+ tests: map.tests.length,
329
+ historyEpisodes: map.historyEpisodes.length
330
+ },
331
+ seeds: {
332
+ extracted: seeds.length,
333
+ selected: {
334
+ id: selected.id,
335
+ summary: selected.summary,
336
+ initialCommit: selected.initialState.commit,
337
+ referenceCommit: selected.referenceCommit
338
+ }
339
+ },
340
+ qualification,
341
+ pathPolicy: {
342
+ deniedRoots: deniedSmokePathRoots,
343
+ selectedPathsUnderDeniedRoots
344
+ },
345
+ modelCalls: 0
346
+ };
347
+ });
348
+ const resolveHistoricalRepositoryCaseContextV1 = Effect.fn("RepositoryFoundry.resolveExecutionContext")(function* (input) {
349
+ yield* reportFoundryStageV1("execute-start", `plan=${input.plan.planDigest}`);
350
+ yield* Effect.try({
351
+ try: () => assertRepositoryFoundryGenerationPlanV1(input.plan),
352
+ catch: (cause) => failure("execute-generation", "repository foundry plan failed validation", cause)
353
+ });
354
+ if (input.plan.historyProvenance !== undefined) {
355
+ yield* validateIntegratedRepositoryHistoryV1({
356
+ repositoryRoot: input.plan.repository.root,
357
+ referenceCommit: input.plan.referenceCommit,
358
+ initialCommit: input.plan.initialCommit,
359
+ provenance: input.plan.historyProvenance
360
+ });
361
+ }
362
+ const map = yield* buildRepositoryBehaviorMapV1({
363
+ repositoryRoot: input.plan.repository.root,
364
+ requestedRef: input.plan.repository.commit
365
+ });
366
+ if (map.repository.commit !== input.plan.repository.commit ||
367
+ map.repository.tree !== input.plan.repository.tree) {
368
+ return yield* failure("execute-generation", "repository history changed after the immutable foundry plan was created");
369
+ }
370
+ const seeds = yield* extractHistoricalTaskSeedsV1({
371
+ ...map,
372
+ historyEpisodes: map.historyEpisodes.filter((episode) => episode.commit === input.plan.referenceCommit)
373
+ });
374
+ const candidateSeed = seeds.find((candidate) => candidate.id === input.plan.seedId &&
375
+ candidate.initialState.commit === input.plan.initialCommit &&
376
+ candidate.referenceCommit === input.plan.referenceCommit);
377
+ if (candidateSeed === undefined) {
378
+ return yield* failure("execute-generation", "the immutable foundry plan no longer identifies the same historical seed");
379
+ }
380
+ yield* reportFoundryStageV1("replay-qualify");
381
+ const qualification = yield* qualifyHistoricalTaskSeedAcrossBatchesV1({
382
+ repositoryRoot: input.plan.repository.root,
383
+ seed: candidateSeed,
384
+ batches: input.plan.qualification.batches,
385
+ repetitionsPerBatch: input.plan.qualification.repetitionsPerBatch
386
+ });
387
+ if (!qualification.stability.stable || qualification.seed.status !== "qualified") {
388
+ return yield* failure("execute-generation", [
389
+ `historical seed failed replay qualification: ${qualification.stability.rejectionReasons.join("; ")}`,
390
+ qualificationDiagnostics(qualification)
391
+ ].join("\n"));
392
+ }
393
+ return { map, qualification };
394
+ });
395
+ const historicalCaseInput = (plan, map, seed) => ({
396
+ repositoryRoot: plan.repository.root,
397
+ operationId: `repository-foundry-${plan.planDigest.slice(0, 20)}`,
398
+ caseId: plan.caseId,
399
+ requestedDimension: plan.requestedDimension,
400
+ validControlRegenerationSequence: plan.validControlRegenerationSequence,
401
+ validControlReviewVersion: plan.validControlReviewVersion,
402
+ dependencyContextVersion: plan.dependencyContextVersion,
403
+ oracleCoverageWitnessVersion: plan.oracleCoverageWitnessVersion,
404
+ oracleCoverageWitnessRepairVersion: plan.oracleCoverageWitnessRepairVersion,
405
+ oracleRepairFeedbackVersion: plan.oracleRepairFeedbackVersion,
406
+ reviewInputVersion: plan.reviewInputVersion,
407
+ specificationContractFactsVersion: plan.specificationContractFactsVersion,
408
+ map,
409
+ seed,
410
+ modelPlan: plan.modelPlan,
411
+ oracleRepetitions: plan.qualification.oracleRepetitions,
412
+ oracleConcurrency: plan.qualification.oracleConcurrency,
413
+ maximumHillClimbAttempts: plan.budget.maximumHillClimbAttempts,
414
+ maximumSpecificationRevisions: plan.budget.maximumSpecificationRevisions,
415
+ maximumOracleCoverageRevisions: plan.budget.maximumOracleCoverageRevisions,
416
+ maximumFixtureRepairAttempts: plan.budget.maximumFixtureRepairAttempts
417
+ });
418
+ export const executeHistoricalRepositoryCaseGenerationV1 = Effect.fn("RepositoryFoundry.executeHistorical")(function* (input) {
419
+ const { map, qualification } = yield* resolveHistoricalRepositoryCaseContextV1(input);
420
+ const generation = yield* generateHistoricalRepositoryCaseV1(historicalCaseInput(input.plan, map, qualification.seed));
421
+ yield* reportFoundryStageV1("execute-complete", `status=${generation.benchmarkCase.status}`);
422
+ return {
423
+ version: 1,
424
+ plan: input.plan,
425
+ qualification,
426
+ generation
427
+ };
428
+ });
429
+ export const reconstructHistoricalRepositoryCaseCheckpointV1 = Effect.fn("RepositoryFoundry.reconstructCheckpoint")(function* (input) {
430
+ const { map, qualification } = yield* resolveHistoricalRepositoryCaseContextV1(input);
431
+ const checkpoint = yield* reconstructRepositoryGeneratedCaseCheckpointV1(historicalCaseInput(input.plan, map, qualification.seed));
432
+ return { version: 1, plan: input.plan, qualification, checkpoint };
433
+ });
434
+ export const makeRepositoryFoundry = Effect.gen(function* () {
435
+ const languageModel = yield* RepositoryFoundryLanguageModel;
436
+ return RepositoryFoundry.of({
437
+ planHistorical: planHistoricalRepositoryCaseGenerationV1,
438
+ executeHistorical: (input) => executeHistoricalRepositoryCaseGenerationV1(input).pipe(Effect.provideService(RepositoryFoundryLanguageModel, languageModel)),
439
+ smoke: smokeHistoricalRepositoryQualificationV1
440
+ });
441
+ });
442
+ export const RepositoryFoundryLive = Layer.effect(RepositoryFoundry, makeRepositoryFoundry);
@@ -0,0 +1,62 @@
1
+ import { Context, Effect, Layer } from "effect";
2
+ import type { RepositoryFoundryError } from "../../errors.js";
3
+ import { type RepositoryFoundryAuthoringArtifactV1, type RepositoryFoundryProgressEventV1, type RepositoryFoundryProgressSnapshotV1, type RepositoryFoundryProgressStageV1 } from "../../repository-foundry-progress-protocol.js";
4
+ declare const RepositoryFoundryIdleStallError_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 & {
5
+ readonly _tag: "RepositoryFoundryIdleStallError";
6
+ } & Readonly<A>;
7
+ export declare class RepositoryFoundryIdleStallError extends RepositoryFoundryIdleStallError_base<{
8
+ readonly stage: RepositoryFoundryProgressStageV1;
9
+ readonly modelCalls: number;
10
+ readonly idleMs: number;
11
+ readonly idleStallMs: number;
12
+ readonly detail: string;
13
+ }> {
14
+ get message(): string;
15
+ }
16
+ export type RepositoryFoundryProgressShape = {
17
+ readonly snapshot: Effect.Effect<RepositoryFoundryProgressSnapshotV1>;
18
+ readonly reportStage: (stage: RepositoryFoundryProgressStageV1, detail?: string) => Effect.Effect<RepositoryFoundryProgressEventV1>;
19
+ readonly reportModelCall: (input: {
20
+ readonly role: string;
21
+ readonly phase: "start" | "complete" | "failed";
22
+ readonly operationId?: string;
23
+ readonly callId?: string;
24
+ }) => Effect.Effect<RepositoryFoundryProgressEventV1>;
25
+ readonly reportHeartbeat: (input?: {
26
+ readonly role?: string;
27
+ readonly detail?: string;
28
+ }) => Effect.Effect<RepositoryFoundryProgressEventV1>;
29
+ /** Sync pulse for Responses SSE bytes; does not emit a durable line. */
30
+ readonly markActivitySync: () => void;
31
+ readonly recordAuthoringArtifact?: (artifact: RepositoryFoundryAuthoringArtifactV1) => Effect.Effect<void, RepositoryFoundryError>;
32
+ };
33
+ declare const RepositoryFoundryProgress_base: Context.ServiceClass<RepositoryFoundryProgress, "@velum-labs/routekit-eval-setup/RepositoryFoundryProgress", RepositoryFoundryProgressShape>;
34
+ export declare class RepositoryFoundryProgress extends RepositoryFoundryProgress_base {
35
+ }
36
+ export type RepositoryFoundryProgressEmit = (event: RepositoryFoundryProgressEventV1) => Effect.Effect<void>;
37
+ export type RepositoryFoundryArtifactEmit = (artifact: RepositoryFoundryAuthoringArtifactV1) => Effect.Effect<void, RepositoryFoundryError>;
38
+ export declare const makeRepositoryFoundryProgress: (emit?: RepositoryFoundryProgressEmit, recordArtifact?: RepositoryFoundryArtifactEmit) => Effect.Effect<RepositoryFoundryProgressShape>;
39
+ export declare const RepositoryFoundryProgressLive: (emit?: RepositoryFoundryProgressEmit, recordArtifact?: RepositoryFoundryArtifactEmit) => Layer.Layer<RepositoryFoundryProgress, never, never>;
40
+ export declare const reportFoundryAuthoringArtifactV1: (artifact: RepositoryFoundryAuthoringArtifactV1) => Effect.Effect<void, RepositoryFoundryError>;
41
+ /** No-op when the progress service is not provided. */
42
+ export declare const reportFoundryStageV1: (stage: RepositoryFoundryProgressStageV1, detail?: string) => Effect.Effect<void>;
43
+ export declare const reportFoundryModelCallV1: (input: {
44
+ readonly role: string;
45
+ readonly phase: "start" | "complete" | "failed";
46
+ readonly operationId?: string;
47
+ readonly callId?: string;
48
+ }) => Effect.Effect<void>;
49
+ export declare const reportFoundryHeartbeatV1: (input?: {
50
+ readonly role?: string;
51
+ readonly detail?: string;
52
+ }) => Effect.Effect<void>;
53
+ /**
54
+ * Fail closed when foundry execute progress is flat for `idleStallMs`.
55
+ * Wall time remains a separate hard ceiling outside this helper.
56
+ */
57
+ export declare const withRepositoryFoundryIdleStall: <A, E, R>(effect: Effect.Effect<A, E, R>, input: {
58
+ readonly idleStallMs: number;
59
+ readonly wallTimeMs: number;
60
+ }) => Effect.Effect<A, E | RepositoryFoundryIdleStallError, R | RepositoryFoundryProgress>;
61
+ export declare const renderRepositoryFoundryProgressLineV1: (event: RepositoryFoundryProgressEventV1) => string;
62
+ export {};
@@ -0,0 +1,149 @@
1
+ import { Clock, Context, Data, Effect, Layer, Option } from "effect";
2
+ import { boundRepositoryFoundryIdleStallMsV1, formatRepositoryFoundryProgressLineV1 } from "../../repository-foundry-progress-protocol.js";
3
+ export class RepositoryFoundryIdleStallError extends Data.TaggedError("RepositoryFoundryIdleStallError") {
4
+ get message() {
5
+ return (`RouteKit repository foundry execute stalled: ${this.detail}; ` +
6
+ `stage=${this.stage} modelCalls=${String(this.modelCalls)} ` +
7
+ `idleMs=${String(this.idleMs)} idleStallMs=${String(this.idleStallMs)}`);
8
+ }
9
+ }
10
+ export class RepositoryFoundryProgress extends Context.Service()("@velum-labs/routekit-eval-setup/RepositoryFoundryProgress") {
11
+ }
12
+ const isoOf = (millis) => new Date(millis).toISOString();
13
+ export const makeRepositoryFoundryProgress = (emit = () => Effect.void, recordArtifact = () => Effect.void) => Effect.gen(function* () {
14
+ const startedAt = yield* Clock.currentTimeMillis;
15
+ const mutable = {
16
+ stage: "execute-start",
17
+ modelCalls: 0,
18
+ lastProgressAtMs: startedAt,
19
+ lastEventKind: "stage"
20
+ };
21
+ const publish = (next, event) => Effect.gen(function* () {
22
+ mutable.stage = next.stage;
23
+ mutable.modelCalls = next.modelCalls;
24
+ mutable.lastProgressAtMs = next.lastProgressAtMs;
25
+ mutable.lastEventKind = next.lastEventKind;
26
+ const published = {
27
+ version: 1,
28
+ at: isoOf(next.lastProgressAtMs),
29
+ stage: next.stage,
30
+ modelCalls: next.modelCalls,
31
+ ...event
32
+ };
33
+ yield* emit(published);
34
+ return published;
35
+ });
36
+ return {
37
+ recordAuthoringArtifact: recordArtifact,
38
+ snapshot: Effect.sync(() => ({
39
+ stage: mutable.stage,
40
+ modelCalls: mutable.modelCalls,
41
+ lastProgressAtMs: mutable.lastProgressAtMs,
42
+ lastEventKind: mutable.lastEventKind
43
+ })),
44
+ markActivitySync: () => {
45
+ mutable.lastProgressAtMs = Date.now();
46
+ mutable.lastEventKind = "heartbeat";
47
+ },
48
+ reportStage: (stage, detail) => Effect.gen(function* () {
49
+ const now = yield* Clock.currentTimeMillis;
50
+ return yield* publish({
51
+ stage,
52
+ modelCalls: mutable.modelCalls,
53
+ lastProgressAtMs: now,
54
+ lastEventKind: "stage"
55
+ }, {
56
+ kind: "stage",
57
+ ...(detail === undefined ? {} : { detail })
58
+ });
59
+ }),
60
+ reportModelCall: (input) => Effect.gen(function* () {
61
+ const now = yield* Clock.currentTimeMillis;
62
+ const modelCalls = input.phase === "complete" ? mutable.modelCalls + 1 : mutable.modelCalls;
63
+ return yield* publish({
64
+ stage: mutable.stage,
65
+ modelCalls,
66
+ lastProgressAtMs: now,
67
+ lastEventKind: "model-call"
68
+ }, {
69
+ kind: "model-call",
70
+ role: input.role,
71
+ phase: input.phase,
72
+ ...(input.operationId === undefined ? {} : { operationId: input.operationId }),
73
+ ...(input.callId === undefined ? {} : { callId: input.callId })
74
+ });
75
+ }),
76
+ reportHeartbeat: (input = {}) => Effect.gen(function* () {
77
+ const now = yield* Clock.currentTimeMillis;
78
+ return yield* publish({
79
+ stage: mutable.stage,
80
+ modelCalls: mutable.modelCalls,
81
+ lastProgressAtMs: now,
82
+ lastEventKind: "heartbeat"
83
+ }, {
84
+ kind: "heartbeat",
85
+ phase: "activity",
86
+ ...(input.role === undefined ? {} : { role: input.role }),
87
+ ...(input.detail === undefined ? {} : { detail: input.detail })
88
+ });
89
+ })
90
+ };
91
+ });
92
+ export const RepositoryFoundryProgressLive = (emit, recordArtifact) => Layer.effect(RepositoryFoundryProgress, makeRepositoryFoundryProgress(emit, recordArtifact));
93
+ export const reportFoundryAuthoringArtifactV1 = (artifact) => Effect.gen(function* () {
94
+ const progress = yield* Effect.serviceOption(RepositoryFoundryProgress);
95
+ if (Option.isNone(progress) || progress.value.recordAuthoringArtifact === undefined)
96
+ return;
97
+ yield* progress.value.recordAuthoringArtifact(artifact);
98
+ });
99
+ /** No-op when the progress service is not provided. */
100
+ export const reportFoundryStageV1 = (stage, detail) => Effect.gen(function* () {
101
+ const progress = yield* Effect.serviceOption(RepositoryFoundryProgress);
102
+ if (Option.isNone(progress))
103
+ return;
104
+ yield* progress.value.reportStage(stage, detail);
105
+ });
106
+ export const reportFoundryModelCallV1 = (input) => Effect.gen(function* () {
107
+ const progress = yield* Effect.serviceOption(RepositoryFoundryProgress);
108
+ if (Option.isNone(progress))
109
+ return;
110
+ yield* progress.value.reportModelCall(input);
111
+ });
112
+ export const reportFoundryHeartbeatV1 = (input) => Effect.gen(function* () {
113
+ const progress = yield* Effect.serviceOption(RepositoryFoundryProgress);
114
+ if (Option.isNone(progress))
115
+ return;
116
+ yield* progress.value.reportHeartbeat(input);
117
+ });
118
+ const idlePollIntervalMs = (idleStallMs) => Math.max(1, Math.min(5_000, Math.floor(idleStallMs / 4)));
119
+ /**
120
+ * Fail closed when foundry execute progress is flat for `idleStallMs`.
121
+ * Wall time remains a separate hard ceiling outside this helper.
122
+ */
123
+ export const withRepositoryFoundryIdleStall = (effect, input) => {
124
+ const idleStallMs = boundRepositoryFoundryIdleStallMsV1(input.idleStallMs, input.wallTimeMs);
125
+ const pollMs = idlePollIntervalMs(idleStallMs);
126
+ return Effect.gen(function* () {
127
+ const progress = yield* RepositoryFoundryProgress;
128
+ const monitor = Effect.gen(function* () {
129
+ for (;;) {
130
+ yield* Effect.sleep(pollMs);
131
+ const snap = yield* progress.snapshot;
132
+ const now = yield* Clock.currentTimeMillis;
133
+ const idleMs = now - snap.lastProgressAtMs;
134
+ if (idleMs >= idleStallMs) {
135
+ return yield* new RepositoryFoundryIdleStallError({
136
+ stage: snap.stage,
137
+ modelCalls: snap.modelCalls,
138
+ idleMs,
139
+ idleStallMs,
140
+ detail: "silent post-turbo authoring with no stage or modelCalls progress " +
141
+ "(hung call or stalled before first call); failing closed before the plan wall budget burns silent"
142
+ });
143
+ }
144
+ }
145
+ });
146
+ return yield* Effect.raceFirst(effect, monitor);
147
+ });
148
+ };
149
+ export const renderRepositoryFoundryProgressLineV1 = formatRepositoryFoundryProgressLineV1;