reeval 0.10.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. package/README.md +64 -39
  2. package/THIRD_PARTY_NOTICES.md +75 -106
  3. package/bin/mcp-timer.cjs +224 -0
  4. package/dist/{adapter-DWlpOtRn.js → adapter-DigeVFWC.js} +3 -3
  5. package/dist/{adapter-DWlpOtRn.js.map → adapter-DigeVFWC.js.map} +1 -1
  6. package/dist/{agent-CaS_2Sce.js → agent-CatUEo5h.js} +21 -6
  7. package/dist/{agent-CaS_2Sce.js.map → agent-CatUEo5h.js.map} +1 -1
  8. package/dist/{assemble-B9Alds-z.js → assemble-CF063ms6.js} +19 -17
  9. package/dist/assemble-CF063ms6.js.map +1 -0
  10. package/dist/assemble-CJoD_Rzr.js +1 -0
  11. package/dist/bridge/index.mjs +15 -7
  12. package/dist/{capture-CNb9SuU5.js → capture-BiD7lVaM.js} +26 -18
  13. package/dist/{capture-CNb9SuU5.js.map → capture-BiD7lVaM.js.map} +1 -1
  14. package/dist/capture-Dp3q7K7Y.js +1 -0
  15. package/dist/{cli-D303Vj5N.js → cli-B5zQCR2r.js} +266 -547
  16. package/dist/cli-B5zQCR2r.js.map +1 -0
  17. package/dist/{cli-spec-BPZbQG2p.js → cli-spec-BXIBUlaK.js} +46 -18
  18. package/dist/cli-spec-BXIBUlaK.js.map +1 -0
  19. package/dist/cli.js +2 -2
  20. package/dist/{command-BT9a37ZR.js → command-BMHXHqMT.js} +17 -14
  21. package/dist/command-BMHXHqMT.js.map +1 -0
  22. package/dist/command-C94CQNh8.js +91 -0
  23. package/dist/command-C94CQNh8.js.map +1 -0
  24. package/dist/command-CVtgyqlM.js +335 -0
  25. package/dist/command-CVtgyqlM.js.map +1 -0
  26. package/dist/{command-BLfT7vnQ.js → command-CaZgCTIw.js} +13 -17
  27. package/dist/command-CaZgCTIw.js.map +1 -0
  28. package/dist/{command-CMJtHKRa.js → command-DTgBZR0k.js} +6 -6
  29. package/dist/{command-CMJtHKRa.js.map → command-DTgBZR0k.js.map} +1 -1
  30. package/dist/{commands-1p-bIWhN.js → commands-BXzIDB3X.js} +1 -1
  31. package/dist/commands-CjpGBUWr.js +666 -0
  32. package/dist/commands-CjpGBUWr.js.map +1 -0
  33. package/dist/{config-DEgnUiU-.js → config-Dv5MG7Rp.js} +31 -34
  34. package/dist/config-Dv5MG7Rp.js.map +1 -0
  35. package/dist/{context-C1mxXh80.js → context-Dgn48BqT.js} +13 -2
  36. package/dist/context-Dgn48BqT.js.map +1 -0
  37. package/dist/contrasts-CcoMLC_y.js +101 -0
  38. package/dist/contrasts-CcoMLC_y.js.map +1 -0
  39. package/dist/db-BeqRiWLl.js +602 -0
  40. package/dist/db-BeqRiWLl.js.map +1 -0
  41. package/dist/db-CJDRVQal.js +2 -0
  42. package/dist/{dist-B8hJImYt.js → dist-CMjp3qqF.js} +81 -14
  43. package/dist/dist-CMjp3qqF.js.map +1 -0
  44. package/dist/{docker-sZrNrr82.js → docker-BbTlMmYi.js} +2 -2
  45. package/dist/{docker-sZrNrr82.js.map → docker-BbTlMmYi.js.map} +1 -1
  46. package/dist/{docker-7b_2SaH7.js → docker-CCXdbREk.js} +20 -4
  47. package/dist/{docker-7b_2SaH7.js.map → docker-CCXdbREk.js.map} +1 -1
  48. package/dist/{docker-yauK-9X8.js → docker-DC69dKxB.js} +1 -1
  49. package/dist/{doctor-BYNok4UO.js → doctor-CqttrZcs.js} +56 -22
  50. package/dist/doctor-CqttrZcs.js.map +1 -0
  51. package/dist/{egress-C4PZTSSe.js → egress-BfK_O9ce.js} +435 -31
  52. package/dist/egress-BfK_O9ce.js.map +1 -0
  53. package/dist/{environment-DNjRk0nU.js → environment-BBz1Yes9.js} +225 -12
  54. package/dist/environment-BBz1Yes9.js.map +1 -0
  55. package/dist/{evaluate-D4zeRGBF.js → evaluate-CXQ1o-pd.js} +539 -562
  56. package/dist/evaluate-CXQ1o-pd.js.map +1 -0
  57. package/dist/{evaluate-C1UVL21l.d.ts → evaluate-yjZKUexW.d.ts} +2 -2
  58. package/dist/facts-DtENlf9s.js +898 -0
  59. package/dist/facts-DtENlf9s.js.map +1 -0
  60. package/dist/{files-BXUdY8tr.js → files-B-eUpCZ1.js} +30 -7
  61. package/dist/files-B-eUpCZ1.js.map +1 -0
  62. package/dist/files-BsQbYz2i.js +65 -0
  63. package/dist/files-BsQbYz2i.js.map +1 -0
  64. package/dist/{files-DQmHE7pb.js → files-COHQLEHE.js} +6 -17
  65. package/dist/files-COHQLEHE.js.map +1 -0
  66. package/dist/files-DqCBW7i8.js +1 -0
  67. package/dist/files-Ha-jsQXf.js +1 -0
  68. package/dist/generate-Cs2TMH_k.js +1647 -0
  69. package/dist/generate-Cs2TMH_k.js.map +1 -0
  70. package/dist/{git-DfG-YJ1u.js → git-DhykwgKF.js} +2 -2
  71. package/dist/{git-DfG-YJ1u.js.map → git-DhykwgKF.js.map} +1 -1
  72. package/dist/{harness-B8QC9u0O.js → harness-BAjw1fcr.js} +3 -3
  73. package/dist/{harness-B8QC9u0O.js.map → harness-BAjw1fcr.js.map} +1 -1
  74. package/dist/harness.d.ts +1 -1
  75. package/dist/harness.js +1 -1
  76. package/dist/{header-hK-Z_Po9.js → header-kSmWatcO.js} +10 -3
  77. package/dist/{header-hK-Z_Po9.js.map → header-kSmWatcO.js.map} +1 -1
  78. package/dist/{images-0On0cztu.js → images-BmJRuTpm.js} +61 -13
  79. package/dist/images-BmJRuTpm.js.map +1 -0
  80. package/dist/index.d.ts +3 -3
  81. package/dist/index.js +4 -4
  82. package/dist/init-Bwc9byQr.js +543 -0
  83. package/dist/init-Bwc9byQr.js.map +1 -0
  84. package/dist/init-D7Y1ny1z.js +1 -0
  85. package/dist/insights-B2Xmhz9o.js +64 -0
  86. package/dist/insights-B2Xmhz9o.js.map +1 -0
  87. package/dist/{invocations-DbGfBAA_.js → invocations-CQTbP092.js} +3 -3
  88. package/dist/{invocations-DbGfBAA_.js.map → invocations-CQTbP092.js.map} +1 -1
  89. package/dist/{judge-DW_GDOmB.js → judge-Dt6KW6_O.js} +5 -3
  90. package/dist/judge-Dt6KW6_O.js.map +1 -0
  91. package/dist/judge.d.ts +7 -6
  92. package/dist/judge.js +8 -7
  93. package/dist/judge.js.map +1 -1
  94. package/dist/{live-jlfszAbb.js → live-DYd2QEyR.js} +2 -2
  95. package/dist/{live-jlfszAbb.js.map → live-DYd2QEyR.js.map} +1 -1
  96. package/dist/{model-h_cDtcRr.js → model-B-mel-Gv.js} +46 -20
  97. package/dist/model-B-mel-Gv.js.map +1 -0
  98. package/dist/model-BGKYVpoj.js +1 -0
  99. package/dist/{model-DaVCY3rb.js → model-C7tSwT7f.js} +2 -2
  100. package/dist/{model-DaVCY3rb.js.map → model-C7tSwT7f.js.map} +1 -1
  101. package/dist/{model-oqcDplJG.js → model-CWlAqmbU.js} +150 -46
  102. package/dist/model-CWlAqmbU.js.map +1 -0
  103. package/dist/model-DHY-dfoO.js +1 -0
  104. package/dist/{node-B3ydHo6t.js → node-D0mtjRAO.js} +3 -3
  105. package/dist/{node-B3ydHo6t.js.map → node-D0mtjRAO.js.map} +1 -1
  106. package/dist/{options-Bh2W63dK.js → options-CPUW97_7.js} +9 -12
  107. package/dist/options-CPUW97_7.js.map +1 -0
  108. package/dist/{pairs-CnInRu-G.js → pairs-DP6XOJby.js} +2 -2
  109. package/dist/{pairs-CnInRu-G.js.map → pairs-DP6XOJby.js.map} +1 -1
  110. package/dist/{patch-Zac5aIRM.js → patch-D4oluWzH.js} +2 -2
  111. package/dist/{patch-Zac5aIRM.js.map → patch-D4oluWzH.js.map} +1 -1
  112. package/dist/{plan-C9Cy27Ay.js → plan-OkwUcJQ9.js} +31 -12
  113. package/dist/plan-OkwUcJQ9.js.map +1 -0
  114. package/dist/plugins-CUWMnSNb.js +654 -0
  115. package/dist/plugins-CUWMnSNb.js.map +1 -0
  116. package/dist/{preflight-CPWpQeBI.js → preflight-B6pY89bF.js} +1 -1
  117. package/dist/{preflight-D7iFPKeK.js → preflight-Bjm7_ylE.js} +14 -10
  118. package/dist/preflight-Bjm7_ylE.js.map +1 -0
  119. package/dist/{prepare-doGxaAGR.js → prepare-CQmK3SBn.js} +71 -24
  120. package/dist/prepare-CQmK3SBn.js.map +1 -0
  121. package/dist/prepare-DbdgtZKe.js +2 -0
  122. package/dist/{provenance-DmE9uPVt.js → provenance-B3Y17oCC.js} +2 -2
  123. package/dist/{provenance-DmE9uPVt.js.map → provenance-B3Y17oCC.js.map} +1 -1
  124. package/dist/providers-CXN2RFz-.js +1 -0
  125. package/dist/{providers-tAOD1NQN.js → providers-eoniqK6w.js} +24 -10
  126. package/dist/providers-eoniqK6w.js.map +1 -0
  127. package/dist/query-CLRZmWBT.js +139 -0
  128. package/dist/query-CLRZmWBT.js.map +1 -0
  129. package/dist/query-CmBDYt0_.js +1 -0
  130. package/dist/{questions-DjAwMxZ3.js → questions-1XOulevV.js} +6 -6
  131. package/dist/{questions-DjAwMxZ3.js.map → questions-1XOulevV.js.map} +1 -1
  132. package/dist/{record-BKmMvZ6O.js → record-kk9M1hj-.js} +8 -4
  133. package/dist/record-kk9M1hj-.js.map +1 -0
  134. package/dist/remarks-1521zwfW.js +38 -0
  135. package/dist/remarks-1521zwfW.js.map +1 -0
  136. package/dist/remarks-BhAV1H4V.js +1 -0
  137. package/dist/remarks-DlJCqWRs.js +278 -0
  138. package/dist/remarks-DlJCqWRs.js.map +1 -0
  139. package/dist/{remote-HDRt16ew.js → remote-cE2VWfkJ.js} +3 -3
  140. package/dist/{remote-HDRt16ew.js.map → remote-cE2VWfkJ.js.map} +1 -1
  141. package/dist/resolve-C4zeccCH.js +724 -0
  142. package/dist/resolve-C4zeccCH.js.map +1 -0
  143. package/dist/resolve-D30yZYmB.js +1 -0
  144. package/dist/{results-DuauQI3Z.js → results-Drtt0uFl.js} +33 -7
  145. package/dist/results-Drtt0uFl.js.map +1 -0
  146. package/dist/{resume-BRfa8E_s.js → resume-BEFazUfy.js} +4 -4
  147. package/dist/{resume-BRfa8E_s.js.map → resume-BEFazUfy.js.map} +1 -1
  148. package/dist/rules-BFzQqPIm.js +317 -0
  149. package/dist/rules-BFzQqPIm.js.map +1 -0
  150. package/dist/run-BeMy92Us.js +88 -0
  151. package/dist/run-BeMy92Us.js.map +1 -0
  152. package/dist/{sandbox-D3A8oUb7.js → sandbox-CQaJj7n9.js} +2 -2
  153. package/dist/{sandbox-D3A8oUb7.js.map → sandbox-CQaJj7n9.js.map} +1 -1
  154. package/dist/sandbox.d.ts +1 -1
  155. package/dist/sandbox.js +1 -1
  156. package/dist/server-V4-2w0l8.js +1 -0
  157. package/dist/{server-XDleKaF_.js → server-xK0les4f.js} +8 -8
  158. package/dist/{server-XDleKaF_.js.map → server-xK0les4f.js.map} +1 -1
  159. package/dist/{shared-DYpIb1BI.js → shared-CA61BuPJ.js} +25 -3
  160. package/dist/shared-CA61BuPJ.js.map +1 -0
  161. package/dist/source-BDow_oW8.js +1 -0
  162. package/dist/{source-C8xumIWj.js → source-Q1hEKbCs.js} +2 -2
  163. package/dist/{source-C8xumIWj.js.map → source-Q1hEKbCs.js.map} +1 -1
  164. package/dist/src-B9L9yGKI.js +1 -0
  165. package/dist/{src-ofUaYbuY.js → src-Bcah6ZkT.js} +1 -1
  166. package/dist/{src-DvCg0NBs.js → src-BhmaorOU.js} +28 -6
  167. package/dist/{src-DvCg0NBs.js.map → src-BhmaorOU.js.map} +1 -1
  168. package/dist/{src-CF17Ug08.js → src-C0CeKiLU.js} +19 -4
  169. package/dist/{src-CF17Ug08.js.map → src-C0CeKiLU.js.map} +1 -1
  170. package/dist/src-C0xowZ3C.js +2 -0
  171. package/dist/src-CHIfIKUu.js +2 -0
  172. package/dist/src-DLtyz4w5.js +2 -0
  173. package/dist/src-DPIjmReZ.js +2 -0
  174. package/dist/{src-C_lPtowT.js → src-DXNh5mTr.js} +1 -1
  175. package/dist/{src-FGXhkEkH.js → src-DiLMkIr9.js} +142 -13
  176. package/dist/src-DiLMkIr9.js.map +1 -0
  177. package/dist/{src-B7treWa8.js → src-LekQrr_S.js} +324 -32
  178. package/dist/src-LekQrr_S.js.map +1 -0
  179. package/dist/src-bCnsA6Vp.js +2 -0
  180. package/dist/{src-u8_ixn_F.js → src-cbCb-MPy.js} +20 -4
  181. package/dist/src-cbCb-MPy.js.map +1 -0
  182. package/dist/{src-DvK0EIZx.js → src-qGoFkuJF.js} +55 -6
  183. package/dist/{src-DvK0EIZx.js.map → src-qGoFkuJF.js.map} +1 -1
  184. package/dist/{src-jzagbuqH.js → src-ynBVosfX.js} +1 -1
  185. package/dist/state-BQR_BCm4.js +1 -0
  186. package/dist/{state-C__9swoG.js → state-BmZ8QVZ8.js} +12 -12
  187. package/dist/{state-C__9swoG.js.map → state-BmZ8QVZ8.js.map} +1 -1
  188. package/dist/studio-app/assets/index-CnYJijyI.js +58 -0
  189. package/dist/studio-app/index.html +1 -1
  190. package/dist/suite-BaHPmAGy.js +1 -0
  191. package/dist/suite-C8sw2pox.js +481 -0
  192. package/dist/suite-C8sw2pox.js.map +1 -0
  193. package/dist/summary-0oQNGskv.js +837 -0
  194. package/dist/summary-0oQNGskv.js.map +1 -0
  195. package/dist/testing.d.ts +2 -2
  196. package/dist/testing.js +2 -2
  197. package/dist/{text-gEcKjAyp.js → text-CrVy5ioL.js} +18 -2
  198. package/dist/text-CrVy5ioL.js.map +1 -0
  199. package/dist/{transcript-BNNANU8A.js → transcript-BTxJpW4R.js} +2 -2
  200. package/dist/{transcript-BNNANU8A.js.map → transcript-BTxJpW4R.js.map} +1 -1
  201. package/dist/types-C5vI3g1C.js.map +1 -1
  202. package/dist/{types-g17bRAzt.d.ts → types-GraZtfHN.d.ts} +858 -39
  203. package/dist/usage-BDo2q_yu.js +1 -0
  204. package/dist/{command-Bge8F7Ko.js → validate-BdoXUuL_.js} +35 -383
  205. package/dist/validate-BdoXUuL_.js.map +1 -0
  206. package/dist/view/index.d.ts +20 -9
  207. package/dist/view/index.js +7 -6
  208. package/dist/views-BoUoX4_A.js +125 -0
  209. package/dist/views-BoUoX4_A.js.map +1 -0
  210. package/dist/views-noVQNCUP.js +2 -0
  211. package/dist/{worker-entry-yOchGYYv.js → worker-entry-D0-GErmU.js} +2 -2
  212. package/dist/{worker-entry-yOchGYYv.js.map → worker-entry-D0-GErmU.js.map} +1 -1
  213. package/dist/{workspace-D8sSgpiy.js → workspace-B90YDU_a.js} +1 -1
  214. package/dist/{workspace-CgyHEM0l.js → workspace-tjZFkjxC.js} +4 -4
  215. package/dist/{workspace-CgyHEM0l.js.map → workspace-tjZFkjxC.js.map} +1 -1
  216. package/package.json +10 -8
  217. package/skills/eval-rubric/SKILL.md +130 -0
  218. package/dist/agent-CURAwx_q.js +0 -334
  219. package/dist/agent-CURAwx_q.js.map +0 -1
  220. package/dist/assemble-B9Alds-z.js.map +0 -1
  221. package/dist/assemble-J5MukZFY.js +0 -1
  222. package/dist/capture-jquXZBKK.js +0 -1
  223. package/dist/cli-D303Vj5N.js.map +0 -1
  224. package/dist/cli-spec-BPZbQG2p.js.map +0 -1
  225. package/dist/command-BLfT7vnQ.js.map +0 -1
  226. package/dist/command-BT9a37ZR.js.map +0 -1
  227. package/dist/command-Bge8F7Ko.js.map +0 -1
  228. package/dist/command-BkFjijN2.js +0 -1
  229. package/dist/commands-BFx16WB8.js +0 -225
  230. package/dist/commands-BFx16WB8.js.map +0 -1
  231. package/dist/config-DEgnUiU-.js.map +0 -1
  232. package/dist/context-C1mxXh80.js.map +0 -1
  233. package/dist/db-CdHizc4_.js +0 -1406
  234. package/dist/db-CdHizc4_.js.map +0 -1
  235. package/dist/db-Dm1cRJJP.js +0 -2
  236. package/dist/dist-B8hJImYt.js.map +0 -1
  237. package/dist/doctor-BYNok4UO.js.map +0 -1
  238. package/dist/duration-CEOQww97.js +0 -26
  239. package/dist/duration-CEOQww97.js.map +0 -1
  240. package/dist/egress-C4PZTSSe.js.map +0 -1
  241. package/dist/environment-DNjRk0nU.js.map +0 -1
  242. package/dist/evaluate-D4zeRGBF.js.map +0 -1
  243. package/dist/family-D2b7WD10.js +0 -67
  244. package/dist/family-D2b7WD10.js.map +0 -1
  245. package/dist/files-BXUdY8tr.js.map +0 -1
  246. package/dist/files-BhyltlDB.js +0 -1
  247. package/dist/files-DQmHE7pb.js.map +0 -1
  248. package/dist/files-ZZPqfAo6.js +0 -1
  249. package/dist/images-0On0cztu.js.map +0 -1
  250. package/dist/init-B77Rpcqc.js +0 -360
  251. package/dist/init-B77Rpcqc.js.map +0 -1
  252. package/dist/init-BrOWin3W.js +0 -1
  253. package/dist/judge-DW_GDOmB.js.map +0 -1
  254. package/dist/model-NM3ID0uR.js +0 -1
  255. package/dist/model-h_cDtcRr.js.map +0 -1
  256. package/dist/model-nwWJvaUR.js +0 -1
  257. package/dist/model-oqcDplJG.js.map +0 -1
  258. package/dist/options-Bh2W63dK.js.map +0 -1
  259. package/dist/plan-C9Cy27Ay.js.map +0 -1
  260. package/dist/preflight-D7iFPKeK.js.map +0 -1
  261. package/dist/prepare-BGjePFQl.js +0 -2
  262. package/dist/prepare-doGxaAGR.js.map +0 -1
  263. package/dist/process-CSVO_jsc.js +0 -119
  264. package/dist/process-CSVO_jsc.js.map +0 -1
  265. package/dist/providers-gDMko8fl.js +0 -1
  266. package/dist/providers-tAOD1NQN.js.map +0 -1
  267. package/dist/query-Bes9Kh6Y.js +0 -91
  268. package/dist/query-Bes9Kh6Y.js.map +0 -1
  269. package/dist/query-C_G_svLU.js +0 -1
  270. package/dist/record-BKmMvZ6O.js.map +0 -1
  271. package/dist/results-DuauQI3Z.js.map +0 -1
  272. package/dist/server-C7sg1ndo.js +0 -1
  273. package/dist/shared-DYpIb1BI.js.map +0 -1
  274. package/dist/source-fGd0SaKP.js +0 -1
  275. package/dist/src-B7treWa8.js.map +0 -1
  276. package/dist/src-DNnG4e4R.js +0 -2
  277. package/dist/src-DTbrY1hi.js +0 -2
  278. package/dist/src-DdyJEh2v.js +0 -2
  279. package/dist/src-Dj9PAroc.js +0 -2
  280. package/dist/src-Du8H85Qq.js +0 -2
  281. package/dist/src-FGXhkEkH.js.map +0 -1
  282. package/dist/src-pJZOrYR9.js +0 -1
  283. package/dist/src-u8_ixn_F.js.map +0 -1
  284. package/dist/state-CgjQo29K.js +0 -1
  285. package/dist/studio-app/assets/index-DrQc2Yxd.js +0 -58
  286. package/dist/summary-BLAVLySU.js +0 -385
  287. package/dist/summary-BLAVLySU.js.map +0 -1
  288. package/dist/summary-DgyjUh_l.js +0 -192
  289. package/dist/summary-DgyjUh_l.js.map +0 -1
  290. package/dist/text-gEcKjAyp.js.map +0 -1
  291. package/dist/tools-GCyNYSc1.js +0 -249
  292. package/dist/tools-GCyNYSc1.js.map +0 -1
  293. package/dist/views-BW6oCDUQ.js +0 -2
  294. package/dist/views-BmQF4UCI.js +0 -225
  295. package/dist/views-BmQF4UCI.js.map +0 -1
