@prismatic-io/lux 0.0.2-preview.4 → 0.0.2-preview.40

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 (753) hide show
  1. package/lib/answerers/claude-code/index.d.ts +15 -3
  2. package/lib/answerers/claude-code/index.d.ts.map +1 -1
  3. package/lib/answerers/claude-code/index.js +6 -5
  4. package/lib/answerers/claude-code/index.js.map +1 -1
  5. package/lib/answerers/persona/index.d.ts +44 -5
  6. package/lib/answerers/persona/index.d.ts.map +1 -1
  7. package/lib/answerers/persona/index.js +60 -34
  8. package/lib/answerers/persona/index.js.map +1 -1
  9. package/lib/answerers/terminal/index.d.ts +9 -3
  10. package/lib/answerers/terminal/index.d.ts.map +1 -1
  11. package/lib/answerers/terminal/index.js +6 -4
  12. package/lib/answerers/terminal/index.js.map +1 -1
  13. package/lib/assertions/authoring.d.ts +2 -2
  14. package/lib/assertions/authoring.d.ts.map +1 -1
  15. package/lib/assertions/authoring.js.map +1 -1
  16. package/lib/assertions/core/command-exits-zero.d.ts +5 -2
  17. package/lib/assertions/core/command-exits-zero.d.ts.map +1 -1
  18. package/lib/assertions/core/command-exits-zero.js +59 -14
  19. package/lib/assertions/core/command-exits-zero.js.map +1 -1
  20. package/lib/assertions/core/event-checks.d.ts +3 -0
  21. package/lib/assertions/core/event-checks.d.ts.map +1 -1
  22. package/lib/assertions/core/event-checks.js +49 -3
  23. package/lib/assertions/core/event-checks.js.map +1 -1
  24. package/lib/assertions/core/file-checks.d.ts +6 -0
  25. package/lib/assertions/core/file-checks.d.ts.map +1 -1
  26. package/lib/assertions/core/index.d.ts.map +1 -1
  27. package/lib/assertions/core/index.js +2 -1
  28. package/lib/assertions/core/index.js.map +1 -1
  29. package/lib/assertions/core/json-pointer-equals.d.ts +1 -0
  30. package/lib/assertions/core/json-pointer-equals.d.ts.map +1 -1
  31. package/lib/assertions/core/output-checks.d.ts +3 -0
  32. package/lib/assertions/core/output-checks.d.ts.map +1 -1
  33. package/lib/assertions/core/predicate.d.ts +1 -0
  34. package/lib/assertions/core/predicate.d.ts.map +1 -1
  35. package/lib/assertions/core/resource-checks.d.ts +25 -0
  36. package/lib/assertions/core/resource-checks.d.ts.map +1 -1
  37. package/lib/assertions/core/resource-checks.js +35 -5
  38. package/lib/assertions/core/resource-checks.js.map +1 -1
  39. package/lib/assertions/core/safe-regex.d.ts.map +1 -1
  40. package/lib/assertions/core/safe-regex.js +7 -1
  41. package/lib/assertions/core/safe-regex.js.map +1 -1
  42. package/lib/assertions/rubric/evidence.d.ts +88 -0
  43. package/lib/assertions/rubric/evidence.d.ts.map +1 -0
  44. package/lib/assertions/rubric/evidence.js +75 -0
  45. package/lib/assertions/rubric/evidence.js.map +1 -0
  46. package/lib/assertions/rubric/index.d.ts +88 -34
  47. package/lib/assertions/rubric/index.d.ts.map +1 -1
  48. package/lib/assertions/rubric/index.js +59 -43
  49. package/lib/assertions/rubric/index.js.map +1 -1
  50. package/lib/assertions/rubric/internal.d.ts +30 -5
  51. package/lib/assertions/rubric/internal.d.ts.map +1 -1
  52. package/lib/assertions/rubric/internal.js +203 -41
  53. package/lib/assertions/rubric/internal.js.map +1 -1
  54. package/lib/authoring.d.ts +37 -2
  55. package/lib/authoring.d.ts.map +1 -1
  56. package/lib/authoring.js +36 -1
  57. package/lib/authoring.js.map +1 -1
  58. package/lib/cli/bin.js +2 -13
  59. package/lib/cli/bin.js.map +1 -1
  60. package/lib/cli/command-runtime.d.ts +3 -3
  61. package/lib/cli/command-runtime.d.ts.map +1 -1
  62. package/lib/cli/command-runtime.js +17 -6
  63. package/lib/cli/command-runtime.js.map +1 -1
  64. package/lib/cli/doctor.d.ts +55 -0
  65. package/lib/cli/doctor.d.ts.map +1 -0
  66. package/lib/cli/doctor.js +14 -0
  67. package/lib/cli/doctor.js.map +1 -0
  68. package/lib/cli/harness-plan.d.ts +27 -0
  69. package/lib/cli/harness-plan.d.ts.map +1 -0
  70. package/lib/cli/harness-plan.js +75 -0
  71. package/lib/cli/harness-plan.js.map +1 -0
  72. package/lib/cli/init-templates.d.ts +11 -0
  73. package/lib/cli/init-templates.d.ts.map +1 -0
  74. package/lib/cli/init-templates.js +215 -0
  75. package/lib/cli/init-templates.js.map +1 -0
  76. package/lib/cli/init.d.ts +10 -0
  77. package/lib/cli/init.d.ts.map +1 -1
  78. package/lib/cli/init.js +34 -173
  79. package/lib/cli/init.js.map +1 -1
  80. package/lib/cli/output-schemas.d.ts +1412 -0
  81. package/lib/cli/output-schemas.d.ts.map +1 -0
  82. package/lib/cli/output-schemas.js +94 -0
  83. package/lib/cli/output-schemas.js.map +1 -0
  84. package/lib/cli/program.d.ts +140 -12
  85. package/lib/cli/program.d.ts.map +1 -1
  86. package/lib/cli/program.js +783 -650
  87. package/lib/cli/program.js.map +1 -1
  88. package/lib/cli/render/format.d.ts.map +1 -1
  89. package/lib/cli/render/format.js +1 -1
  90. package/lib/cli/render/format.js.map +1 -1
  91. package/lib/cli/render/reporter.d.ts.map +1 -1
  92. package/lib/cli/render/reporter.js +35 -8
  93. package/lib/cli/render/reporter.js.map +1 -1
  94. package/lib/cli/run-options.d.ts +19 -4
  95. package/lib/cli/run-options.d.ts.map +1 -1
  96. package/lib/cli/run-options.js +100 -19
  97. package/lib/cli/run-options.js.map +1 -1
  98. package/lib/cli/view.d.ts +15 -0
  99. package/lib/cli/view.d.ts.map +1 -0
  100. package/lib/cli/view.js +168 -0
  101. package/lib/cli/view.js.map +1 -0
  102. package/lib/container/driver.d.ts +27 -0
  103. package/lib/container/driver.d.ts.map +1 -0
  104. package/lib/container/driver.js +199 -0
  105. package/lib/container/driver.js.map +1 -0
  106. package/lib/container/paths.d.ts +3 -0
  107. package/lib/container/paths.d.ts.map +1 -0
  108. package/lib/container/paths.js +27 -0
  109. package/lib/container/paths.js.map +1 -0
  110. package/lib/container/protocol.d.ts +12 -0
  111. package/lib/container/protocol.d.ts.map +1 -0
  112. package/lib/container/protocol.js +38 -0
  113. package/lib/container/protocol.js.map +1 -0
  114. package/lib/container/resources.d.ts +14 -0
  115. package/lib/container/resources.d.ts.map +1 -0
  116. package/lib/container/resources.js +141 -0
  117. package/lib/container/resources.js.map +1 -0
  118. package/lib/container/worker.d.ts +2 -0
  119. package/lib/container/worker.d.ts.map +1 -0
  120. package/lib/container/worker.js +85 -0
  121. package/lib/container/worker.js.map +1 -0
  122. package/lib/core/action-events.d.ts +29 -0
  123. package/lib/core/action-events.d.ts.map +1 -0
  124. package/lib/core/action-events.js +51 -0
  125. package/lib/core/action-events.js.map +1 -0
  126. package/lib/core/agent-activity.d.ts +49 -0
  127. package/lib/core/agent-activity.d.ts.map +1 -0
  128. package/lib/core/agent-activity.js +206 -0
  129. package/lib/core/agent-activity.js.map +1 -0
  130. package/lib/core/agent-environment.d.ts +5 -0
  131. package/lib/core/agent-environment.d.ts.map +1 -0
  132. package/lib/core/agent-environment.js +47 -0
  133. package/lib/core/agent-environment.js.map +1 -0
  134. package/lib/core/agent-events.d.ts +26 -0
  135. package/lib/core/agent-events.d.ts.map +1 -0
  136. package/lib/core/agent-events.js +13 -0
  137. package/lib/core/agent-events.js.map +1 -0
  138. package/lib/core/annotation.d.ts +6 -2
  139. package/lib/core/annotation.d.ts.map +1 -1
  140. package/lib/core/annotation.js +2 -1
  141. package/lib/core/annotation.js.map +1 -1
  142. package/lib/core/answerer.d.ts +12 -0
  143. package/lib/core/answerer.d.ts.map +1 -1
  144. package/lib/core/answerer.js +2 -0
  145. package/lib/core/answerer.js.map +1 -1
  146. package/lib/core/artifact-evidence.d.ts +6 -1
  147. package/lib/core/artifact-evidence.d.ts.map +1 -1
  148. package/lib/core/artifact-evidence.js +27 -6
  149. package/lib/core/artifact-evidence.js.map +1 -1
  150. package/lib/core/assertion.d.ts +10 -4
  151. package/lib/core/assertion.d.ts.map +1 -1
  152. package/lib/core/assertion.js +8 -2
  153. package/lib/core/assertion.js.map +1 -1
  154. package/lib/core/case-defaults.d.ts +16 -0
  155. package/lib/core/case-defaults.d.ts.map +1 -0
  156. package/lib/core/case-defaults.js +42 -0
  157. package/lib/core/case-defaults.js.map +1 -0
  158. package/lib/core/case.d.ts +120 -6
  159. package/lib/core/case.d.ts.map +1 -1
  160. package/lib/core/case.js +51 -5
  161. package/lib/core/case.js.map +1 -1
  162. package/lib/core/command-verification.d.ts +10 -0
  163. package/lib/core/command-verification.d.ts.map +1 -0
  164. package/lib/core/command-verification.js +66 -0
  165. package/lib/core/command-verification.js.map +1 -0
  166. package/lib/core/driver-execution.d.ts +83 -0
  167. package/lib/core/driver-execution.d.ts.map +1 -0
  168. package/lib/core/driver-execution.js +72 -0
  169. package/lib/core/driver-execution.js.map +1 -0
  170. package/lib/core/driver-metrics.d.ts +98 -0
  171. package/lib/core/driver-metrics.d.ts.map +1 -0
  172. package/lib/core/driver-metrics.js +36 -0
  173. package/lib/core/driver-metrics.js.map +1 -0
  174. package/lib/core/driver.d.ts +64 -0
  175. package/lib/core/driver.d.ts.map +1 -1
  176. package/lib/core/driver.js +28 -0
  177. package/lib/core/driver.js.map +1 -1
  178. package/lib/core/duration.d.ts +5 -0
  179. package/lib/core/duration.d.ts.map +1 -0
  180. package/lib/core/duration.js +49 -0
  181. package/lib/core/duration.js.map +1 -0
  182. package/lib/core/environment.d.ts +18 -0
  183. package/lib/core/environment.d.ts.map +1 -0
  184. package/lib/core/environment.js +21 -0
  185. package/lib/core/environment.js.map +1 -0
  186. package/lib/core/evaluation-clusters.d.ts +17 -0
  187. package/lib/core/evaluation-clusters.d.ts.map +1 -0
  188. package/lib/core/evaluation-clusters.js +23 -0
  189. package/lib/core/evaluation-clusters.js.map +1 -0
  190. package/lib/core/events.d.ts +34 -0
  191. package/lib/core/events.d.ts.map +1 -1
  192. package/lib/core/events.js +11 -2
  193. package/lib/core/events.js.map +1 -1
  194. package/lib/core/experiment.d.ts +33 -2
  195. package/lib/core/experiment.d.ts.map +1 -1
  196. package/lib/core/experiment.js +40 -19
  197. package/lib/core/experiment.js.map +1 -1
  198. package/lib/core/file-tree.d.ts +7 -0
  199. package/lib/core/file-tree.d.ts.map +1 -0
  200. package/lib/core/file-tree.js +35 -0
  201. package/lib/core/file-tree.js.map +1 -0
  202. package/lib/core/global-id.d.ts +6 -0
  203. package/lib/core/global-id.d.ts.map +1 -0
  204. package/lib/core/global-id.js +17 -0
  205. package/lib/core/global-id.js.map +1 -0
  206. package/lib/core/harness-catalog.d.ts +35 -0
  207. package/lib/core/harness-catalog.d.ts.map +1 -0
  208. package/lib/core/harness-catalog.js +45 -0
  209. package/lib/core/harness-catalog.js.map +1 -0
  210. package/lib/core/harness-catalogs/antigravity.d.ts +11 -0
  211. package/lib/core/harness-catalogs/antigravity.d.ts.map +1 -0
  212. package/lib/core/harness-catalogs/antigravity.js +23 -0
  213. package/lib/core/harness-catalogs/antigravity.js.map +1 -0
  214. package/lib/core/harness-catalogs/claude-code.d.ts +12 -0
  215. package/lib/core/harness-catalogs/claude-code.d.ts.map +1 -0
  216. package/lib/core/harness-catalogs/claude-code.js +24 -0
  217. package/lib/core/harness-catalogs/claude-code.js.map +1 -0
  218. package/lib/core/harness-catalogs/codex.d.ts +11 -0
  219. package/lib/core/harness-catalogs/codex.d.ts.map +1 -0
  220. package/lib/core/harness-catalogs/codex.js +26 -0
  221. package/lib/core/harness-catalogs/codex.js.map +1 -0
  222. package/lib/core/harness-catalogs/copilot.d.ts +29 -0
  223. package/lib/core/harness-catalogs/copilot.d.ts.map +1 -0
  224. package/lib/core/harness-catalogs/copilot.js +45 -0
  225. package/lib/core/harness-catalogs/copilot.js.map +1 -0
  226. package/lib/core/harness-catalogs/cursor.d.ts +2 -0
  227. package/lib/core/harness-catalogs/cursor.d.ts.map +1 -0
  228. package/lib/core/harness-catalogs/cursor.js +13 -0
  229. package/lib/core/harness-catalogs/cursor.js.map +1 -0
  230. package/lib/core/harness-catalogs/grok-build.d.ts +7 -0
  231. package/lib/core/harness-catalogs/grok-build.d.ts.map +1 -0
  232. package/lib/core/harness-catalogs/grok-build.js +18 -0
  233. package/lib/core/harness-catalogs/grok-build.js.map +1 -0
  234. package/lib/core/harness-catalogs/index.d.ts +73 -0
  235. package/lib/core/harness-catalogs/index.d.ts.map +1 -0
  236. package/lib/core/harness-catalogs/index.js +17 -0
  237. package/lib/core/harness-catalogs/index.js.map +1 -0
  238. package/lib/core/harness-matrix.d.ts +154 -0
  239. package/lib/core/harness-matrix.d.ts.map +1 -0
  240. package/lib/core/harness-matrix.js +204 -0
  241. package/lib/core/harness-matrix.js.map +1 -0
  242. package/lib/core/index.d.ts +12 -0
  243. package/lib/core/index.d.ts.map +1 -1
  244. package/lib/core/index.js +12 -0
  245. package/lib/core/index.js.map +1 -1
  246. package/lib/core/lifecycle-fixtures.d.ts.map +1 -1
  247. package/lib/core/lifecycle-fixtures.js +4 -2
  248. package/lib/core/lifecycle-fixtures.js.map +1 -1
  249. package/lib/core/model-cli.d.ts +9 -11
  250. package/lib/core/model-cli.d.ts.map +1 -1
  251. package/lib/core/model-cli.js +39 -22
  252. package/lib/core/model-cli.js.map +1 -1
  253. package/lib/core/platform-process.d.ts +7 -2
  254. package/lib/core/platform-process.d.ts.map +1 -1
  255. package/lib/core/platform-process.js +54 -16
  256. package/lib/core/platform-process.js.map +1 -1
  257. package/lib/core/reference-defaults.d.ts +5 -0
  258. package/lib/core/reference-defaults.d.ts.map +1 -0
  259. package/lib/core/reference-defaults.js +42 -0
  260. package/lib/core/reference-defaults.js.map +1 -0
  261. package/lib/core/rubric.d.ts +1 -0
  262. package/lib/core/rubric.d.ts.map +1 -1
  263. package/lib/core/run.d.ts +292 -1
  264. package/lib/core/run.d.ts.map +1 -1
  265. package/lib/core/run.js +27 -0
  266. package/lib/core/run.js.map +1 -1
  267. package/lib/core/secure-copy.d.ts.map +1 -0
  268. package/lib/core/secure-copy.js.map +1 -0
  269. package/lib/core/usage.d.ts +5 -0
  270. package/lib/core/usage.d.ts.map +1 -1
  271. package/lib/core/usage.js +3 -0
  272. package/lib/core/usage.js.map +1 -1
  273. package/lib/core/wire.d.ts +11 -0
  274. package/lib/core/wire.d.ts.map +1 -1
  275. package/lib/drivers/antigravity/artifacts.d.ts +2 -0
  276. package/lib/drivers/antigravity/artifacts.d.ts.map +1 -0
  277. package/lib/drivers/antigravity/artifacts.js +33 -0
  278. package/lib/drivers/antigravity/artifacts.js.map +1 -0
  279. package/lib/drivers/antigravity/config.d.ts +88 -0
  280. package/lib/drivers/antigravity/config.d.ts.map +1 -0
  281. package/lib/drivers/antigravity/config.js +87 -0
  282. package/lib/drivers/antigravity/config.js.map +1 -0
  283. package/lib/drivers/antigravity/events.d.ts +4 -0
  284. package/lib/drivers/antigravity/events.d.ts.map +1 -0
  285. package/lib/drivers/antigravity/events.js +241 -0
  286. package/lib/drivers/antigravity/events.js.map +1 -0
  287. package/lib/drivers/antigravity/index.d.ts +114 -0
  288. package/lib/drivers/antigravity/index.d.ts.map +1 -0
  289. package/lib/drivers/antigravity/index.js +113 -0
  290. package/lib/drivers/antigravity/index.js.map +1 -0
  291. package/lib/drivers/antigravity/runtime.d.ts +7 -0
  292. package/lib/drivers/antigravity/runtime.d.ts.map +1 -0
  293. package/lib/drivers/antigravity/runtime.js +83 -0
  294. package/lib/drivers/antigravity/runtime.js.map +1 -0
  295. package/lib/drivers/claude-code/deferred-process.d.ts +17 -0
  296. package/lib/drivers/claude-code/deferred-process.d.ts.map +1 -0
  297. package/lib/drivers/claude-code/deferred-process.js +108 -0
  298. package/lib/drivers/claude-code/deferred-process.js.map +1 -0
  299. package/lib/drivers/claude-code/index.d.ts +187 -10
  300. package/lib/drivers/claude-code/index.d.ts.map +1 -1
  301. package/lib/drivers/claude-code/index.js +197 -252
  302. package/lib/drivers/claude-code/index.js.map +1 -1
  303. package/lib/drivers/claude-code/isolation.d.ts +8 -0
  304. package/lib/drivers/claude-code/isolation.d.ts.map +1 -0
  305. package/lib/drivers/claude-code/isolation.js +199 -0
  306. package/lib/drivers/claude-code/isolation.js.map +1 -0
  307. package/lib/drivers/claude-code/parse-events.d.ts.map +1 -1
  308. package/lib/drivers/claude-code/parse-events.js +73 -8
  309. package/lib/drivers/claude-code/parse-events.js.map +1 -1
  310. package/lib/drivers/codex/app-events.d.ts +9 -2
  311. package/lib/drivers/codex/app-events.d.ts.map +1 -1
  312. package/lib/drivers/codex/app-events.js +104 -12
  313. package/lib/drivers/codex/app-events.js.map +1 -1
  314. package/lib/drivers/codex/config.d.ts +69 -5
  315. package/lib/drivers/codex/config.d.ts.map +1 -1
  316. package/lib/drivers/codex/config.js +48 -8
  317. package/lib/drivers/codex/config.js.map +1 -1
  318. package/lib/drivers/codex/exec-events.d.ts +4 -0
  319. package/lib/drivers/codex/exec-events.d.ts.map +1 -0
  320. package/lib/drivers/codex/exec-events.js +230 -0
  321. package/lib/drivers/codex/exec-events.js.map +1 -0
  322. package/lib/drivers/codex/index.d.ts +142 -4
  323. package/lib/drivers/codex/index.d.ts.map +1 -1
  324. package/lib/drivers/codex/index.js +114 -276
  325. package/lib/drivers/codex/index.js.map +1 -1
  326. package/lib/drivers/copilot/config.d.ts +84 -0
  327. package/lib/drivers/copilot/config.d.ts.map +1 -0
  328. package/lib/drivers/copilot/config.js +57 -0
  329. package/lib/drivers/copilot/config.js.map +1 -0
  330. package/lib/drivers/copilot/index.d.ts +107 -0
  331. package/lib/drivers/copilot/index.d.ts.map +1 -0
  332. package/lib/drivers/copilot/index.js +268 -0
  333. package/lib/drivers/copilot/index.js.map +1 -0
  334. package/lib/drivers/cursor/config.d.ts +28 -0
  335. package/lib/drivers/cursor/config.d.ts.map +1 -0
  336. package/lib/drivers/cursor/config.js +28 -0
  337. package/lib/drivers/cursor/config.js.map +1 -0
  338. package/lib/drivers/cursor/index.d.ts +44 -0
  339. package/lib/drivers/cursor/index.d.ts.map +1 -0
  340. package/lib/drivers/cursor/index.js +286 -0
  341. package/lib/drivers/cursor/index.js.map +1 -0
  342. package/lib/drivers/cursor/interaction.d.ts +6 -0
  343. package/lib/drivers/cursor/interaction.d.ts.map +1 -0
  344. package/lib/drivers/cursor/interaction.js +55 -0
  345. package/lib/drivers/cursor/interaction.js.map +1 -0
  346. package/lib/drivers/grok-build/config.d.ts +68 -0
  347. package/lib/drivers/grok-build/config.d.ts.map +1 -0
  348. package/lib/drivers/grok-build/config.js +40 -0
  349. package/lib/drivers/grok-build/config.js.map +1 -0
  350. package/lib/drivers/grok-build/index.d.ts +87 -0
  351. package/lib/drivers/grok-build/index.d.ts.map +1 -0
  352. package/lib/drivers/grok-build/index.js +293 -0
  353. package/lib/drivers/grok-build/index.js.map +1 -0
  354. package/lib/drivers/mcp/index.d.ts +37 -4
  355. package/lib/drivers/mcp/index.d.ts.map +1 -1
  356. package/lib/drivers/mcp/index.js +25 -11
  357. package/lib/drivers/mcp/index.js.map +1 -1
  358. package/lib/drivers/shared/acp-events.d.ts +15 -0
  359. package/lib/drivers/shared/acp-events.d.ts.map +1 -0
  360. package/lib/drivers/shared/acp-events.js +83 -0
  361. package/lib/drivers/shared/acp-events.js.map +1 -0
  362. package/lib/drivers/shared/acp-interaction.d.ts +7 -0
  363. package/lib/drivers/shared/acp-interaction.d.ts.map +1 -0
  364. package/lib/drivers/shared/acp-interaction.js +20 -0
  365. package/lib/drivers/shared/acp-interaction.js.map +1 -0
  366. package/lib/drivers/shared/acp-session.d.ts +4 -0
  367. package/lib/drivers/shared/acp-session.d.ts.map +1 -0
  368. package/lib/drivers/shared/acp-session.js +23 -0
  369. package/lib/drivers/shared/acp-session.js.map +1 -0
  370. package/lib/drivers/shared/acp-transport.d.ts +40 -0
  371. package/lib/drivers/shared/acp-transport.d.ts.map +1 -0
  372. package/lib/drivers/shared/acp-transport.js +152 -0
  373. package/lib/drivers/shared/acp-transport.js.map +1 -0
  374. package/lib/drivers/shared/artifacts.d.ts.map +1 -1
  375. package/lib/drivers/shared/artifacts.js +3 -2
  376. package/lib/drivers/shared/artifacts.js.map +1 -1
  377. package/lib/drivers/shared/experiment-behavior.d.ts +13 -0
  378. package/lib/drivers/shared/experiment-behavior.d.ts.map +1 -0
  379. package/lib/drivers/shared/experiment-behavior.js +200 -0
  380. package/lib/drivers/shared/experiment-behavior.js.map +1 -0
  381. package/lib/drivers/shared/experiment-policy.d.ts +4 -0
  382. package/lib/drivers/shared/experiment-policy.d.ts.map +1 -0
  383. package/lib/drivers/shared/experiment-policy.js +144 -0
  384. package/lib/drivers/shared/experiment-policy.js.map +1 -0
  385. package/lib/drivers/shared/skills.d.ts +3 -0
  386. package/lib/drivers/shared/skills.d.ts.map +1 -0
  387. package/lib/drivers/shared/skills.js +73 -0
  388. package/lib/drivers/shared/skills.js.map +1 -0
  389. package/lib/drivers/subprocess/index.d.ts +39 -4
  390. package/lib/drivers/subprocess/index.d.ts.map +1 -1
  391. package/lib/drivers/subprocess/index.js +56 -12
  392. package/lib/drivers/subprocess/index.js.map +1 -1
  393. package/lib/index.d.ts +24 -8
  394. package/lib/index.d.ts.map +1 -1
  395. package/lib/index.js +20 -5
  396. package/lib/index.js.map +1 -1
  397. package/lib/optimization/reflective.d.ts +3 -1
  398. package/lib/optimization/reflective.d.ts.map +1 -1
  399. package/lib/optimization/reflective.js +3 -2
  400. package/lib/optimization/reflective.js.map +1 -1
  401. package/lib/orchestrator/annotation-loader.d.ts +6 -2
  402. package/lib/orchestrator/annotation-loader.d.ts.map +1 -1
  403. package/lib/orchestrator/annotation-loader.js +8 -0
  404. package/lib/orchestrator/annotation-loader.js.map +1 -1
  405. package/lib/orchestrator/annotation-store.d.ts.map +1 -1
  406. package/lib/orchestrator/annotation-store.js +16 -2
  407. package/lib/orchestrator/annotation-store.js.map +1 -1
  408. package/lib/orchestrator/artifact-origin.d.ts +3 -0
  409. package/lib/orchestrator/artifact-origin.d.ts.map +1 -0
  410. package/lib/orchestrator/artifact-origin.js +40 -0
  411. package/lib/orchestrator/artifact-origin.js.map +1 -0
  412. package/lib/orchestrator/campaign-lifecycle.d.ts +1 -0
  413. package/lib/orchestrator/campaign-lifecycle.d.ts.map +1 -1
  414. package/lib/orchestrator/campaign-lifecycle.js +4 -1
  415. package/lib/orchestrator/campaign-lifecycle.js.map +1 -1
  416. package/lib/orchestrator/candidates.d.ts.map +1 -1
  417. package/lib/orchestrator/candidates.js +3 -2
  418. package/lib/orchestrator/candidates.js.map +1 -1
  419. package/lib/orchestrator/compare.d.ts +23 -6
  420. package/lib/orchestrator/compare.d.ts.map +1 -1
  421. package/lib/orchestrator/compare.js +45 -12
  422. package/lib/orchestrator/compare.js.map +1 -1
  423. package/lib/orchestrator/comparison-identity.d.ts.map +1 -1
  424. package/lib/orchestrator/comparison-identity.js +2 -0
  425. package/lib/orchestrator/comparison-identity.js.map +1 -1
  426. package/lib/orchestrator/config.d.ts +180 -1
  427. package/lib/orchestrator/config.d.ts.map +1 -1
  428. package/lib/orchestrator/config.js +21 -2
  429. package/lib/orchestrator/config.js.map +1 -1
  430. package/lib/orchestrator/discover.d.ts +1 -0
  431. package/lib/orchestrator/discover.d.ts.map +1 -1
  432. package/lib/orchestrator/discover.js +7 -1
  433. package/lib/orchestrator/discover.js.map +1 -1
  434. package/lib/orchestrator/doctor.d.ts +1 -0
  435. package/lib/orchestrator/doctor.d.ts.map +1 -1
  436. package/lib/orchestrator/doctor.js +134 -69
  437. package/lib/orchestrator/doctor.js.map +1 -1
  438. package/lib/orchestrator/driver-capabilities.d.ts +4 -0
  439. package/lib/orchestrator/driver-capabilities.d.ts.map +1 -0
  440. package/lib/orchestrator/driver-capabilities.js +13 -0
  441. package/lib/orchestrator/driver-capabilities.js.map +1 -0
  442. package/lib/orchestrator/driver-identity.d.ts +5 -0
  443. package/lib/orchestrator/driver-identity.d.ts.map +1 -0
  444. package/lib/orchestrator/driver-identity.js +51 -0
  445. package/lib/orchestrator/driver-identity.js.map +1 -0
  446. package/lib/orchestrator/experiment-context.d.ts +51 -3
  447. package/lib/orchestrator/experiment-context.d.ts.map +1 -1
  448. package/lib/orchestrator/experiment-context.js +2 -1
  449. package/lib/orchestrator/experiment-context.js.map +1 -1
  450. package/lib/orchestrator/experiment-contracts.d.ts +31 -1
  451. package/lib/orchestrator/experiment-contracts.d.ts.map +1 -1
  452. package/lib/orchestrator/experiment-corpus.d.ts +2 -1
  453. package/lib/orchestrator/experiment-corpus.d.ts.map +1 -1
  454. package/lib/orchestrator/experiment-corpus.js +28 -22
  455. package/lib/orchestrator/experiment-corpus.js.map +1 -1
  456. package/lib/orchestrator/experiment-effects.d.ts +33 -0
  457. package/lib/orchestrator/experiment-effects.d.ts.map +1 -0
  458. package/lib/orchestrator/experiment-effects.js +46 -0
  459. package/lib/orchestrator/experiment-effects.js.map +1 -0
  460. package/lib/orchestrator/experiment-evaluation.d.ts.map +1 -1
  461. package/lib/orchestrator/experiment-evaluation.js +70 -5
  462. package/lib/orchestrator/experiment-evaluation.js.map +1 -1
  463. package/lib/orchestrator/experiment-identity.d.ts +3 -0
  464. package/lib/orchestrator/experiment-identity.d.ts.map +1 -1
  465. package/lib/orchestrator/experiment-identity.js +22 -33
  466. package/lib/orchestrator/experiment-identity.js.map +1 -1
  467. package/lib/orchestrator/experiment-loader.d.ts +8 -3
  468. package/lib/orchestrator/experiment-loader.d.ts.map +1 -1
  469. package/lib/orchestrator/experiment-preflight.d.ts +3 -0
  470. package/lib/orchestrator/experiment-preflight.d.ts.map +1 -0
  471. package/lib/orchestrator/experiment-preflight.js +21 -0
  472. package/lib/orchestrator/experiment-preflight.js.map +1 -0
  473. package/lib/orchestrator/experiment-report.d.ts +91 -1
  474. package/lib/orchestrator/experiment-report.d.ts.map +1 -1
  475. package/lib/orchestrator/experiment-report.js +9 -1
  476. package/lib/orchestrator/experiment-report.js.map +1 -1
  477. package/lib/orchestrator/experiment-runs.d.ts +63 -2
  478. package/lib/orchestrator/experiment-runs.d.ts.map +1 -1
  479. package/lib/orchestrator/experiment-runs.js +13 -5
  480. package/lib/orchestrator/experiment-runs.js.map +1 -1
  481. package/lib/orchestrator/experiment-runtime-identity.d.ts +0 -16
  482. package/lib/orchestrator/experiment-runtime-identity.d.ts.map +1 -1
  483. package/lib/orchestrator/experiment-runtime-identity.js +5 -220
  484. package/lib/orchestrator/experiment-runtime-identity.js.map +1 -1
  485. package/lib/orchestrator/experiment-selection.d.ts.map +1 -1
  486. package/lib/orchestrator/experiment-selection.js +151 -43
  487. package/lib/orchestrator/experiment-selection.js.map +1 -1
  488. package/lib/orchestrator/experiment.d.ts +3 -3
  489. package/lib/orchestrator/experiment.d.ts.map +1 -1
  490. package/lib/orchestrator/experiment.js +26 -21
  491. package/lib/orchestrator/experiment.js.map +1 -1
  492. package/lib/orchestrator/fixture-identity.d.ts +1 -0
  493. package/lib/orchestrator/fixture-identity.d.ts.map +1 -1
  494. package/lib/orchestrator/fixture-identity.js +6 -1
  495. package/lib/orchestrator/fixture-identity.js.map +1 -1
  496. package/lib/orchestrator/fs-read.d.ts +1 -6
  497. package/lib/orchestrator/fs-read.d.ts.map +1 -1
  498. package/lib/orchestrator/fs-read.js +2 -32
  499. package/lib/orchestrator/fs-read.js.map +1 -1
  500. package/lib/orchestrator/grader-experiment.d.ts +23 -5
  501. package/lib/orchestrator/grader-experiment.d.ts.map +1 -1
  502. package/lib/orchestrator/grader-experiment.js +54 -9
  503. package/lib/orchestrator/grader-experiment.js.map +1 -1
  504. package/lib/orchestrator/grading.d.ts +1 -0
  505. package/lib/orchestrator/grading.d.ts.map +1 -1
  506. package/lib/orchestrator/grading.js +41 -33
  507. package/lib/orchestrator/grading.js.map +1 -1
  508. package/lib/orchestrator/harness-catalog-drift.d.ts +22 -0
  509. package/lib/orchestrator/harness-catalog-drift.d.ts.map +1 -0
  510. package/lib/orchestrator/harness-catalog-drift.js +90 -0
  511. package/lib/orchestrator/harness-catalog-drift.js.map +1 -0
  512. package/lib/orchestrator/harness-registry.d.ts +4 -0
  513. package/lib/orchestrator/harness-registry.d.ts.map +1 -0
  514. package/lib/orchestrator/harness-registry.js +5 -0
  515. package/lib/orchestrator/harness-registry.js.map +1 -0
  516. package/lib/orchestrator/index.d.ts +1 -1
  517. package/lib/orchestrator/index.d.ts.map +1 -1
  518. package/lib/orchestrator/index.js +1 -1
  519. package/lib/orchestrator/index.js.map +1 -1
  520. package/lib/orchestrator/list-runs.d.ts +8 -1
  521. package/lib/orchestrator/list-runs.d.ts.map +1 -1
  522. package/lib/orchestrator/list-runs.js +83 -18
  523. package/lib/orchestrator/list-runs.js.map +1 -1
  524. package/lib/orchestrator/optimization-lifecycle.d.ts.map +1 -1
  525. package/lib/orchestrator/optimization-lifecycle.js +3 -1
  526. package/lib/orchestrator/optimization-lifecycle.js.map +1 -1
  527. package/lib/orchestrator/orchestrator.d.ts +17 -2
  528. package/lib/orchestrator/orchestrator.d.ts.map +1 -1
  529. package/lib/orchestrator/orchestrator.js +55 -177
  530. package/lib/orchestrator/orchestrator.js.map +1 -1
  531. package/lib/orchestrator/paired-effects.d.ts +34 -0
  532. package/lib/orchestrator/paired-effects.d.ts.map +1 -0
  533. package/lib/orchestrator/paired-effects.js +164 -0
  534. package/lib/orchestrator/paired-effects.js.map +1 -0
  535. package/lib/orchestrator/profile.d.ts +4 -0
  536. package/lib/orchestrator/profile.d.ts.map +1 -0
  537. package/lib/orchestrator/profile.js +10 -0
  538. package/lib/orchestrator/profile.js.map +1 -0
  539. package/lib/orchestrator/provenance.d.ts +5 -1
  540. package/lib/orchestrator/provenance.d.ts.map +1 -1
  541. package/lib/orchestrator/provenance.js +16 -3
  542. package/lib/orchestrator/provenance.js.map +1 -1
  543. package/lib/orchestrator/regrade.d.ts +4 -2
  544. package/lib/orchestrator/regrade.d.ts.map +1 -1
  545. package/lib/orchestrator/rubric-loader.js +1 -1
  546. package/lib/orchestrator/rubric-loader.js.map +1 -1
  547. package/lib/orchestrator/run-dir.d.ts +2 -0
  548. package/lib/orchestrator/run-dir.d.ts.map +1 -1
  549. package/lib/orchestrator/run-dir.js +1 -1
  550. package/lib/orchestrator/run-dir.js.map +1 -1
  551. package/lib/orchestrator/run-execution.d.ts +3 -0
  552. package/lib/orchestrator/run-execution.d.ts.map +1 -1
  553. package/lib/orchestrator/run-execution.js +64 -10
  554. package/lib/orchestrator/run-execution.js.map +1 -1
  555. package/lib/orchestrator/run-lifecycle.d.ts +1 -0
  556. package/lib/orchestrator/run-lifecycle.d.ts.map +1 -1
  557. package/lib/orchestrator/run-lifecycle.js +3 -2
  558. package/lib/orchestrator/run-lifecycle.js.map +1 -1
  559. package/lib/orchestrator/run-workspace.d.ts +10 -0
  560. package/lib/orchestrator/run-workspace.d.ts.map +1 -0
  561. package/lib/orchestrator/run-workspace.js +58 -0
  562. package/lib/orchestrator/run-workspace.js.map +1 -0
  563. package/lib/orchestrator/suite-compare.d.ts +37 -0
  564. package/lib/orchestrator/suite-compare.d.ts.map +1 -1
  565. package/lib/orchestrator/suite-compare.js +44 -22
  566. package/lib/orchestrator/suite-compare.js.map +1 -1
  567. package/lib/orchestrator/suite-runs.d.ts +6 -1
  568. package/lib/orchestrator/suite-runs.d.ts.map +1 -1
  569. package/lib/orchestrator/suite-runs.js +14 -2
  570. package/lib/orchestrator/suite-runs.js.map +1 -1
  571. package/lib/orchestrator/suite-summary.d.ts +79 -0
  572. package/lib/orchestrator/suite-summary.d.ts.map +1 -1
  573. package/lib/orchestrator/suite-summary.js +67 -14
  574. package/lib/orchestrator/suite-summary.js.map +1 -1
  575. package/lib/previewer/artifacts.d.ts +25 -0
  576. package/lib/previewer/artifacts.d.ts.map +1 -0
  577. package/lib/previewer/artifacts.js +180 -0
  578. package/lib/previewer/artifacts.js.map +1 -0
  579. package/lib/previewer/server.d.ts +111 -0
  580. package/lib/previewer/server.d.ts.map +1 -0
  581. package/lib/previewer/server.js +559 -0
  582. package/lib/previewer/server.js.map +1 -0
  583. package/package.json +4 -2
  584. package/skills/lux-answerer/SKILL.md +2 -2
  585. package/src/answerers/claude-code/index.ts +6 -5
  586. package/src/answerers/persona/index.ts +75 -34
  587. package/src/answerers/terminal/index.ts +7 -11
  588. package/src/assertions/authoring.ts +2 -0
  589. package/src/assertions/core/command-exits-zero.ts +82 -17
  590. package/src/assertions/core/event-checks.ts +64 -3
  591. package/src/assertions/core/index.ts +2 -0
  592. package/src/assertions/core/resource-checks.ts +38 -5
  593. package/src/assertions/core/safe-regex.ts +16 -6
  594. package/src/assertions/rubric/evidence.ts +85 -0
  595. package/src/assertions/rubric/index.ts +63 -46
  596. package/src/assertions/rubric/internal.ts +256 -41
  597. package/src/authoring.ts +346 -2
  598. package/src/cli/bin.ts +2 -12
  599. package/src/cli/command-runtime.ts +20 -9
  600. package/src/cli/doctor.ts +17 -0
  601. package/src/cli/harness-plan.ts +123 -0
  602. package/src/cli/init-templates.ts +238 -0
  603. package/src/cli/init.ts +53 -184
  604. package/src/cli/output-schemas.ts +109 -0
  605. package/src/cli/program.ts +697 -730
  606. package/src/cli/render/format.ts +1 -1
  607. package/src/cli/render/reporter.ts +36 -8
  608. package/src/cli/run-options.ts +131 -25
  609. package/src/cli/view.ts +129 -0
  610. package/src/container/driver.ts +213 -0
  611. package/src/container/paths.ts +29 -0
  612. package/src/container/protocol.ts +48 -0
  613. package/src/container/resources.ts +165 -0
  614. package/src/container/worker.ts +107 -0
  615. package/src/core/action-events.ts +59 -0
  616. package/src/core/agent-activity.ts +236 -0
  617. package/src/core/agent-environment.ts +64 -0
  618. package/src/core/agent-events.ts +17 -0
  619. package/src/core/annotation.ts +2 -1
  620. package/src/core/answerer.ts +9 -0
  621. package/src/core/artifact-evidence.ts +40 -5
  622. package/src/core/assertion.ts +8 -2
  623. package/src/core/case-defaults.ts +65 -0
  624. package/src/core/case.ts +79 -8
  625. package/src/core/command-verification.ts +74 -0
  626. package/src/core/driver-execution.ts +84 -0
  627. package/src/core/driver-metrics.ts +51 -0
  628. package/src/core/driver.ts +76 -0
  629. package/src/core/duration.ts +52 -0
  630. package/src/core/environment.ts +22 -0
  631. package/src/core/evaluation-clusters.ts +35 -0
  632. package/src/core/events.ts +13 -2
  633. package/src/core/experiment.ts +71 -25
  634. package/src/core/file-tree.ts +35 -0
  635. package/src/core/global-id.ts +26 -0
  636. package/src/core/harness-catalog.ts +100 -0
  637. package/src/core/harness-catalogs/antigravity.ts +24 -0
  638. package/src/core/harness-catalogs/claude-code.ts +25 -0
  639. package/src/core/harness-catalogs/codex.ts +27 -0
  640. package/src/core/harness-catalogs/copilot.ts +46 -0
  641. package/src/core/harness-catalogs/cursor.ts +13 -0
  642. package/src/core/harness-catalogs/grok-build.ts +19 -0
  643. package/src/core/harness-catalogs/index.ts +31 -0
  644. package/src/core/harness-matrix.ts +316 -0
  645. package/src/core/index.ts +12 -0
  646. package/src/core/lifecycle-fixtures.ts +4 -2
  647. package/src/core/model-cli.ts +60 -26
  648. package/src/core/platform-process.ts +65 -16
  649. package/src/core/reference-defaults.ts +47 -0
  650. package/src/core/run.ts +31 -0
  651. package/src/core/usage.ts +8 -0
  652. package/src/drivers/antigravity/README.md +171 -0
  653. package/src/drivers/antigravity/artifacts.ts +37 -0
  654. package/src/drivers/antigravity/config.ts +92 -0
  655. package/src/drivers/antigravity/events.ts +290 -0
  656. package/src/drivers/antigravity/index.ts +132 -0
  657. package/src/drivers/antigravity/runtime.ts +94 -0
  658. package/src/drivers/claude-code/deferred-process.ts +118 -0
  659. package/src/drivers/claude-code/index.ts +227 -281
  660. package/src/drivers/claude-code/isolation.ts +228 -0
  661. package/src/drivers/claude-code/parse-events.ts +98 -12
  662. package/src/drivers/codex/app-events.ts +126 -16
  663. package/src/drivers/codex/config.ts +59 -8
  664. package/src/drivers/codex/exec-events.ts +258 -0
  665. package/src/drivers/codex/index.ts +146 -312
  666. package/src/drivers/copilot/README.md +60 -0
  667. package/src/drivers/copilot/config.ts +61 -0
  668. package/src/drivers/copilot/index.ts +310 -0
  669. package/src/drivers/cursor/README.md +66 -0
  670. package/src/drivers/cursor/config.ts +31 -0
  671. package/src/drivers/cursor/index.ts +326 -0
  672. package/src/drivers/cursor/interaction.ts +74 -0
  673. package/src/drivers/grok-build/README.md +112 -0
  674. package/src/drivers/grok-build/config.ts +43 -0
  675. package/src/drivers/grok-build/index.ts +331 -0
  676. package/src/drivers/mcp/index.ts +25 -11
  677. package/src/drivers/shared/acp-events.ts +94 -0
  678. package/src/drivers/shared/acp-interaction.ts +27 -0
  679. package/src/drivers/shared/acp-session.ts +40 -0
  680. package/src/drivers/shared/acp-transport.ts +187 -0
  681. package/src/drivers/shared/artifacts.ts +6 -2
  682. package/src/drivers/shared/experiment-behavior.ts +217 -0
  683. package/src/drivers/shared/experiment-policy.ts +196 -0
  684. package/src/drivers/shared/skills.ts +74 -0
  685. package/src/drivers/subprocess/index.ts +55 -12
  686. package/src/index.ts +117 -6
  687. package/src/optimization/reflective.ts +3 -2
  688. package/src/orchestrator/annotation-loader.ts +10 -0
  689. package/src/orchestrator/annotation-store.ts +24 -3
  690. package/src/orchestrator/artifact-origin.ts +50 -0
  691. package/src/orchestrator/campaign-lifecycle.ts +5 -1
  692. package/src/orchestrator/candidates.ts +3 -2
  693. package/src/orchestrator/compare.ts +62 -13
  694. package/src/orchestrator/comparison-identity.ts +2 -0
  695. package/src/orchestrator/config.ts +23 -1
  696. package/src/orchestrator/discover.ts +8 -1
  697. package/src/orchestrator/doctor.ts +211 -65
  698. package/src/orchestrator/driver-capabilities.ts +21 -0
  699. package/src/orchestrator/driver-identity.ts +69 -0
  700. package/src/orchestrator/experiment-context.ts +5 -3
  701. package/src/orchestrator/experiment-corpus.ts +58 -37
  702. package/src/orchestrator/experiment-effects.ts +63 -0
  703. package/src/orchestrator/experiment-evaluation.ts +88 -10
  704. package/src/orchestrator/experiment-identity.ts +57 -48
  705. package/src/orchestrator/experiment-preflight.ts +27 -0
  706. package/src/orchestrator/experiment-report.ts +21 -1
  707. package/src/orchestrator/experiment-runs.ts +11 -4
  708. package/src/orchestrator/experiment-runtime-identity.ts +5 -243
  709. package/src/orchestrator/experiment-selection.ts +178 -18
  710. package/src/orchestrator/experiment.ts +29 -29
  711. package/src/orchestrator/fixture-identity.ts +9 -1
  712. package/src/orchestrator/fs-read.ts +2 -32
  713. package/src/orchestrator/grader-experiment.ts +74 -13
  714. package/src/orchestrator/grading.ts +60 -31
  715. package/src/orchestrator/harness-catalog-drift.ts +132 -0
  716. package/src/orchestrator/harness-registry.ts +12 -0
  717. package/src/orchestrator/index.ts +1 -0
  718. package/src/orchestrator/list-runs.ts +102 -18
  719. package/src/orchestrator/optimization-lifecycle.ts +4 -1
  720. package/src/orchestrator/orchestrator.ts +105 -224
  721. package/src/orchestrator/paired-effects.ts +214 -0
  722. package/src/orchestrator/profile.ts +24 -0
  723. package/src/orchestrator/provenance.ts +23 -3
  724. package/src/orchestrator/rubric-loader.ts +1 -1
  725. package/src/orchestrator/run-dir.ts +8 -1
  726. package/src/orchestrator/run-execution.ts +75 -10
  727. package/src/orchestrator/run-lifecycle.ts +4 -2
  728. package/src/orchestrator/run-workspace.ts +62 -0
  729. package/src/orchestrator/suite-compare.ts +47 -23
  730. package/src/orchestrator/suite-runs.ts +13 -2
  731. package/src/orchestrator/suite-summary.ts +129 -15
  732. package/src/previewer/artifacts.ts +221 -0
  733. package/src/previewer/server.ts +789 -0
  734. package/viewer/app.css +2111 -0
  735. package/viewer/app.js +627 -0
  736. package/viewer/artifact-view.js +48 -0
  737. package/viewer/charts.js +98 -0
  738. package/viewer/detail.js +1266 -0
  739. package/viewer/format.js +129 -0
  740. package/viewer/index.html +151 -0
  741. package/lib/cli/skills.d.ts +0 -38
  742. package/lib/cli/skills.d.ts.map +0 -1
  743. package/lib/cli/skills.js +0 -84
  744. package/lib/cli/skills.js.map +0 -1
  745. package/lib/drivers/shared/secure-copy.d.ts.map +0 -1
  746. package/lib/drivers/shared/secure-copy.js.map +0 -1
  747. package/skills/lux/SKILL.md +0 -89
  748. package/skills/lux/references/cli.md +0 -125
  749. package/skills/lux/references/eval-authoring.md +0 -257
  750. package/src/cli/skills.ts +0 -129
  751. /package/lib/{drivers/shared → core}/secure-copy.d.ts +0 -0
  752. /package/lib/{drivers/shared → core}/secure-copy.js +0 -0
  753. /package/src/{drivers/shared → core}/secure-copy.ts +0 -0
