@prismatic-io/lux 0.0.2-preview.3 → 0.0.2-preview.32

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 (727) 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 +7 -5
  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 +4 -1
  17. package/lib/assertions/core/command-exits-zero.d.ts.map +1 -1
  18. package/lib/assertions/core/command-exits-zero.js +50 -7
  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/helpers.d.ts +2 -7
  27. package/lib/assertions/core/helpers.d.ts.map +1 -1
  28. package/lib/assertions/core/helpers.js +2 -6
  29. package/lib/assertions/core/helpers.js.map +1 -1
  30. package/lib/assertions/core/index.d.ts.map +1 -1
  31. package/lib/assertions/core/index.js +2 -1
  32. package/lib/assertions/core/index.js.map +1 -1
  33. package/lib/assertions/core/json-pointer-equals.d.ts +1 -0
  34. package/lib/assertions/core/json-pointer-equals.d.ts.map +1 -1
  35. package/lib/assertions/core/output-checks.d.ts +3 -0
  36. package/lib/assertions/core/output-checks.d.ts.map +1 -1
  37. package/lib/assertions/core/predicate.d.ts +1 -0
  38. package/lib/assertions/core/predicate.d.ts.map +1 -1
  39. package/lib/assertions/core/resource-checks.d.ts +25 -0
  40. package/lib/assertions/core/resource-checks.d.ts.map +1 -1
  41. package/lib/assertions/core/resource-checks.js +35 -5
  42. package/lib/assertions/core/resource-checks.js.map +1 -1
  43. package/lib/assertions/rubric/index.d.ts +28 -3
  44. package/lib/assertions/rubric/index.d.ts.map +1 -1
  45. package/lib/assertions/rubric/index.js +59 -13
  46. package/lib/assertions/rubric/index.js.map +1 -1
  47. package/lib/assertions/rubric/internal.d.ts +30 -5
  48. package/lib/assertions/rubric/internal.d.ts.map +1 -1
  49. package/lib/assertions/rubric/internal.js +181 -28
  50. package/lib/assertions/rubric/internal.js.map +1 -1
  51. package/lib/authoring.d.ts +36 -2
  52. package/lib/authoring.d.ts.map +1 -1
  53. package/lib/authoring.js +36 -1
  54. package/lib/authoring.js.map +1 -1
  55. package/lib/cli/bin.js +2 -13
  56. package/lib/cli/bin.js.map +1 -1
  57. package/lib/cli/command-runtime.d.ts +3 -3
  58. package/lib/cli/command-runtime.d.ts.map +1 -1
  59. package/lib/cli/command-runtime.js +17 -6
  60. package/lib/cli/command-runtime.js.map +1 -1
  61. package/lib/cli/doctor.d.ts +55 -0
  62. package/lib/cli/doctor.d.ts.map +1 -0
  63. package/lib/cli/doctor.js +14 -0
  64. package/lib/cli/doctor.js.map +1 -0
  65. package/lib/cli/harness-plan.d.ts +26 -0
  66. package/lib/cli/harness-plan.d.ts.map +1 -0
  67. package/lib/cli/harness-plan.js +75 -0
  68. package/lib/cli/harness-plan.js.map +1 -0
  69. package/lib/cli/init-templates.d.ts +11 -0
  70. package/lib/cli/init-templates.d.ts.map +1 -0
  71. package/lib/cli/init-templates.js +215 -0
  72. package/lib/cli/init-templates.js.map +1 -0
  73. package/lib/cli/init.d.ts +10 -0
  74. package/lib/cli/init.d.ts.map +1 -1
  75. package/lib/cli/init.js +34 -173
  76. package/lib/cli/init.js.map +1 -1
  77. package/lib/cli/output-schemas.d.ts +1408 -0
  78. package/lib/cli/output-schemas.d.ts.map +1 -0
  79. package/lib/cli/output-schemas.js +91 -0
  80. package/lib/cli/output-schemas.js.map +1 -0
  81. package/lib/cli/program.d.ts +140 -12
  82. package/lib/cli/program.d.ts.map +1 -1
  83. package/lib/cli/program.js +779 -646
  84. package/lib/cli/program.js.map +1 -1
  85. package/lib/cli/render/reporter.d.ts.map +1 -1
  86. package/lib/cli/render/reporter.js +48 -8
  87. package/lib/cli/render/reporter.js.map +1 -1
  88. package/lib/cli/run-options.d.ts +20 -4
  89. package/lib/cli/run-options.d.ts.map +1 -1
  90. package/lib/cli/run-options.js +100 -19
  91. package/lib/cli/run-options.js.map +1 -1
  92. package/lib/cli/view.d.ts +15 -0
  93. package/lib/cli/view.d.ts.map +1 -0
  94. package/lib/cli/view.js +168 -0
  95. package/lib/cli/view.js.map +1 -0
  96. package/lib/container/driver.d.ts +27 -0
  97. package/lib/container/driver.d.ts.map +1 -0
  98. package/lib/container/driver.js +197 -0
  99. package/lib/container/driver.js.map +1 -0
  100. package/lib/container/protocol.d.ts +12 -0
  101. package/lib/container/protocol.d.ts.map +1 -0
  102. package/lib/container/protocol.js +38 -0
  103. package/lib/container/protocol.js.map +1 -0
  104. package/lib/container/resources.d.ts +12 -0
  105. package/lib/container/resources.d.ts.map +1 -0
  106. package/lib/container/resources.js +133 -0
  107. package/lib/container/resources.js.map +1 -0
  108. package/lib/container/worker.d.ts +2 -0
  109. package/lib/container/worker.d.ts.map +1 -0
  110. package/lib/container/worker.js +85 -0
  111. package/lib/container/worker.js.map +1 -0
  112. package/lib/core/action-events.d.ts +29 -0
  113. package/lib/core/action-events.d.ts.map +1 -0
  114. package/lib/core/action-events.js +51 -0
  115. package/lib/core/action-events.js.map +1 -0
  116. package/lib/core/agent-activity.d.ts +49 -0
  117. package/lib/core/agent-activity.d.ts.map +1 -0
  118. package/lib/core/agent-activity.js +206 -0
  119. package/lib/core/agent-activity.js.map +1 -0
  120. package/lib/core/agent-environment.d.ts +5 -0
  121. package/lib/core/agent-environment.d.ts.map +1 -0
  122. package/lib/core/agent-environment.js +47 -0
  123. package/lib/core/agent-environment.js.map +1 -0
  124. package/lib/core/agent-events.d.ts +26 -0
  125. package/lib/core/agent-events.d.ts.map +1 -0
  126. package/lib/core/agent-events.js +13 -0
  127. package/lib/core/agent-events.js.map +1 -0
  128. package/lib/core/annotation.d.ts +6 -2
  129. package/lib/core/annotation.d.ts.map +1 -1
  130. package/lib/core/annotation.js +2 -1
  131. package/lib/core/annotation.js.map +1 -1
  132. package/lib/core/answerer.d.ts +12 -0
  133. package/lib/core/answerer.d.ts.map +1 -1
  134. package/lib/core/answerer.js +2 -0
  135. package/lib/core/answerer.js.map +1 -1
  136. package/lib/core/artifact-evidence.d.ts +8 -0
  137. package/lib/core/artifact-evidence.d.ts.map +1 -1
  138. package/lib/core/artifact-evidence.js +36 -4
  139. package/lib/core/artifact-evidence.js.map +1 -1
  140. package/lib/core/assertion.d.ts +20 -2
  141. package/lib/core/assertion.d.ts.map +1 -1
  142. package/lib/core/assertion.js +19 -1
  143. package/lib/core/assertion.js.map +1 -1
  144. package/lib/core/case.d.ts +111 -3
  145. package/lib/core/case.d.ts.map +1 -1
  146. package/lib/core/case.js +17 -2
  147. package/lib/core/case.js.map +1 -1
  148. package/lib/core/command-verification.d.ts +10 -0
  149. package/lib/core/command-verification.d.ts.map +1 -0
  150. package/lib/core/command-verification.js +66 -0
  151. package/lib/core/command-verification.js.map +1 -0
  152. package/lib/core/driver-execution.d.ts +83 -0
  153. package/lib/core/driver-execution.d.ts.map +1 -0
  154. package/lib/core/driver-execution.js +72 -0
  155. package/lib/core/driver-execution.js.map +1 -0
  156. package/lib/core/driver-metrics.d.ts +98 -0
  157. package/lib/core/driver-metrics.d.ts.map +1 -0
  158. package/lib/core/driver-metrics.js +36 -0
  159. package/lib/core/driver-metrics.js.map +1 -0
  160. package/lib/core/driver.d.ts +64 -0
  161. package/lib/core/driver.d.ts.map +1 -1
  162. package/lib/core/driver.js +28 -0
  163. package/lib/core/driver.js.map +1 -1
  164. package/lib/core/duration.d.ts +5 -0
  165. package/lib/core/duration.d.ts.map +1 -0
  166. package/lib/core/duration.js +49 -0
  167. package/lib/core/duration.js.map +1 -0
  168. package/lib/core/environment.d.ts +18 -0
  169. package/lib/core/environment.d.ts.map +1 -0
  170. package/lib/core/environment.js +21 -0
  171. package/lib/core/environment.js.map +1 -0
  172. package/lib/core/evaluation-clusters.d.ts +17 -0
  173. package/lib/core/evaluation-clusters.d.ts.map +1 -0
  174. package/lib/core/evaluation-clusters.js +23 -0
  175. package/lib/core/evaluation-clusters.js.map +1 -0
  176. package/lib/core/events.d.ts +36 -0
  177. package/lib/core/events.d.ts.map +1 -1
  178. package/lib/core/events.js +12 -2
  179. package/lib/core/events.js.map +1 -1
  180. package/lib/core/experiment.d.ts +32 -2
  181. package/lib/core/experiment.d.ts.map +1 -1
  182. package/lib/core/experiment.js +35 -18
  183. package/lib/core/experiment.js.map +1 -1
  184. package/lib/core/file-tree.d.ts +7 -0
  185. package/lib/core/file-tree.d.ts.map +1 -0
  186. package/lib/core/file-tree.js +35 -0
  187. package/lib/core/file-tree.js.map +1 -0
  188. package/lib/core/global-id.d.ts +6 -0
  189. package/lib/core/global-id.d.ts.map +1 -0
  190. package/lib/core/global-id.js +17 -0
  191. package/lib/core/global-id.js.map +1 -0
  192. package/lib/core/harness-catalog.d.ts +35 -0
  193. package/lib/core/harness-catalog.d.ts.map +1 -0
  194. package/lib/core/harness-catalog.js +45 -0
  195. package/lib/core/harness-catalog.js.map +1 -0
  196. package/lib/core/harness-catalogs/antigravity.d.ts +11 -0
  197. package/lib/core/harness-catalogs/antigravity.d.ts.map +1 -0
  198. package/lib/core/harness-catalogs/antigravity.js +23 -0
  199. package/lib/core/harness-catalogs/antigravity.js.map +1 -0
  200. package/lib/core/harness-catalogs/claude-code.d.ts +12 -0
  201. package/lib/core/harness-catalogs/claude-code.d.ts.map +1 -0
  202. package/lib/core/harness-catalogs/claude-code.js +24 -0
  203. package/lib/core/harness-catalogs/claude-code.js.map +1 -0
  204. package/lib/core/harness-catalogs/codex.d.ts +11 -0
  205. package/lib/core/harness-catalogs/codex.d.ts.map +1 -0
  206. package/lib/core/harness-catalogs/codex.js +26 -0
  207. package/lib/core/harness-catalogs/codex.js.map +1 -0
  208. package/lib/core/harness-catalogs/copilot.d.ts +29 -0
  209. package/lib/core/harness-catalogs/copilot.d.ts.map +1 -0
  210. package/lib/core/harness-catalogs/copilot.js +45 -0
  211. package/lib/core/harness-catalogs/copilot.js.map +1 -0
  212. package/lib/core/harness-catalogs/cursor.d.ts +2 -0
  213. package/lib/core/harness-catalogs/cursor.d.ts.map +1 -0
  214. package/lib/core/harness-catalogs/cursor.js +13 -0
  215. package/lib/core/harness-catalogs/cursor.js.map +1 -0
  216. package/lib/core/harness-catalogs/grok-build.d.ts +7 -0
  217. package/lib/core/harness-catalogs/grok-build.d.ts.map +1 -0
  218. package/lib/core/harness-catalogs/grok-build.js +18 -0
  219. package/lib/core/harness-catalogs/grok-build.js.map +1 -0
  220. package/lib/core/harness-catalogs/index.d.ts +73 -0
  221. package/lib/core/harness-catalogs/index.d.ts.map +1 -0
  222. package/lib/core/harness-catalogs/index.js +17 -0
  223. package/lib/core/harness-catalogs/index.js.map +1 -0
  224. package/lib/core/harness-matrix.d.ts +154 -0
  225. package/lib/core/harness-matrix.d.ts.map +1 -0
  226. package/lib/core/harness-matrix.js +204 -0
  227. package/lib/core/harness-matrix.js.map +1 -0
  228. package/lib/core/index.d.ts +12 -0
  229. package/lib/core/index.d.ts.map +1 -1
  230. package/lib/core/index.js +12 -0
  231. package/lib/core/index.js.map +1 -1
  232. package/lib/core/lifecycle-fixtures.d.ts.map +1 -1
  233. package/lib/core/lifecycle-fixtures.js +4 -2
  234. package/lib/core/lifecycle-fixtures.js.map +1 -1
  235. package/lib/core/model-cli.d.ts +9 -11
  236. package/lib/core/model-cli.d.ts.map +1 -1
  237. package/lib/core/model-cli.js +31 -19
  238. package/lib/core/model-cli.js.map +1 -1
  239. package/lib/core/platform-process.d.ts +6 -1
  240. package/lib/core/platform-process.d.ts.map +1 -1
  241. package/lib/core/platform-process.js +49 -11
  242. package/lib/core/platform-process.js.map +1 -1
  243. package/lib/core/rubric.d.ts +1 -0
  244. package/lib/core/rubric.d.ts.map +1 -1
  245. package/lib/core/run.d.ts +293 -1
  246. package/lib/core/run.d.ts.map +1 -1
  247. package/lib/core/run.js +27 -0
  248. package/lib/core/run.js.map +1 -1
  249. package/lib/core/secure-copy.d.ts.map +1 -0
  250. package/lib/core/secure-copy.js.map +1 -0
  251. package/lib/core/usage.d.ts +5 -0
  252. package/lib/core/usage.d.ts.map +1 -1
  253. package/lib/core/usage.js +3 -0
  254. package/lib/core/usage.js.map +1 -1
  255. package/lib/core/wire.d.ts +12 -0
  256. package/lib/core/wire.d.ts.map +1 -1
  257. package/lib/core/wire.js +5 -1
  258. package/lib/core/wire.js.map +1 -1
  259. package/lib/drivers/antigravity/artifacts.d.ts +2 -0
  260. package/lib/drivers/antigravity/artifacts.d.ts.map +1 -0
  261. package/lib/drivers/antigravity/artifacts.js +33 -0
  262. package/lib/drivers/antigravity/artifacts.js.map +1 -0
  263. package/lib/drivers/antigravity/config.d.ts +88 -0
  264. package/lib/drivers/antigravity/config.d.ts.map +1 -0
  265. package/lib/drivers/antigravity/config.js +87 -0
  266. package/lib/drivers/antigravity/config.js.map +1 -0
  267. package/lib/drivers/antigravity/events.d.ts +4 -0
  268. package/lib/drivers/antigravity/events.d.ts.map +1 -0
  269. package/lib/drivers/antigravity/events.js +241 -0
  270. package/lib/drivers/antigravity/events.js.map +1 -0
  271. package/lib/drivers/antigravity/index.d.ts +114 -0
  272. package/lib/drivers/antigravity/index.d.ts.map +1 -0
  273. package/lib/drivers/antigravity/index.js +113 -0
  274. package/lib/drivers/antigravity/index.js.map +1 -0
  275. package/lib/drivers/antigravity/runtime.d.ts +7 -0
  276. package/lib/drivers/antigravity/runtime.d.ts.map +1 -0
  277. package/lib/drivers/antigravity/runtime.js +83 -0
  278. package/lib/drivers/antigravity/runtime.js.map +1 -0
  279. package/lib/drivers/claude-code/deferred-process.d.ts +17 -0
  280. package/lib/drivers/claude-code/deferred-process.d.ts.map +1 -0
  281. package/lib/drivers/claude-code/deferred-process.js +108 -0
  282. package/lib/drivers/claude-code/deferred-process.js.map +1 -0
  283. package/lib/drivers/claude-code/index.d.ts +180 -10
  284. package/lib/drivers/claude-code/index.d.ts.map +1 -1
  285. package/lib/drivers/claude-code/index.js +186 -252
  286. package/lib/drivers/claude-code/index.js.map +1 -1
  287. package/lib/drivers/claude-code/isolation.d.ts +8 -0
  288. package/lib/drivers/claude-code/isolation.d.ts.map +1 -0
  289. package/lib/drivers/claude-code/isolation.js +199 -0
  290. package/lib/drivers/claude-code/isolation.js.map +1 -0
  291. package/lib/drivers/claude-code/parse-events.d.ts.map +1 -1
  292. package/lib/drivers/claude-code/parse-events.js +73 -8
  293. package/lib/drivers/claude-code/parse-events.js.map +1 -1
  294. package/lib/drivers/codex/app-events.d.ts +9 -2
  295. package/lib/drivers/codex/app-events.d.ts.map +1 -1
  296. package/lib/drivers/codex/app-events.js +104 -12
  297. package/lib/drivers/codex/app-events.js.map +1 -1
  298. package/lib/drivers/codex/config.d.ts +66 -5
  299. package/lib/drivers/codex/config.d.ts.map +1 -1
  300. package/lib/drivers/codex/config.js +39 -8
  301. package/lib/drivers/codex/config.js.map +1 -1
  302. package/lib/drivers/codex/exec-events.d.ts +4 -0
  303. package/lib/drivers/codex/exec-events.d.ts.map +1 -0
  304. package/lib/drivers/codex/exec-events.js +230 -0
  305. package/lib/drivers/codex/exec-events.js.map +1 -0
  306. package/lib/drivers/codex/index.d.ts +138 -4
  307. package/lib/drivers/codex/index.d.ts.map +1 -1
  308. package/lib/drivers/codex/index.js +112 -276
  309. package/lib/drivers/codex/index.js.map +1 -1
  310. package/lib/drivers/copilot/config.d.ts +84 -0
  311. package/lib/drivers/copilot/config.d.ts.map +1 -0
  312. package/lib/drivers/copilot/config.js +57 -0
  313. package/lib/drivers/copilot/config.js.map +1 -0
  314. package/lib/drivers/copilot/index.d.ts +107 -0
  315. package/lib/drivers/copilot/index.d.ts.map +1 -0
  316. package/lib/drivers/copilot/index.js +268 -0
  317. package/lib/drivers/copilot/index.js.map +1 -0
  318. package/lib/drivers/cursor/config.d.ts +28 -0
  319. package/lib/drivers/cursor/config.d.ts.map +1 -0
  320. package/lib/drivers/cursor/config.js +28 -0
  321. package/lib/drivers/cursor/config.js.map +1 -0
  322. package/lib/drivers/cursor/index.d.ts +44 -0
  323. package/lib/drivers/cursor/index.d.ts.map +1 -0
  324. package/lib/drivers/cursor/index.js +286 -0
  325. package/lib/drivers/cursor/index.js.map +1 -0
  326. package/lib/drivers/cursor/interaction.d.ts +6 -0
  327. package/lib/drivers/cursor/interaction.d.ts.map +1 -0
  328. package/lib/drivers/cursor/interaction.js +55 -0
  329. package/lib/drivers/cursor/interaction.js.map +1 -0
  330. package/lib/drivers/grok-build/config.d.ts +68 -0
  331. package/lib/drivers/grok-build/config.d.ts.map +1 -0
  332. package/lib/drivers/grok-build/config.js +40 -0
  333. package/lib/drivers/grok-build/config.js.map +1 -0
  334. package/lib/drivers/grok-build/index.d.ts +87 -0
  335. package/lib/drivers/grok-build/index.d.ts.map +1 -0
  336. package/lib/drivers/grok-build/index.js +293 -0
  337. package/lib/drivers/grok-build/index.js.map +1 -0
  338. package/lib/drivers/mcp/index.d.ts +37 -4
  339. package/lib/drivers/mcp/index.d.ts.map +1 -1
  340. package/lib/drivers/mcp/index.js +25 -11
  341. package/lib/drivers/mcp/index.js.map +1 -1
  342. package/lib/drivers/shared/acp-events.d.ts +15 -0
  343. package/lib/drivers/shared/acp-events.d.ts.map +1 -0
  344. package/lib/drivers/shared/acp-events.js +83 -0
  345. package/lib/drivers/shared/acp-events.js.map +1 -0
  346. package/lib/drivers/shared/acp-interaction.d.ts +7 -0
  347. package/lib/drivers/shared/acp-interaction.d.ts.map +1 -0
  348. package/lib/drivers/shared/acp-interaction.js +20 -0
  349. package/lib/drivers/shared/acp-interaction.js.map +1 -0
  350. package/lib/drivers/shared/acp-session.d.ts +4 -0
  351. package/lib/drivers/shared/acp-session.d.ts.map +1 -0
  352. package/lib/drivers/shared/acp-session.js +23 -0
  353. package/lib/drivers/shared/acp-session.js.map +1 -0
  354. package/lib/drivers/shared/acp-transport.d.ts +40 -0
  355. package/lib/drivers/shared/acp-transport.d.ts.map +1 -0
  356. package/lib/drivers/shared/acp-transport.js +152 -0
  357. package/lib/drivers/shared/acp-transport.js.map +1 -0
  358. package/lib/drivers/shared/artifacts.d.ts.map +1 -1
  359. package/lib/drivers/shared/artifacts.js +3 -2
  360. package/lib/drivers/shared/artifacts.js.map +1 -1
  361. package/lib/drivers/shared/experiment-behavior.d.ts +13 -0
  362. package/lib/drivers/shared/experiment-behavior.d.ts.map +1 -0
  363. package/lib/drivers/shared/experiment-behavior.js +197 -0
  364. package/lib/drivers/shared/experiment-behavior.js.map +1 -0
  365. package/lib/drivers/shared/experiment-policy.d.ts +4 -0
  366. package/lib/drivers/shared/experiment-policy.d.ts.map +1 -0
  367. package/lib/drivers/shared/experiment-policy.js +143 -0
  368. package/lib/drivers/shared/experiment-policy.js.map +1 -0
  369. package/lib/drivers/subprocess/index.d.ts +39 -4
  370. package/lib/drivers/subprocess/index.d.ts.map +1 -1
  371. package/lib/drivers/subprocess/index.js +56 -12
  372. package/lib/drivers/subprocess/index.js.map +1 -1
  373. package/lib/index.d.ts +22 -8
  374. package/lib/index.d.ts.map +1 -1
  375. package/lib/index.js +20 -6
  376. package/lib/index.js.map +1 -1
  377. package/lib/optimization/reflective.d.ts +3 -1
  378. package/lib/optimization/reflective.d.ts.map +1 -1
  379. package/lib/optimization/reflective.js +3 -2
  380. package/lib/optimization/reflective.js.map +1 -1
  381. package/lib/orchestrator/annotation-loader.d.ts +6 -2
  382. package/lib/orchestrator/annotation-loader.d.ts.map +1 -1
  383. package/lib/orchestrator/annotation-loader.js +8 -0
  384. package/lib/orchestrator/annotation-loader.js.map +1 -1
  385. package/lib/orchestrator/annotation-store.d.ts.map +1 -1
  386. package/lib/orchestrator/annotation-store.js +16 -2
  387. package/lib/orchestrator/annotation-store.js.map +1 -1
  388. package/lib/orchestrator/artifact-origin.d.ts +3 -0
  389. package/lib/orchestrator/artifact-origin.d.ts.map +1 -0
  390. package/lib/orchestrator/artifact-origin.js +40 -0
  391. package/lib/orchestrator/artifact-origin.js.map +1 -0
  392. package/lib/orchestrator/campaign-lifecycle.d.ts +1 -0
  393. package/lib/orchestrator/campaign-lifecycle.d.ts.map +1 -1
  394. package/lib/orchestrator/campaign-lifecycle.js +4 -1
  395. package/lib/orchestrator/campaign-lifecycle.js.map +1 -1
  396. package/lib/orchestrator/candidates.d.ts.map +1 -1
  397. package/lib/orchestrator/candidates.js +3 -2
  398. package/lib/orchestrator/candidates.js.map +1 -1
  399. package/lib/orchestrator/compare.d.ts +19 -3
  400. package/lib/orchestrator/compare.d.ts.map +1 -1
  401. package/lib/orchestrator/compare.js +32 -6
  402. package/lib/orchestrator/compare.js.map +1 -1
  403. package/lib/orchestrator/comparison-identity.d.ts.map +1 -1
  404. package/lib/orchestrator/comparison-identity.js +2 -0
  405. package/lib/orchestrator/comparison-identity.js.map +1 -1
  406. package/lib/orchestrator/config.d.ts +179 -1
  407. package/lib/orchestrator/config.d.ts.map +1 -1
  408. package/lib/orchestrator/config.js +18 -4
  409. package/lib/orchestrator/config.js.map +1 -1
  410. package/lib/orchestrator/discover.d.ts +1 -0
  411. package/lib/orchestrator/discover.d.ts.map +1 -1
  412. package/lib/orchestrator/discover.js +7 -1
  413. package/lib/orchestrator/discover.js.map +1 -1
  414. package/lib/orchestrator/doctor.d.ts +1 -0
  415. package/lib/orchestrator/doctor.d.ts.map +1 -1
  416. package/lib/orchestrator/doctor.js +121 -33
  417. package/lib/orchestrator/doctor.js.map +1 -1
  418. package/lib/orchestrator/driver-capabilities.d.ts +4 -0
  419. package/lib/orchestrator/driver-capabilities.d.ts.map +1 -0
  420. package/lib/orchestrator/driver-capabilities.js +13 -0
  421. package/lib/orchestrator/driver-capabilities.js.map +1 -0
  422. package/lib/orchestrator/driver-identity.d.ts +5 -0
  423. package/lib/orchestrator/driver-identity.d.ts.map +1 -0
  424. package/lib/orchestrator/driver-identity.js +51 -0
  425. package/lib/orchestrator/driver-identity.js.map +1 -0
  426. package/lib/orchestrator/experiment-context.d.ts +51 -3
  427. package/lib/orchestrator/experiment-context.d.ts.map +1 -1
  428. package/lib/orchestrator/experiment-context.js.map +1 -1
  429. package/lib/orchestrator/experiment-contracts.d.ts +30 -1
  430. package/lib/orchestrator/experiment-contracts.d.ts.map +1 -1
  431. package/lib/orchestrator/experiment-corpus.d.ts +2 -1
  432. package/lib/orchestrator/experiment-corpus.d.ts.map +1 -1
  433. package/lib/orchestrator/experiment-corpus.js +28 -22
  434. package/lib/orchestrator/experiment-corpus.js.map +1 -1
  435. package/lib/orchestrator/experiment-effects.d.ts +33 -0
  436. package/lib/orchestrator/experiment-effects.d.ts.map +1 -0
  437. package/lib/orchestrator/experiment-effects.js +44 -0
  438. package/lib/orchestrator/experiment-effects.js.map +1 -0
  439. package/lib/orchestrator/experiment-evaluation.d.ts.map +1 -1
  440. package/lib/orchestrator/experiment-evaluation.js +56 -5
  441. package/lib/orchestrator/experiment-evaluation.js.map +1 -1
  442. package/lib/orchestrator/experiment-identity.d.ts +3 -0
  443. package/lib/orchestrator/experiment-identity.d.ts.map +1 -1
  444. package/lib/orchestrator/experiment-identity.js +22 -33
  445. package/lib/orchestrator/experiment-identity.js.map +1 -1
  446. package/lib/orchestrator/experiment-loader.d.ts +8 -3
  447. package/lib/orchestrator/experiment-loader.d.ts.map +1 -1
  448. package/lib/orchestrator/experiment-preflight.d.ts +3 -0
  449. package/lib/orchestrator/experiment-preflight.d.ts.map +1 -0
  450. package/lib/orchestrator/experiment-preflight.js +21 -0
  451. package/lib/orchestrator/experiment-preflight.js.map +1 -0
  452. package/lib/orchestrator/experiment-report.d.ts +90 -1
  453. package/lib/orchestrator/experiment-report.d.ts.map +1 -1
  454. package/lib/orchestrator/experiment-report.js +9 -1
  455. package/lib/orchestrator/experiment-report.js.map +1 -1
  456. package/lib/orchestrator/experiment-runs.d.ts +61 -2
  457. package/lib/orchestrator/experiment-runs.d.ts.map +1 -1
  458. package/lib/orchestrator/experiment-runs.js +13 -5
  459. package/lib/orchestrator/experiment-runs.js.map +1 -1
  460. package/lib/orchestrator/experiment-runtime-identity.d.ts +0 -16
  461. package/lib/orchestrator/experiment-runtime-identity.d.ts.map +1 -1
  462. package/lib/orchestrator/experiment-runtime-identity.js +5 -220
  463. package/lib/orchestrator/experiment-runtime-identity.js.map +1 -1
  464. package/lib/orchestrator/experiment-selection.d.ts.map +1 -1
  465. package/lib/orchestrator/experiment-selection.js +52 -0
  466. package/lib/orchestrator/experiment-selection.js.map +1 -1
  467. package/lib/orchestrator/experiment.d.ts +3 -3
  468. package/lib/orchestrator/experiment.d.ts.map +1 -1
  469. package/lib/orchestrator/experiment.js +26 -21
  470. package/lib/orchestrator/experiment.js.map +1 -1
  471. package/lib/orchestrator/fixture-identity.d.ts +1 -0
  472. package/lib/orchestrator/fixture-identity.d.ts.map +1 -1
  473. package/lib/orchestrator/fixture-identity.js +6 -1
  474. package/lib/orchestrator/fixture-identity.js.map +1 -1
  475. package/lib/orchestrator/fs-read.d.ts +1 -6
  476. package/lib/orchestrator/fs-read.d.ts.map +1 -1
  477. package/lib/orchestrator/fs-read.js +2 -32
  478. package/lib/orchestrator/fs-read.js.map +1 -1
  479. package/lib/orchestrator/grader-experiment.d.ts +33 -3
  480. package/lib/orchestrator/grader-experiment.d.ts.map +1 -1
  481. package/lib/orchestrator/grader-experiment.js +54 -9
  482. package/lib/orchestrator/grader-experiment.js.map +1 -1
  483. package/lib/orchestrator/grading.d.ts +2 -1
  484. package/lib/orchestrator/grading.d.ts.map +1 -1
  485. package/lib/orchestrator/grading.js +46 -31
  486. package/lib/orchestrator/grading.js.map +1 -1
  487. package/lib/orchestrator/harness-catalog-drift.d.ts +22 -0
  488. package/lib/orchestrator/harness-catalog-drift.d.ts.map +1 -0
  489. package/lib/orchestrator/harness-catalog-drift.js +90 -0
  490. package/lib/orchestrator/harness-catalog-drift.js.map +1 -0
  491. package/lib/orchestrator/harness-registry.d.ts +4 -0
  492. package/lib/orchestrator/harness-registry.d.ts.map +1 -0
  493. package/lib/orchestrator/harness-registry.js +5 -0
  494. package/lib/orchestrator/harness-registry.js.map +1 -0
  495. package/lib/orchestrator/index.d.ts +1 -1
  496. package/lib/orchestrator/index.d.ts.map +1 -1
  497. package/lib/orchestrator/index.js +1 -1
  498. package/lib/orchestrator/index.js.map +1 -1
  499. package/lib/orchestrator/list-runs.d.ts +8 -1
  500. package/lib/orchestrator/list-runs.d.ts.map +1 -1
  501. package/lib/orchestrator/list-runs.js +81 -14
  502. package/lib/orchestrator/list-runs.js.map +1 -1
  503. package/lib/orchestrator/optimization-lifecycle.d.ts.map +1 -1
  504. package/lib/orchestrator/optimization-lifecycle.js +3 -1
  505. package/lib/orchestrator/optimization-lifecycle.js.map +1 -1
  506. package/lib/orchestrator/orchestrator.d.ts +18 -2
  507. package/lib/orchestrator/orchestrator.d.ts.map +1 -1
  508. package/lib/orchestrator/orchestrator.js +50 -168
  509. package/lib/orchestrator/orchestrator.js.map +1 -1
  510. package/lib/orchestrator/paired-effects.d.ts +34 -0
  511. package/lib/orchestrator/paired-effects.d.ts.map +1 -0
  512. package/lib/orchestrator/paired-effects.js +158 -0
  513. package/lib/orchestrator/paired-effects.js.map +1 -0
  514. package/lib/orchestrator/provenance.d.ts +5 -1
  515. package/lib/orchestrator/provenance.d.ts.map +1 -1
  516. package/lib/orchestrator/provenance.js +16 -3
  517. package/lib/orchestrator/provenance.js.map +1 -1
  518. package/lib/orchestrator/regrade.d.ts +9 -1
  519. package/lib/orchestrator/regrade.d.ts.map +1 -1
  520. package/lib/orchestrator/rubric-loader.js +1 -1
  521. package/lib/orchestrator/rubric-loader.js.map +1 -1
  522. package/lib/orchestrator/run-dir.d.ts +2 -0
  523. package/lib/orchestrator/run-dir.d.ts.map +1 -1
  524. package/lib/orchestrator/run-dir.js +1 -1
  525. package/lib/orchestrator/run-dir.js.map +1 -1
  526. package/lib/orchestrator/run-execution.d.ts +3 -0
  527. package/lib/orchestrator/run-execution.d.ts.map +1 -1
  528. package/lib/orchestrator/run-execution.js +66 -12
  529. package/lib/orchestrator/run-execution.js.map +1 -1
  530. package/lib/orchestrator/run-lifecycle.d.ts +1 -0
  531. package/lib/orchestrator/run-lifecycle.d.ts.map +1 -1
  532. package/lib/orchestrator/run-lifecycle.js +3 -2
  533. package/lib/orchestrator/run-lifecycle.js.map +1 -1
  534. package/lib/orchestrator/run-workspace.d.ts +10 -0
  535. package/lib/orchestrator/run-workspace.d.ts.map +1 -0
  536. package/lib/orchestrator/run-workspace.js +58 -0
  537. package/lib/orchestrator/run-workspace.js.map +1 -0
  538. package/lib/orchestrator/suite-compare.d.ts +37 -0
  539. package/lib/orchestrator/suite-compare.d.ts.map +1 -1
  540. package/lib/orchestrator/suite-compare.js +27 -17
  541. package/lib/orchestrator/suite-compare.js.map +1 -1
  542. package/lib/orchestrator/suite-runs.d.ts +6 -1
  543. package/lib/orchestrator/suite-runs.d.ts.map +1 -1
  544. package/lib/orchestrator/suite-runs.js +14 -2
  545. package/lib/orchestrator/suite-runs.js.map +1 -1
  546. package/lib/orchestrator/suite-summary.d.ts +77 -0
  547. package/lib/orchestrator/suite-summary.d.ts.map +1 -1
  548. package/lib/orchestrator/suite-summary.js +61 -12
  549. package/lib/orchestrator/suite-summary.js.map +1 -1
  550. package/lib/previewer/artifacts.d.ts +25 -0
  551. package/lib/previewer/artifacts.d.ts.map +1 -0
  552. package/lib/previewer/artifacts.js +180 -0
  553. package/lib/previewer/artifacts.js.map +1 -0
  554. package/lib/previewer/server.d.ts +111 -0
  555. package/lib/previewer/server.d.ts.map +1 -0
  556. package/lib/previewer/server.js +558 -0
  557. package/lib/previewer/server.js.map +1 -0
  558. package/package.json +3 -3
  559. package/skills/lux-answerer/SKILL.md +2 -2
  560. package/src/answerers/claude-code/index.ts +6 -5
  561. package/src/answerers/persona/index.ts +75 -34
  562. package/src/answerers/terminal/index.ts +8 -12
  563. package/src/assertions/authoring.ts +2 -0
  564. package/src/assertions/core/command-exits-zero.ts +61 -7
  565. package/src/assertions/core/event-checks.ts +64 -3
  566. package/src/assertions/core/helpers.ts +3 -6
  567. package/src/assertions/core/index.ts +2 -0
  568. package/src/assertions/core/resource-checks.ts +38 -5
  569. package/src/assertions/rubric/index.ts +68 -13
  570. package/src/assertions/rubric/internal.ts +227 -27
  571. package/src/authoring.ts +345 -2
  572. package/src/cli/bin.ts +2 -12
  573. package/src/cli/command-runtime.ts +20 -9
  574. package/src/cli/doctor.ts +17 -0
  575. package/src/cli/harness-plan.ts +117 -0
  576. package/src/cli/init-templates.ts +238 -0
  577. package/src/cli/init.ts +53 -184
  578. package/src/cli/output-schemas.ts +106 -0
  579. package/src/cli/program.ts +691 -721
  580. package/src/cli/render/reporter.ts +50 -8
  581. package/src/cli/run-options.ts +132 -25
  582. package/src/cli/view.ts +129 -0
  583. package/src/container/driver.ts +211 -0
  584. package/src/container/protocol.ts +48 -0
  585. package/src/container/resources.ts +153 -0
  586. package/src/container/worker.ts +107 -0
  587. package/src/core/action-events.ts +59 -0
  588. package/src/core/agent-activity.ts +236 -0
  589. package/src/core/agent-environment.ts +64 -0
  590. package/src/core/agent-events.ts +17 -0
  591. package/src/core/annotation.ts +2 -1
  592. package/src/core/answerer.ts +9 -0
  593. package/src/core/artifact-evidence.ts +47 -4
  594. package/src/core/assertion.ts +21 -1
  595. package/src/core/case.ts +21 -3
  596. package/src/core/command-verification.ts +74 -0
  597. package/src/core/driver-execution.ts +84 -0
  598. package/src/core/driver-metrics.ts +51 -0
  599. package/src/core/driver.ts +76 -0
  600. package/src/core/duration.ts +52 -0
  601. package/src/core/environment.ts +22 -0
  602. package/src/core/evaluation-clusters.ts +35 -0
  603. package/src/core/events.ts +14 -2
  604. package/src/core/experiment.ts +64 -24
  605. package/src/core/file-tree.ts +35 -0
  606. package/src/core/global-id.ts +26 -0
  607. package/src/core/harness-catalog.ts +100 -0
  608. package/src/core/harness-catalogs/antigravity.ts +24 -0
  609. package/src/core/harness-catalogs/claude-code.ts +25 -0
  610. package/src/core/harness-catalogs/codex.ts +27 -0
  611. package/src/core/harness-catalogs/copilot.ts +46 -0
  612. package/src/core/harness-catalogs/cursor.ts +13 -0
  613. package/src/core/harness-catalogs/grok-build.ts +19 -0
  614. package/src/core/harness-catalogs/index.ts +31 -0
  615. package/src/core/harness-matrix.ts +316 -0
  616. package/src/core/index.ts +12 -0
  617. package/src/core/lifecycle-fixtures.ts +4 -2
  618. package/src/core/model-cli.ts +52 -23
  619. package/src/core/platform-process.ts +58 -10
  620. package/src/core/run.ts +31 -0
  621. package/src/core/usage.ts +8 -0
  622. package/src/core/wire.ts +5 -1
  623. package/src/drivers/antigravity/README.md +171 -0
  624. package/src/drivers/antigravity/artifacts.ts +37 -0
  625. package/src/drivers/antigravity/config.ts +92 -0
  626. package/src/drivers/antigravity/events.ts +290 -0
  627. package/src/drivers/antigravity/index.ts +132 -0
  628. package/src/drivers/antigravity/runtime.ts +94 -0
  629. package/src/drivers/claude-code/deferred-process.ts +118 -0
  630. package/src/drivers/claude-code/index.ts +216 -281
  631. package/src/drivers/claude-code/isolation.ts +228 -0
  632. package/src/drivers/claude-code/parse-events.ts +98 -12
  633. package/src/drivers/codex/app-events.ts +126 -16
  634. package/src/drivers/codex/config.ts +50 -8
  635. package/src/drivers/codex/exec-events.ts +258 -0
  636. package/src/drivers/codex/index.ts +144 -312
  637. package/src/drivers/copilot/README.md +60 -0
  638. package/src/drivers/copilot/config.ts +61 -0
  639. package/src/drivers/copilot/index.ts +310 -0
  640. package/src/drivers/cursor/README.md +66 -0
  641. package/src/drivers/cursor/config.ts +31 -0
  642. package/src/drivers/cursor/index.ts +326 -0
  643. package/src/drivers/cursor/interaction.ts +74 -0
  644. package/src/drivers/grok-build/README.md +112 -0
  645. package/src/drivers/grok-build/config.ts +43 -0
  646. package/src/drivers/grok-build/index.ts +331 -0
  647. package/src/drivers/mcp/index.ts +25 -11
  648. package/src/drivers/shared/acp-events.ts +94 -0
  649. package/src/drivers/shared/acp-interaction.ts +27 -0
  650. package/src/drivers/shared/acp-session.ts +40 -0
  651. package/src/drivers/shared/acp-transport.ts +187 -0
  652. package/src/drivers/shared/artifacts.ts +6 -2
  653. package/src/drivers/shared/experiment-behavior.ts +214 -0
  654. package/src/drivers/shared/experiment-policy.ts +195 -0
  655. package/src/drivers/subprocess/index.ts +55 -12
  656. package/src/index.ts +115 -10
  657. package/src/optimization/reflective.ts +3 -2
  658. package/src/orchestrator/annotation-loader.ts +10 -0
  659. package/src/orchestrator/annotation-store.ts +24 -3
  660. package/src/orchestrator/artifact-origin.ts +50 -0
  661. package/src/orchestrator/campaign-lifecycle.ts +5 -1
  662. package/src/orchestrator/candidates.ts +3 -2
  663. package/src/orchestrator/compare.ts +41 -6
  664. package/src/orchestrator/comparison-identity.ts +2 -0
  665. package/src/orchestrator/config.ts +20 -3
  666. package/src/orchestrator/discover.ts +8 -1
  667. package/src/orchestrator/doctor.ts +189 -28
  668. package/src/orchestrator/driver-capabilities.ts +21 -0
  669. package/src/orchestrator/driver-identity.ts +69 -0
  670. package/src/orchestrator/experiment-context.ts +3 -2
  671. package/src/orchestrator/experiment-corpus.ts +53 -37
  672. package/src/orchestrator/experiment-effects.ts +61 -0
  673. package/src/orchestrator/experiment-evaluation.ts +71 -10
  674. package/src/orchestrator/experiment-identity.ts +42 -48
  675. package/src/orchestrator/experiment-preflight.ts +27 -0
  676. package/src/orchestrator/experiment-report.ts +21 -1
  677. package/src/orchestrator/experiment-runs.ts +11 -4
  678. package/src/orchestrator/experiment-runtime-identity.ts +5 -243
  679. package/src/orchestrator/experiment-selection.ts +77 -0
  680. package/src/orchestrator/experiment.ts +29 -29
  681. package/src/orchestrator/fixture-identity.ts +9 -1
  682. package/src/orchestrator/fs-read.ts +2 -32
  683. package/src/orchestrator/grader-experiment.ts +74 -13
  684. package/src/orchestrator/grading.ts +67 -28
  685. package/src/orchestrator/harness-catalog-drift.ts +132 -0
  686. package/src/orchestrator/harness-registry.ts +12 -0
  687. package/src/orchestrator/index.ts +1 -0
  688. package/src/orchestrator/list-runs.ts +98 -13
  689. package/src/orchestrator/optimization-lifecycle.ts +4 -1
  690. package/src/orchestrator/orchestrator.ts +92 -216
  691. package/src/orchestrator/paired-effects.ts +209 -0
  692. package/src/orchestrator/provenance.ts +23 -3
  693. package/src/orchestrator/rubric-loader.ts +1 -1
  694. package/src/orchestrator/run-dir.ts +8 -1
  695. package/src/orchestrator/run-execution.ts +77 -11
  696. package/src/orchestrator/run-lifecycle.ts +4 -2
  697. package/src/orchestrator/run-workspace.ts +62 -0
  698. package/src/orchestrator/suite-compare.ts +29 -19
  699. package/src/orchestrator/suite-runs.ts +13 -2
  700. package/src/orchestrator/suite-summary.ts +122 -13
  701. package/src/previewer/artifacts.ts +221 -0
  702. package/src/previewer/server.ts +787 -0
  703. package/viewer/app.css +2079 -0
  704. package/viewer/app.js +627 -0
  705. package/viewer/artifact-view.js +48 -0
  706. package/viewer/charts.js +86 -0
  707. package/viewer/detail.js +1237 -0
  708. package/viewer/format.js +129 -0
  709. package/viewer/index.html +151 -0
  710. package/lib/answerers/scripted/index.d.ts +0 -8
  711. package/lib/answerers/scripted/index.d.ts.map +0 -1
  712. package/lib/answerers/scripted/index.js +0 -163
  713. package/lib/answerers/scripted/index.js.map +0 -1
  714. package/lib/cli/skills.d.ts +0 -38
  715. package/lib/cli/skills.d.ts.map +0 -1
  716. package/lib/cli/skills.js +0 -84
  717. package/lib/cli/skills.js.map +0 -1
  718. package/lib/drivers/shared/secure-copy.d.ts.map +0 -1
  719. package/lib/drivers/shared/secure-copy.js.map +0 -1
  720. package/skills/lux/SKILL.md +0 -85
  721. package/skills/lux/references/cli.md +0 -102
  722. package/skills/lux/references/eval-authoring.md +0 -105
  723. package/src/answerers/scripted/index.ts +0 -186
  724. package/src/cli/skills.ts +0 -129
  725. /package/lib/{drivers/shared → core}/secure-copy.d.ts +0 -0
  726. /package/lib/{drivers/shared → core}/secure-copy.js +0 -0
  727. /package/src/{drivers/shared → core}/secure-copy.ts +0 -0