@@ -66,7 +66,10 @@ declare const effortSample: (a: Pick<AttemptRecord, 'activity' | 'timings' | 'us
66
66
  /** Token totals from the attempts that reported usage; empty when none did. */
67
67
  declare const tokenValues: (samples: EffortSample[]) => number[];
68
68
  declare function effortOf(samples: EffortSample[]): CellEffort | null;
69
- /** The verdict of an exact rank test of `xs` (variant) against `ys` (control). */
69
+ /**
70
+ * The verdict of an exact rank test of `xs` (variant) against `ys` (control). Its direction is
71
+ * the test's (which side ranks lower), not the medians', which can be equal or disagree.
72
+ */
70
73
  declare function effortVerdict(xs: number[], ys: number[]): {
71
74
  p: number | null;
72
75
  verdict: EffortVerdict;
@@ -95,14 +98,17 @@ declare function cellContrast(e: Pick<EvalEntry, 'attempts' | 'cells'>, cellKey:
95
98
  /** `4`, `4.5`: medians of counts are whole or halves. */
96
99
  declare const formatCount: (n: number) => string;
97
100
  declare const formatRatio: (r: number | null) => string;
98
- /** Seconds for agent time: `21s`, `1m 05s`. */
101
+ /** Two agent times that both print `<0.1s` have no ratio worth printing. */
102
+ declare const bothUnderATenth: (a: number, b: number) => boolean;
103
+ /** Seconds for agent time: `<0.1s`, `0.4s`, `21s`, `1m 05s`. */
99
104
  declare function formatSeconds(ms: number): string;
100
105
  declare const VERDICT_TEXT: Record<EffortVerdict, (what: string) => string>;
101
106
  /**
102
107
  * `tools 5 vs 43 (×0.11), agent 21s vs 46s (×0.47): too few attempts to test` for a variant
103
108
  * against its control; with enough attempts, `fewer tool calls (p = 0.029)`. Tokens fold in
104
109
  * when both sides have usage samples; they are omitted (not `insufficient`) when either does not.
105
- * A metric too small to test whose ranges don't overlap says so: `(×0.37, no overlap)`.
110
+ * A metric too small to test whose ranges don't overlap says so: `(×0.37, no overlap)`. Agent
111
+ * times both under a tenth of a second have no ratio: `agent <0.1s vs <0.1s`.
106
112
  */
107
113
  declare function effortLabel(c: EffortContrast): string;
108
114
  /** One cell's effort on its own: `tools 43 · agent 46s`, plus tokens when any attempt reported them. */
@@ -265,7 +271,10 @@ type AttemptRecord = {
265
271
  outcome: Outcome;
266
272
  error: AttemptError | null;
267
273
  durationMs: number;
268
- /** `text` is the agent's final message, cut at 8 KB; the whole of it is in `transcript.jsonl`. */
274
+ /**
275
+ * `text` is the agent's final message, cut at 8 KB; the whole of it is in `transcript.jsonl`.
276
+ * `mcpStartup` times each stdio MCP server's start in the turn (`McpStartup`).
277
+ */
269
278
  turns: Array<{
270
279
  prompt: string;
271
280
  status: TurnStatus;
@@ -280,6 +289,8 @@ type AttemptRecord = {
280
289
  unreported: WebEventType[];
281
290
  /** The turn's first error, such as a provider's billing or auth error, cut at 1 KB; else null. */
282
291
  error: string | null;
292
+ /** Each stdio MCP server start during the turn; see `McpStartup`. */
293
+ mcpStartup?: McpStartup[];
283
294
  }>;
284
295
  /** Tokens across the attempt's turns; null when the harness reported none. */
285
296
  usage: TokenUsage | null;
@@ -410,7 +421,10 @@ type FamilyEffortMetric = {
410
421
  ratio: number | null;
411
422
  /** Wilcoxon signed-rank over the per-case differences; null when every difference is 0. */
412
423
  p: number | null;
413
- /** `insufficient` below 6 non-zero differences, where the exact test can't reach 0.05. */
424
+ /**
425
+ * `insufficient` below 6 non-zero differences, where the exact test can't reach 0.05. `fewer`
426
+ * and `more` are the test's direction (which side's differences rank higher), not the median's.
427
+ */
414
428
  verdict: 'fewer' | 'more' | 'noise' | 'insufficient';
415
429
  };
416
430
  /** The variant's effort against the control's, paired by case. */
@@ -557,9 +571,10 @@ type CheckTally = {
557
571
  notRun: number;
558
572
  };
559
573
  /**
560
- * One check over a cell's counted attempts. `verdict` (variant cells): `discriminates` when it
561
- * passes on every counted attempt of one side and none of the other; `both-pass` or `both-fail`
562
- * when it does the same on both sides, so it can't tell them apart; `mixed` otherwise.
574
+ * One check over a cell's counted attempts. `verdict` (variant cells), over the attempts that
575
+ * reached the check: `discriminates` when it passes on every one of one side and none of the
576
+ * other; `both-pass` or `both-fail` when it does the same on both sides, so it can't tell them
577
+ * apart; `mixed` otherwise. No verdict when a side never reached it: not run is not a fail.
563
578
  */
564
579
  type CellCheck = CheckTally & {
565
580
  label: string;
@@ -667,6 +682,11 @@ type RunRecord = {
667
682
  evals: EvalEntry[];
668
683
  /** Each pooled `evaluate.each` that ran; unset when none did. */
669
684
  families?: FamilyRecord[];
685
+ /**
686
+ * Errors outside any attempt, redacted: an eval file that didn't load, a rejection or throw no
687
+ * attempt awaited, a worker that died. Any one fails the run. Unset when there were none.
688
+ */
689
+ errors?: string[];
670
690
  };
671
691
  /** What ran and graded the agents: the machine, images, harnesses and judge. */
672
692
  type Stack = {
@@ -715,7 +735,7 @@ type Stack = {
715
735
  effort: string | null;
716
736
  /**
717
737
  * The models the harness reported serving, across every turn in the run, with the variant it
718
- * resolved (`composer-2.5[fast=true]` for `composer-2.5` with no `params`); empty when it
738
+ * resolved (`composer-2.5[fast=false]` for `composer-2.5` with no `params`); empty when it
719
739
  * reports none.
720
740
  */
721
741
  resolvedModels: string[];
@@ -770,6 +790,8 @@ type HistoryCell = Pick<CellRecord, 'key' | 'role' | 'variant' | 'harness' | 'mo
770
790
  };
771
791
  /** Median tool calls, agent time and tokens over the counted attempts; null when none counted. */
772
792
  effort: CellEffort | null;
793
+ /** Of `fail`, the attempts the run's interrupt cancelled (`error.kind: 'aborted'`); unset when none. */
794
+ cancelled?: number;
773
795
  };
774
796
  /**
775
797
  * One line of the derived history listing: cached locally by the CLI, and the run header in the
@@ -810,6 +832,592 @@ type HistoryEntry = {
810
832
  }>;
811
833
  /** The run's pooled families; unset when none ran. */
812
834
  families?: Array<Pick<FamilyRecord, 'id' | 'name' | 'cases' | 'ran' | 'outcome'>>;
835
+ /** The run's errors outside any attempt; unset when there were none. */
836
+ errors?: string[];
837
+ };
838
+ //#endregion
839
+ //#region src/view/suite.d.ts
840
+ /**
841
+ * A variant against its baseline: `better` or `worse` when the stored 95% interval on the
842
+ * difference excludes 0, `same` when both pass at the same rate, and `unclear` otherwise,
843
+ * including whenever either side has fewer than `EFFECT_MIN_COUNTED` counted attempts.
844
+ */
845
+ type Effect = 'better' | 'worse' | 'same' | 'unclear';
846
+ /**
847
+ * What an eval's cells compare: `change` when it has variants (or several environments),
848
+ * `harness` when it has several harnesses, `both`, or `none`.
849
+ */
850
+ type Across = 'none' | 'change' | 'harness' | 'both';
851
+ /** The fewest counted attempts a side for an effect to be anything but `unclear`. */
852
+ declare const EFFECT_MIN_COUNTED = 4;
853
+ /**
854
+ * One finished run's facts. Every node has a `path`, a stable id to cite it by, and `paths`
855
+ * lists them all in the order the nodes appear.
856
+ *
857
+ * A path is `/`-separated segments, each with `%`, `/` and `+` percent-encoded:
858
+ *
859
+ * - `<eval>`: the eval's id (`evals/a.eval.ts › group › name`) or a family's
860
+ * (`evals/a.eval.ts › fixes $id`);
861
+ * - `<eval>/<case>`: a family case, by its label (`GH-101` for `fixes GH-101`);
862
+ * - `<eval>[/<case>]/<harness>+<environment>+<sandbox>`: a cell;
863
+ * - `<cell>/checks/<label>`: a check, by its assertion label;
864
+ * - `<cell>/effort`: the cell's effort, only when it was tested;
865
+ * - `<eval>/<harness>+<environment>+<sandbox>`: on a family, a variant's pooled effect.
866
+ *
867
+ * A case segment never has a raw `+` and a cell segment always has two, so the two can't be
868
+ * confused. Ids, labels and cell keys are what runs are matched on, so a path names the same
869
+ * fact in every run that has it.
870
+ */
871
+ type SuiteResult = {
872
+ runId: string;
873
+ status: RunRecord['status'];
874
+ /**
875
+ * The run's outcome, which `reeval run`'s exit code is read from: `fail` on any error outside
876
+ * an attempt, and `skipped` on an interrupted run.
877
+ */
878
+ outcome: Outcome;
879
+ /**
880
+ * Errors outside any attempt: an eval file that didn't load, a rejection or throw no attempt
881
+ * awaited, a worker that died. Any one fails the run.
882
+ */
883
+ errors: string[];
884
+ /**
885
+ * Outcomes counted per block: each family case is one, each eval with no cases is one, and a
886
+ * family whose pooled gate failed is one more fail. `errors` counts the run's `errors`.
887
+ */
888
+ tally: SuiteTally;
889
+ /** Sorted by path. */
890
+ files: ResultFile[];
891
+ /** Every node's `path`, in the order they appear. */
892
+ paths: string[];
893
+ };
894
+ type SuiteTally = {
895
+ errors: number;
896
+ pass: number;
897
+ fail: number;
898
+ infraError: number;
899
+ cancelled: number;
900
+ skipped: number;
901
+ };
902
+ /**
903
+ * An eval's or a family case's outcome: the record's, except `cancelled` where its only failed
904
+ * gated attempts are ones the run's interrupt cancelled, since the agent didn't fail those.
905
+ */
906
+ type ResultOutcome = Outcome | 'cancelled';
907
+ type ResultFile = {
908
+ path: string;
909
+ evals: EvalResult[];
910
+ };
911
+ type EvalResult = {
912
+ path: string;
913
+ /** The eval's id, or the family's. */
914
+ id: string;
915
+ group: string[];
916
+ /** The eval's name; on a family, its template. */
917
+ name: string;
918
+ /** A family's name template (`fixes $id`); null on a single eval. */
919
+ template: string | null;
920
+ /** Source order in the file. */
921
+ order: number;
922
+ across: Across;
923
+ /**
924
+ * A pooled `evaluate.each` with two or more cases: `cases` is set and `cells` is null. An
925
+ * unpooled one (`{ pool: false }`) is recorded as separate evals, each a single eval.
926
+ */
927
+ family: boolean;
928
+ /** A placeholder (`evaluate.todo`) that never ran. */
929
+ todo: boolean;
930
+ /** On a family: `fail` when a case failed or its pooled gate did. */
931
+ outcome: ResultOutcome;
932
+ cells: CellResult[] | null;
933
+ cases: CaseResult[] | null;
934
+ /** A family's variants against their baseline, pooled over the cases; null on a single eval. */
935
+ pooled: PooledArm[] | null;
936
+ /**
937
+ * Its compare questions' answers. On a family, each question asked of any case, in first-asked
938
+ * order, with its votes and wins summed over the cases that answered it.
939
+ */
940
+ questions: QuestionResult[];
941
+ };
942
+ /** A compare question: each side's wins over the pairs the model decided. Never gates. */
943
+ type QuestionResult = {
944
+ question: string;
945
+ /** Pairs voted, each counted once per order it was asked in. */
946
+ votes: number;
947
+ rates: Array<{
948
+ cut: 'within' | 'across';
949
+ name: string;
950
+ wins: number;
951
+ n: number;
952
+ }>;
953
+ /** Why some or all of its votes are missing: the model call failed. */
954
+ error: string | null;
955
+ };
956
+ type CaseResult = {
957
+ path: string;
958
+ /** The case's own eval id. */
959
+ id: string;
960
+ /** Its name less the template's literal text: `GH-101` for `fixes GH-101`. */
961
+ label: string;
962
+ name: string;
963
+ /** Its place in the case list. */
964
+ order: number;
965
+ outcome: ResultOutcome;
966
+ cells: CellResult[];
967
+ };
968
+ type CellResult = {
969
+ path: string;
970
+ key: string;
971
+ harness: string;
972
+ /** `-` when no environment is set. */
973
+ environment: string;
974
+ sandbox: string;
975
+ /** The variant's name; null on a control. */
976
+ variant: string | null;
977
+ /** The control of an eval that has variants: the arm the variants are measured against. */
978
+ baseline: boolean;
979
+ /** On a variant, its baseline cell's key; else null. */
980
+ vs: string | null;
981
+ /** The cell's place in the eval's cells. */
982
+ order: number;
983
+ /** Its failures fail the eval (its gate isn't `'none'`). */
984
+ gated: boolean;
985
+ outcome: Outcome;
986
+ /** Every attempt: `passed + failed + infraError + skipped`. */
987
+ attempts: number;
988
+ passed: number;
989
+ failed: number;
990
+ /** Infrastructure errors, which are neither passes nor fails. */
991
+ infraError: number;
992
+ skipped: number;
993
+ fingerprint: string;
994
+ /** The skill sources and files the cell's environment placed, as written. */
995
+ context: string[];
996
+ /**
997
+ * Every check the eval's attempts recorded (on a family, any case's). A cell with no counted
998
+ * attempt (every one an infra error or skipped) lists each as `not run`.
999
+ */
1000
+ checks: CheckResult[];
1001
+ /** On a variant, against its baseline; null on a control. */
1002
+ effect: Effect | null;
1003
+ /** The stored 95% interval on the variant's difference from its baseline. Not for display. */
1004
+ interval: Interval | null;
1005
+ /** On a variant, the compare's `minLift`, a fraction like the interval; null without one. */
1006
+ minLift: number | null;
1007
+ /** Medians over the counted attempts; null below `EFFECT_MIN_COUNTED` of them. */
1008
+ effort: EffortCounters | null;
1009
+ /** On a variant, its tool calls, agent time or tokens differ from its baseline's by the rank test. */
1010
+ effortDiffers: boolean;
1011
+ /** Why attempts failed or errored where no check says: a timeout, an infra error, a throw. */
1012
+ errors: CellError[];
1013
+ /** Web searches and fetches per counted attempt; null where the harness can't report them. */
1014
+ searches: Array<number | null>;
1015
+ fetches: Array<number | null>;
1016
+ };
1017
+ /** A cell's attempts the run's interrupt cancelled: recorded as fails, but not the agent's. */
1018
+ declare const cancelledOf: (cell: CellResult) => number;
1019
+ /** A cell's counted tries: its passes and fails, less the ones the interrupt cancelled. */
1020
+ declare const countedOf: (cell: CellResult) => number;
1021
+ type CheckResult = {
1022
+ path: string;
1023
+ label: string;
1024
+ /** First-seen order across the eval's attempts. */
1025
+ order: number;
1026
+ outcome: CheckOutcome;
1027
+ /**
1028
+ * On a variant, this check against the baseline's (`unclear` when the baseline never ran it);
1029
+ * null on a control or without one.
1030
+ */
1031
+ effect: Effect | null;
1032
+ /** Set when the check is a judge verdict. */
1033
+ judge: JudgeResult | null;
1034
+ };
1035
+ /**
1036
+ * `not run`: no counted attempt reached the check, because a hard `expect` before it failed or
1037
+ * none counted. That is not a failure, and is never `0 of N`. `ran`: counts over the counted attempts that
1038
+ * reached it (`errored` ones couldn't answer), with `notRun` for those that didn't, and the
1039
+ * first failure's message.
1040
+ */
1041
+ type CheckOutcome = {
1042
+ status: 'not run';
1043
+ } | {
1044
+ status: 'ran';
1045
+ passed: number;
1046
+ failed: number;
1047
+ errored: number;
1048
+ notRun: number;
1049
+ assertion: string | null;
1050
+ };
1051
+ /**
1052
+ * One distinct error over a cell's attempts: its kind (`turn` for a turn the harness ended with
1053
+ * an error), its message's first line, and how often.
1054
+ */
1055
+ type CellError = {
1056
+ kind: ErrorKind | 'turn';
1057
+ message: string;
1058
+ attempts: number;
1059
+ };
1060
+ type JudgeResult = {
1061
+ question: string;
1062
+ threshold: number;
1063
+ /** One per counted attempt that judged it. */
1064
+ scores: number[];
1065
+ };
1066
+ type Interval = {
1067
+ low: number;
1068
+ high: number;
1069
+ };
1070
+ /** A null counter is one the harness didn't record; a recorded zero stays zero. */
1071
+ type EffortCounters = {
1072
+ tools: number | null;
1073
+ agentMs: number | null;
1074
+ tokens: number | null;
1075
+ };
1076
+ type PooledArm = {
1077
+ path: string;
1078
+ /** The variant cell's key, the same in every case. */
1079
+ key: string;
1080
+ vs: string;
1081
+ effect: Effect;
1082
+ /** Cases with counted attempts on both sides. */
1083
+ pairs: number;
1084
+ interval: Interval;
1085
+ /** The compare's `minLift`, a fraction like the interval, which gates its low end; null without one. */
1086
+ minLift: number | null;
1087
+ outcome: 'pass' | 'fail';
1088
+ };
1089
+ type Side = {
1090
+ pass: number;
1091
+ counted: number;
1092
+ };
1093
+ /**
1094
+ * The effect of `variant` against `control`, from the interval on their difference. A side
1095
+ * with fewer than `EFFECT_MIN_COUNTED` counted attempts is `unclear`, whatever the interval.
1096
+ */
1097
+ declare function effectOf(variant: Side, control: Side, interval: Interval | null): Effect;
1098
+ /** The check's effect, on the same Newcombe interval the record stores for a cell's lift. */
1099
+ declare function checkEffect(variant: CheckTally, control: CheckTally): Effect;
1100
+ /** One path segment: `%`, `/` and `+` percent-encoded, so segments split back unambiguously. */
1101
+ declare const factSegment: (s: string) => string;
1102
+ declare function evalAcross(cells: readonly Pick<CellRecord, 'harness' | 'environment' | 'role'>[]): Across;
1103
+ /**
1104
+ * An error's one line: its first line with any letter or digit in it, joined with the next one
1105
+ * when it ends with `:`, since `Docker failed:` alone says nothing. A log line's `| ` is dropped.
1106
+ */
1107
+ declare function messageLine(text: string): string;
1108
+ /** The facts of a run, from its record. Pure: the same record always gives the same result. */
1109
+ declare function suiteResult(record: RunRecord): SuiteResult;
1110
+ //#endregion
1111
+ //#region src/view/insights.d.ts
1112
+ /** `<history>/<run>/insights.json`, beside the record. */
1113
+ declare const INSIGHTS_FILE = "insights.json";
1114
+ /** `RunInsights.model` when no analysis model wrote the file: it holds deterministic remarks only. */
1115
+ declare const NO_MODEL = "none";
1116
+ /** Whether an analysis model wrote these insights, rather than reeval alone for its remarks. */
1117
+ declare const fromModel: (insights: RunInsights) => boolean;
1118
+ /** What one attempt tests. Only an analysis model can tell; without one every eval is `other`. */
1119
+ type Job = 'choose' | 'finish' | 'other';
1120
+ /**
1121
+ * A run's insights, `<history>/<run>/insights.json`. Written create-only; the record is untouched.
1122
+ * They're for the facts they were written from: a `factsHash` that isn't the run's marks them stale.
1123
+ */
1124
+ type RunInsights = {
1125
+ kind: 'reeval-insights';
1126
+ schemaVersion: 1;
1127
+ runId: string;
1128
+ /**
1129
+ * The analysis model, as configured (`google/gemini-3.8-flash`, or `fake`); `NO_MODEL` when
1130
+ * reeval wrote the file without one, to hold the run's deterministic remarks only.
1131
+ */
1132
+ model: string;
1133
+ /** The prompts' version: insights from another version were asked differently. */
1134
+ promptVersion: string;
1135
+ /** sha256 of the run's `SuiteResult` as canonical JSON: the facts the model saw. */
1136
+ factsHash: string;
1137
+ createdAt: string;
1138
+ /**
1139
+ * Over every call; `outputTokens` includes `reasoningTokens`, the model's thinking, when it
1140
+ * reports them. `costUsd` is null when reeval doesn't know the model's price.
1141
+ */
1142
+ usage: {
1143
+ inputTokens: number;
1144
+ outputTokens: number;
1145
+ reasoningTokens?: number;
1146
+ costUsd: number | null;
1147
+ };
1148
+ /**
1149
+ * `analysis.maxTokens`, and the evals (`SuiteResult` paths) it ran out before: they print
1150
+ * without insights. Absent when no budget applied.
1151
+ */
1152
+ budget?: {
1153
+ maxTokens: number;
1154
+ skipped: string[];
1155
+ };
1156
+ /**
1157
+ * Evals whose calls failed twice (an error, a reply cut off at the output cap, or a call past its
1158
+ * timeout), with the last error: they print without insights. Absent when none failed.
1159
+ */
1160
+ failed?: Array<{
1161
+ evalId: string;
1162
+ error: string;
1163
+ }>;
1164
+ /**
1165
+ * Set when the run was stopped (Ctrl-C, or SIGTERM) before every eval's insights had finished:
1166
+ * the evals that hadn't, which print without insights. Absent otherwise, even when the stop came
1167
+ * during the headline call, which leaves `headline` null.
1168
+ */
1169
+ stopped?: {
1170
+ signal: 'SIGINT' | 'SIGTERM';
1171
+ skipped: string[];
1172
+ };
1173
+ /** One sentence for the whole run, citing facts; null when the model's was dropped. */
1174
+ headline: Sentence | null;
1175
+ /** One per eval (a family is one), in the order the output prints them. */
1176
+ evals: EvalInsight[];
1177
+ /**
1178
+ * Remarks about the evals' own quality, ranked: every one this run raised, including those an
1179
+ * earlier run printed first (`firstSeenRun`), which don't print again.
1180
+ */
1181
+ remarks: Remark[];
1182
+ /**
1183
+ * What the checks dropped, and how many sentences were asked for again, so the output can say
1184
+ * so. `drops` is each dropped sentence: its slot (`<eval> › answer`, `› row <path>`, `headline`),
1185
+ * its text and why.
1186
+ */
1187
+ validation: {
1188
+ dropped: number;
1189
+ regenerated: number;
1190
+ drops?: Array<{
1191
+ slot: string;
1192
+ text: string;
1193
+ reason: string;
1194
+ }>;
1195
+ };
1196
+ /** Set when insights failed; the facts still print. */
1197
+ error?: string;
1198
+ };
1199
+ type EvalInsight = {
1200
+ /** The eval's `SuiteResult` path; for a family, the family's. */
1201
+ evalId: string;
1202
+ intent: {
1203
+ /** What one attempt is testing. Can't be read from the cell shape. */
1204
+ job: Job;
1205
+ /** What the cells compare. Deterministic, copied from the facts. */
1206
+ across: Across;
1207
+ /** The eval's question in plain words: "Do agents pick Genkit for a production AI feature?" */
1208
+ question: string;
1209
+ /** The tool a choose eval asks about, and the change a measure eval makes. */
1210
+ subject: {
1211
+ tool?: string;
1212
+ change?: string;
1213
+ };
1214
+ /** How the eval name relates to what the eval checks. */
1215
+ name: 'states-intent' | 'no-intent' | 'contradicts';
1216
+ /**
1217
+ * sha256 of the eval's id, sources, first attempt's prompts, judge questions, check labels,
1218
+ * the model and the prompt version: the classification's cache key.
1219
+ */
1220
+ key: string;
1221
+ };
1222
+ /** The answer to `question`, at most two sentences; null when it was dropped. */
1223
+ answer: Sentence | null;
1224
+ /** Up to three supporting points: what moved, what broke, what the agent did. */
1225
+ findings: Sentence[];
1226
+ /**
1227
+ * At most one sentence per row (a case, an arm or a harness), keyed by the row's fact path.
1228
+ * Only rows the eval's layout opens a slot on are kept.
1229
+ */
1230
+ rows?: Array<Sentence & {
1231
+ row: string;
1232
+ }>;
1233
+ /**
1234
+ * Per attempt (`<cell path>#<n>`), the tools the reply recommended or used, each found
1235
+ * verbatim in that attempt's final message. Only on `choose` evals.
1236
+ */
1237
+ namedTools?: Array<{
1238
+ attempt: string;
1239
+ tools: string[];
1240
+ }>;
1241
+ };
1242
+ /**
1243
+ * A plain sentence citing the facts it states: `SuiteResult` paths
1244
+ * (`evals%2Fbilling.eval.ts › bills in pence/fake+-+fake/checks/amount`) or a transcript line
1245
+ * (`transcript:<cell path>#<n>#L<line>`). A sentence citing nothing is dropped.
1246
+ */
1247
+ type Sentence = {
1248
+ text: string;
1249
+ cites: string[];
1250
+ };
1251
+ /**
1252
+ * Each remark kind's origin and severity: an analysis model raises the `model` kinds, through the
1253
+ * gates (a known kind, a quote verbatim on the cited line); reeval's rules raise the others. The
1254
+ * severity is the kind's, never the model's.
1255
+ */
1256
+ declare const REMARK_KINDS: Record<Remark['kind'], {
1257
+ origin: Remark['origin'];
1258
+ severity: 'concern' | 'suggestion';
1259
+ }>;
1260
+ /** The kinds an analysis model may raise; a remark of any other kind from it is dropped. */
1261
+ declare const MODEL_REMARK_KINDS: ("check-never-fails" | "compound-judge" | "flaky-check" | "judge-leaks-answer" | "judge-too-loose" | "name-contradicts" | "name-no-intent" | "no-baseline" | "prompt-names-tool" | "slow-mcp-start" | "too-few-tries")[];
1262
+ /** A remark about the eval's quality, not about the agent. Anything that fails a gate is dropped. */
1263
+ type Remark = {
1264
+ /**
1265
+ * sha256(kind, evalId, the eval's sources hash, and for `slow-mcp-start` the server): one remark
1266
+ * per kind (and server) per eval version.
1267
+ */
1268
+ id: string;
1269
+ evalId: string;
1270
+ /** Closed set; an unknown kind is dropped. There is no general or free-form kind. */
1271
+ kind: 'name-contradicts' | 'name-no-intent' | 'judge-too-loose' | 'judge-leaks-answer' | 'prompt-names-tool' | 'compound-judge' | 'too-few-tries' | 'check-never-fails' | 'flaky-check' | 'no-baseline' | 'slow-mcp-start';
1272
+ /** Fixed by kind (`REMARK_KINDS`), never chosen by the model. */
1273
+ severity: 'concern' | 'suggestion';
1274
+ /** One plain sentence: what's wrong. */
1275
+ text: string;
1276
+ /**
1277
+ * Where the problem is: `source:<file>#L<n>` with `quote`, found verbatim on that line of the
1278
+ * file at the run's source hash. Every model remark has one.
1279
+ */
1280
+ source?: {
1281
+ at: string;
1282
+ quote: string;
1283
+ };
1284
+ /** Facts from this run (or history facts) showing it mattered now; a model's, as it cited them. */
1285
+ evidence: string[];
1286
+ /**
1287
+ * An edit at a source location (`source:<file>#L<n>`) in the eval. A model remark's `edit` is
1288
+ * empty when the model gave none, and its `at` is the quoted line when it named no line.
1289
+ */
1290
+ fix: {
1291
+ at: string;
1292
+ edit: string;
1293
+ };
1294
+ origin: 'model' | 'deterministic';
1295
+ /**
1296
+ * The first run that printed this `id`, or this run when none has: it prints only in that run,
1297
+ * except `slow-mcp-start`, which is about the environment, not the eval's source, and prints in
1298
+ * every run it happens.
1299
+ */
1300
+ firstSeenRun: string;
1301
+ /**
1302
+ * Whether this run's `reeval run` output printed it: false when an earlier run printed it, or
1303
+ * when the cap or a run without `-v` left it out, so a later run prints it. Missing: printed in
1304
+ * `firstSeenRun` only.
1305
+ */
1306
+ printed?: boolean;
1307
+ /** Set on later runs once the cited span changed: the remark was acted on. */
1308
+ actedOn?: {
1309
+ run: string;
1310
+ };
1311
+ };
1312
+ //#endregion
1313
+ //#region src/insights/input.d.ts
1314
+ /** One fact the model may cite, by its path. */
1315
+ type InsightFact = {
1316
+ path: string;
1317
+ kind: string;
1318
+ } & Record<string, unknown>;
1319
+ type InsightAttempt = {
1320
+ /** `<cell path>#<n>`. */
1321
+ id: string;
1322
+ cell: string;
1323
+ outcome: string;
1324
+ /** The agent's final message, clipped. */
1325
+ lastText: string;
1326
+ /** A failed attempt's transcript lines, `L<n> …`, each citable as `transcript:<id>#L<n>`. */
1327
+ lines: string[];
1328
+ };
1329
+ /** Where an insight sentence can go, as the eval's layout opens them. */
1330
+ type InsightSlots = {
1331
+ /** Row paths that take one sentence each. */
1332
+ rows: string[];
1333
+ findings: boolean;
1334
+ namedTools: boolean;
1335
+ };
1336
+ /** One eval as the classifier and the insight model see it. */
1337
+ type InsightInput = {
1338
+ call: 'classify' | 'insights';
1339
+ eval: {
1340
+ path: string;
1341
+ /** The eval's name, or a family's template: the author's statement of what it asks. */
1342
+ name: string;
1343
+ group: string[];
1344
+ file: string;
1345
+ across: Across;
1346
+ family: boolean;
1347
+ verdict: string;
1348
+ };
1349
+ /** The first attempt's prompts, in order. */
1350
+ prompts: string[];
1351
+ judgeQuestions: string[];
1352
+ checks: string[];
1353
+ /** Set on the insights call: the classification. */
1354
+ intent?: {
1355
+ job: Job;
1356
+ question: string;
1357
+ subject: {
1358
+ tool?: string;
1359
+ change?: string;
1360
+ };
1361
+ };
1362
+ /** Set on the insights call. */
1363
+ slots?: InsightSlots;
1364
+ facts: InsightFact[];
1365
+ attempts: InsightAttempt[];
1366
+ /**
1367
+ * Set on the insights call: the eval's declaration in its file, each line `L<n> …` as the file
1368
+ * numbers it, which a remark's `source` and `fix` cite.
1369
+ */
1370
+ source?: {
1371
+ file: string;
1372
+ lines: string[];
1373
+ };
1374
+ /** What was left out to fit the eval's size cap (`trim.ts`), when anything was. */
1375
+ trimmed?: string[];
1376
+ /** On a regeneration: why the earlier sentences were refused. */
1377
+ retry?: string[];
1378
+ };
1379
+ /** The headline call's input: each eval's verdict and answer, and the run's tally with its total. */
1380
+ type HeadlineInput = {
1381
+ call: 'headline';
1382
+ /**
1383
+ * Counts results, not evals: each case of a family counts one, as the tally line does, and
1384
+ * `total` is their sum, so no count is the model's arithmetic; `errors` (outside any eval) aren't
1385
+ * results and stay out of it. The eval count is `evals.length`.
1386
+ */
1387
+ tally: SuiteResult['tally'] & {
1388
+ total: number;
1389
+ unit: 'results';
1390
+ };
1391
+ evals: Array<{
1392
+ path: string;
1393
+ name: string;
1394
+ verdict: string;
1395
+ answer: string | null;
1396
+ }>;
1397
+ retry?: string[];
1398
+ };
1399
+ /** A fact as the model sees it: its short id (`F1`), which is what it cites. */
1400
+ type ModelFact = InsightFact & {
1401
+ id: string;
1402
+ };
1403
+ /** An attempt as the model sees it: `A1`, its cell's fact id, and its lines citable as `A1#L<n>`. */
1404
+ type ModelAttempt = Omit<InsightAttempt, 'id' | 'cell'> & {
1405
+ id: string;
1406
+ cell: string;
1407
+ };
1408
+ /** One eval's call as the model sees it: facts, attempts and row slots by short id. */
1409
+ type ModelInsightInput = Omit<InsightInput, 'facts' | 'attempts' | 'slots'> & {
1410
+ facts: ModelFact[];
1411
+ attempts: ModelAttempt[];
1412
+ slots?: Omit<InsightSlots, 'rows'> & {
1413
+ rows: string[];
1414
+ };
1415
+ };
1416
+ /** The headline call as the model sees it: each eval by its short id. */
1417
+ type ModelHeadlineInput = Omit<HeadlineInput, 'evals'> & {
1418
+ evals: Array<HeadlineInput['evals'][number] & {
1419
+ id: string;
1420
+ }>;
813
1421
  };
814
1422
  //#endregion
815
1423
  //#region src/types.d.ts
@@ -1342,8 +1950,8 @@ type CursorHarnessDescriptor = {
1342
1950
  /** A model id `Cursor.models.list()` returns for the key, e.g. `composer-2.5`. */
1343
1951
  model: string;
1344
1952
  /**
1345
- * Model parameters, e.g. `{ fast: 'false' }`. Unset ones take the default variant in Cursor's
1346
- * model catalog (`fast=true` for `composer-2.5`), sent explicitly; pass the ones that change cost.
1953
+ * Model parameters, e.g. `{ fast: 'true' }`. Unset ones take the default variant in Cursor's
1954
+ * model catalog, sent explicitly, except `fast`, which is `false` wherever the model takes it.
1347
1955
  */
1348
1956
  params?: Record<string, string>;
1349
1957
  /**
@@ -1805,6 +2413,103 @@ type EnvironmentSpec = {
1805
2413
  skills?: SkillSource[];
1806
2414
  /** MCP servers the agent gets, by name. */
1807
2415
  mcp?: Record<string, McpServer>;
2416
+ /**
2417
+ * Plugins in Claude Code's layout, made by the `plugin` helper; a child's replaces its
2418
+ * parent's plugin of the same name.
2419
+ */
2420
+ plugins?: PluginSource[];
2421
+ };
2422
+ /**
2423
+ * A part of a plugin, as Claude Code's layout bundles it: `skills/<name>/SKILL.md`,
2424
+ * `agents/<name>.md`, `commands/<name>.md`, `hooks/hooks.json`, `.mcp.json` (or the manifest's `mcpServers`) or `rules/`.
2425
+ */
2426
+ type PluginPart = 'skills' | 'agents' | 'commands' | 'hooks' | 'mcp' | 'rules';
2427
+ /** A plugin to place for the agent, in Claude Code's layout, made by the `plugin` helper. */
2428
+ type PluginSource = {
2429
+ kind: 'plugin';
2430
+ /** The parts to place; default every part the plugin has. */
2431
+ only?: PluginPart[];
2432
+ /** Commands that build the plugin in a Docker image layer, from its directory unless `cwd` says otherwise. */
2433
+ build?: PluginBuild;
2434
+ } & ({
2435
+ source: 'local';
2436
+ /** A host directory with a `.claude-plugin/plugin.json`. */
2437
+ path: string;
2438
+ } | {
2439
+ source: 'git';
2440
+ /** As written: a URL, `github:owner/repo`, or a GitHub `/tree/<ref>/<path>` URL. */
2441
+ repo: string;
2442
+ /** A branch, tag or commit SHA; unset is the remote's `HEAD`. */
2443
+ ref?: string;
2444
+ /** The plugin's directory in the repository; default its root. */
2445
+ path?: string;
2446
+ } | {
2447
+ source: 'npm';
2448
+ /** A pinned npm package spec. */
2449
+ spec: string;
2450
+ /** The plugin's directory in the package; default its root. */
2451
+ path?: string;
2452
+ } | {
2453
+ source: 'marketplace';
2454
+ /** The plugin's entry in the marketplace's `.claude-plugin/marketplace.json`. */
2455
+ name: string;
2456
+ /** Where the marketplace is: a git repository (at `ref`) or an npm package. */
2457
+ marketplace: PluginMarketplace;
2458
+ });
2459
+ /** A Claude Code marketplace: the source that holds its `.claude-plugin/marketplace.json`. */
2460
+ type PluginMarketplace = {
2461
+ source: 'git';
2462
+ /** As written: a URL or `github:owner/repo`. */
2463
+ repo: string;
2464
+ /** A branch, tag or commit SHA; unset is the remote's `HEAD`. */
2465
+ ref?: string;
2466
+ } | {
2467
+ source: 'npm';
2468
+ /** An npm package spec. */
2469
+ spec: string;
2470
+ };
2471
+ /**
2472
+ * Shell commands that build a plugin in a Docker image layer, on the cell's harness image, as root
2473
+ * and with no secrets: one, a list, or `{ run, cwd }`. They run from the plugin's directory, or from
2474
+ * `cwd`, relative to the source's root (`'.'` for the repository's or package's root).
2475
+ */
2476
+ type PluginBuild = string | string[] | {
2477
+ /** The command, or the commands in order. */
2478
+ run: string | string[];
2479
+ /** Where they run, relative to the source's root; default the plugin's directory. */
2480
+ cwd?: string;
2481
+ };
2482
+ type PluginOptions = {
2483
+ /** The parts to place, e.g. `['skills', 'mcp']`; default every part the plugin has. */
2484
+ only?: readonly PluginPart[];
2485
+ /**
2486
+ * Commands that build the plugin in a Docker image layer, e.g. `'npm ci && npm run build'`, or
2487
+ * `{ run, cwd: '.' }` to run them from the source's root. Only the plugin's directory is placed.
2488
+ */
2489
+ build?: string | readonly string[] | {
2490
+ run: string | readonly string[];
2491
+ cwd?: string;
2492
+ };
2493
+ };
2494
+ type PluginHelper = {
2495
+ /** A directory with a `.claude-plugin/plugin.json`, relative to the calling file. */
2496
+ local(path: string | URL, options?: PluginOptions): PluginSource;
2497
+ /** `https://…`, `git@…`, `github:owner/repo` or a GitHub `/tree/<ref>/<path>` URL. */
2498
+ git(repo: string, options?: PluginOptions & {
2499
+ ref?: string;
2500
+ path?: string;
2501
+ }): PluginSource;
2502
+ /** A pinned npm package spec; the plugin is at `path` inside it (default its root). */
2503
+ npm(spec: string, options?: PluginOptions & {
2504
+ path?: string;
2505
+ }): PluginSource;
2506
+ /**
2507
+ * `'name@source'`: the entry `name` in a Claude Code marketplace, at a git repository (a URL or
2508
+ * `github:owner/repo`, at `ref`) or an npm package (`npm:<spec>`).
2509
+ */
2510
+ marketplace(entry: string, options?: PluginOptions & {
2511
+ ref?: string;
2512
+ }): PluginSource;
1808
2513
  };
1809
2514
  /** One environment in an `extend` chain. */
1810
2515
  type EnvironmentLayer = {
@@ -1838,6 +2543,7 @@ type EnvironmentHelpers = {
1838
2543
  secret: SecretHelper;
1839
2544
  skill: SkillHelper;
1840
2545
  mcp: McpHelper;
2546
+ plugin: PluginHelper;
1841
2547
  /** A host file, relative to the file that calls it (or an absolute path or `URL`). */
1842
2548
  file: (path: string | URL) => HostFile;
1843
2549
  /**
@@ -2232,30 +2938,11 @@ type Profile = {
2232
2938
  /** Tag filters for this profile, like `--tag` (`'!slow'` excludes). */
2233
2939
  tags?: string[];
2234
2940
  };
2235
- /** What a fake note is written from: the eval, the harness, and what its tools returned. */
2236
- type FakeNoteInput = {
2237
- eval: string;
2238
- harness: string;
2239
- attempts: Array<{
2240
- id: string;
2241
- outcome: string;
2242
- }>;
2243
- /** Each failed attempt the fake opened beside a passing one, and the step where they diverged. */
2244
- compared: Array<{
2245
- failed: string;
2246
- passed: string;
2247
- divergedAt: number | null;
2248
- }>;
2249
- };
2250
2941
  /** A canned analysis for tests; see `fakeAnalysis()` in `reeval/judge`. */
2251
2942
  type FakeAnalysisModel = {
2252
2943
  kind: 'fake-analysis';
2253
2944
  /** The model's structured answer, or a function of the digest it was given. */
2254
2945
  output?: unknown | ((digest: unknown) => unknown);
2255
- /** `analysis.agent`'s note on each eval and harness: text, a function of its tools' results, or an error to throw. */
2256
- note?: string | ((input: FakeNoteInput) => string) | {
2257
- error: string;
2258
- };
2259
2946
  /**
2260
2947
  * How it answers compare questions: a fixed pick, a function of the blinded pair, or
2261
2948
  * `{ error }` to fail every call. A pick may be `{ winner, reason? }`. Default `'tie'`.
@@ -2263,6 +2950,74 @@ type FakeAnalysisModel = {
2263
2950
  vote?: FakePick | ((pair: BlindPair) => FakePick) | {
2264
2951
  error: string;
2265
2952
  };
2953
+ /**
2954
+ * What insights get back, in `reeval run` and `reeval analyze --insights`: fixed insights, a
2955
+ * function of each call's input (`input.call` is `classify` or `insights`, once each per eval,
2956
+ * or `headline` once; it may return a promise), or `{ error }` to fail every call. It counts a
2957
+ * token per 4 characters of each call's input and answer, so `analysis.maxTokens` applies.
2958
+ */
2959
+ insights?: FakeInsights | ((input: FakeInsightsInput) => FakeInsights | Promise<FakeInsights>) | {
2960
+ error: string;
2961
+ };
2962
+ };
2963
+ /** What a fake insights function is given: one eval's scoped facts, or the run's evals for the headline. */
2964
+ type FakeInsightsInput = ModelInsightInput | ModelHeadlineInput;
2965
+ /**
2966
+ * A fake insight answer. Each call takes its part: `intent` the classification, `answer`,
2967
+ * `findings`, `rows`, `namedTools` and `remarks` the eval's, `headline` the run's. Whatever's
2968
+ * left out is empty, and the intent defaults to `job: 'other'`.
2969
+ */
2970
+ type FakeInsights = {
2971
+ intent?: {
2972
+ job: 'choose' | 'finish' | 'other';
2973
+ question?: string;
2974
+ subject?: {
2975
+ tool?: string;
2976
+ change?: string;
2977
+ };
2978
+ name?: 'states-intent' | 'no-intent' | 'contradicts';
2979
+ /** `low` falls back to `job: 'other'`, as a real classification does. */
2980
+ confidence?: 'high' | 'medium' | 'low';
2981
+ };
2982
+ answer?: {
2983
+ text: string;
2984
+ cites: string[];
2985
+ } | null;
2986
+ findings?: Array<{
2987
+ text: string;
2988
+ cites: string[];
2989
+ }>;
2990
+ rows?: Array<{
2991
+ row: string;
2992
+ text: string;
2993
+ cites: string[];
2994
+ }>;
2995
+ namedTools?: Array<{
2996
+ attempt: string;
2997
+ tools: string[];
2998
+ }>;
2999
+ /**
3000
+ * The eval's remarks, as the model's JSON would have them: `source.at` and `fix.at` are
3001
+ * `L<n>` lines of the eval's source, `evidence` fact ids (`F1`) or attempt lines (`A1#L3`).
3002
+ * They go through the same gates as a model's, so one missing a part is dropped.
3003
+ */
3004
+ remarks?: Array<{
3005
+ kind: string;
3006
+ text: string;
3007
+ source?: {
3008
+ at: string;
3009
+ quote: string;
3010
+ } | null;
3011
+ evidence?: string[];
3012
+ fix?: {
3013
+ at: string;
3014
+ edit: string;
3015
+ } | null;
3016
+ }>;
3017
+ headline?: {
3018
+ text: string;
3019
+ cites: string[];
3020
+ } | null;
2266
3021
  };
2267
3022
  /** A blinded label's pick: the attempt shown first (`A`), second (`B`), or neither. */
2268
3023
  type FakeVote = 'A' | 'B' | 'tie';
@@ -2314,15 +3069,24 @@ type BlindSide = BlindTurn & {
2314
3069
  missing: true;
2315
3070
  }>;
2316
3071
  };
2317
- /** `reeval analyze`: a language model (not an evaluation model) and what matters in this project. */
3072
+ /** Insights and `reeval analyze`: a language model (not an evaluation model) and what matters in this project. */
2318
3073
  type AnalysisConfig = {
2319
- /** `'provider/model'`, e.g. `'google/gemini-3.8-flash'`; default: the judge's, if it's one. */
3074
+ /**
3075
+ * `'provider/model'`, e.g. `'google/gemini-3.8-flash'`. Insights use it only; `reeval analyze`
3076
+ * and compare questions fall back to the judge's when it's a language model.
3077
+ */
2320
3078
  model?: string | FakeAnalysisModel;
2321
3079
  /**
2322
- * `reeval run` writes a note on each eval and harness once its attempts finish, with the analysis
2323
- * model (default false: one call per eval and harness, every run).
3080
+ * `reeval run` classifies each eval and explains its result with `model` once the attempts
3081
+ * finish (default true when `model` is set; `--no-insights` turns it off for one run).
2324
3082
  */
2325
- agent?: boolean;
3083
+ insights?: boolean;
3084
+ /**
3085
+ * Tokens (in and out) that one run's insights may use, over every classification, insight and
3086
+ * headline call (default 250000). Past it, the evals left print without insights; the run's
3087
+ * outcome and exit code never change.
3088
+ */
3089
+ maxTokens?: number;
2326
3090
  /** Added to the prompt, e.g. "Fewer tool calls count as a win. The skill under test is reeval-good." */
2327
3091
  instructions?: string;
2328
3092
  /** The digest's cap; evidence is dropped, lowest priority first, to fit (default 20000). */
@@ -2388,7 +3152,7 @@ type ReevalConfig = {
2388
3152
  keep?: number;
2389
3153
  traceBufferMb?: number;
2390
3154
  };
2391
- /** `reeval analyze`, compare questions without a model, and `agent`'s notes during a run. */
3155
+ /** Insights during `reeval run`, `reeval analyze`, and compare questions without a model. */
2392
3156
  analysis?: AnalysisConfig;
2393
3157
  };
2394
3158
  /** What a `defineConfig` callback gets: the environment helpers plus the run's context. */
@@ -2437,6 +3201,23 @@ type AttemptError = {
2437
3201
  prepare?: PrepareFailureRecord;
2438
3202
  resource?: ResourceFailureRecord;
2439
3203
  };
3204
+ /**
3205
+ * One start of a stdio MCP server during a turn (`turns[].mcpStartup`, in start order), timed by
3206
+ * reeval's MCP timer, which every stdio server runs through. An agent CLI that runs a process per
3207
+ * turn (Antigravity, pi, Codex) starts its servers on every turn; one that keeps a session starts
3208
+ * them once, on the first. A server that doesn't answer within 60s fails the attempt as an infra
3209
+ * error naming it; one whose client closes it first doesn't. `mcpStartup` is absent when the
3210
+ * environment has no stdio MCP server, or the sandbox has no `node` to run the timer.
3211
+ */
3212
+ type McpStartup = {
3213
+ /** The server's name in the environment's `mcp`. */
3214
+ server: string;
3215
+ /**
3216
+ * Milliseconds from spawning the server to its answer to the client's `initialize`; null when it
3217
+ * never answered (it exited first, timed out, or its client closed it first).
3218
+ */
3219
+ ms: number | null;
3220
+ };
2440
3221
  /** Where an eval's time went, in ms. `agentMs` is the harness turns; `diffMs` reading changes. */
2441
3222
  type PhaseTimings = {
2442
3223
  setupMs: number;
@@ -2455,12 +3236,45 @@ type CellRole = 'control' | 'variant';
2455
3236
  type Cell = {
2456
3237
  key: string;
2457
3238
  harness: string;
3239
+ /** The environment's own name, also on a variant cell (`with-house-greeting`, with no prefix). */
2458
3240
  environment: string;
2459
3241
  sandbox: string;
2460
3242
  role: CellRole;
2461
3243
  /** The variant's name, for variant cells. */
2462
3244
  variant?: string;
2463
3245
  };
3246
+ /** A plugin as an attempt placed it. */
3247
+ type PluginRecord = {
3248
+ /** The manifest's `name`. */
3249
+ name: string;
3250
+ /** Where it came from, e.g. `local:plugins/review`, `github:acme/agent-plugins#v1:plugins/review` or `npm:@acme/review@1.2.0`; for a marketplace entry, the entry's own source. */
3251
+ source: string;
3252
+ /**
3253
+ * The marketplace it was listed in, with its `marketplace.json` name, its source as written
3254
+ * (`github:acme/agent-plugins#v3`, `npm:@acme/plugins@2.0.0`) and the commit a git one resolved
3255
+ * to (null for npm); null when the plugin was named directly.
3256
+ */
3257
+ marketplace: {
3258
+ name: string;
3259
+ source: string;
3260
+ commit: string | null;
3261
+ } | null;
3262
+ /** The commit a git source resolved to (the marketplace's, for an entry inside it); null for a local or npm one. */
3263
+ commit: string | null;
3264
+ /** The hash of the files placed. */
3265
+ sha256: string;
3266
+ /** The tag of the image layer its build ran in (`reeval-plugin:…`); null without a build. */
3267
+ build: string | null;
3268
+ /** What it placed: skill, agent, command and MCP server names, hook events, and whether it had rules. */
3269
+ parts: {
3270
+ skills: string[];
3271
+ agents: string[];
3272
+ commands: string[];
3273
+ hooks: string[];
3274
+ mcp: string[];
3275
+ rules: boolean;
3276
+ };
3277
+ };
2464
3278
  /** An environment as it was applied, without secret values. */
2465
3279
  type EnvironmentRecord = {
2466
3280
  name: string;
@@ -2479,8 +3293,13 @@ type EnvironmentRecord = {
2479
3293
  placement: SkillPlacement;
2480
3294
  /** Paths left out of the sandbox by `exclude` (directories end in `/`); `.git` isn't listed. */
2481
3295
  excluded: string[];
3296
+ /** The plugin the skill came with; unset for a skill from `skills`. */
3297
+ plugin?: string;
2482
3298
  }>;
3299
+ /** Every MCP server, a plugin's as `<plugin>:<server>`. */
2483
3300
  mcp: string[];
3301
+ /** The plugins placed, each with what it placed; in the digest. Unset when there are none. */
3302
+ plugins?: PluginRecord[];
2484
3303
  files: Array<{
2485
3304
  path: string;
2486
3305
  sha256: string;
@@ -2545,7 +3364,7 @@ type AttemptImage = {
2545
3364
  /** Content-addressed image id (`sha256:…`). */
2546
3365
  id: string;
2547
3366
  agentCli: string | null;
2548
- /** The harness image `install` was baked onto: `ref` itself without `install`. */
3367
+ /** The harness image `install` and plugin builds were baked onto: `ref` itself without either. */
2549
3368
  base: string;
2550
3369
  /** The `docker({ install })` commands, in order. */
2551
3370
  install: string[];
@@ -2616,5 +3435,5 @@ type SandboxWarning = {
2616
3435
  message: string;
2617
3436
  };
2618
3437
  //#endregion
2619
- export { GrokBuildHarnessDescriptor as $, RunRecord as $t, DirectoryOptions as A, SetupStep as At, EvalFn as B, WebEventType as Bt, CompareCut as C, formatCount as Cn, ProfileLimit as Ct, ConfigJudgeOptions as D, Secret as Dt, ConfigHelpers as E, tokenValues as En, SandboxWarning as Et, EnvVars as F, TurnData as Ft, FakeHarnessDescriptor as G, FamilyLift as Gt, EvalOptionsData as H, AttemptRecord as Ht, Environment as I, TurnStatus as It, FakeSandboxDescriptor as J, FileRef as Jt, FakeJudgeModel as K, FamilyRate as Kt, EnvironmentHelpers as L, Verdict as Lt, Duration as M, TokenUsage as Mt, EgressPolicy as N, TranscriptEvent as Nt, CursorHarnessDescriptor as O, SecretTemplate as Ot, EgressRecord as P, Turn as Pt, GooseHarnessDescriptor as Q, Lift as Qt, EnvironmentInput as R, Viewport as Rt, CompareAnswer as S, effortVerdict as Sn, ProfileDefaults as St, CompareQuestion as T, formatSeconds as Tn, SandboxDescriptor as Tt, ExecResult as U, CellRecord as Ut, EvalOptions as V, ArtifactRef as Vt, FakeAnalysisModel as W, EvalEntry as Wt, FakeVote as X, HistoryEntry as Xt, FakeScriptStep as Y, HistoryCell as Yt, FxHarnessDescriptor as Z, JudgementRecord as Zt, Cell as _, effortChangeLabel as _n, PairFactor as _t, BackgroundHandle as a, EffortContrast as an, HistoryConfig as at, ClaudeCodeHarnessDescriptor as b, effortSample as bn, PinnableKey as bt, Capture as c, EffortVerdict as cn, JudgeCallOptions as ct, CaptureOptions as d, VERDICT_TEXT as dn, JudgeOptions as dt, StackSummary as en, GroupOptions as et, CaptureUse as f, cellContrast as fn, JudgeState as ft, CaptureWindow as g, directional as gn, Outcome as gt, CaptureWait as h, contrastEffort as hn, OpenCodeHarnessDescriptor as ht, AttemptContext as i, EFFORT_MIN_RUNS as in, HarnessOption as it, DockerSandboxDescriptor as j, SkillSource as jt, Diff as k, ServeHandle as kt, CaptureCall as l, Spread as ln, JudgeFailure as lt, CaptureUseScript as m, cellSamples as mn, McpServer as mt, AnalysisConfig as n, DIRECTIONAL_MIN as nn, HarnessDescriptor as nt, BlindPair as o, EffortMetric as on, HostFile as ot, CaptureUseAction as p, cellEffort as pn, JudgeStateOptions as pt, FakeNoteInput as q, FamilyRecord as qt, AntigravityHarnessDescriptor as r, EFFORT_ALPHA as rn, HarnessEdit as rt, Budget as s, EffortSample as sn, JudgeArtifactRef as st, AgentHarnessDescriptor as t, CellEffort as tn, HarnessData as tt, CaptureInstruction as u, TOKENS_UNREPORTED as un, JudgeModel as ut, CellRole as v, effortLabel as vn, PairVote as vt, CompareOptions as w, formatRatio as wn, ReevalConfig as wt, CodexHarnessDescriptor as x, effortSummary as xn, Profile as xt, ClaudeCodeEffort as y, effortOf as yn, PiHarnessDescriptor as yt, EnvironmentSpec as z, Wait as zt };
2620
- //# sourceMappingURL=types-g17bRAzt.d.ts.map
3438
+ export { GooseHarnessDescriptor as $, cellEffort as $n, fromModel as $t, DirectoryOptions as A, FamilyLift as An, Secret as At, EvalFn as B, CellEffort as Bn, Verdict as Bt, CompareCut as C, factSegment as Cn, PluginSource as Ct, ConfigJudgeOptions as D, AttemptRecord as Dn, ReevalConfig as Dt, ConfigHelpers as E, ArtifactRef as En, ProfileLimit as Et, EnvVars as F, HistoryEntry as Fn, TokenUsage as Ft, FakeHarnessDescriptor as G, EffortMetric as Gn, INSIGHTS_FILE as Gt, EvalOptionsData as H, EFFORT_ALPHA as Hn, Wait as Ht, Environment as I, JudgementRecord as In, TranscriptEvent as It, FakeJudgeModel as J, Spread as Jn, NO_MODEL as Jt, FakeInsights as K, EffortSample as Kn, Job as Kt, EnvironmentHelpers as L, Lift as Ln, Turn as Lt, Duration as M, FamilyRecord as Mn, ServeHandle as Mt, EgressPolicy as N, FileRef as Nn, SetupStep as Nt, CursorHarnessDescriptor as O, CellRecord as On, SandboxDescriptor as Ot, EgressRecord as P, HistoryCell as Pn, SkillSource as Pt, FxHarnessDescriptor as Q, cellContrast as Qn, Sentence as Qt, EnvironmentInput as R, RunRecord as Rn, TurnData as Rt, CompareAnswer as S, evalAcross as Sn, PluginPart as St, CompareQuestion as T, suiteResult as Tn, ProfileDefaults as Tt, ExecResult as U, EFFORT_MIN_RUNS as Un, WebEventType as Ut, EvalOptions as V, DIRECTIONAL_MIN as Vn, Viewport as Vt, FakeAnalysisModel as W, EffortContrast as Wn, EvalInsight as Wt, FakeScriptStep as X, VERDICT_TEXT as Xn, Remark as Xt, FakeSandboxDescriptor as Y, TOKENS_UNREPORTED as Yn, REMARK_KINDS as Yt, FakeVote as Z, bothUnderATenth as Zn, RunInsights as Zt, Cell as _, SuiteTally as _n, Outcome as _t, BackgroundHandle as a, CheckResult as an, effortOf as ar, HarnessOption as at, ClaudeCodeHarnessDescriptor as b, countedOf as bn, PiHarnessDescriptor as bt, Capture as c, EffortCounters as cn, effortVerdict as cr, JudgeArtifactRef as ct, CaptureOptions as d, JudgeResult as dn, formatSeconds as dr, JudgeModel as dt, Across as en, cellSamples as er, GrokBuildHarnessDescriptor as et, CaptureUse as f, PooledArm as fn, tokenValues as fr, JudgeOptions as ft, CaptureWindow as g, SuiteResult as gn, OpenCodeHarnessDescriptor as gt, CaptureWait as h, ResultOutcome as hn, McpServer as ht, AttemptContext as i, CheckOutcome as in, effortLabel as ir, HarnessEdit as it, DockerSandboxDescriptor as j, FamilyRate as jn, SecretTemplate as jt, Diff as k, EvalEntry as kn, SandboxWarning as kt, CaptureCall as l, EvalResult as ln, formatCount as lr, JudgeCallOptions as lt, CaptureUseScript as m, ResultFile as mn, JudgeStateOptions as mt, AnalysisConfig as n, CellError as nn, directional as nr, HarnessData as nt, BlindPair as o, EFFECT_MIN_COUNTED as on, effortSample as or, HistoryConfig as ot, CaptureUseAction as p, QuestionResult as pn, JudgeState as pt, FakeInsightsInput as q, EffortVerdict as qn, MODEL_REMARK_KINDS as qt, AntigravityHarnessDescriptor as r, CellResult as rn, effortChangeLabel as rr, HarnessDescriptor as rt, Budget as s, Effect as sn, effortSummary as sr, HostFile as st, AgentHarnessDescriptor as t, CaseResult as tn, contrastEffort as tr, GroupOptions as tt, CaptureInstruction as u, Interval as un, formatRatio as ur, JudgeFailure as ut, CellRole as v, cancelledOf as vn, PairFactor as vt, CompareOptions as w, messageLine as wn, Profile as wt, CodexHarnessDescriptor as x, effectOf as xn, PinnableKey as xt, ClaudeCodeEffort as y, checkEffect as yn, PairVote as yt, EnvironmentSpec as z, StackSummary as zn, TurnStatus as zt };
3439
+ //# sourceMappingURL=types-GraZtfHN.d.ts.map