@@ -1,6 +1,7 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
  import { rm } from "node:fs/promises";
3
3
  import type { z } from "zod";
4
+ import { independentClusterCount } from "../core/evaluation-clusters.js";
4
5
  import {
5
6
  bootstrapMeanConfidenceInterval,
6
7
  type Candidate,
@@ -47,6 +48,7 @@ import {
47
48
  resolvedProfileSnapshot,
48
49
  runtimeCliReferences,
49
50
  } from "./experiment-identity.js";
51
+ import { preparePlanningCorpus } from "./experiment-preflight.js";
50
52
  import {
51
53
  type ExperimentEvaluation,
52
54
  loadExperimentCandidates,
@@ -55,14 +57,7 @@ import {
55
57
  openExperimentRun,
56
58
  resumeExperimentRun,
57
59
  } from "./experiment-runs.js";
58
- import {
59
- claudeConfigRoot,
60
- claudeUserBehaviorHash,
61
- cliIdentity,
62
- configuredClaudeSourceHashes,
63
- LUX_VERSION,
64
- runtimeCliIdentityHashForReferences,
65
- } from "./experiment-runtime-identity.js";
60
+ import { LUX_VERSION, runtimeCliIdentityHashForReferences } from "./experiment-runtime-identity.js";
66
61
  import {
67
62
  candidateEvaluations,
68
63
  type ExperimentSelectionDerivationOptionsSchema,
@@ -188,6 +183,7 @@ const evaluateAcross = async (options: {
188
183
  export const planExperimentCampaign = async (
189
184
  execution: CampaignExecutionOptions,
190
185
  mode: "experiment" | "optimize",
186
+ options: { static?: boolean } = {},
191
187
  ): Promise<ExperimentCampaignPlan> => {
192
188
  const campaign = execution.loaded.campaign;
193
189
  if (mode === "optimize") {
@@ -198,11 +194,7 @@ export const planExperimentCampaign = async (
198
194
  }
199
195
  const baseline = await captureSeedCandidate(execution.loaded.subjectRoot, campaign.subject);
200
196
  await assertGraderSubject(execution, baseline);
201
- const corpus = await prepareCorpus(execution);
202
- // Plan is the deterministic preflight for execution. Build the exact same
203
- // identity now so profile, behavior-tree, and custom CLI failures happen
204
- // before a user approves any model spend.
205
- await evaluationIdentity(execution, corpus, mode);
197
+ const corpus = await preparePlanningCorpus(execution, mode, options.static ?? false);
206
198
  const splitSelectors = selectorsBySplit(campaign);
207
199
  const graderAnnotations = execution.loaded.graderAnnotations?.annotations ?? [];
208
200
  const splits = splitSelectors.map(({ name, selector }) => ({
@@ -254,50 +246,57 @@ export const planExperimentCampaign = async (
254
246
  const splitSelector = splitSelectors.find((split) => split.name === constraint.split)?.selector;
255
247
  let examples = splits.find((split) => split.split === constraint.split)?.examples ?? 0;
256
248
  if (corpus.kind === "grader" && splitSelector) {
257
- const selected = selectGraderAnnotations(graderAnnotations, splitSelector);
249
+ let selected = selectGraderAnnotations(graderAnnotations, splitSelector);
258
250
  if (constraint.metric === "grader.macroFalsePositiveRate") {
259
- examples = selected.filter((annotation) =>
251
+ selected = selected.filter((annotation) =>
260
252
  [
261
253
  annotation.expected.casePassed,
262
254
  ...Object.values(annotation.expected.assertions).map((label) => label.passed),
263
255
  ].includes(false),
264
- ).length;
256
+ );
265
257
  } else if (constraint.metric === "grader.macroFalseNegativeRate") {
266
- examples = selected.filter((annotation) =>
258
+ selected = selected.filter((annotation) =>
267
259
  [
268
260
  annotation.expected.casePassed,
269
261
  ...Object.values(annotation.expected.assertions).map((label) => label.passed),
270
262
  ].includes(true),
271
- ).length;
263
+ );
272
264
  } else if (constraint.metric === "grader.scoreMae") {
273
- examples = selected.filter(
265
+ selected = selected.filter(
274
266
  (annotation) =>
275
267
  annotation.expected.caseScore !== undefined ||
276
268
  Object.values(annotation.expected.assertions).some(
277
269
  (label) => label.score !== undefined,
278
270
  ),
279
- ).length;
271
+ );
280
272
  } else if (constraint.metric === "grader.caseAgreement") {
281
- examples = selected.filter(
273
+ selected = selected.filter(
282
274
  (annotation) =>
283
275
  annotation.expected.casePassed !== undefined ||
284
276
  annotation.expected.caseScore !== undefined,
285
- ).length;
277
+ );
286
278
  } else if (constraint.metric === "grader.assertionAgreement") {
287
- examples = selected.filter(
279
+ selected = selected.filter(
288
280
  (annotation) => Object.keys(annotation.expected.assertions).length > 0,
289
- ).length;
281
+ );
290
282
  } else if (
291
283
  constraint.metric === "grader.abstentionRate" ||
284
+ constraint.metric === "grader.insufficientEvidenceRate" ||
285
+ constraint.metric === "grader.operationalErrorRate" ||
292
286
  constraint.metric === "grader.coverage"
293
287
  ) {
294
- examples = selected.filter(
288
+ selected = selected.filter(
295
289
  (annotation) =>
296
290
  annotation.expected.casePassed !== undefined ||
297
291
  Object.keys(annotation.expected.assertions).length > 0,
298
- ).length;
292
+ );
299
293
  }
294
+ examples = independentClusterCount(
295
+ selected.map((annotation) => ({ id: annotation.id, cluster: annotation.meta?.cluster })),
296
+ );
300
297
  }
298
+ if (corpus.kind === "agent" && splitSelector)
299
+ examples = independentClusterCount(selectCases(corpus.cases, splitSelector));
301
300
  if (constraint.metric === "subject.bytes" || constraint.metric === "quality.caseRegressions") {
302
301
  examples = 1;
303
302
  }
@@ -318,6 +317,10 @@ export const planExperimentCampaign = async (
318
317
  Array<number>(examples).fill(0),
319
318
  constraint.confidence,
320
319
  );
320
+ if (constraint.relativeTo) {
321
+ bestForMin.lower = 2 * bestForMin.lower - 1;
322
+ bestForMax.upper = 2 * bestForMax.upper - 1;
323
+ }
321
324
  if (constraint.min !== undefined && bestForMin.lower < constraint.min) {
322
325
  notes.push(
323
326
  `${constraint.split} metric '${constraint.metric}' cannot attain confidence lower bound ${constraint.min} with only ${examples} samples (best ${bestForMin.lower.toFixed(3)})`,
@@ -986,6 +989,3 @@ export const optimizeExperimentCampaign = async (
986
989
  new CampaignExecution(execution, "optimize", runOptimizationCampaignWork),
987
990
  );
988
991
  };
989
-
990
- // Internal exports for identity contract tests.
991
- export { claudeConfigRoot, claudeUserBehaviorHash, cliIdentity, configuredClaudeSourceHashes };
@@ -5,6 +5,7 @@ import { contentHash, type FixturesRef, valueHash } from "../core/index.js";
5
5
  export type FixtureIdentity = {
6
6
  rootDir: string;
7
7
  hash: string;
8
+ fileHashes: ReadonlyMap<string, string>;
8
9
  };
9
10
 
10
11
  const fixtureEntries = async (
@@ -63,5 +64,12 @@ export const fixtureIdentity = async (
63
64
  if (metadata.isSymbolicLink() || !metadata.isDirectory()) {
64
65
  throw new Error(`fixtures: expected a real directory: ${rootDir}`);
65
66
  }
66
- return { rootDir, hash: valueHash(await fixtureEntries(rootDir)) };
67
+ const entries = await fixtureEntries(rootDir);
68
+ return {
69
+ rootDir,
70
+ hash: valueHash(entries),
71
+ fileHashes: new Map(
72
+ entries.flatMap((entry) => (entry.hash === undefined ? [] : [[entry.path, entry.hash]])),
73
+ ),
74
+ };
67
75
  };
@@ -1,7 +1,7 @@
1
1
  import { existsSync } from "node:fs";
2
2
  import type { FileHandle } from "node:fs/promises";
3
3
  import { readdir, readFile } from "node:fs/promises";
4
- import { join, relative, resolve } from "node:path";
4
+ import { join, relative } from "node:path";
5
5
  import type { z } from "zod";
6
6
 
7
7
  const errorMessage = (error: unknown): string =>
@@ -93,34 +93,4 @@ export const walkFiles = async (root: string, maxFiles?: number): Promise<string
93
93
  return out.sort();
94
94
  };
95
95
 
96
- /**
97
- * Walk authored trees without silently following or omitting a symlink that
98
- * can change outside the experiment identity. Exact ignored paths support
99
- * generated state directories whose names are project-configurable.
100
- */
101
- export const walkAuthoredFiles = async (
102
- root: string,
103
- ignoredDirectoryNames: ReadonlySet<string> = new Set(),
104
- ignoredPaths: ReadonlySet<string> = new Set(),
105
- ): Promise<string[]> => {
106
- if (!existsSync(root)) return [];
107
- const out: string[] = [];
108
- const stack = [root];
109
- while (stack.length > 0) {
110
- const dir = stack.pop();
111
- if (!dir) continue;
112
- for (const entry of await readdir(dir, { withFileTypes: true })) {
113
- const full = join(dir, entry.name);
114
- if (ignoredPaths.has(resolve(full))) continue;
115
- if (entry.isDirectory() && ignoredDirectoryNames.has(entry.name)) continue;
116
- if (entry.isSymbolicLink()) {
117
- throw new Error(
118
- `authored evaluation trees cannot contain symlinks: ${relative(root, full)}`,
119
- );
120
- }
121
- if (entry.isDirectory()) stack.push(full);
122
- else if (entry.isFile()) out.push(relative(root, full));
123
- }
124
- }
125
- return out.sort();
126
- };
96
+ export { walkAuthoredFiles } from "../core/file-tree.js";
@@ -1,10 +1,7 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
  import { join, relative, resolve, sep } from "node:path";
3
3
  import { z } from "zod";
4
- import {
5
- createRubricAssertion,
6
- RubricModelAccountingDetailSchema,
7
- } from "../assertions/rubric/index.js";
4
+ import { RubricModelAccountingDetailSchema } from "../assertions/rubric/index.js";
8
5
  import {
9
6
  type Candidate,
10
7
  type CandidateEvaluation,
@@ -28,6 +25,7 @@ import {
28
25
  import type { CampaignExecutionOptions } from "./experiment.js";
29
26
  import type { OpenedExperimentRun } from "./experiment-runs.js";
30
27
  import { gradeRun } from "./grading.js";
28
+ import { clusterCaseSamples, groupedCaseMetricSamples } from "./paired-effects.js";
31
29
  import { loadFrozenRegradableRun, releaseFrozenRegradableRun } from "./regrade.js";
32
30
  import { loadRubricDefinition } from "./rubric-loader.js";
33
31
 
@@ -38,10 +36,12 @@ const GraderJudgmentSchema = z.object({
38
36
  actual: z.union([z.boolean(), z.number()]).nullable(),
39
37
  matched: z.boolean(),
40
38
  absoluteError: z.exactOptional(z.number()),
39
+ unavailableReason: z.exactOptional(z.enum(["insufficient-evidence", "operational-error"])),
41
40
  });
42
41
  export type GraderJudgment = z.infer<typeof GraderJudgmentSchema>;
43
42
 
44
43
  const GraderEvidenceItemSchema = z.object({
44
+ clusterId: z.exactOptional(z.string().min(1)),
45
45
  annotationId: z.string(),
46
46
  repetition: z.number().int().positive(),
47
47
  runDir: z.string(),
@@ -95,6 +95,11 @@ const assertionOperationalError = (
95
95
  return detail.success && detail.data.graderError !== undefined;
96
96
  };
97
97
 
98
+ const assertionUnavailableReason = (
99
+ entry: GradingReport["assertions"][number] | undefined,
100
+ ): GraderJudgment["unavailableReason"] =>
101
+ assertionOperationalError(entry) ? "operational-error" : entry?.abstention;
102
+
98
103
  const assertionModelAccounting = (
99
104
  assertion: GradingReport["assertions"][number],
100
105
  ): { attempts: number; costUsd: number; unpricedModelCalls: number } => {
@@ -115,19 +120,22 @@ export const compareGraderAnnotation = (
115
120
  scoreTolerance: number,
116
121
  ): GraderJudgment[] => {
117
122
  const judgments: GraderJudgment[] = [];
118
- const reportFailed = report.assertions.some(assertionOperationalError);
123
+ const reportUnavailableReason = report.assertions.some(assertionOperationalError)
124
+ ? "operational-error"
125
+ : report.assertions.find((entry) => entry.abstention)?.abstention;
119
126
  if (annotation.expected.casePassed !== undefined) {
120
- const actual = reportFailed ? null : report.casePassed;
127
+ const actual = reportUnavailableReason ? null : report.casePassed;
121
128
  judgments.push({
122
129
  key: "case",
123
130
  kind: "case-pass",
124
131
  expected: annotation.expected.casePassed,
125
132
  actual,
126
133
  matched: actual === annotation.expected.casePassed,
134
+ ...(reportUnavailableReason ? { unavailableReason: reportUnavailableReason } : {}),
127
135
  });
128
136
  }
129
137
  if (annotation.expected.caseScore !== undefined) {
130
- const actual = reportFailed ? null : report.caseScore;
138
+ const actual = reportUnavailableReason ? null : report.caseScore;
131
139
  const absoluteError = actual === null ? 1 : Math.abs(actual - annotation.expected.caseScore);
132
140
  judgments.push({
133
141
  key: "case",
@@ -136,6 +144,7 @@ export const compareGraderAnnotation = (
136
144
  actual,
137
145
  matched: actual !== null && absoluteError <= scoreTolerance,
138
146
  absoluteError,
147
+ ...(reportUnavailableReason ? { unavailableReason: reportUnavailableReason } : {}),
139
148
  });
140
149
  }
141
150
  const entries = new Map(
@@ -143,13 +152,15 @@ export const compareGraderAnnotation = (
143
152
  );
144
153
  for (const [assertionId, expected] of Object.entries(annotation.expected.assertions)) {
145
154
  const entry = entries.get(assertionId);
146
- const actual = assertionOperationalError(entry) ? undefined : entry;
155
+ const unavailableReason = assertionUnavailableReason(entry);
156
+ const actual = unavailableReason ? undefined : entry;
147
157
  judgments.push({
148
158
  key: assertionId,
149
159
  kind: "assertion-pass",
150
160
  expected: expected.passed,
151
161
  actual: actual?.passed ?? null,
152
162
  matched: actual?.passed === expected.passed,
163
+ ...(unavailableReason ? { unavailableReason } : {}),
153
164
  });
154
165
  if (expected.score !== undefined) {
155
166
  const absoluteError = actual ? Math.abs(actual.score - expected.score) : 1;
@@ -160,6 +171,7 @@ export const compareGraderAnnotation = (
160
171
  actual: actual?.score ?? null,
161
172
  matched: actual !== undefined && absoluteError <= scoreTolerance,
162
173
  absoluteError,
174
+ ...(unavailableReason ? { unavailableReason } : {}),
163
175
  });
164
176
  }
165
177
  }
@@ -233,7 +245,7 @@ const collectGraderEvidence = (
233
245
 
234
246
  export const summarizeGraderEvidence = (
235
247
  items: readonly z.infer<typeof GraderEvidenceItemSchema>[],
236
- candidate: Candidate,
248
+ candidate: Pick<Candidate, "sourceBytes">,
237
249
  ): { metrics: Record<string, number>; samples: Record<string, number[]> } => {
238
250
  const samples: Record<string, number[]> = {};
239
251
  const { byAnnotation, itemsByAnnotation, counts } = collectGraderEvidence(items);
@@ -323,6 +335,18 @@ export const summarizeGraderEvidence = (
323
335
  "grader.abstentionRate",
324
336
  passes.filter((judgment) => judgment.actual === null).length / passes.length,
325
337
  );
338
+ addSample(
339
+ samples,
340
+ "grader.insufficientEvidenceRate",
341
+ passes.filter((judgment) => judgment.unavailableReason === "insufficient-evidence").length /
342
+ passes.length,
343
+ );
344
+ addSample(
345
+ samples,
346
+ "grader.operationalErrorRate",
347
+ passes.filter((judgment) => judgment.unavailableReason === "operational-error").length /
348
+ passes.length,
349
+ );
326
350
  }
327
351
  }
328
352
  const precision = ratio(
@@ -440,7 +464,42 @@ const evaluationFromEvidence = (
440
464
  evidencePath: string,
441
465
  evidence: GraderEvaluationEvidence,
442
466
  ): CandidateEvaluation & { evidencePath: string } => {
467
+ const caseSamples = clusterCaseSamples(
468
+ evidence.items.map((item) => {
469
+ const summary = summarizeGraderEvidence([item], {
470
+ sourceBytes: evidence.metrics["subject.bytes"] ?? 0,
471
+ });
472
+ return {
473
+ [item.annotationId]: {
474
+ ...(item.clusterId ? { clusterId: item.clusterId } : {}),
475
+ identityHash: experiment.manifest.evaluationHash
476
+ ? valueHash({
477
+ evaluationHash: experiment.manifest.evaluationHash,
478
+ annotationId: item.annotationId,
479
+ profileId: evidence.profileId,
480
+ split: evidence.split,
481
+ })
482
+ : null,
483
+ metrics: Object.fromEntries(
484
+ Object.entries(summary.samples).flatMap(([metric, values]) =>
485
+ values.length === 1 ? [[metric, { mean: values[0] ?? 0, n: 1 }]] : [],
486
+ ),
487
+ ),
488
+ },
489
+ };
490
+ }),
491
+ );
443
492
  const byAnnotation = new Map<string, number[]>();
493
+ const grouped = groupedCaseMetricSamples(caseSamples, evidence.repetitions);
494
+ const metrics = grouped
495
+ ? Object.fromEntries(
496
+ Object.entries(evidence.metrics).flatMap(([name, value]) => {
497
+ if (!Object.hasOwn(evidence.samples, name)) return [[name, value]];
498
+ const values = grouped[name];
499
+ return values ? [[name, mean(values)]] : [];
500
+ }),
501
+ )
502
+ : evidence.metrics;
444
503
  for (const item of evidence.items) {
445
504
  const values = byAnnotation.get(item.annotationId) ?? [];
446
505
  values.push(...item.judgments.map((judgment) => (judgment.matched ? 1 : 0)));
@@ -471,10 +530,11 @@ const evaluationFromEvidence = (
471
530
  profileId: evidence.profileId,
472
531
  split: evidence.split,
473
532
  evidencePath: relative(experiment.path, evidencePath),
474
- passRate: evidence.metrics["quality.passRate"] ?? 0,
533
+ passRate: metrics["quality.passRate"] ?? 0,
475
534
  casePassRates: Object.fromEntries([...byAnnotation].map(([id, values]) => [id, mean(values)])),
476
- metrics: evidence.metrics,
477
- samples: evidence.samples,
535
+ metrics,
536
+ samples: grouped ?? evidence.samples,
537
+ ...(caseSamples ? { caseSamples } : {}),
478
538
  metricCalls: evidence.items.length,
479
539
  judgeCalls: evidence.items.reduce(
480
540
  (total, item) =>
@@ -648,7 +708,7 @@ export const evaluateGraderCandidate = async (options: {
648
708
  const registry = buildRegistryFromConfig({
649
709
  ...execution.config,
650
710
  ...(harness ? { harness } : {}),
651
- }).withAssertion(createRubricAssertion(harness));
711
+ });
652
712
  const items: GraderEvidenceItem[] = [];
653
713
  for (const annotation of selected) {
654
714
  const rubric = await loadRubricDefinition(
@@ -779,6 +839,7 @@ export const evaluateGraderCandidate = async (options: {
779
839
  );
780
840
  const item: GraderEvidenceItem = {
781
841
  annotationId: annotation.id,
842
+ ...(annotation.meta?.cluster ? { clusterId: annotation.meta.cluster } : {}),
782
843
  repetition,
783
844
  runDir: annotation.runDir,
784
845
  rubricPath: annotation.rubricPath,
@@ -3,6 +3,7 @@ import {
3
3
  type Assertion,
4
4
  type AssertionImpl,
5
5
  type AssertionProgress,
6
+ type AssertionResult,
6
7
  AssertionResultSchema,
7
8
  type GradingAssertionEntry,
8
9
  type GradingReport,
@@ -14,7 +15,7 @@ import {
14
15
  } from "../core/index.js";
15
16
  import { validatePluginConfigAsync } from "./validate-plugin-config.js";
16
17
 
17
- const FRAMEWORK_KEYS = new Set(["id", "type", "name", "weight", "threshold"]);
18
+ const FRAMEWORK_KEYS = new Set(["id", "type", "name", "weight", "threshold", "informational"]);
18
19
 
19
20
  const shapeOf = (schema: z.ZodTypeAny): Record<string, unknown> | null => {
20
21
  const shape = (schema as { shape?: unknown }).shape;
@@ -124,6 +125,56 @@ const describeAssertion = (a: Assertion): string => {
124
125
  return fields ? `${a.type} ${fields}` : a.type;
125
126
  };
126
127
 
128
+ const assertionPassed = (result: AssertionResult, threshold: number): boolean =>
129
+ result.errorMessage === undefined &&
130
+ result.abstention === undefined &&
131
+ result.passed &&
132
+ result.score >= threshold;
133
+
134
+ export const gradingScoreBasis = (report: GradingReport | null): string | null =>
135
+ report?.caseScore === null || !report
136
+ ? null
137
+ : valueHash(
138
+ report.assertions
139
+ .map((entry, index) => ({ entry, id: entry.id ?? `${entry.type}:${index + 1}` }))
140
+ .filter(({ entry }) => entry.errorMessage === undefined && entry.abstention === undefined)
141
+ .map(({ entry, id }) => ({ id, weight: entry.weight }))
142
+ .sort((a, b) => a.id.localeCompare(b.id)),
143
+ );
144
+
145
+ const aggregateGrading = (
146
+ entries: GradingAssertionEntry[],
147
+ skippedAssertions: NonNullable<GradingReport["skippedAssertions"]>,
148
+ gradingIncomplete: boolean,
149
+ ): GradingReport => {
150
+ const requiredEntries = entries.filter((entry) => entry.passed !== null);
151
+ const incomplete =
152
+ gradingIncomplete || requiredEntries.some((entry) => entry.errorMessage !== undefined);
153
+ const gradingAbstained = requiredEntries.some((entry) => entry.abstention !== undefined);
154
+ const scoredEntries = entries.filter(
155
+ (entry) => entry.errorMessage === undefined && entry.abstention === undefined,
156
+ );
157
+ const weightSum = scoredEntries.reduce((sum, entry) => sum + entry.weight, 0);
158
+ const weightedScoreSum = scoredEntries.reduce(
159
+ (sum, entry) => sum + entry.weight * entry.score,
160
+ 0,
161
+ );
162
+ const hasVerdict = !incomplete && !gradingAbstained && weightSum > 0;
163
+ return {
164
+ schemaVersion: 1,
165
+ casePassed:
166
+ hasVerdict && requiredEntries.length > 0
167
+ ? requiredEntries.every((entry) => entry.passed)
168
+ : null,
169
+ caseScore: hasVerdict ? weightedScoreSum / weightSum : null,
170
+ assertions: entries,
171
+ ...(skippedAssertions.length > 0 ? { skippedAssertions } : {}),
172
+ ...(incomplete
173
+ ? { incomplete: { exitReason: "error" as const, phase: "grading" as const } }
174
+ : {}),
175
+ };
176
+ };
177
+
127
178
  export const gradeRun = async (
128
179
  run: Run,
129
180
  registry: Registry,
@@ -150,9 +201,6 @@ export const gradeRun = async (
150
201
  name: string;
151
202
  reason: "judge-disabled";
152
203
  }> = [];
153
- let weightedScoreSum = 0;
154
- let weightSum = 0;
155
- let allPassed = true;
156
204
  let gradingIncomplete = false;
157
205
 
158
206
  for (const [index, a] of assertions.entries()) {
@@ -205,7 +253,7 @@ export const gradeRun = async (
205
253
  if (validatedConfigs && index >= validatedConfigs.length) {
206
254
  throw new Error(`validated assertion plan is missing assertions[${index}]`);
207
255
  }
208
- // Pass the validated config so schema defaults (e.g. timeoutMs)
256
+ // Pass the validated config so schema defaults (e.g. timeout)
209
257
  // reach evaluate(); the raw assertion object has none applied.
210
258
  const result = AssertionResultSchema.parse(
211
259
  await impl.evaluate(validated as typeof a, run, {
@@ -219,43 +267,35 @@ export const gradeRun = async (
219
267
  : {}),
220
268
  }),
221
269
  );
222
- const passed =
223
- result.errorMessage === undefined && result.passed && result.score >= threshold;
270
+ const passed = assertionPassed(result, threshold);
224
271
  entry = {
225
272
  id,
226
273
  type: a.type,
227
274
  name,
228
- passed,
275
+ passed: a.informational ? null : passed,
276
+ ...(a.informational ? { informational: true } : { threshold }),
229
277
  score: result.score,
230
278
  weight,
231
- threshold,
232
279
  durationMs: Date.now() - startedAt,
233
280
  ...(result.comment !== undefined ? { comment: result.comment } : {}),
234
281
  detail: result.detail,
282
+ ...(result.abstention !== undefined ? { abstention: result.abstention } : {}),
235
283
  ...(result.errorMessage !== undefined ? { errorMessage: result.errorMessage } : {}),
236
284
  ...(result.usage ? { usage: result.usage } : {}),
237
285
  };
238
- if (result.errorMessage !== undefined) {
239
- gradingIncomplete = true;
240
- } else {
241
- if (!passed) allPassed = false;
242
- weightedScoreSum += weight * result.score;
243
- weightSum += weight;
244
- }
245
286
  } catch (err) {
246
287
  const message = err instanceof Error ? err.message : String(err);
247
288
  entry = {
248
289
  id,
249
290
  type: a.type,
250
291
  name,
251
- passed: false,
292
+ passed: a.informational ? null : false,
293
+ ...(a.informational ? { informational: true } : { threshold }),
252
294
  score: 0,
253
295
  weight,
254
- threshold,
255
296
  durationMs: Date.now() - startedAt,
256
297
  errorMessage: message,
257
298
  };
258
- gradingIncomplete = true;
259
299
  }
260
300
 
261
301
  entries.push(entry);
@@ -264,16 +304,5 @@ export const gradeRun = async (
264
304
  await modelAttempts?.complete(assertionAttemptIds);
265
305
  }
266
306
 
267
- let caseScore: number | null = null;
268
- if (!gradingIncomplete && weightSum > 0) caseScore = weightedScoreSum / weightSum;
269
- return {
270
- schemaVersion: 1,
271
- casePassed: gradingIncomplete || weightSum === 0 ? null : allPassed,
272
- caseScore,
273
- assertions: entries,
274
- ...(skippedAssertions.length > 0 ? { skippedAssertions } : {}),
275
- ...(gradingIncomplete
276
- ? { incomplete: { exitReason: "error" as const, phase: "grading" as const } }
277
- : {}),
278
- };
307
+ return aggregateGrading(entries, skippedAssertions, gradingIncomplete);
279
308
  };