@@ -1,6 +1,7 @@
1
1
  import { readFile } from "node:fs/promises";
2
2
  import { dirname, join } from "node:path";
3
3
  import { RubricConfigSchema } from "../assertions/rubric/index.js";
4
+ import { assertDisjointClusters } from "../core/evaluation-clusters.js";
4
5
  import {
5
6
  bindSubjectRoot,
6
7
  type Candidate,
@@ -11,16 +12,14 @@ import {
11
12
  } from "../core/index.js";
12
13
  import { assertDisjointAnnotationSplits, selectGraderAnnotations } from "./annotation-loader.js";
13
14
  import { discoverCases, selectCases } from "./discover.js";
14
- import type { CampaignExecutionOptions, EvaluationCorpus } from "./experiment-context.js";
15
+ import { experimentDriverIdentity } from "./driver-identity.js";
16
+ import type {
17
+ CampaignExecutionOptions,
18
+ CorpusSelection,
19
+ EvaluationCorpus,
20
+ } from "./experiment-context.js";
15
21
  import { profileOrThrow } from "./experiment-context.js";
16
- import {
17
- claudeConfigRoot,
18
- claudeUserBehaviorHash,
19
- cliIdentity,
20
- configuredClaudeSourceHashes,
21
- referencedAnswererCli,
22
- referencedCli,
23
- } from "./experiment-runtime-identity.js";
22
+ import { cliIdentity, referencedAnswererCli } from "./experiment-runtime-identity.js";
24
23
  import { fixtureIdentity } from "./fixture-identity.js";
25
24
  import { loadEvalCase } from "./loader.js";
26
25
  import { resolveAnswererReference, resolveDriverReference } from "./orchestrator.js";
@@ -123,8 +122,6 @@ export const agentCorpusHash = async (
123
122
  .map((evalCase) => [evalCase.path, evalCase]),
124
123
  ).values(),
125
124
  ];
