@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,237 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+ import { compileEvaluationEvidence } from "../evaluation-evidence.js";
4
+ import { evaluationSourceTokens, planEvaluationSourceRetrieval, selectEvaluationEvidencePacket, selectEvaluationSourcePacket } from "../evaluation-source-retrieval.js";
5
+ const providerDimension = {
6
+ id: "provider-model-execution",
7
+ description: "Execute requests through provider model backends and translate provider responses",
8
+ includes: [
9
+ "provider backend request execution",
10
+ "provider response decoding"
11
+ ],
12
+ excludes: [
13
+ "compositional routing",
14
+ "subscription account capacity",
15
+ "external wire protocol compatibility"
16
+ ]
17
+ };
18
+ const candidate = (path, sizeBytes = 100, sourceClass = "implementation") => ({
19
+ path,
20
+ sizeBytes,
21
+ sourceClass
22
+ });
23
+ const document = (path, content, sourceClass = "implementation") => ({
24
+ ...candidate(path, Buffer.byteLength(content), sourceClass),
25
+ content
26
+ });
27
+ test("tokenization preserves acronym and identifier boundaries deterministically", () => {
28
+ assert.deepEqual(evaluationSourceTokens("CodexResponsesBackend"), [
29
+ "codex",
30
+ "response",
31
+ "backend"
32
+ ]);
33
+ assert.deepEqual(evaluationSourceTokens("SSECodec provider_model"), [
34
+ "sse",
35
+ "codec",
36
+ "provider",
37
+ "model"
38
+ ]);
39
+ assert.deepEqual(evaluationSourceTokens("providers responses capabilities"), [
40
+ "provider",
41
+ "response",
42
+ "capability"
43
+ ]);
44
+ });
45
+ test("exclusion-only terms cannot promote a source", () => {
46
+ const selected = selectEvaluationSourcePacket({
47
+ documents: [
48
+ document("packages/gateway/src/providers/openai-backend.ts", "export const executeProviderModel = true;"),
49
+ document("packages/gateway/src/routing/compositional-routing.ts", "export const compositionalRouting = true;")
50
+ ],
51
+ targetDimensions: [providerDimension],
52
+ maximumFiles: 8,
53
+ maximumBytes: 10_000
54
+ });
55
+ assert.deepEqual(selected.map((source) => source.path), ["packages/gateway/src/providers/openai-backend.ts"]);
56
+ });
57
+ test("provider execution evidence outranks routing and broad documentation", () => {
58
+ const selected = selectEvaluationSourcePacket({
59
+ documents: [
60
+ document("packages/gateway/src/providers/openai-backend.ts", "execute provider model request and decode provider response"),
61
+ document("packages/gateway/src/providers/codex-responses-codec.ts", "translate provider request and provider response decoding"),
62
+ document("packages/gateway/src/test/provider-backends.test.ts", "test provider backend request execution and response decoding", "test"),
63
+ document("packages/gateway/src/test/compositional-routing.test.ts", "test compositional routing dimension selection", "test"),
64
+ document("docs/routekit-remote-gateways.md", "RouteKit gateway CLI daemon routing tool", "documentation")
65
+ ],
66
+ targetDimensions: [providerDimension],
67
+ maximumFiles: 3,
68
+ maximumBytes: 10_000
69
+ });
70
+ assert.deepEqual(selected.map((source) => source.path), [
71
+ "packages/gateway/src/providers/codex-responses-codec.ts",
72
+ "packages/gateway/src/providers/openai-backend.ts",
73
+ "packages/gateway/src/test/provider-backends.test.ts"
74
+ ]);
75
+ assert.ok(selected.every((source) => source.inclusionReason.startsWith("sparse retrieval rank ")));
76
+ });
77
+ test("ownership-root expansion recovers generic filenames by content", () => {
78
+ const candidates = [
79
+ candidate("packages/gateway/src/providers/openai-backend.ts"),
80
+ candidate("packages/gateway/src/dispatcher.ts"),
81
+ candidate("packages/unrelated/src/provider-catalog.ts")
82
+ ];
83
+ const planned = planEvaluationSourceRetrieval({
84
+ candidates,
85
+ targetDimensions: [providerDimension],
86
+ maximumFiles: 16,
87
+ maximumBytes: 10_000
88
+ });
89
+ assert.deepEqual(planned.map((source) => source.path), candidates.map((source) => source.path).sort());
90
+ const selected = selectEvaluationSourcePacket({
91
+ documents: planned.map((source) => ({
92
+ ...source,
93
+ content: source.path === "packages/gateway/src/dispatcher.ts"
94
+ ? "execute a request through the selected backend and decode its response"
95
+ : source.path.includes("unrelated")
96
+ ? "provider names for display only"
97
+ : "provider backend adapter"
98
+ })),
99
+ targetDimensions: [providerDimension],
100
+ maximumFiles: 2,
101
+ maximumBytes: 10_000
102
+ });
103
+ assert.ok(selected.some((source) => source.path === "packages/gateway/src/dispatcher.ts" &&
104
+ source.inclusionReason.endsWith("fields: content")));
105
+ });
106
+ test("selection does not force an irrelevant source class", () => {
107
+ const selected = selectEvaluationSourcePacket({
108
+ documents: [
109
+ document("packages/gateway/src/providers/anthropic-backend.ts", "provider backend request execution"),
110
+ document("docs/operations.md", "deployment rotation and incident access", "documentation"),
111
+ document("scripts/check-daemon.ts", "check daemon availability", "operational")
112
+ ],
113
+ targetDimensions: [providerDimension],
114
+ maximumFiles: 8,
115
+ maximumBytes: 10_000
116
+ });
117
+ assert.deepEqual(selected.map((source) => source.path), ["packages/gateway/src/providers/anthropic-backend.ts"]);
118
+ });
119
+ test("explicit inclusions are planned before retrieved candidates under a bound", () => {
120
+ const explicit = {
121
+ ...candidate(".routekit/incident/provider-trace.json"),
122
+ explicitReason: "reviewed incident evidence"
123
+ };
124
+ const planned = planEvaluationSourceRetrieval({
125
+ candidates: [
126
+ candidate("packages/gateway/src/providers/openai-backend.ts"),
127
+ candidate("packages/gateway/src/providers/anthropic-backend.ts"),
128
+ explicit
129
+ ],
130
+ targetDimensions: [providerDimension],
131
+ maximumFiles: 1,
132
+ maximumBytes: 10_000
133
+ });
134
+ assert.deepEqual(planned.map(({ pathScore: _pathScore, ...source }) => source), [explicit]);
135
+ });
136
+ test("planning and selection obey exact file and byte bounds", () => {
137
+ const candidates = [
138
+ candidate("packages/gateway/src/providers/a-backend.ts", 6),
139
+ candidate("packages/gateway/src/providers/b-backend.ts", 6),
140
+ candidate("packages/gateway/src/providers/c-backend.ts", 4)
141
+ ];
142
+ const planned = planEvaluationSourceRetrieval({
143
+ candidates,
144
+ targetDimensions: [providerDimension],
145
+ maximumFiles: 2,
146
+ maximumBytes: 10
147
+ });
148
+ assert.equal(planned.length, 2);
149
+ assert.equal(planned.reduce((total, source) => total + source.sizeBytes, 0), 10);
150
+ const selected = selectEvaluationSourcePacket({
151
+ documents: candidates.map((source) => ({
152
+ ...source,
153
+ content: "provider backend"
154
+ })),
155
+ targetDimensions: [providerDimension],
156
+ maximumFiles: 2,
157
+ maximumBytes: 10
158
+ });
159
+ assert.equal(selected.length, 2);
160
+ assert.equal(selected.reduce((total, source) => total + source.sizeBytes, 0), 10);
161
+ });
162
+ test("inventory order cannot change the retrieval result", () => {
163
+ const documents = [
164
+ document("packages/gateway/src/providers/openai-backend.ts", "provider backend request execution"),
165
+ document("packages/gateway/src/providers/google-backend.ts", "provider backend response decoding"),
166
+ document("packages/gateway/src/test/compositional-routing.test.ts", "compositional routing")
167
+ ];
168
+ const select = (values) => selectEvaluationSourcePacket({
169
+ documents: values,
170
+ targetDimensions: [providerDimension],
171
+ maximumFiles: 8,
172
+ maximumBytes: 10_000
173
+ });
174
+ assert.deepEqual(select([...documents].reverse()), select(documents));
175
+ });
176
+ test("block packet assembly covers positive facets without whole-file monopoly", () => {
177
+ const dimension = {
178
+ ...providerDimension,
179
+ includes: [
180
+ "provider live model catalogs and reasoning capabilities",
181
+ "upstream request construction and response decoding",
182
+ "explicit provider backend execution"
183
+ ]
184
+ };
185
+ const source = (path, blocks) => {
186
+ const content = blocks.join("\n\n");
187
+ return {
188
+ ...candidate(path, Buffer.byteLength(content)),
189
+ evidenceSource: compileEvaluationEvidence({
190
+ sources: [{ path, content }],
191
+ maximumBlockBytes: 80
192
+ })[0]
193
+ };
194
+ };
195
+ const selected = selectEvaluationEvidencePacket({
196
+ documents: [
197
+ source("packages/gateway/src/providers/backend.ts", [
198
+ "explicit provider backend execution",
199
+ "generic provider backend helper",
200
+ "generic provider backend helper"
201
+ ]),
202
+ source("packages/cli/src/catalog.ts", [
203
+ "live model catalog reasoning capability"
204
+ ]),
205
+ source("packages/gateway/src/providers/codex-codec.ts", [
206
+ "upstream request construction response decoding"
207
+ ])
208
+ ],
209
+ targetDimensions: [dimension],
210
+ maximumBlocks: 3,
211
+ maximumBytes: 10_000,
212
+ maximumBlocksPerSource: 2
213
+ });
214
+ assert.deepEqual(selected.map((selection) => selection.source.path), [
215
+ "packages/cli/src/catalog.ts",
216
+ "packages/gateway/src/providers/backend.ts",
217
+ "packages/gateway/src/providers/codex-codec.ts"
218
+ ]);
219
+ assert.equal(selected.reduce((total, selection) => total + selection.blocks.length, 0), 3);
220
+ });
221
+ test("structural provider scope lets concrete sibling transports compete", () => {
222
+ const candidates = [
223
+ candidate("packages/gateway/src/providers/backend.ts"),
224
+ candidate("packages/gateway/src/providers/openai-backend.ts"),
225
+ candidate("packages/gateway/src/routing/router.ts")
226
+ ];
227
+ const planned = planEvaluationSourceRetrieval({
228
+ candidates,
229
+ targetDimensions: [providerDimension],
230
+ maximumFiles: 16,
231
+ maximumBytes: 10_000
232
+ });
233
+ const byPath = new Map(planned.map((source) => [source.path, source]));
234
+ assert.ok((byPath.get("packages/gateway/src/providers/openai-backend.ts")
235
+ ?.pathScore ?? 0) >
236
+ (byPath.get("packages/gateway/src/routing/router.ts")?.pathScore ?? 0));
237
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,196 @@
1
+ import assert from "node:assert/strict";
2
+ import { test } from "node:test";
3
+ import { compileEvaluationEvidence, renderEvaluationEvidenceContext } from "../evaluation-evidence.js";
4
+ import { assertEvaluationStructure, candidateCaseProjection, hiddenOracleProjection, renderEvaluationCriteria } from "../evaluation-structure-policy.js";
5
+ const sourceContent = [
6
+ "Protocol rules:",
7
+ "- the terminal event must be last;",
8
+ "- later output is invalid;",
9
+ "- unsupported fields are rejected.",
10
+ ""
11
+ ].join("\n");
12
+ const evidenceSources = compileEvaluationEvidence({
13
+ sources: [{ path: "src/protocol.ts", content: sourceContent }],
14
+ maximumBlockBytes: 3_000
15
+ });
16
+ const evidenceBlock = evidenceSources[0].blocks[0];
17
+ const compilerBackedCase = (id, overrides = {}) => {
18
+ const criteria = [
19
+ {
20
+ id: `${id}-critical`,
21
+ description: "Explain why the terminal event must be last and why later output is invalid or unsupported.",
22
+ importance: "critical",
23
+ gradingMode: "semantic"
24
+ }
25
+ ];
26
+ return {
27
+ id,
28
+ prompt: "Explain the protocol behavior from the supplied evidence.",
29
+ context: renderEvaluationEvidenceContext([evidenceBlock]),
30
+ rubric: renderEvaluationCriteria(criteria),
31
+ evidenceIds: [evidenceBlock.id],
32
+ criteria,
33
+ positiveControls: [
34
+ {
35
+ id: `${id}-positive`,
36
+ response: "The terminal event must be last; later output is invalid and unsupported."
37
+ }
38
+ ],
39
+ negativeControls: [
40
+ {
41
+ id: `${id}-missing`,
42
+ response: "The response discusses event streams but omits terminal ordering.",
43
+ targetedCriterionIds: [`${id}-critical`],
44
+ kind: "missing-criterion"
45
+ },
46
+ {
47
+ id: `${id}-forbidden`,
48
+ response: "Events may be emitted after the terminal event.",
49
+ targetedCriterionIds: [`${id}-critical`],
50
+ kind: "forbidden-behavior"
51
+ },
52
+ {
53
+ id: `${id}-non-responsive`,
54
+ response: "This protocol is thoughtfully designed and broadly useful.",
55
+ targetedCriterionIds: [`${id}-critical`],
56
+ kind: "non-responsive"
57
+ }
58
+ ],
59
+ ...overrides
60
+ };
61
+ };
62
+ const proposalWith = (dimensionCase = compilerBackedCase("dimension-case"), compositionCase = compilerBackedCase("composition-case")) => ({
63
+ version: 1,
64
+ basisDigest: "basis",
65
+ evaluationDigest: "evaluation",
66
+ candidateModels: ["provider/candidate-a", "provider/candidate-b"],
67
+ judgeModel: "provider/judge",
68
+ evidenceSources,
69
+ suites: [
70
+ {
71
+ version: 1,
72
+ dimensionId: "protocol",
73
+ maximumOutputTokens: 256,
74
+ cases: [dimensionCase]
75
+ }
76
+ ],
77
+ decompositionBenchmark: {
78
+ maximumVectorL1Error: 0.3,
79
+ cases: []
80
+ },
81
+ compositionSuite: {
82
+ maximumOutputTokens: 256,
83
+ minimumWinnerScoreGap: 0.05,
84
+ minimumWinnerAgreement: 0.8,
85
+ cases: [
86
+ {
87
+ ...compositionCase,
88
+ decomposition: {
89
+ weights: [{ dimensionId: "protocol", weight: 1 }],
90
+ unknownWeight: 0
91
+ },
92
+ requirements: {
93
+ endpoint: "responses",
94
+ requiresTools: false,
95
+ requiresVision: false
96
+ }
97
+ }
98
+ ]
99
+ }
100
+ });
101
+ test("structure policy accepts legitimate protocol language and reports duplicate selections as facts", () => {
102
+ const report = assertEvaluationStructure({
103
+ proposal: proposalWith(),
104
+ sourceInventory: ["src/protocol.ts"]
105
+ });
106
+ assert.equal(report.caseCount, 2);
107
+ assert.deepEqual(report.duplicateEvidenceSelectionGroups, [
108
+ ["composition/composition-case", "protocol/dimension-case"]
109
+ ]);
110
+ });
111
+ test("candidate and hidden projections encode the visibility boundary", () => {
112
+ const testCase = compilerBackedCase("projection");
113
+ assert.deepEqual(Object.keys(candidateCaseProjection(testCase)).sort(), [
114
+ "context",
115
+ "id",
116
+ "prompt"
117
+ ]);
118
+ assert.deepEqual(Object.keys(hiddenOracleProjection(testCase)).sort(), [
119
+ "criteria",
120
+ "id",
121
+ "negativeControls",
122
+ "positiveControls",
123
+ "rubric"
124
+ ]);
125
+ });
126
+ test("structure policy rejects context and rubric not rendered by the compiler", () => {
127
+ assert.throws(() => assertEvaluationStructure({
128
+ proposal: proposalWith(compilerBackedCase("context", { context: "author-supplied context" })),
129
+ sourceInventory: ["src/protocol.ts"]
130
+ }), /context is not compiler-rendered/u);
131
+ assert.throws(() => assertEvaluationStructure({
132
+ proposal: proposalWith(compilerBackedCase("rubric", { rubric: "author-supplied rubric" })),
133
+ sourceInventory: ["src/protocol.ts"]
134
+ }), /rubric is not compiler-rendered/u);
135
+ });
136
+ test("structure policy rejects unknown evidence and inventory mismatches", () => {
137
+ assert.throws(() => assertEvaluationStructure({
138
+ proposal: proposalWith(compilerBackedCase("unknown", { evidenceIds: ["ev_unknown"] })),
139
+ sourceInventory: ["src/protocol.ts"]
140
+ }), /unknown evidence id/u);
141
+ assert.throws(() => assertEvaluationStructure({
142
+ proposal: proposalWith(),
143
+ sourceInventory: ["src/other.ts"]
144
+ }), /outside the project inventory/u);
145
+ });
146
+ test("structure policy rejects missing or invalid control topology", () => {
147
+ const base = compilerBackedCase("controls");
148
+ assert.throws(() => assertEvaluationStructure({
149
+ proposal: proposalWith({
150
+ ...base,
151
+ criteria: base.criteria.map((criterion) => ({
152
+ ...criterion,
153
+ importance: "supporting"
154
+ })),
155
+ rubric: renderEvaluationCriteria(base.criteria.map((criterion) => ({
156
+ ...criterion,
157
+ importance: "supporting"
158
+ })))
159
+ }),
160
+ sourceInventory: ["src/protocol.ts"]
161
+ }), /requires a critical criterion/u);
162
+ assert.throws(() => assertEvaluationStructure({
163
+ proposal: proposalWith({
164
+ ...base,
165
+ negativeControls: base.negativeControls.map((control, index) => index === 0
166
+ ? { ...control, targetedCriterionIds: ["unknown-criterion"] }
167
+ : control)
168
+ }),
169
+ sourceInventory: ["src/protocol.ts"]
170
+ }), /invalid negative-control target/u);
171
+ assert.throws(() => assertEvaluationStructure({
172
+ proposal: proposalWith({
173
+ ...base,
174
+ negativeControls: base.negativeControls.filter((control) => control.kind !== "non-responsive")
175
+ }),
176
+ sourceInventory: ["src/protocol.ts"]
177
+ }), /requires a non-responsive negative control/u);
178
+ });
179
+ test("structure policy rejects tampered persisted evidence metadata", () => {
180
+ const proposal = proposalWith();
181
+ const source = proposal.evidenceSources[0];
182
+ const block = source.blocks[0];
183
+ const tampered = {
184
+ ...proposal,
185
+ evidenceSources: [
186
+ {
187
+ ...source,
188
+ blocks: [{ ...block, text: `${block.text}tampered` }]
189
+ }
190
+ ]
191
+ };
192
+ assert.throws(() => assertEvaluationStructure({
193
+ proposal: tampered,
194
+ sourceInventory: ["src/protocol.ts"]
195
+ }), /source digest does not match|block identity does not match/u);
196
+ });
@@ -0,0 +1,39 @@
1
+ export declare const RESOURCE_PARENT_DEADLINE_MS = 8000;
2
+ export declare const RESOURCE_BODY_DELAY_MS = 30000;
3
+ export declare const RESOURCE_FRAMEWORK_TIMEOUT_MS = 45000;
4
+ export declare const RESOURCE_OUTPUT_CHUNK_BYTES: number;
5
+ export declare const RESOURCE_OUTPUT_CAP_BYTES: number;
6
+ export declare const REPOSITORY_RESOURCE_CASES: readonly [{
7
+ readonly id: "edge-resource-clean";
8
+ readonly runner: "vitest";
9
+ readonly kind: "clean";
10
+ readonly expected: "pass";
11
+ readonly events: readonly ["module-enter", "body-enter", "body-return", ...string[]];
12
+ }, {
13
+ readonly id: "edge-worker-terminated";
14
+ readonly runner: "vitest";
15
+ readonly kind: "termination";
16
+ readonly expected: "unknown";
17
+ readonly events: readonly ["module-enter", "body-enter", "signal-requested", "signal-observed", "termination-requested"];
18
+ }, {
19
+ readonly id: "edge-parent-deadline";
20
+ readonly runner: "vitest";
21
+ readonly kind: "deadline";
22
+ readonly expected: "unknown";
23
+ readonly events: readonly ["module-enter", "body-enter"];
24
+ }, {
25
+ readonly id: "edge-output-ordinary";
26
+ readonly runner: "node";
27
+ readonly kind: "output";
28
+ readonly chunks: 1;
29
+ readonly expected: "pass";
30
+ readonly events: readonly ["module-enter", "body-enter", "output-enter", "output-return", "body-return", "cleanup-enter", "cleanup-return"];
31
+ }, {
32
+ readonly id: "edge-output-overflow";
33
+ readonly runner: "node";
34
+ readonly kind: "output";
35
+ readonly chunks: 33;
36
+ readonly expected: "unknown";
37
+ readonly events: readonly ["module-enter", "body-enter", "output-enter", "output-return", "body-return", "cleanup-enter", "cleanup-return"];
38
+ }];
39
+ export declare const REPOSITORY_RESOURCE_FILES: Readonly<Record<string, string>>;
@@ -0,0 +1,111 @@
1
+ import { REPOSITORY_BOUNDARY_EVENTS_SOURCE } from "./vitest-boundary-panel.js";
2
+ // Real, bounded subprocess controls only. No candidate benchmark code, new
3
+ // execution owner, resource-policy change, or fabricated command-result flags.
4
+ export const RESOURCE_PARENT_DEADLINE_MS = 8000;
5
+ export const RESOURCE_BODY_DELAY_MS = 30000;
6
+ export const RESOURCE_FRAMEWORK_TIMEOUT_MS = 45000;
7
+ export const RESOURCE_OUTPUT_CHUNK_BYTES = 64 * 1024;
8
+ export const RESOURCE_OUTPUT_CAP_BYTES = 2 * 1024 * 1024;
9
+ const cleanHooks = ["after-each-enter", "after-each-return", "after-all-enter", "after-all-return"];
10
+ export const REPOSITORY_RESOURCE_CASES = [
11
+ { id: "edge-resource-clean", runner: "vitest", kind: "clean", expected: "pass",
12
+ events: ["module-enter", "body-enter", "body-return", ...cleanHooks] },
13
+ { id: "edge-worker-terminated", runner: "vitest", kind: "termination", expected: "unknown",
14
+ events: ["module-enter", "body-enter", "signal-requested", "signal-observed", "termination-requested"] },
15
+ { id: "edge-parent-deadline", runner: "vitest", kind: "deadline", expected: "unknown",
16
+ events: ["module-enter", "body-enter"] },
17
+ { id: "edge-output-ordinary", runner: "node", kind: "output", chunks: 1, expected: "pass",
18
+ events: ["module-enter", "body-enter", "output-enter", "output-return", "body-return",
19
+ "cleanup-enter", "cleanup-return"] },
20
+ { id: "edge-output-overflow", runner: "node", kind: "output", chunks: 33, expected: "unknown",
21
+ events: ["module-enter", "body-enter", "output-enter", "output-return", "body-return",
22
+ "cleanup-enter", "cleanup-return"] }
23
+ ];
24
+ const vitestSource = String.raw `
25
+ import assert from "node:assert/strict";
26
+ import { setTimeout as delay } from "node:timers/promises";
27
+ import { afterAll, afterEach, test } from "vitest";
28
+ import { diagnostic, phase } from "./edge-events.mjs";
29
+ export function register(scenario, timing) {
30
+ const event = (name, detail) => phase(scenario.id, name, detail);
31
+ event("module-enter");
32
+ afterEach(() => { event("after-each-enter"); event("after-each-return"); });
33
+ afterAll(() => { event("after-all-enter"); event("after-all-return"); });
34
+ // The framework timeout must outlast BOTH the finite body and the parent
35
+ // command deadline. A native body timeout is not the intended control.
36
+ test("bounded resource " + scenario.id, { timeout: timing.frameworkTimeoutMs }, async () => {
37
+ event("body-enter");
38
+ if (scenario.kind === "termination") {
39
+ // Vitest patches process.exit to throw. Deliver a real signal to this
40
+ // fresh fixture-owned worker instead; do not touch existing listeners.
41
+ assert.equal(process.listenerCount("SIGTERM"), 0, "unexpected fixture-worker signal listener");
42
+ process.once("SIGTERM", () => {
43
+ event("signal-observed");
44
+ event("termination-requested");
45
+ try {
46
+ process.kill(process.pid, "SIGKILL");
47
+ } catch (error) {
48
+ event("termination-rejected", diagnostic(error));
49
+ throw error;
50
+ }
51
+ event("termination-returned");
52
+ });
53
+ event("signal-requested");
54
+ try {
55
+ process.kill(process.pid, "SIGTERM");
56
+ } catch (error) {
57
+ event("signal-rejected", diagnostic(error));
58
+ throw error;
59
+ }
60
+ // One finite fallback ensures denial or unexpected survival is a failed
61
+ // causal control, never a successful "unknown" by an unrelated error.
62
+ await delay(1500);
63
+ event("worker-survived");
64
+ assert.fail("the fixture-owned grading worker survived its termination signal");
65
+ }
66
+ await delay(scenario.kind === "deadline" ? timing.bodyDelayMs : 25);
67
+ event("body-return");
68
+ });
69
+ }
70
+ `;
71
+ const nodeSource = String.raw `
72
+ import assert from "node:assert/strict";
73
+ import { test } from "node:test";
74
+ import { phase } from "./edge-events.mjs";
75
+ export function register(scenario, chunkBytes) {
76
+ const event = name => phase(scenario.id, name);
77
+ event("module-enter");
78
+ test("bounded resource " + scenario.id, async context => {
79
+ event("body-enter");
80
+ context.after(() => { event("cleanup-enter"); event("cleanup-return"); });
81
+ // Allocate one ASCII chunk and reuse it. Each write awaits the actual
82
+ // stream callback/backpressure; neither loop nor buffering is unbounded.
83
+ const chunk = "x".repeat(chunkBytes - 1) + "\n";
84
+ assert.equal(Buffer.byteLength(chunk), chunkBytes);
85
+ let written = 0;
86
+ event("output-enter");
87
+ for (let index = 0; index < scenario.chunks; index += 1) {
88
+ const stream = index % 2 === 0 ? process.stdout : process.stderr;
89
+ await new Promise((resolve, reject) => stream.write(chunk, "utf8",
90
+ error => error ? reject(error) : resolve()));
91
+ written += chunkBytes;
92
+ }
93
+ event("output-return");
94
+ assert.equal(written, scenario.chunks * chunkBytes);
95
+ event("body-return");
96
+ });
97
+ }
98
+ `;
99
+ export const REPOSITORY_RESOURCE_FILES = {
100
+ "test/edge-events.mjs": REPOSITORY_BOUNDARY_EVENTS_SOURCE,
101
+ "test/resource-vitest-register.mjs": vitestSource,
102
+ "test/resource-node-register.mjs": nodeSource,
103
+ ...Object.fromEntries(REPOSITORY_RESOURCE_CASES.map(scenario => [
104
+ `test/${scenario.id}.test.mjs`,
105
+ scenario.runner === "vitest"
106
+ ? `import { register } from "./resource-vitest-register.mjs";\nregister(${JSON.stringify(scenario)}, ${JSON.stringify({
107
+ frameworkTimeoutMs: RESOURCE_FRAMEWORK_TIMEOUT_MS, bodyDelayMs: RESOURCE_BODY_DELAY_MS
108
+ })});\n`
109
+ : `import { register } from "./resource-node-register.mjs";\nregister(${JSON.stringify(scenario)}, ${RESOURCE_OUTPUT_CHUNK_BYTES});\n`
110
+ ]))
111
+ };
@@ -0,0 +1,84 @@
1
+ export declare const VITEST_BOUNDARY_CASES: readonly [{
2
+ readonly id: "edge-hooks-clean";
3
+ readonly kind: "hooks";
4
+ readonly bodyOk: true;
5
+ readonly expected: "pass";
6
+ readonly events: string[];
7
+ readonly taskState: "passed";
8
+ }, {
9
+ readonly id: "edge-hooks-body-only";
10
+ readonly kind: "hooks";
11
+ readonly bodyOk: false;
12
+ readonly expected: "fail";
13
+ readonly events: string[];
14
+ readonly taskState: "failed";
15
+ }, {
16
+ readonly id: "edge-before-all";
17
+ readonly kind: "hooks";
18
+ readonly bodyOk: true;
19
+ readonly hookFailure: "before-all";
20
+ readonly expected: "unknown";
21
+ readonly events: readonly ["module-enter", "before-all-enter", "after-all-enter", "after-all-return"];
22
+ readonly taskState: "skipped";
23
+ }, {
24
+ readonly id: "edge-after-each";
25
+ readonly kind: "hooks";
26
+ readonly bodyOk: true;
27
+ readonly hookFailure: "after-each";
28
+ readonly expected: "unknown";
29
+ readonly events: string[];
30
+ readonly taskState: "failed";
31
+ }, {
32
+ readonly id: "edge-after-all";
33
+ readonly kind: "hooks";
34
+ readonly bodyOk: true;
35
+ readonly hookFailure: "after-all";
36
+ readonly expected: "unknown";
37
+ readonly events: string[];
38
+ readonly taskState: "passed";
39
+ }, {
40
+ readonly id: "edge-import-ok";
41
+ readonly kind: "import-ok";
42
+ readonly expected: "pass";
43
+ readonly events: readonly ["module-enter", "imported-module-enter", "import-return", "body-enter", "body-return"];
44
+ readonly taskState: "passed";
45
+ }, {
46
+ readonly id: "edge-import-error";
47
+ readonly kind: "import-error";
48
+ readonly expected: "unknown";
49
+ readonly events: readonly ["module-enter", "imported-module-enter", "import-rejected"];
50
+ readonly taskState: "none";
51
+ }, {
52
+ readonly id: "edge-syntax-error";
53
+ readonly kind: "syntax-error";
54
+ readonly expected: "unknown";
55
+ readonly events: readonly ["module-enter", "import-rejected"];
56
+ readonly taskState: "none";
57
+ }, {
58
+ readonly id: "edge-no-tests";
59
+ readonly kind: "no-tests";
60
+ readonly expected: "unknown";
61
+ readonly events: readonly ["module-enter"];
62
+ readonly taskState: "none";
63
+ }, {
64
+ readonly id: "edge-all-skipped";
65
+ readonly kind: "all-skipped";
66
+ readonly expected: "unknown";
67
+ readonly events: readonly ["module-enter"];
68
+ readonly taskState: "skipped";
69
+ }];
70
+ export declare const VITEST_COLLECTION_FAILURE_CASES: ({
71
+ readonly id: "edge-import-error";
72
+ readonly kind: "import-error";
73
+ readonly expected: "unknown";
74
+ readonly events: readonly ["module-enter", "imported-module-enter", "import-rejected"];
75
+ readonly taskState: "none";
76
+ } | {
77
+ readonly id: "edge-syntax-error";
78
+ readonly kind: "syntax-error";
79
+ readonly expected: "unknown";
80
+ readonly events: readonly ["module-enter", "import-rejected"];
81
+ readonly taskState: "none";
82
+ })[];
83
+ export declare const REPOSITORY_BOUNDARY_EVENTS_SOURCE: string;
84
+ export declare const VITEST_BOUNDARY_FILES: Readonly<Record<string, string>>;