@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,511 @@
1
+ import assert from "node:assert/strict";
2
+ import { execFile } from "node:child_process";
3
+ import { createHash } from "node:crypto";
4
+ import { mkdtemp, realpath, rm, writeFile } from "node:fs/promises";
5
+ import { tmpdir } from "node:os";
6
+ import { join } from "node:path";
7
+ import { test } from "node:test";
8
+ import { promisify } from "node:util";
9
+ import { Effect } from "effect";
10
+ import { REPOSITORY_FIXTURE_EVIDENCE_INSTRUCTIONS, repositoryFixtureAuthoringInstructionsV1 } from "../repository-fixture-instructions.js";
11
+ import { EvalAuthoringTransport } from "../project-authoring.js";
12
+ import { assertRepositoryFoundryGenerationPlanV1, repositoryFoundryGenerationBudgetV1, repositoryFoundryGenerationPlanDigestV1 } from "../repository-foundry-plan-protocol.js";
13
+ import { repositoryFoundryModelPlanV1 } from "../repository-language-model-protocol.js";
14
+ import { makeRepositoryFoundryEvidenceReconstructionV1, RepositoryFoundryEvidenceReconstruction } from "../services/evidence-reconstruction/service.js";
15
+ import { RepositoryFoundryProgressLive } from "../services/foundry-progress/service.js";
16
+ import { RepositoryFoundryLanguageModelLive } from "../services/language-model/service.js";
17
+ import { resolveRepositoryOracleCoverageWitnessesV1, validateRepositoryOracleCoverageWitnessRevisionsV1 } from "../services/oracle-coverage-witness/service.js";
18
+ const execute = promisify(execFile);
19
+ const modelPlan = repositoryFoundryModelPlanV1({
20
+ primaryModel: "openai/gpt-6-astra",
21
+ oracleCriticModel: "openai/gpt-6-astra"
22
+ });
23
+ const referenceSource = "export const clamp = value => Math.min(100, Math.max(0, value));\n";
24
+ const testSource = (assertion) => `import assert from "node:assert/strict";
25
+ import test from "node:test";
26
+ import { clamp } from "./subject.mjs";
27
+ test("observable contract", () => { ${assertion} });
28
+ `;
29
+ const fractionTest = testSource("assert.equal(clamp(42.5), 42.5);");
30
+ const integerTest = testSource("assert.equal(clamp(101), 100);");
31
+ const proposal = (scopeId = "fractions") => ({
32
+ scopeId,
33
+ explanation: "Rounding in-range fractions violates exact value preservation.",
34
+ fileOverrides: [
35
+ {
36
+ path: "subject.mjs",
37
+ edits: [{ search: "Math.max(0, value)", replace: "Math.max(0, Math.round(value))" }]
38
+ }
39
+ ],
40
+ testPath: "case.test.mjs",
41
+ testSource: fractionTest,
42
+ expectedBehavior: "An in-range fraction remains exactly unchanged.",
43
+ expectationMode: "preserved"
44
+ });
45
+ const review = (ids = ["fractions"]) => ({
46
+ verdict: "revise",
47
+ detail: "Integer-only examples may conceal a fractional regression.",
48
+ scopeCoverage: ids.map((scopeId) => ({
49
+ scopeId,
50
+ outcome: "gap",
51
+ detail: "An isolated rounding defect may pass integer tests.",
52
+ counterexample: "Round an in-range fraction in an otherwise correct implementation.",
53
+ assertionEvidence: []
54
+ }))
55
+ });
56
+ async function fixture(t) {
57
+ const root = await realpath(await mkdtemp(join(tmpdir(), "coverage-witness-test-")));
58
+ t.after(() => rm(root, { recursive: true, force: true }));
59
+ const git = (...args) => execute("git", ["-C", root, ...args]);
60
+ await git("init", "-q");
61
+ await writeFile(join(root, "subject.mjs"), referenceSource);
62
+ await writeFile(join(root, "case.test.mjs"), integerTest);
63
+ await writeFile(join(root, "control.json"), "{}");
64
+ await git("add", ".");
65
+ await git("-c", "core.hooksPath=/dev/null", "-c", "commit.gpgSign=false", "-c", "user.name=Coverage Witness", "-c", "user.email=witness@example.test", "commit", "-qm", "pinned reference");
66
+ const commit = (await git("rev-parse", "HEAD")).stdout.trim();
67
+ const grade = {
68
+ id: "grade",
69
+ kind: "test",
70
+ cwd: ".",
71
+ executable: "node",
72
+ args: ["--test", "case.test.mjs"],
73
+ timeoutMs: 5_000
74
+ };
75
+ const observation = (id, outcome) => ({
76
+ id,
77
+ kind: "test-command",
78
+ subjectId: id === "baseline" ? "baseline" : "grade",
79
+ outcome,
80
+ detail: "Qualified test seed."
81
+ });
82
+ const seed = {
83
+ version: 1,
84
+ id: "witness-seed",
85
+ status: "qualified",
86
+ source: { kind: "historical-fix", changeEpisodeId: "change" },
87
+ summary: "Clamp bounds and preserve fractions.",
88
+ capabilityEvidence: [{ kind: "test", id: "case", path: "case.test.mjs" }],
89
+ initialState: { commit },
90
+ referenceCommit: commit,
91
+ targetBehavior: [
92
+ { id: "fractions", description: "Preserve in-range fractions.", critical: true, evidence: [] }
93
+ ],
94
+ baselineObservations: [observation("baseline", "pass")],
95
+ preChangeObservations: [observation("before", "fail")],
96
+ postChangeObservations: [observation("after", "pass")],
97
+ candidateTestIds: ["case"],
98
+ environment: {
99
+ protectedControlPaths: ["control.json"],
100
+ trustedPreparationRecipes: [],
101
+ candidateValidationRecipes: [
102
+ {
103
+ id: "syntax",
104
+ kind: "check",
105
+ cwd: ".",
106
+ executable: "node",
107
+ args: ["--check", "subject.mjs"],
108
+ timeoutMs: 5_000
109
+ }
110
+ ],
111
+ baselineGradeRecipes: [{ ...grade, id: "baseline" }],
112
+ gradeRecipes: [grade]
113
+ },
114
+ confidence: "high",
115
+ risks: [],
116
+ rejectionReasons: []
117
+ };
118
+ const suite = {
119
+ version: 1,
120
+ caseId: "witness-case",
121
+ fixtures: [
122
+ {
123
+ id: "upper",
124
+ kind: "counterfactual",
125
+ source: "generated",
126
+ description: "Cap the upper bound.",
127
+ expectedBehavior: "101 becomes 100.",
128
+ testPath: "case.test.mjs",
129
+ expectationMode: "changes"
130
+ }
131
+ ],
132
+ overlays: [{ path: "case.test.mjs", content: integerTest, fixtureIds: ["upper"] }]
133
+ };
134
+ // Pinned source and checkout isolation must win over ambient working-tree state.
135
+ await writeFile(join(root, "subject.mjs"), "throw new Error('dirty tree');");
136
+ return { root, seed, suite };
137
+ }
138
+ function runner(data, options = {}) {
139
+ const calls = [];
140
+ const artifacts = new Map();
141
+ const accounting = { attempts: 0 };
142
+ const effect = resolveRepositoryOracleCoverageWitnessesV1({
143
+ operationId: "witness-test",
144
+ witnessPrefix: "coverage-initial",
145
+ repositoryRoot: data.root,
146
+ seed: options.seed ?? data.seed,
147
+ suite: options.suite ?? data.suite,
148
+ review: options.review ?? review(),
149
+ modelPlan,
150
+ allowedTestPaths: new Set(["case.test.mjs"]),
151
+ allowedSolutionPaths: options.allowedSolutionPaths ?? new Set(["subject.mjs"]),
152
+ referenceSources: [{ path: "subject.mjs", content: referenceSource }],
153
+ context: { visible: "Preserve every in-range numeric value." },
154
+ maximumAttempts: options.maximumAttempts ?? 2,
155
+ oracleCoverageWitnessVersion: options.oracleCoverageWitnessVersion,
156
+ onGenerationAttempt: () => Effect.sync(() => {
157
+ accounting.attempts += 1;
158
+ })
159
+ }).pipe(Effect.provide(RepositoryFoundryLanguageModelLive), Effect.provideService(EvalAuthoringTransport, options.transport ?? {
160
+ complete: () => Effect.die("detailed transport required"),
161
+ completeDetailed: (request) => Effect.sync(() => {
162
+ calls.push(request);
163
+ return {
164
+ text: JSON.stringify(options.reply?.(request, calls.length) ?? { witnesses: [proposal()] }),
165
+ callId: `witness-call-${String(calls.length)}`
166
+ };
167
+ })
168
+ }), Effect.provide(RepositoryFoundryProgressLive(() => Effect.void, (artifact) => Effect.sync(() => {
169
+ artifacts.set(artifact.operationId, artifact);
170
+ }))));
171
+ return { effect, calls, artifacts, accounting };
172
+ }
173
+ test("coverage witnesses prove an isolated escape and retain exact reconstructable replays", async (t) => {
174
+ const data = await fixture(t);
175
+ const run = runner(data);
176
+ const result = await Effect.runPromise(run.effect);
177
+ assert.equal(createHash("sha256").update(run.calls[0].instructions).digest("hex"), "9f9cf7cb450c16ca3b5df037983ac2bf14770c37a9566ef7781dbeb6d04089c8", "V1 reconstructs the original recorded witness-authoring instruction bytes");
178
+ assert.equal(result.witnesses[0].outcome, "confirmed-escape");
179
+ assert.equal(result.witnesses[0].referenceEvidence.outcome, "pass");
180
+ assert.equal(result.witnesses[0].mutantEvidence.outcome, "fail");
181
+ assert.equal(result.suite.fixtures.length, 2);
182
+ assert.deepEqual(result.suite.overlays[0], data.suite.overlays[0]);
183
+ assert.equal(run.accounting.attempts, 1);
184
+ assert.equal("fixtureSuite" in JSON.parse(run.calls[0].input), false);
185
+ const replays = [...run.artifacts.values()].filter((artifact) => artifact.schemaName === "routekit_repository_coverage_witness_replay_v1");
186
+ assert.equal(replays.length, 3);
187
+ for (const artifact of replays) {
188
+ const request = artifact.request.input;
189
+ assert.equal(request.replayInput.repetitions, 2);
190
+ assert.equal(request.replayInput.commit, data.seed.referenceCommit);
191
+ assert.equal(artifact.value.results.length, 2);
192
+ assert.equal(artifact.value.admissionEvidence, false);
193
+ }
194
+ const unsigned = {
195
+ version: 1,
196
+ repository: {
197
+ root: data.root,
198
+ requestedRef: "HEAD",
199
+ commit: data.seed.referenceCommit,
200
+ tree: "tree"
201
+ },
202
+ caseId: data.suite.caseId,
203
+ oracleCoverageWitnessVersion: 1,
204
+ seedId: data.seed.id,
205
+ initialCommit: data.seed.initialState.commit,
206
+ referenceCommit: data.seed.referenceCommit,
207
+ modelPlan,
208
+ qualification: { batches: 2, repetitionsPerBatch: 2, oracleRepetitions: 2 },
209
+ budget: repositoryFoundryGenerationBudgetV1(2, undefined, 2, 2)
210
+ };
211
+ const plan = { ...unsigned, planDigest: repositoryFoundryGenerationPlanDigestV1(unsigned) };
212
+ assertRepositoryFoundryGenerationPlanV1(plan);
213
+ const artifacts = [...run.artifacts.values()].map((artifact, index) => ({
214
+ ...artifact,
215
+ planDigest: plan.planDigest,
216
+ caseId: plan.caseId,
217
+ updatedAt: new Date(index).toISOString()
218
+ }));
219
+ const saved = await Effect.runPromise(makeRepositoryFoundryEvidenceReconstructionV1({ plan, artifacts }));
220
+ const restored = await Effect.runPromise(runner(data, { transport: saved.transport }).effect.pipe(Effect.provideService(RepositoryFoundryEvidenceReconstruction, saved.service)));
221
+ await Effect.runPromise(saved.service.assertConsumed);
222
+ assert.deepEqual(restored, result);
223
+ const incomplete = await Effect.runPromise(makeRepositoryFoundryEvidenceReconstructionV1({
224
+ plan,
225
+ artifacts: artifacts.filter((artifact) => artifact !== artifacts.find((entry) => entry.operationId.includes(":incumbent:")))
226
+ }));
227
+ await assert.rejects(Effect.runPromise(runner(data, { transport: incomplete.transport }).effect.pipe(Effect.provideService(RepositoryFoundryEvidenceReconstruction, incomplete.service))), /infrastructure or incomplete execution/u);
228
+ });
229
+ test("already detected coverage criticism retains its isolated behavioral guard without claiming new coverage", async (t) => {
230
+ const data = await fixture(t);
231
+ const suite = {
232
+ ...data.suite,
233
+ overlays: [{ ...data.suite.overlays[0], content: fractionTest }]
234
+ };
235
+ const run = runner(data, { suite });
236
+ const result = await Effect.runPromise(run.effect);
237
+ assert.equal(result.witnesses[0].outcome, "already-detected");
238
+ assert.deepEqual(result.suite.overlays[0], suite.overlays[0]);
239
+ assert.equal(result.suite.fixtures.length, 2);
240
+ assert.equal(result.suite.overlays[1].content, fractionTest);
241
+ });
242
+ for (const defect of [
243
+ "bad-reference",
244
+ "runtime-mutant",
245
+ "syntax-mutant",
246
+ "multiple-tests"
247
+ ]) {
248
+ test(`invalid coverage witness is repaired without counting ${defect} as a semantic kill`, async (t) => {
249
+ const data = await fixture(t);
250
+ const run = runner(data, {
251
+ reply: (request, ordinal) => {
252
+ if (ordinal > 1) {
253
+ assert.equal(JSON.parse(request.input).previousDiagnostics.length, 1);
254
+ return { witnesses: [proposal()] };
255
+ }
256
+ const witness = proposal();
257
+ if (defect === "bad-reference")
258
+ witness.testSource = testSource("assert.equal(clamp(42.5), 43);");
259
+ if (defect === "multiple-tests")
260
+ witness.testSource += '\ntest("extra", () => assert.ok(true));';
261
+ if (defect === "runtime-mutant" || defect === "syntax-mutant") {
262
+ witness.fileOverrides[0].edits[0].replace =
263
+ defect === "runtime-mutant" ? "missingAtRuntime(value)" : "Math.max(0, ) +";
264
+ }
265
+ return { witnesses: [witness] };
266
+ }
267
+ });
268
+ const result = await Effect.runPromise(run.effect);
269
+ assert.equal(run.accounting.attempts, 2);
270
+ assert.equal(result.witnesses[0].outcome, "confirmed-escape");
271
+ const executions = [...run.artifacts.values()].filter((artifact) => artifact.schemaName === "routekit_repository_coverage_witness_execution_v1");
272
+ assert.equal(executions[0].value.resolved, false);
273
+ assert.equal(executions[1].value.resolved, true);
274
+ });
275
+ }
276
+ test("bounded witness repair retains resolved claims and requests only pending claims", async (t) => {
277
+ const data = await fixture(t);
278
+ const run = runner(data, {
279
+ review: review(["first", "second"]),
280
+ reply: (request, ordinal) => {
281
+ if (ordinal === 1)
282
+ return {
283
+ witnesses: [
284
+ proposal("first"),
285
+ { ...proposal("second"), testSource: testSource("assert.fail('bad');") }
286
+ ]
287
+ };
288
+ assert.deepEqual(JSON.parse(request.input).coverageHypotheses.map((claim) => claim.scopeId), ["second"]);
289
+ return { witnesses: [proposal("second")] };
290
+ }
291
+ });
292
+ const result = await Effect.runPromise(run.effect);
293
+ assert.deepEqual(result.witnesses.map((entry) => entry.scopeId), ["first", "second"]);
294
+ assert.equal(result.suite.fixtures.length, 3);
295
+ assert.equal([...run.artifacts.values()].filter((artifact) => artifact.operationId.endsWith("coverage-initial-1:reference")).length, 1);
296
+ });
297
+ test("invalid exact edits consume the bounded author allowance and never execute", async (t) => {
298
+ const data = await fixture(t);
299
+ const run = runner(data, {
300
+ reply: () => ({
301
+ witnesses: [
302
+ {
303
+ ...proposal(),
304
+ fileOverrides: [
305
+ { path: "subject.mjs", edits: [{ search: "absent text", replace: "wrong" }] }
306
+ ]
307
+ }
308
+ ]
309
+ })
310
+ });
311
+ await assert.rejects(Effect.runPromise(run.effect), /oracle-coverage-witness-exhausted/u);
312
+ assert.equal(run.accounting.attempts, 2);
313
+ assert.equal([...run.artifacts.values()].some((artifact) => artifact.schemaName === "routekit_repository_coverage_witness_replay_v1"), false);
314
+ });
315
+ test("protected paths and test edits cannot be used as witness implementations", async (t) => {
316
+ const data = await fixture(t);
317
+ for (const path of ["control.json", "case.test.mjs", "../subject.mjs"]) {
318
+ const run = runner(data, { allowedSolutionPaths: new Set([path]) });
319
+ await assert.rejects(Effect.runPromise(run.effect), /valid incumbent fixture suite/u);
320
+ assert.equal(run.accounting.attempts, 0);
321
+ }
322
+ });
323
+ test("infrastructure failures stop witness execution without a semantic repair retry", async (t) => {
324
+ const data = await fixture(t);
325
+ const run = runner(data, {
326
+ seed: {
327
+ ...data.seed,
328
+ environment: {
329
+ ...data.seed.environment,
330
+ trustedPreparationRecipes: [
331
+ {
332
+ id: "preparation",
333
+ kind: "build",
334
+ cwd: ".",
335
+ executable: "node",
336
+ args: ["-e", "process.exit(1)"],
337
+ timeoutMs: 5_000
338
+ }
339
+ ]
340
+ }
341
+ }
342
+ });
343
+ await assert.rejects(Effect.runPromise(run.effect), /infrastructure or incomplete execution/u);
344
+ assert.equal(run.accounting.attempts, 1);
345
+ });
346
+ const revisionEffect = (data, witness, suite, artifacts) => validateRepositoryOracleCoverageWitnessRevisionsV1({
347
+ operationId: "witness-test:revision",
348
+ repositoryRoot: data.root,
349
+ seed: data.seed,
350
+ suite,
351
+ retained: [{ witness, overlay: witness.overlay }]
352
+ }).pipe(Effect.provide(RepositoryFoundryProgressLive(() => Effect.void, (artifact) => Effect.sync(() => {
353
+ artifacts.set(artifact.operationId, artifact);
354
+ }))));
355
+ test("V2 witness mechanics can change while the original mutant and complete replay lineage remain fixed", async (t) => {
356
+ const data = await fixture(t);
357
+ const run = runner(data, { oracleCoverageWitnessVersion: 2 });
358
+ const original = await Effect.runPromise(run.effect);
359
+ const witness = original.witnesses[0];
360
+ const revisedSource = testSource("for (const value of [0.25, 42.5, 99.75]) assert.equal(clamp(value), value);");
361
+ const suite = {
362
+ ...original.suite,
363
+ overlays: original.suite.overlays.map((overlay) => overlay.fixtureIds[0] === witness.fixture.id
364
+ ? { ...overlay, content: revisedSource }
365
+ : overlay)
366
+ };
367
+ const revisions = await Effect.runPromise(revisionEffect(data, witness, suite, run.artifacts));
368
+ assert.equal(revisions.length, 1);
369
+ assert.equal(revisions[0].status, "validated");
370
+ assert.equal(revisions[0].referenceEvidence.outcome, "pass");
371
+ assert.equal(revisions[0].mutantEvidence?.outcome, "fail");
372
+ assert.deepEqual(revisions[0].beforeOverlay, witness.overlay);
373
+ assert.equal(witness.overlay.content, fractionTest);
374
+ assert.equal(revisions[0].overlay.content, revisedSource);
375
+ assert.equal(revisions[0].originalExecutionOperationId, witness.executionOperationId);
376
+ assert.match(run.calls[0].instructions, /Transport chunks are not logical event boundaries/u);
377
+ assert.doesNotMatch(run.calls[0].instructions, /race against a resolved tagged sentinel/u);
378
+ const unsigned = {
379
+ version: 1,
380
+ repository: {
381
+ root: data.root,
382
+ requestedRef: "HEAD",
383
+ commit: data.seed.referenceCommit,
384
+ tree: "tree"
385
+ },
386
+ caseId: data.suite.caseId,
387
+ oracleCoverageWitnessVersion: 2,
388
+ seedId: data.seed.id,
389
+ initialCommit: data.seed.initialState.commit,
390
+ referenceCommit: data.seed.referenceCommit,
391
+ modelPlan,
392
+ qualification: { batches: 2, repetitionsPerBatch: 2, oracleRepetitions: 2 },
393
+ budget: repositoryFoundryGenerationBudgetV1(2, undefined, 2, 2)
394
+ };
395
+ const plan = { ...unsigned, planDigest: repositoryFoundryGenerationPlanDigestV1(unsigned) };
396
+ assertRepositoryFoundryGenerationPlanV1(plan);
397
+ const artifacts = [...run.artifacts.values()].map((artifact, index) => ({
398
+ ...artifact,
399
+ planDigest: plan.planDigest,
400
+ caseId: plan.caseId,
401
+ updatedAt: new Date(index).toISOString()
402
+ }));
403
+ const saved = await Effect.runPromise(makeRepositoryFoundryEvidenceReconstructionV1({ plan, artifacts }));
404
+ const restored = await Effect.runPromise(runner(data, {
405
+ oracleCoverageWitnessVersion: 2,
406
+ transport: saved.transport
407
+ }).effect.pipe(Effect.provideService(RepositoryFoundryEvidenceReconstruction, saved.service)));
408
+ const reconstructedRevisions = await Effect.runPromise(revisionEffect(data, restored.witnesses[0], suite, new Map()).pipe(Effect.provideService(RepositoryFoundryEvidenceReconstruction, saved.service)));
409
+ await Effect.runPromise(saved.service.assertConsumed);
410
+ assert.deepEqual(reconstructedRevisions, revisions);
411
+ const missing = await Effect.runPromise(makeRepositoryFoundryEvidenceReconstructionV1({
412
+ plan,
413
+ artifacts: artifacts.filter((artifact) => !(artifact.operationId.includes(":revision:") && artifact.operationId.endsWith(":mutant")))
414
+ }));
415
+ await assert.rejects(Effect.runPromise(revisionEffect(data, witness, suite, new Map()).pipe(Effect.provideService(RepositoryFoundryEvidenceReconstruction, missing.service))), /infrastructure or incomplete execution/u);
416
+ });
417
+ for (const defect of [
418
+ "lost-defect",
419
+ "rejects-reference",
420
+ "runtime-error",
421
+ "multiple-tests"
422
+ ]) {
423
+ test(`a rejected witness revision preserves the incumbent: ${defect}`, async (t) => {
424
+ const data = await fixture(t);
425
+ const run = runner(data);
426
+ const original = await Effect.runPromise(run.effect);
427
+ const witness = original.witnesses[0];
428
+ const source = defect === "lost-defect"
429
+ ? integerTest
430
+ : defect === "rejects-reference"
431
+ ? testSource("assert.equal(clamp(42.5), 43);")
432
+ : defect === "runtime-error"
433
+ ? testSource("missingFunction();")
434
+ : `${fractionTest}\ntest("second", () => assert.ok(true));`;
435
+ const suite = {
436
+ ...original.suite,
437
+ overlays: original.suite.overlays.map((overlay) => overlay.fixtureIds[0] === witness.fixture.id ? { ...overlay, content: source } : overlay)
438
+ };
439
+ const before = structuredClone(original);
440
+ const revisions = await Effect.runPromise(revisionEffect(data, witness, suite, run.artifacts));
441
+ assert.equal(revisions[0].status, "rejected");
442
+ assert.deepEqual(original, before);
443
+ if (defect === "lost-defect")
444
+ assert.equal(revisions[0].mutantEvidence?.outcome, "pass");
445
+ else
446
+ assert.equal(revisions[0].mutantEvidence, undefined);
447
+ });
448
+ }
449
+ test("witness revision cannot replace its reference, metadata, mutant path or test identity", async (t) => {
450
+ const data = await fixture(t);
451
+ const run = runner(data);
452
+ const original = await Effect.runPromise(run.effect);
453
+ for (const witness of [
454
+ { ...original.witnesses[0], referenceCommit: "f".repeat(40) },
455
+ {
456
+ ...original.witnesses[0],
457
+ fixture: { ...original.witnesses[0].fixture, expectedBehavior: "weakened" }
458
+ },
459
+ { ...original.witnesses[0], fileOverrides: [{ path: "control.json", content: "{}" }] },
460
+ {
461
+ ...original.witnesses[0],
462
+ overlay: { ...original.witnesses[0].overlay, path: "another.test.mjs" }
463
+ }
464
+ ]) {
465
+ await assert.rejects(Effect.runPromise(revisionEffect(data, witness, original.suite, new Map())), /identity validation/u);
466
+ }
467
+ });
468
+ test("infrastructure failure during witness revision stops before adoption", async (t) => {
469
+ const data = await fixture(t);
470
+ const run = runner(data);
471
+ const original = await Effect.runPromise(run.effect);
472
+ const witness = original.witnesses[0];
473
+ const suite = {
474
+ ...original.suite,
475
+ overlays: original.suite.overlays.map((overlay) => overlay.fixtureIds[0] === witness.fixture.id
476
+ ? { ...overlay, content: `${fractionTest}\n` }
477
+ : overlay)
478
+ };
479
+ const broken = {
480
+ ...data,
481
+ seed: {
482
+ ...data.seed,
483
+ environment: {
484
+ ...data.seed.environment,
485
+ trustedPreparationRecipes: [
486
+ {
487
+ id: "preparation",
488
+ kind: "build",
489
+ cwd: ".",
490
+ executable: "node",
491
+ args: ["-e", "process.exit(1)"],
492
+ timeoutMs: 5_000
493
+ }
494
+ ]
495
+ }
496
+ }
497
+ };
498
+ await assert.rejects(Effect.runPromise(revisionEffect(broken, witness, suite, new Map())), /infrastructure or incomplete execution/u);
499
+ assert.equal(witness.overlay.content, fractionTest);
500
+ });
501
+ test("V2 observation instructions preserve legacy prompt bytes and apply to complete repair prompts", () => {
502
+ const legacy = `prefix\n${REPOSITORY_FIXTURE_EVIDENCE_INSTRUCTIONS}\nsuffix`;
503
+ assert.equal(repositoryFixtureAuthoringInstructionsV1(legacy), legacy);
504
+ assert.equal(repositoryFixtureAuthoringInstructionsV1(legacy, 1), legacy);
505
+ const revised = repositoryFixtureAuthoringInstructionsV1(legacy, 2);
506
+ assert.match(revised, /^prefix\n/u);
507
+ assert.match(revised, /suffix$/u);
508
+ assert.match(revised, /fixed count of microtasks measures implementation scheduling/u);
509
+ assert.match(revised, /Accumulate reads to the required byte or event boundary/u);
510
+ assert.doesNotMatch(revised, /race against a resolved tagged sentinel/u);
511
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,168 @@
1
+ import assert from "node:assert/strict";
2
+ import { test } from "node:test";
3
+ import { assertRepositoryFoundryGenerationPlanV1, repositoryFoundryGenerationBudgetV1, repositoryFoundryGenerationPlanDigestV1, repositoryFoundryRoleOutputCeilingV1 } from "../repository-foundry-plan-protocol.js";
4
+ import { assertRepositoryFoundryModelPlanV1, repositoryFoundryModelPlanV1 } from "../repository-language-model-protocol.js";
5
+ import { assertRepositoryOracleCoverageReviewV1 } from "../repository-oracle-coverage-protocol.js";
6
+ const primaryModel = "openai/gpt-6-astra";
7
+ const content = "assert.equal(penalty(2000, 1000).until, 2000);";
8
+ const suite = {
9
+ version: 1,
10
+ caseId: "deadline-preservation",
11
+ fixtures: [
12
+ {
13
+ id: "deadline",
14
+ kind: "metamorphic",
15
+ description: "An earlier reset preserves the later penalty deadline.",
16
+ expectedBehavior: "The supplied deadline remains unchanged.",
17
+ expectationMode: "preserved",
18
+ source: "generated",
19
+ testPath: "test.js"
20
+ }
21
+ ],
22
+ overlays: [{ path: "test.js", fixtureIds: ["deadline"], content }]
23
+ };
24
+ const approved = () => ({
25
+ verdict: "approve",
26
+ detail: "The conflicting reset is exercised while the supplied penalty remains authoritative.",
27
+ scopeCoverage: [
28
+ {
29
+ scopeId: "preserve-deadline",
30
+ outcome: "covered",
31
+ detail: "The reset occurs earlier than the supplied penalty deadline.",
32
+ counterexample: "",
33
+ assertionEvidence: [{ fixtureId: "deadline", excerpt: content }]
34
+ }
35
+ ]
36
+ });
37
+ test("oracle coverage approval requires every scope clause and exact current fixture evidence", () => {
38
+ const valid = approved();
39
+ assertRepositoryOracleCoverageReviewV1(valid, ["preserve-deadline"], suite);
40
+ for (const invalid of [
41
+ { ...valid, scopeCoverage: [] },
42
+ { ...valid, scopeCoverage: [...valid.scopeCoverage, ...valid.scopeCoverage] },
43
+ { ...valid, scopeCoverage: [{ ...valid.scopeCoverage[0], scopeId: "unknown" }] },
44
+ { ...valid, scopeCoverage: [{ ...valid.scopeCoverage[0], assertionEvidence: [] }] },
45
+ {
46
+ ...valid,
47
+ scopeCoverage: [{ ...valid.scopeCoverage[0], counterexample: "An unresolved case." }]
48
+ },
49
+ {
50
+ ...valid,
51
+ scopeCoverage: [
52
+ {
53
+ ...valid.scopeCoverage[0],
54
+ assertionEvidence: [{ fixtureId: "deadline", excerpt: "assert.equal(alwaysPass, true);" }]
55
+ }
56
+ ]
57
+ },
58
+ {
59
+ ...valid,
60
+ scopeCoverage: [
61
+ {
62
+ ...valid.scopeCoverage[0],
63
+ assertionEvidence: [{ fixtureId: "invented-fixture", excerpt: content }]
64
+ }
65
+ ]
66
+ }
67
+ ]) {
68
+ assert.throws(() => assertRepositoryOracleCoverageReviewV1(invalid, ["preserve-deadline"], suite), /every frozen scope clause/u);
69
+ }
70
+ assert.throws(() => assertRepositoryOracleCoverageReviewV1(valid, ["preserve-deadline"], {
71
+ ...suite,
72
+ overlays: [
73
+ { ...suite.overlays[0], content: "assert.equal(penalty(2000, 3000).until, 2000);" }
74
+ ]
75
+ }));
76
+ });
77
+ test("oracle coverage gaps carry actionable isolated counterexamples and cannot approve", () => {
78
+ const gap = {
79
+ verdict: "revise",
80
+ detail: "A compound candidate can be killed by missing metadata and conceal a deadline defect.",
81
+ scopeCoverage: [
82
+ {
83
+ scopeId: "preserve-deadline",
84
+ outcome: "gap",
85
+ detail: "No assertion isolates deadline preservation under an earlier reset.",
86
+ counterexample: "Use otherwise-correct metadata with reset 1000 and supplied deadline 2000; assert the effective deadline stays 2000.",
87
+ assertionEvidence: []
88
+ }
89
+ ]
90
+ };
91
+ assertRepositoryOracleCoverageReviewV1(gap, ["preserve-deadline"], suite);
92
+ assert.throws(() => assertRepositoryOracleCoverageReviewV1({ ...gap, verdict: "approve" }, ["preserve-deadline"], suite));
93
+ assert.throws(() => assertRepositoryOracleCoverageReviewV1({
94
+ ...gap,
95
+ scopeCoverage: [{ ...gap.scopeCoverage[0], counterexample: "" }]
96
+ }, ["preserve-deadline"], suite));
97
+ });
98
+ test("optional oracle criticism preserves legacy roles and reserves every review and repair call", () => {
99
+ const legacyModels = repositoryFoundryModelPlanV1({ primaryModel });
100
+ const models = repositoryFoundryModelPlanV1({ primaryModel, oracleCriticModel: primaryModel });
101
+ assert.equal(legacyModels.assignments.length, 17);
102
+ assert.deepEqual(models.assignments.slice(0, 17), legacyModels.assignments);
103
+ assert.equal(models.assignments[17].role, "oracle-critic");
104
+ assertRepositoryFoundryModelPlanV1(legacyModels);
105
+ assertRepositoryFoundryModelPlanV1(models);
106
+ assert.throws(() => assertRepositoryFoundryModelPlanV1({
107
+ ...models,
108
+ assignments: [...models.assignments, models.assignments[17]]
109
+ }));
110
+ const legacy = repositoryFoundryGenerationBudgetV1(2, undefined, 2);
111
+ for (const revisions of [0, 1, 2]) {
112
+ const budget = repositoryFoundryGenerationBudgetV1(2, undefined, 2, revisions);
113
+ assert.equal(budget.plannedModelCalls - legacy.plannedModelCalls, 2 + 2 * revisions);
114
+ assert.equal(budget.requiredTotalInputTokens - legacy.requiredTotalInputTokens, (2 + 2 * revisions) * 512_000);
115
+ assert.equal(budget.requiredTotalOutputTokens - legacy.requiredTotalOutputTokens, (2 + revisions) * repositoryFoundryRoleOutputCeilingV1("oracle-critic") +
116
+ revisions * repositoryFoundryRoleOutputCeilingV1("oracle-designer"));
117
+ const unsigned = {
118
+ version: 1,
119
+ repository: { root: "/repo", requestedRef: "HEAD", commit: "commit", tree: "tree" },
120
+ caseId: "coverage",
121
+ seedId: "seed",
122
+ initialCommit: "initial",
123
+ referenceCommit: "reference",
124
+ modelPlan: models,
125
+ qualification: { batches: 2, repetitionsPerBatch: 2, oracleRepetitions: 2 },
126
+ budget
127
+ };
128
+ const plan = { ...unsigned, planDigest: repositoryFoundryGenerationPlanDigestV1(unsigned) };
129
+ assertRepositoryFoundryGenerationPlanV1(plan);
130
+ if (revisions > 0) {
131
+ for (const witnessVersion of [1, 2]) {
132
+ const { version, repository, caseId, ...rest } = unsigned;
133
+ const versioned = {
134
+ version,
135
+ repository,
136
+ caseId,
137
+ oracleCoverageWitnessVersion: witnessVersion,
138
+ ...rest
139
+ };
140
+ const witnessPlan = {
141
+ ...versioned,
142
+ planDigest: repositoryFoundryGenerationPlanDigestV1(versioned)
143
+ };
144
+ assertRepositoryFoundryGenerationPlanV1(witnessPlan);
145
+ assert.deepEqual(witnessPlan.budget, plan.budget, "witnesses reuse the reserved author allowance");
146
+ assert.notEqual(witnessPlan.planDigest, plan.planDigest);
147
+ assert.throws(() => assertRepositoryFoundryGenerationPlanV1({
148
+ ...plan,
149
+ oracleCoverageWitnessVersion: witnessVersion
150
+ }), /digest/u);
151
+ }
152
+ }
153
+ else {
154
+ assert.throws(() => assertRepositoryFoundryGenerationPlanV1({ ...plan, oracleCoverageWitnessVersion: 1 }), /nonzero coverage allowance/u);
155
+ }
156
+ assert.throws(() => assertRepositoryFoundryGenerationPlanV1({
157
+ ...plan,
158
+ budget: { ...budget, maximumOracleCoverageRevisions: revisions === 2 ? 0 : 2 }
159
+ }), /digest/u);
160
+ assert.throws(() => assertRepositoryFoundryGenerationPlanV1({
161
+ ...plan,
162
+ modelPlan: legacyModels
163
+ }), /assigned oracle critic/u);
164
+ }
165
+ for (const revisions of [-1, 3, 0.5, Number.NaN]) {
166
+ assert.throws(() => repositoryFoundryGenerationBudgetV1(2, undefined, 2, revisions));
167
+ }
168
+ });