126
- const caseBehaviorHashes = new Map<string, Promise<string | null>>();
127
- const configuredSourceHashes = new Map<string, Promise<string>>();
128
125
  const definitions = await Promise.all(
129
126
  selected.map(async (evalCase) => {
130
127
  const authored = await loadEvalCase(evalCase.path);
@@ -133,39 +130,26 @@ export const agentCorpusHash = async (
133
130
  execution.loaded.campaign.profiles.map(async (profileId) => {
134
131
  const profile = profileOrThrow(execution.config, profileId);
135
132
  const harness = profile.harness ?? execution.config.harness;
136
- const driver = resolveDriverReference(
137
- bound,
138
- profile.driver ?? execution.config.defaultDriver,
133
+ const driver = bindSubjectRoot(
134
+ resolveDriverReference(bound, profile.driver ?? execution.config.defaultDriver),
135
+ execution.loaded.subjectRoot,
139
136
  );
140
- const answerer = resolveAnswererReference(
141
- bound,
142
- profile.answerer ?? execution.config.defaultAnswerer,
143
- harness,
137
+ const answerer = bindSubjectRoot(
138
+ resolveAnswererReference(
139
+ bound,
140
+ profile.answerer ?? execution.config.defaultAnswerer,
141
+ harness,
142
+ ),
143
+ execution.loaded.subjectRoot,
144
144
  );
145
- const driverCli = referencedCli(driver);
146
145
  const answererCli = referencedAnswererCli(answerer);
147
- const configuredRoot =
148
- driverCli?.name === "claude-code" ? claudeConfigRoot(driver) : null;
149
- let driverClaudeBehaviorHash: string | null = null;
150
- if (configuredRoot) {
151
- let hash = caseBehaviorHashes.get(configuredRoot);
152
- if (!hash) {
153
- hash = claudeUserBehaviorHash(configuredRoot);
154
- caseBehaviorHashes.set(configuredRoot, hash);
155
- }
156
- driverClaudeBehaviorHash = await hash;
157
- }
158
146
  return {
159
147
  profileId,
160
148
  driver,
161
- driverCliIdentity: driverCli
162
- ? await cliIdentity(driverCli.command, execution.config.rootDir)
163
- : null,
164
- driverClaudeBehaviorHash,
165
- configuredDriverSources: await configuredClaudeSourceHashes(
149
+ driverIdentity: await experimentDriverIdentity(
166
150
  driver,
151
+ execution.registry,
167
152
  execution.config.rootDir,
168
- configuredSourceHashes,
169
153
  ),
170
154
  answerer,
171
155
  answererCliIdentity: answererCli
@@ -275,6 +259,21 @@ export const graderCorpusHash = async (
275
259
  export const prepareCorpus = async (
276
260
  execution: CampaignExecutionOptions,
277
261
  ): Promise<EvaluationCorpus> => {
262
+ const corpus = await inspectCorpus(execution);
263
+ if (corpus.kind === "grader") return corpus;
264
+ return {
265
+ ...corpus,
266
+ hash: await agentCorpusHash(
267
+ execution,
268
+ corpus.cases,
269
+ selectorsBySplit(execution.loaded.campaign),
270
+ ),
271
+ };
272
+ };
273
+
274
+ export const inspectCorpus = async (
275
+ execution: CampaignExecutionOptions,
276
+ ): Promise<CorpusSelection> => {
278
277
  const campaign = execution.loaded.campaign;
279
278
  const splits = selectorsBySplit(campaign);
280
279
  if (campaign.evaluation.kind === "grader") {
@@ -303,6 +302,24 @@ export const prepareCorpus = async (
303
302
  );
304
303
  }
305
304
  const owners = new Map<string, string>();
305
+ assertDisjointClusters(
306
+ splits.map((split) => ({
307
+ name: split.name,
308
+ items: selectCases(discovery.cases, split.selector),
309
+ })),
310
+ );
311
+ for (const constraint of campaign.objectives.constraints) {
312
+ if (constraint.confidence?.method !== "wilson") continue;
313
+ const selector = splits.find((split) => split.name === constraint.split)?.selector;
314
+ if (
315
+ selector &&
316
+ selectCases(discovery.cases, selector).some((evalCase) => evalCase.cluster !== undefined)
317
+ ) {
318
+ throw new Error(
319
+ "authored case clusters produce bounded means; use Hoeffding or percentile-bootstrap confidence instead of Wilson",
320
+ );
321
+ }
322
+ }
306
323
  const caseIds = new Map<string, string>();
307
324
  const evidenceOwners = new Map<
308
325
  string,
@@ -349,7 +366,6 @@ export const prepareCorpus = async (
349
366
  return {
350
367
  kind: "agent",
351
368
  cases: discovery.cases,
352
- hash: await agentCorpusHash(execution, discovery.cases, splits),
353
369
  };
354
370
  };
355
371
 
@@ -0,0 +1,61 @@
1
+ import { z } from "zod";
2
+ import { ConfidenceConfigSchema } from "../core/index.js";
3
+ import type { ExperimentRun } from "./experiment-runs.js";
4
+ import { candidateEvaluations } from "./experiment-selection.js";
5
+ import { PairedEffectSchema, pairedEffect } from "./paired-effects.js";
6
+
7
+ export const ExperimentEffectsSchema = z.array(
8
+ PairedEffectSchema.extend({
9
+ candidateId: z.string(),
10
+ profileId: z.string(),
11
+ split: z.enum(["train", "validation", "test"]),
12
+ metric: z.string(),
13
+ }),
14
+ );
15
+
16
+ export const experimentEffects = (
17
+ experiment: ExperimentRun,
18
+ ): z.infer<typeof ExperimentEffectsSchema> => {
19
+ const candidateIds =
20
+ experiment.selection?.decisionCandidateIds ??
21
+ experiment.candidates.map((candidate) => candidate.id);
22
+ const baseline = candidateEvaluations(experiment, "baseline");
23
+ const metrics = new Set([
24
+ "quality.passRate",
25
+ experiment.evaluationKind === "grader" ? "harness.total" : "agent.total",
26
+ ...(experiment.evaluationKind === "agent" ? ["interrupts.ask", "toolCalls"] : []),
27
+ ...experiment.campaignSnapshot.objectives.constraints
28
+ .filter((constraint) => constraint.relativeTo)
29
+ .map((constraint) => constraint.metric),
30
+ ]);
31
+ return candidateIds
32
+ .filter((id) => id !== "baseline")
33
+ .flatMap((candidateId) =>
34
+ candidateEvaluations(experiment, candidateId).flatMap((after) =>
35
+ [...metrics].map((metric) => {
36
+ const before = baseline.find(
37
+ (entry) => entry.profileId === after.profileId && entry.split === after.split,
38
+ );
39
+ const constraint = experiment.campaignSnapshot.objectives.constraints.find(
40
+ (entry) =>
41
+ entry.relativeTo &&
42
+ entry.metric === metric &&
43
+ entry.split === after.split &&
44
+ (!entry.profile || entry.profile === after.profileId),
45
+ );
46
+ const confidence =
47
+ constraint?.confidence ??
48
+ ConfidenceConfigSchema.parse({
49
+ method: metric === "quality.passRate" ? "hoeffding" : "percentile-bootstrap",
50
+ });
51
+ return {
52
+ candidateId,
53
+ profileId: after.profileId,
54
+ split: after.split,
55
+ metric,
56
+ ...pairedEffect(before, after, metric, confidence),
57
+ };
58
+ }),
59
+ ),
60
+ );
61
+ };
@@ -2,10 +2,7 @@ import { randomUUID } from "node:crypto";
2
2
  import { rm } from "node:fs/promises";
3
3
  import { join } from "node:path";
4
4
  import { z } from "zod";
5
- import {
6
- createRubricAssertion,
7
- RubricModelAccountingDetailSchema,
8
- } from "../assertions/rubric/index.js";
5
+ import { RubricModelAccountingDetailSchema } from "../assertions/rubric/index.js";
9
6
  import {
10
7
  addUsage,
11
8
  type Candidate,
@@ -17,6 +14,7 @@ import {
17
14
  valueHash,
18
15
  } from "../core/index.js";
19
16
  import { materializeCandidate } from "./candidates.js";
17
+ import { runComparisonIdentity } from "./comparison-identity.js";
20
18
  import { readContentBoundJson, writeContentBoundJson } from "./content-bound-json.js";
21
19
  import { type discoverCases, selectCases } from "./discover.js";
22
20
  import { ensureBudget, throwIfAborted } from "./experiment-budget.js";
@@ -25,8 +23,10 @@ import { profileOrThrow } from "./experiment-context.js";
25
23
  import type { ExperimentEvaluation, OpenedExperimentRun } from "./experiment-runs.js";
26
24
  import { average } from "./experiment-selection.js";
27
25
  import { evaluateGraderCandidate } from "./grader-experiment.js";
26
+ import { registryWithHarness } from "./harness-registry.js";
28
27
  import { loadEvalCase } from "./loader.js";
29
28
  import { Orchestrator, type SuiteCaseResult, type SuiteItem } from "./orchestrator.js";
29
+ import { clusterCaseSamples, groupedCaseMetricSamples } from "./paired-effects.js";
30
30
  import { loadSuiteSummary, type SuiteSummary } from "./suite-summary.js";
31
31
 
32
32
  type ExperimentSplit = "train" | "validation" | "test";
@@ -101,6 +101,23 @@ const evaluationMetrics = (
101
101
  ),
102
102
  });
103
103
 
104
+ const evaluationMetricDefinitions = (summary: SuiteSummary) =>
105
+ Object.fromEntries(
106
+ Object.entries(summary.metrics).flatMap(([name, metric]) => {
107
+ if (!metric.unit && !metric.label && !metric.better) return [];
108
+ return [
109
+ [
110
+ name,
111
+ {
112
+ unit: metric.unit ?? "number",
113
+ better: metric.better ?? "neutral",
114
+ ...(metric.label ? { label: metric.label } : {}),
115
+ },
116
+ ],
117
+ ];
118
+ }),
119
+ );
120
+
104
121
  const summaryUsage = (summary: SuiteSummary) =>
105
122
  summary.samples.reduce(
106
123
  (usage, sample) =>
@@ -263,8 +280,36 @@ const agentEvaluationFromSuite = (input: {
263
280
  summary: SuiteSummary;
264
281
  results: readonly SuiteCaseResult[];
265
282
  suiteDir: string;
283
+ evaluationHash: string | undefined;
284
+ clusterId: string | undefined;
266
285
  }): CandidateEvaluation => {
267
286
  const { candidate, profileId, split, summary, results, suiteDir } = input;
287
+ const caseSamples = clusterCaseSamples(
288
+ summary.samples.map((sample) => {
289
+ const metadata = results.find((result) => result.caseId === sample.caseId)?.result?.metadata;
290
+ // Validated assertion configs contain a fresh candidate workspace path.
291
+ // The campaign identity binds the authored evaluator without that incidental path.
292
+ const identityHash =
293
+ metadata?.provenance && input.evaluationHash
294
+ ? runComparisonIdentity({
295
+ ...metadata,
296
+ provenance: { ...metadata.provenance, evaluatorConfigHash: input.evaluationHash },
297
+ })
298
+ : null;
299
+ return {
300
+ [sample.canonicalCaseId]: {
301
+ identityHash,
302
+ ...(input.clusterId ? { clusterId: input.clusterId } : {}),
303
+ metrics: Object.fromEntries(
304
+ Object.entries({
305
+ ...sample.metrics,
306
+ "quality.passRate": sample.passed === true ? 1 : 0,
307
+ }).map(([name, value]) => [name, { mean: value, n: 1 }]),
308
+ ),
309
+ },
310
+ };
311
+ }),
312
+ );
268
313
  const modelAccounting = results.map((result) =>
269
314
  modelAccountingFromMetadata(result.result?.metadata ?? null),
270
315
  );
@@ -277,7 +322,9 @@ const agentEvaluationFromSuite = (input: {
277
322
  summary.cases.map((entry) => [entry.canonicalCaseId, entry.passRate]),
278
323
  ),
279
324
  metrics: evaluationMetrics(summary, candidate),
325
+ metricDefinitions: evaluationMetricDefinitions(summary),
280
326
  samples: evaluationSamples(summary),
327
+ ...(caseSamples ? { caseSamples } : {}),
281
328
  metricCalls: summary.samples.length,
282
329
  judgeCalls: results.reduce(
283
330
  (total, result) =>
@@ -344,7 +391,7 @@ const aggregateAgentUnits = (
344
391
  caseValues.set(evaluatedCaseId, values);
345
392
  }
346
393
  }
347
- const samples = Object.fromEntries(
394
+ const ungroupedSamples = Object.fromEntries(
348
395
  [...samplesByCase].map(([name, byCase]) => [
349
396
  name,
350
397
  [...byCase.entries()]
@@ -352,6 +399,13 @@ const aggregateAgentUnits = (
352
399
  .map(([, values]) => average(values)),
353
400
  ]),
354
401
  );
402
+ const metricDefinitions = Object.assign(
403
+ {},
404
+ ...units.map(({ evaluation }) => evaluation.metricDefinitions ?? {}),
405
+ );
406
+ const caseSamples = clusterCaseSamples(units.map((unit) => unit.evaluation.caseSamples));
407
+ const grouped = groupedCaseMetricSamples(caseSamples, repetitions);
408
+ const samples = grouped ?? ungroupedSamples;
355
409
  return {
356
410
  candidateId: candidate.id,
357
411
  profileId,
@@ -362,12 +416,16 @@ const aggregateAgentUnits = (
362
416
  [...caseValues].map(([caseId, values]) => [caseId, average(values)]),
363
417
  ),
364
418
  metrics: Object.fromEntries(
365
- [...metricValues].map(([name, values]) => [
366
- name,
367
- name === "subject.bytes" ? candidate.sourceBytes : average(values),
368
- ]),
419
+ [...metricValues]
420
+ .filter(([name]) => !grouped || name === "subject.bytes" || Object.hasOwn(grouped, name))
421
+ .map(([name, values]) => [
422
+ name,
423
+ name === "subject.bytes" ? candidate.sourceBytes : average(grouped?.[name] ?? values),
424
+ ]),
369
425
  ),
426
+ metricDefinitions,
370
427
  samples,
428
+ ...(caseSamples ? { caseSamples } : {}),
371
429
  metricCalls: units.reduce((total, unit) => total + (unit.evaluation.metricCalls ?? 0), 0),
372
430
  judgeCalls: units.reduce((total, unit) => total + (unit.evaluation.judgeCalls ?? 0), 0),
373
431
  unpricedModelCalls: units.reduce(
@@ -436,8 +494,9 @@ export const evaluateAgentCandidate = async (options: {
436
494
  const profile = profileOrThrow(execution.config, profileId);
437
495
  const harness = profile.harness ?? execution.config.harness;
438
496
  const defaultDriver = profile.driver ?? execution.config.defaultDriver;
439
- const registry = execution.registry.withAssertion(createRubricAssertion(harness));
497
+ const registry = registryWithHarness(execution.registry, execution.config, harness);
440
498
  const orchestrator = new Orchestrator({
499
+ environment: profile.environment ?? execution.config.environment,
441
500
  registry,
442
501
  defaultAnswerer: profile.answerer ?? execution.config.defaultAnswerer,
443
502
  ...(defaultDriver ? { defaultDriver } : {}),
@@ -606,6 +665,8 @@ export const evaluateAgentCandidate = async (options: {
606
665
  summary,
607
666
  results: suite.results,
608
667
  suiteDir: suite.suiteDir,
668
+ evaluationHash: experiment.manifest.evaluationHash,
669
+ clusterId: evalCase.cluster,
609
670
  });
610
671
  } finally {
611
672
  await rm(unitRoot, { recursive: true, force: true });
@@ -5,20 +5,17 @@ import { ReflectiveOptimizerConfigSchema } from "../optimization/reflective.js";
5
5
  import { authoredDependencyGraphHash } from "./authored-dependencies.js";
6
6
  import { assertValidationArgumentsBound } from "./candidates.js";
7
7
  import { selectCases } from "./discover.js";
8
+ import { experimentDriverIdentity, referencedDriverRuntime } from "./driver-identity.js";
8
9
  import { evaluatorImplementationHash } from "./evaluator-identity.js";
9
10
  import type { CampaignExecutionOptions, EvaluationCorpus } from "./experiment-context.js";
10
11
  import { profileOrThrow } from "./experiment-context.js";
11
12
  import { caseRubricCliReferences, selectorsBySplit } from "./experiment-corpus.js";
12
13
  import {
13
- claudeConfigRoot,
14
- claudeUserBehaviorHash,
15
14
  cliIdentity,
16
- configuredClaudeSourceHashes,
17
15
  LUX_VERSION,
18
16
  type RuntimeCliReference,
19
17
  RuntimeCliReferenceSchema,
20
18
  referencedAnswererCli,
21
- referencedCli,
22
19
  runtimeCliIdentityHashForReferences,
23
20
  } from "./experiment-runtime-identity.js";
24
21
  import { loadEvalCase } from "./loader.js";
@@ -33,15 +30,6 @@ import { validatePluginConfig } from "./validate-plugin-config.js";
33
30
  export const resolvedProfileSnapshot = async (
34
31
  execution: CampaignExecutionOptions,
35
32
  ): Promise<Record<string, unknown>> => {
36
- const behaviorHashes = new Map<string, Promise<string | null>>();
37
- const configuredSourceHashes = new Map<string, Promise<string>>();
38
- const behaviorHash = (root: string): Promise<string | null> => {
39
- const existing = behaviorHashes.get(root);
40
- if (existing) return existing;
41
- const created = claudeUserBehaviorHash(root);
42
- behaviorHashes.set(root, created);
43
- return created;
44
- };
45
33
  return Object.fromEntries(
46
34
  await Promise.all(
47
35
  execution.loaded.campaign.profiles.map(async (profileId) => {
@@ -53,20 +41,12 @@ export const resolvedProfileSnapshot = async (
53
41
  execution.loaded.campaign.evaluation.kind === "agent"
54
42
  ? (profile.driver ?? execution.config.defaultDriver)
55
43
  : undefined;
56
- const driverCli = referencedCli(driver);
57
44
  const harness = profile.harness ?? execution.config.harness;
58
45
  const answerer =
59
46
  execution.loaded.campaign.evaluation.kind === "agent"
60
47
  ? (profile.answerer ?? execution.config.defaultAnswerer)
61
48
  : undefined;
62
49
  const answererCli = referencedAnswererCli(answerer);
63
- const driverUserBehaviorHash =
64
- driverCli?.name === "claude-code" ? await behaviorHash(claudeConfigRoot(driver)) : null;
65
- const driverConfiguredSources = await configuredClaudeSourceHashes(
66
- driver,
67
- execution.config.rootDir,
68
- configuredSourceHashes,
69
- );
70
50
  let harnessCommand = harness?.command;
71
51
  if (!harnessCommand) {
72
52
  harnessCommand = harness?.provider === "codex" ? "codex" : "claude";
@@ -80,17 +60,15 @@ export const resolvedProfileSnapshot = async (
80
60
  profileId,
81
61
  {
82
62
  id: profileId,
63
+ environment: profile.environment ?? execution.config.environment ?? null,
64
+ configuredConcurrency: execution.config.concurrency,
65
+ evaluationConcurrency: 1,
83
66
  driver: driver ?? null,
84
- driverCliIdentity: driverCli
85
- ? await cliIdentity(driverCli.command, execution.config.rootDir)
86
- : null,
87
- ...(driverCli?.name === "claude-code"
88
- ? {
89
- driverClaudeConfigRoot: claudeConfigRoot(driver),
90
- driverUserBehaviorHash,
91
- driverConfiguredSources,
92
- }
93
- : {}),
67
+ driverIdentity: await experimentDriverIdentity(
68
+ driver,
69
+ execution.registry,
70
+ execution.config.rootDir,
71
+ ),
94
72
  answerer,
95
73
  answererCliIdentity: answererCli
96
74
  ? await cliIdentity(answererCli.command, execution.config.rootDir)
@@ -130,7 +108,11 @@ const trustedExecutableEntrypoints = async (
130
108
  }
131
109
  for (const profileId of execution.loaded.campaign.profiles) {
132
110
  const profile = profileOrThrow(execution.config, profileId);
133
- add(referencedCli(profile.driver ?? execution.config.defaultDriver)?.command);
111
+ for (const command of referencedDriverRuntime(
112
+ profile.driver ?? execution.config.defaultDriver,
113
+ execution.registry,
114
+ ).commands)
115
+ add(command);
134
116
  add(referencedAnswererCli(profile.answerer ?? execution.config.defaultAnswerer)?.command);
135
117
  add((profile.harness ?? execution.config.harness)?.command);
136
118
  }
@@ -147,7 +129,15 @@ const trustedExecutableEntrypoints = async (
147
129
  await loadEvalCase(evalCase.path),
148
130
  execution.loaded.subjectRoot,
149
131
  );
150
- add(referencedCli(authored.driver)?.command);
132
+ for (const profileId of execution.loaded.campaign.profiles) {
133
+ const profile = profileOrThrow(execution.config, profileId);
134
+ const driver = bindSubjectRoot(
135
+ resolveDriverReference(authored, profile.driver ?? execution.config.defaultDriver),
136
+ execution.loaded.subjectRoot,
137
+ );
138
+ for (const command of referencedDriverRuntime(driver, execution.registry).commands)
139
+ add(command);
140
+ }
151
141
  add(referencedAnswererCli(authored.answerer)?.command);
152
142
  for (const reference of caseRubricCliReferences(execution, authored)) {
153
143
  add(reference.command);
@@ -207,16 +197,20 @@ export const runtimeCliReferences = async (
207
197
  for (const profileId of execution.loaded.campaign.profiles) {
208
198
  const profile = profileOrThrow(execution.config, profileId);
209
199
  const harness = profile.harness ?? execution.config.harness;
210
- const driver = resolveDriverReference(
211
- authored,
212
- profile.driver ?? execution.config.defaultDriver,
200
+ const driver = bindSubjectRoot(
201
+ resolveDriverReference(authored, profile.driver ?? execution.config.defaultDriver),
202
+ execution.loaded.subjectRoot,
213
203
  );
214
- const answerer = resolveAnswererReference(
215
- authored,
216
- profile.answerer ?? execution.config.defaultAnswerer,
217
- harness,
204
+ const answerer = bindSubjectRoot(
205
+ resolveAnswererReference(
206
+ authored,
207
+ profile.answerer ?? execution.config.defaultAnswerer,
208
+ harness,
209
+ ),
210
+ execution.loaded.subjectRoot,
218
211
  );
219
- add(referencedCli(driver)?.command, execution.config.rootDir);
212
+ for (const command of referencedDriverRuntime(driver, execution.registry).commands)
213
+ add(command, execution.config.rootDir);
220
214
  add(referencedAnswererCli(answerer)?.command, execution.config.rootDir);
221
215
  }
222
216
  for (const reference of caseRubricCliReferences(execution, authored)) {
@@ -262,9 +256,9 @@ const authoredConfigDependencyHash = async (
262
256
  }
263
257
  return authoredDependencyGraphHash(configRoot, [...entrypoints]);
264
258
  };
265
- const validateAgentCaseProfileDrivers = async (
259
+ export const validateAgentCaseProfileDrivers = async (
266
260
  execution: CampaignExecutionOptions,
267
- corpus: Extract<EvaluationCorpus, { kind: "agent" }>,
261
+ corpus: Pick<Extract<EvaluationCorpus, { kind: "agent" }>, "cases">,
268
262
  ): Promise<void> => {
269
263
  const selected = [
270
264
  ...new Map(
@@ -280,13 +274,12 @@ const validateAgentCaseProfileDrivers = async (
280
274
  );
281
275
  for (const profileId of execution.loaded.campaign.profiles) {
282
276
  const profile = profileOrThrow(execution.config, profileId);
283
- const reference = resolveDriverReference(
284
- authored,
285
- profile.driver ?? execution.config.defaultDriver,
277
+ const reference = bindSubjectRoot(
278
+ resolveDriverReference(authored, profile.driver ?? execution.config.defaultDriver),
279
+ execution.loaded.subjectRoot,
286
280
  );
287
281
  const name = typeof reference === "string" ? reference : reference.name;
288
282
  const rawConfig = typeof reference === "object" ? reference.config : undefined;
289
- boundExperimentDriverConfig(name, rawConfig, "identity-check");
290
283
  const plugin = execution.registry.getDriver(name);
291
284
  if (!plugin) {
292
285
  throw new Error(
@@ -298,7 +291,7 @@ const validateAgentCaseProfileDrivers = async (
298
291
  rawConfig,
299
292
  `case '${evalCase.id}' profile '${profileId}' driver '${name}'`,
300
293
  );
301
- boundExperimentDriverConfig(name, validated, "identity-check");
294
+ boundExperimentDriverConfig(plugin, validated, "identity-check");
302
295
  }
303
296
  }
304
297
  };
@@ -334,6 +327,7 @@ export const evaluationIdentity = async (
334
327
  luxVersion: LUX_VERSION,
335
328
  evaluatorImplementationHash: await evaluatorImplementationHash(),
336
329
  runtime: runtimeIdentity(),
330
+ concurrency: execution.config.concurrency,
337
331
  corpusHash: corpus.hash,
338
332
  profiles,
339
333
  configSourceHash,
@@ -0,0 +1,27 @@
1
+ import { assertValidationArgumentsBound } from "./candidates.js";
2
+ import {
3
+ type CampaignExecutionOptions,
4
+ type CorpusSelection,
5
+ profileOrThrow,
6
+ } from "./experiment-context.js";
7
+ import { inspectCorpus, prepareCorpus } from "./experiment-corpus.js";
8
+ import { evaluationIdentity, validateAgentCaseProfileDrivers } from "./experiment-identity.js";
9
+
10
+ export const preparePlanningCorpus = async (
11
+ execution: CampaignExecutionOptions,
12
+ mode: "experiment" | "optimize",
13
+ staticChecks: boolean,
14
+ ): Promise<CorpusSelection> => {
15
+ if (!staticChecks) {
16
+ const corpus = await prepareCorpus(execution);
17
+ await evaluationIdentity(execution, corpus, mode);
18
+ return corpus;
19
+ }
20
+ const corpus = await inspectCorpus(execution);
21
+ const campaign = execution.loaded.campaign;
22
+ for (const profileId of campaign.profiles) profileOrThrow(execution.config, profileId);
23
+ if (corpus.kind === "agent") await validateAgentCaseProfileDrivers(execution, corpus);
24
+ for (const validation of campaign.subject.validate)
25
+ assertValidationArgumentsBound(execution.loaded.subjectRoot, validation.args);
26
+ return corpus;
27
+ };
@@ -2,6 +2,7 @@ import { basename } from "node:path";
2
2
  import { z } from "zod";
3
3
  import { valueHash } from "../core/index.js";
4
4
  import { deriveExperimentSelection, rankCandidates } from "./experiment.js";
5
+ import { ExperimentEffectsSchema, experimentEffects } from "./experiment-effects.js";
5
6
  import {
6
7
  type ExperimentRun,
7
8
  ExperimentRunSchema,
@@ -24,6 +25,7 @@ export const ExperimentDecisionReportSchema = z
24
25
  status: z.enum(["running", "passed", "failed", "aborted"]),
25
26
  outcome: z.enum(["promote", "retain", "reject", "error", "incomplete"]),
26
27
  error: z.string().nullable(),
28
+ effects: z.exactOptional(ExperimentEffectsSchema),
27
29
  candidateAndAccountingVerified: z.boolean(),
28
30
  championCandidateId: z.string().nullable(),
29
31
  ranking: z.array(z.string()),
@@ -39,6 +41,7 @@ export const ExperimentDecisionReportSchema = z
39
41
  z
40
42
  .object({
41
43
  metric: z.string(),
44
+ relativeTo: z.exactOptional(z.literal("baseline")),
42
45
  profile: z.string().nullable(),
43
46
  split: ExperimentReportSplitSchema,
44
47
  passed: z.boolean(),
@@ -596,6 +599,7 @@ const projectExperimentDecisionReport = (
596
599
  evaluationKind: experiment.evaluationKind,
597
600
  status: experiment.status,
598
601
  error: experiment.errorMessage ?? null,
602
+ effects: experimentEffects(experiment),
599
603
  candidateAndAccountingVerified,
600
604
  outcome: reportOutcome(experiment, championId),
601
605
  championCandidateId: championId,
@@ -610,6 +614,7 @@ const projectExperimentDecisionReport = (
610
614
  .filter((constraint) => constraint.candidateId === targetId)
611
615
  .map((constraint) => ({
612
616
  metric: constraint.metric,
617
+ ...(constraint.relativeTo ? { relativeTo: constraint.relativeTo } : {}),
613
618
  profile: constraint.profile ?? null,
614
619
  split: constraint.split,
615
620
  passed: constraint.passed,
@@ -733,7 +738,7 @@ export const formatExperimentDecisionMarkdown = (report: ExperimentDecisionRepor
733
738
  "| --- | --- | --- | --- | ---: | --- | --- |",
734
739
  ...report.gates.map(
735
740
  (gate) =>
736
- `| ${gate.passed ? "PASS" : "FAIL"} | ${markdown(gate.metric)} | ${markdown(gate.profile ?? "all")} | ${gate.split} | ${gate.values.map(concise).join(", ") || "—"} | ${markdown(gate.interval ?? "—")} | ${markdown(gate.note ?? "—")} |`,
741
+ `| ${gate.passed ? "PASS" : "FAIL"} | ${markdown(gate.metric)}${gate.relativeTo ? " Δ baseline" : ""} | ${markdown(gate.profile ?? "all")} | ${gate.split} | ${gate.values.map(concise).join(", ") || "—"} | ${markdown(gate.interval ?? "—")} | ${markdown(gate.note ?? "—")} |`,
737
742
  ),
738
743
  );
739
744
  }
@@ -763,6 +768,21 @@ export const formatExperimentDecisionMarkdown = (report: ExperimentDecisionRepor
763
768
  ),
764
769
  );
765
770
  }
771
+ if (report.effects?.length) {
772
+ lines.push(
773
+ "",
774
+ "## Paired case effects",
775
+ "",
776
+ "Differences are candidate minus baseline; repetitions are averaged within cases and authored clusters receive equal weight.",
777
+ "",
778
+ "| Candidate | Profile | Split | Metric | Mean difference | Cases | Clusters | Confidence | Note |",
779
+ "| --- | --- | --- | --- | ---: | ---: | ---: | --- | --- |",
780
+ ...report.effects.map(
781
+ (effect) =>
782
+ `| ${markdown(effect.candidateId)} | ${markdown(effect.profileId)} | ${effect.split} | ${markdown(effect.metric)} | ${effect.meanDelta === null ? "—" : signed(effect.meanDelta)} | ${effect.caseCount ?? effect.caseIds.length} | ${effect.n} | ${markdown(intervalText(effect.interval ?? undefined) ?? "—")} | ${markdown(effect.note ?? "—")} |`,
783
+ ),
784
+ );
785
+ }
766
786
  lines.push(
767
787
  "",
768
788
  "## Source and spend",