reeval 0.8.0 → 0.9.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 (198) hide show
  1. package/README.md +10 -10
  2. package/dist/{agent-B72lZ6w5.js → agent-6FefIhX7.js} +5 -5
  3. package/dist/{agent-B72lZ6w5.js.map → agent-6FefIhX7.js.map} +1 -1
  4. package/dist/{agent-Cfj1wD4D.js → agent-WSmTaesf.js} +51 -16
  5. package/dist/agent-WSmTaesf.js.map +1 -0
  6. package/dist/{analysis-BTNnKh1w.js → analysis-DlGBDjTj.js} +3 -3
  7. package/dist/{analysis-BTNnKh1w.js.map → analysis-DlGBDjTj.js.map} +1 -1
  8. package/dist/{assemble-BbFVjHeS.js → assemble-BCZzTyR7.js} +243 -11
  9. package/dist/assemble-BCZzTyR7.js.map +1 -0
  10. package/dist/assemble-C5qq5yT2.js +2 -0
  11. package/dist/{capture-BXhBfmsM.js → capture-Bp74Z6Fr.js} +66 -15
  12. package/dist/capture-Bp74Z6Fr.js.map +1 -0
  13. package/dist/capture-DS-cPyuE.js +2 -0
  14. package/dist/{cli-BMjTKY-D.js → cli-CVrMh_qz.js} +201 -108
  15. package/dist/cli-CVrMh_qz.js.map +1 -0
  16. package/dist/{cli-spec-DSvKsOK4.js → cli-spec-CKEYa8V2.js} +3 -3
  17. package/dist/{cli-spec-DSvKsOK4.js.map → cli-spec-CKEYa8V2.js.map} +1 -1
  18. package/dist/cli.js +2 -2
  19. package/dist/{client-CwzU9CiW.js → client-Bbo9SPlK.js} +31 -2
  20. package/dist/client-Bbo9SPlK.js.map +1 -0
  21. package/dist/{command-BdstSEHu.js → command-BFP0hKEb.js} +7 -7
  22. package/dist/{command-BdstSEHu.js.map → command-BFP0hKEb.js.map} +1 -1
  23. package/dist/command-BrmXUC-W.js +2 -0
  24. package/dist/{command-BK4kOgkH.js → command-C5xFPKHM.js} +19 -18
  25. package/dist/command-C5xFPKHM.js.map +1 -0
  26. package/dist/{command-JPGNzFsA.js → command-CzIFp1JQ.js} +10 -10
  27. package/dist/{command-JPGNzFsA.js.map → command-CzIFp1JQ.js.map} +1 -1
  28. package/dist/{command-BqJtFiPy.js → command-DUT5l13I.js} +82 -32
  29. package/dist/command-DUT5l13I.js.map +1 -0
  30. package/dist/{commands-B618jg3C.js → commands-CLmPBrTS.js} +6 -6
  31. package/dist/{commands-B618jg3C.js.map → commands-CLmPBrTS.js.map} +1 -1
  32. package/dist/{commands-Duo2ur3r.js → commands-fI3G2Wnh.js} +1 -1
  33. package/dist/{config-B-E0xRkf.js → config-CGvBeewH.js} +17 -7
  34. package/dist/config-CGvBeewH.js.map +1 -0
  35. package/dist/{context-CvUv7DUb.js → context-DbSMEVKs.js} +1 -5
  36. package/dist/{context-CvUv7DUb.js.map → context-DbSMEVKs.js.map} +1 -1
  37. package/dist/{db-CnoUy-FZ.js → db-CSSFtGcN.js} +1 -1
  38. package/dist/{db-DFbtGIYy.js → db-CfQFwJtq.js} +137 -27
  39. package/dist/db-CfQFwJtq.js.map +1 -0
  40. package/dist/{docker-2qns7hJ2.js → docker-CRQGQbIt.js} +17 -5
  41. package/dist/docker-CRQGQbIt.js.map +1 -0
  42. package/dist/{docker-IFRW8K5f.js → docker-DV2GNgle.js} +2 -2
  43. package/dist/{docker-IFRW8K5f.js.map → docker-DV2GNgle.js.map} +1 -1
  44. package/dist/{docker-D6t23fZl.js → docker-Df_YOxxB.js} +1 -1
  45. package/dist/{doctor-B6oYTPoR.js → doctor-DlKycx5H.js} +12 -12
  46. package/dist/{doctor-B6oYTPoR.js.map → doctor-DlKycx5H.js.map} +1 -1
  47. package/dist/{egress-IUKdeayc.js → egress-BhzNh7Yi.js} +10 -9
  48. package/dist/{egress-IUKdeayc.js.map → egress-BhzNh7Yi.js.map} +1 -1
  49. package/dist/{environment-DiCljXMD.js → environment-1jE-HhO-.js} +2 -2
  50. package/dist/{environment-DiCljXMD.js.map → environment-1jE-HhO-.js.map} +1 -1
  51. package/dist/family-D2b7WD10.js +67 -0
  52. package/dist/family-D2b7WD10.js.map +1 -0
  53. package/dist/files-AiEKuEZe.js +2 -0
  54. package/dist/files-BMCvfB4X.js +2 -0
  55. package/dist/{files-CMSUXAEg.js → files-CSzVADHn.js} +4 -4
  56. package/dist/{files-CMSUXAEg.js.map → files-CSzVADHn.js.map} +1 -1
  57. package/dist/{files-B6aVVGrk.js → files-DJUFg-4e.js} +2 -2
  58. package/dist/{files-B6aVVGrk.js.map → files-DJUFg-4e.js.map} +1 -1
  59. package/dist/{git-EmdFJ4DY.js → git-DfG-YJ1u.js} +2 -2
  60. package/dist/{git-EmdFJ4DY.js.map → git-DfG-YJ1u.js.map} +1 -1
  61. package/dist/{harness-iqWeJQMM.js → harness-CeCp2GSW.js} +19 -2
  62. package/dist/harness-CeCp2GSW.js.map +1 -0
  63. package/dist/harness.d.ts +5 -3
  64. package/dist/harness.js +1 -1
  65. package/dist/{header-_F0EWob3.js → header-CALhmafp.js} +10 -3
  66. package/dist/{header-_F0EWob3.js.map → header-CALhmafp.js.map} +1 -1
  67. package/dist/{images-CscddrJU.js → images-BMgdpMAX.js} +6 -6
  68. package/dist/{images-CscddrJU.js.map → images-BMgdpMAX.js.map} +1 -1
  69. package/dist/index.d.ts +17 -5
  70. package/dist/index.js +92 -62
  71. package/dist/index.js.map +1 -1
  72. package/dist/init-B6vegaP_.js +2 -0
  73. package/dist/{init-NQfIvi-0.js → init-BIdLF0F9.js} +4 -4
  74. package/dist/{init-NQfIvi-0.js.map → init-BIdLF0F9.js.map} +1 -1
  75. package/dist/{invocations-nPvrlZPj.js → invocations-CLaL8AuW.js} +2 -2
  76. package/dist/{invocations-nPvrlZPj.js.map → invocations-CLaL8AuW.js.map} +1 -1
  77. package/dist/judge.d.ts +1 -1
  78. package/dist/{model-Cl507trk.js → model-B1BZoZ9b.js} +4 -4
  79. package/dist/{model-Cl507trk.js.map → model-B1BZoZ9b.js.map} +1 -1
  80. package/dist/{model-BndnmcLm.js → model-BOnlAPzs.js} +162 -17
  81. package/dist/model-BOnlAPzs.js.map +1 -0
  82. package/dist/model-DWeg5J7z.js +2 -0
  83. package/dist/{model-DMOraCcm.js → model-FXko2kl7.js} +1 -1
  84. package/dist/{options-DPUlm4FI.js → options-CKqyPGxX.js} +12 -8
  85. package/dist/options-CKqyPGxX.js.map +1 -0
  86. package/dist/{patch-CGCVipPu.js → patch-bDV8YFW0.js} +2 -2
  87. package/dist/{patch-CGCVipPu.js.map → patch-bDV8YFW0.js.map} +1 -1
  88. package/dist/{plan-PPc4-6xd.js → plan-DUydFc_1.js} +53 -25
  89. package/dist/plan-DUydFc_1.js.map +1 -0
  90. package/dist/{preflight-CddycK92.js → preflight-BkoSxf4C.js} +3 -3
  91. package/dist/{preflight-CddycK92.js.map → preflight-BkoSxf4C.js.map} +1 -1
  92. package/dist/{preflight-Zumy0adT.js → preflight-D5LW7Oqi.js} +1 -1
  93. package/dist/{prepare-CsP-057p.js → prepare-CUAWHebF.js} +5 -5
  94. package/dist/{prepare-CsP-057p.js.map → prepare-CUAWHebF.js.map} +1 -1
  95. package/dist/{prepare-CKdMoC7e.js → prepare-oji2oO8W.js} +2 -2
  96. package/dist/process-CSVO_jsc.js +119 -0
  97. package/dist/process-CSVO_jsc.js.map +1 -0
  98. package/dist/{provenance-CsX6PHDR.js → provenance-D7HK3vzt.js} +2 -2
  99. package/dist/{provenance-CsX6PHDR.js.map → provenance-D7HK3vzt.js.map} +1 -1
  100. package/dist/{providers-DkwiLKDS.js → providers-B1DzMvmH.js} +3 -3
  101. package/dist/{providers-DkwiLKDS.js.map → providers-B1DzMvmH.js.map} +1 -1
  102. package/dist/{providers-yXZZcPfx.js → providers-CpEfNU1F.js} +1 -1
  103. package/dist/{query-BUcwCYsI.js → query-BjBMLa-C.js} +2 -2
  104. package/dist/{query-BUcwCYsI.js.map → query-BjBMLa-C.js.map} +1 -1
  105. package/dist/query-oPO_XrTy.js +2 -0
  106. package/dist/{questions-BEPj98fZ.js → questions-B8by4Bbt.js} +3 -3
  107. package/dist/{questions-BEPj98fZ.js.map → questions-B8by4Bbt.js.map} +1 -1
  108. package/dist/{results-BcSHWbgB.js → results-Di7m8dQ3.js} +4 -4
  109. package/dist/{results-BcSHWbgB.js.map → results-Di7m8dQ3.js.map} +1 -1
  110. package/dist/{resume-DZ9AmfPv.js → resume-SUz1GskV.js} +3 -3
  111. package/dist/{resume-DZ9AmfPv.js.map → resume-SUz1GskV.js.map} +1 -1
  112. package/dist/{runtime-Dfb2r-cS.js → runtime-DdsfnRz_.js} +148 -6
  113. package/dist/runtime-DdsfnRz_.js.map +1 -0
  114. package/dist/{sandbox--ZXuscAZ.js → sandbox-D5v-of6d.js} +10 -5
  115. package/dist/sandbox-D5v-of6d.js.map +1 -0
  116. package/dist/sandbox.d.ts +4 -3
  117. package/dist/sandbox.js +1 -1
  118. package/dist/{server-Da60oe4b.js → server-BNnXtmS8.js} +7 -7
  119. package/dist/{server-Da60oe4b.js.map → server-BNnXtmS8.js.map} +1 -1
  120. package/dist/server-BNwoKzlm.js +2 -0
  121. package/dist/source-Bk_0ZaEY.js +2 -0
  122. package/dist/{source-BVOnL3sn.js → source-Dof0NQBm.js} +2 -2
  123. package/dist/{source-BVOnL3sn.js.map → source-Dof0NQBm.js.map} +1 -1
  124. package/dist/{src-TdJuDYqB.js → src-8rRXy4u9.js} +71 -124
  125. package/dist/src-8rRXy4u9.js.map +1 -0
  126. package/dist/{src-DdRlaiRc.js → src-BGWuWp6I.js} +1 -1
  127. package/dist/{src-D13vpMh0.js → src-BRt0O02i.js} +1 -1
  128. package/dist/{src-BrMbt1B2.js → src-Bx2x1ekD.js} +1 -1
  129. package/dist/{src-CxTC5kNI.js → src-COgE7991.js} +4 -6
  130. package/dist/{src-CxTC5kNI.js.map → src-COgE7991.js.map} +1 -1
  131. package/dist/{src-D_cXqmnI.js → src-C_4Umgh2.js} +9 -10
  132. package/dist/{src-D_cXqmnI.js.map → src-C_4Umgh2.js.map} +1 -1
  133. package/dist/src-DLa-ESW0.js +4 -0
  134. package/dist/src-cN0aB-WR.js +3 -0
  135. package/dist/{src-BT4dB5CO.js → src-cdIVjC5b.js} +1 -1
  136. package/dist/{src-BT5pwco0.js → src-sIsDHWYq.js} +1 -1
  137. package/dist/state-Bo5zg4da.js +2 -0
  138. package/dist/{state-B72h_jEw.js → state-CiXyLqg0.js} +5 -5
  139. package/dist/{state-B72h_jEw.js.map → state-CiXyLqg0.js.map} +1 -1
  140. package/dist/studio-app/assets/index-B9MCTfuu.css +2 -0
  141. package/dist/studio-app/assets/{index-Bgr-efZm.js → index-CROH2NB3.js} +12 -12
  142. package/dist/studio-app/index.html +2 -2
  143. package/dist/{summary-CJdxaRdM.js → summary-2OAWF2N7.js} +6 -6
  144. package/dist/{summary-CJdxaRdM.js.map → summary-2OAWF2N7.js.map} +1 -1
  145. package/dist/{summary-k3mhWWXv.js → summary-BTksrIxn.js} +58 -4
  146. package/dist/summary-BTksrIxn.js.map +1 -0
  147. package/dist/testing.d.ts +1 -1
  148. package/dist/{tools-D0gF2QoV.js → tools-B10Uj7OI.js} +4 -4
  149. package/dist/tools-B10Uj7OI.js.map +1 -0
  150. package/dist/types-C5vI3g1C.js.map +1 -1
  151. package/dist/{types-_LOFdPUf.d.ts → types-D8RLfkFP.d.ts} +195 -13
  152. package/dist/view/index.d.ts +44 -12
  153. package/dist/view/index.js +5 -4
  154. package/dist/views-Cs2Oqayd.js +3 -0
  155. package/dist/{views-DZ1YDqey.js → views-Dqa5ojfZ.js} +4 -4
  156. package/dist/{views-DZ1YDqey.js.map → views-Dqa5ojfZ.js.map} +1 -1
  157. package/dist/{worker-entry-DXeyWY-m.js → worker-entry-BAikHl9F.js} +9 -5
  158. package/dist/worker-entry-BAikHl9F.js.map +1 -0
  159. package/dist/{workspace-DpXdrslo.js → workspace-C-TrNIUc.js} +4 -4
  160. package/dist/{workspace-DpXdrslo.js.map → workspace-C-TrNIUc.js.map} +1 -1
  161. package/dist/{workspace-DzNL-3iO.js → workspace-Do_SiWBs.js} +1 -1
  162. package/docker/Dockerfile +7 -5
  163. package/package.json +1 -1
  164. package/dist/agent-Cfj1wD4D.js.map +0 -1
  165. package/dist/assemble-BbFVjHeS.js.map +0 -1
  166. package/dist/assemble-CXiTVyHD.js +0 -2
  167. package/dist/capture-BXhBfmsM.js.map +0 -1
  168. package/dist/capture-N7r3yeak.js +0 -2
  169. package/dist/cli-BMjTKY-D.js.map +0 -1
  170. package/dist/client-CwzU9CiW.js.map +0 -1
  171. package/dist/command-BK4kOgkH.js.map +0 -1
  172. package/dist/command-BqJtFiPy.js.map +0 -1
  173. package/dist/command-CTVGuH8y.js +0 -2
  174. package/dist/config-B-E0xRkf.js.map +0 -1
  175. package/dist/db-DFbtGIYy.js.map +0 -1
  176. package/dist/docker-2qns7hJ2.js.map +0 -1
  177. package/dist/files-BpYgF2z0.js +0 -2
  178. package/dist/files-YCCVaTQC.js +0 -2
  179. package/dist/harness-iqWeJQMM.js.map +0 -1
  180. package/dist/init-DBHyi92L.js +0 -2
  181. package/dist/model-BbLGRtOs.js +0 -2
  182. package/dist/model-BndnmcLm.js.map +0 -1
  183. package/dist/options-DPUlm4FI.js.map +0 -1
  184. package/dist/plan-PPc4-6xd.js.map +0 -1
  185. package/dist/query-noGbekGF.js +0 -2
  186. package/dist/runtime-Dfb2r-cS.js.map +0 -1
  187. package/dist/sandbox--ZXuscAZ.js.map +0 -1
  188. package/dist/server-DiGR4JxK.js +0 -2
  189. package/dist/source-Dqu0jKwx.js +0 -2
  190. package/dist/src-BHNiP-5A.js +0 -4
  191. package/dist/src-TdJuDYqB.js.map +0 -1
  192. package/dist/src-xczuQbE6.js +0 -3
  193. package/dist/state-Bf_Vq_pV.js +0 -2
  194. package/dist/studio-app/assets/index-CUx6GoL5.css +0 -2
  195. package/dist/summary-k3mhWWXv.js.map +0 -1
  196. package/dist/tools-D0gF2QoV.js.map +0 -1
  197. package/dist/views-Ds0GXWtX.js +0 -3
  198. package/dist/worker-entry-DXeyWY-m.js.map +0 -1
@@ -3,25 +3,26 @@ import { t as parseDuration } from "./duration-JsJrIWXq.js";
3
3
  import { n as loadEnvFiles, t as inCI } from "./env-BQqj93gu.js";
4
4
  import { o as redactSecrets, s as registerSecret } from "./redact-DJ9JCShu.js";
5
5
  import { o as PACKAGE_VERSION } from "./root-CvdRlRZX.js";
6
- import { T as workspaceLabel, u as environmentSandbox } from "./environment-DiCljXMD.js";
6
+ import { T as workspaceLabel, u as environmentSandbox } from "./environment-1jE-HhO-.js";
7
7
  import { a as fromCwd, i as evalSlug, n as attemptKey, o as newRunId } from "./ids-Bp6ut7ZD.js";
8
- import { I as LABEL, X as imageInfo } from "./src-TdJuDYqB.js";
9
- import { d as sandboxId, s as harnessId } from "./options-DPUlm4FI.js";
10
- import { c as hostCapacity, d as missingCredentials, f as resolveConcurrency, i as configPathFor, l as loadConfig, p as selectProfile, r as configLabel, s as findConfig, u as malformedCredentials } from "./config-B-E0xRkf.js";
8
+ import { I as LABEL, X as imageInfo } from "./src-8rRXy4u9.js";
9
+ import { d as sandboxId, s as harnessId } from "./options-CKqyPGxX.js";
10
+ import { a as configPathFor, c as findConfig, d as malformedCredentials, f as missingCredentials, h as selectProfile, i as configLabel, l as hostCapacity, m as resolveConcurrency, p as requireConfig, u as loadConfig } from "./config-CGvBeewH.js";
11
11
  import { s as debugTime } from "./debug-D24NOQH1.js";
12
12
  import { i as sandboxWarningLine, n as clip, r as formatDuration } from "./text-gEcKjAyp.js";
13
13
  import { t as PrepareError } from "./provider-CmAYTQQs.js";
14
- import { H as cellContrast, L as judgeRatesLabel, M as cellJudgeRates, N as cellUsage, P as collapsedJudgeLabel, _ as hasUngatedCells, b as isUngatedMiss, h as formatUsage, q as effortLabel, w as runOutcome } from "./model-BndnmcLm.js";
14
+ import { H as cellContrast, L as judgeRatesLabel, M as cellJudgeRates, N as cellUsage, P as collapsedJudgeLabel, _ as hasUngatedCells, b as isUngatedMiss, h as formatUsage, q as effortLabel, w as runOutcome } from "./model-BOnlAPzs.js";
15
+ import { a as familyLiftLabel, i as familyHeadLabel, n as familyCases, o as familyRateLabel, r as familyEffortLabel, t as caseLabel } from "./family-D2b7WD10.js";
15
16
  import { a as sampleReasons } from "./pairs-DDsjgm5F.js";
16
- import { a as liftLabel, i as gateLabel, n as answersLabel } from "./summary-k3mhWWXv.js";
17
- import { c as writeLiveProgress, i as prepareResume, o as resolveResume, r as loadPrevious, s as writeCurrent, t as completedKeysFor } from "./resume-DZ9AmfPv.js";
18
- import { n as FLAGS, o as helpText, r as GLOBAL, t as COMMANDS } from "./cli-spec-DSvKsOK4.js";
19
- import { i as runtimeInfo, n as gitInfo, r as runnerInfo, t as author } from "./provenance-CsX6PHDR.js";
17
+ import { a as gateLabel, d as undiscriminating, f as undiscriminatingLabel, i as checksLabel, n as answersLabel, o as liftLabel } from "./summary-BTksrIxn.js";
18
+ import { c as writeLiveProgress, i as prepareResume, o as resolveResume, r as loadPrevious, s as writeCurrent, t as completedKeysFor } from "./resume-SUz1GskV.js";
19
+ import { n as FLAGS, o as helpText, r as GLOBAL, t as COMMANDS } from "./cli-spec-CKEYa8V2.js";
20
+ import { i as runtimeInfo, n as gitInfo, r as runnerInfo, t as author } from "./provenance-D7HK3vzt.js";
20
21
  import { t as budgetMarker } from "./budget-DBUrH4jX.js";
21
- import { n as prepareAll, o as writePrepared, r as prepareTargets, t as RunStopError } from "./preflight-CddycK92.js";
22
- import { r as imageHarness } from "./prepare-CsP-057p.js";
23
- import { n as createProviders } from "./providers-DkwiLKDS.js";
24
- import { a as redactArgv, r as commandOf, t as logInvocation } from "./invocations-nPvrlZPj.js";
22
+ import { n as prepareAll, o as writePrepared, r as prepareTargets, t as RunStopError } from "./preflight-BkoSxf4C.js";
23
+ import { r as imageHarness } from "./prepare-CUAWHebF.js";
24
+ import { n as createProviders } from "./providers-B1DzMvmH.js";
25
+ import { a as redactArgv, r as commandOf, t as logInvocation } from "./invocations-CLaL8AuW.js";
25
26
  import { n as stripAnsi, t as colors } from "./colors-QV9dFVhN.js";
26
27
  import { existsSync, mkdirSync, readdirSync, writeFileSync } from "node:fs";
27
28
  import { dirname, join } from "node:path";
@@ -426,7 +427,7 @@ function evalColumns(c, e) {
426
427
  if (more.length) {
427
428
  const pass = e.attempts.filter((a) => a.outcome === "pass").length;
428
429
  const counted = e.attempts.filter((a) => a.outcome === "pass" || a.outcome === "fail").length;
429
- const rate = hasUngatedCells(e.cells) ? ` · ${pct(e.passRate).trim()} gated` : ` ${pct(e.passRate)}`;
430
+ const rate = hasUngatedCells(e.cells) ? ` · pass@1 ${pct(e.passRate).trim()} gated` : ` pass@1 ${pct(e.passRate)}`;
430
431
  return c.dim(`${`${pass}/${counted}`.padStart(7)}${rate} ${e.attempts.length} attempts`);
431
432
  }
432
433
  if (attemptOutcome(attempt) === "cancelled") return c.yellow("cancelled");
@@ -439,7 +440,7 @@ function evalColumns(c, e) {
439
440
  if (tokens) cols.push(tokens);
440
441
  return c.dim(cols.join(" "));
441
442
  }
442
- /** Pass rate per cell for evals with several attempts; with compare, each cell's role and lift. */
443
+ /** pass@1 per cell for evals with several attempts; with compare, each cell's role and lift. */
443
444
  function cellRows(c, e, indent) {
444
445
  if (e.attempts.length < 2) return [];
445
446
  const compare = e.cells.some((cell) => cell.role === "variant");
@@ -458,11 +459,13 @@ function cellRows(c, e, indent) {
458
459
  if (cell.gate !== "all" && cell.gate !== "none") note += ` ${c.dim(`gate ${gateLabel(cell.gate)}`)}`;
459
460
  const tokens = formatUsage(cellUsage(e, cell.key));
460
461
  const usage = tokens ? ` ${c.dim(tokens)}` : "";
461
- const rows = [`${indent}${c.dim(cell.key.padEnd(width))}${role} ${counts} ${pct(cell.passRate)}${note}${infra}${usage}`];
462
+ const rows = [`${indent}${c.dim(cell.key.padEnd(width))}${role} ${counts} pass@1 ${pct(cell.passRate)}${note}${infra}${usage}`];
462
463
  const rates = judgeRatesLabel(cellJudgeRates(e, cell.key));
463
464
  if (rates) rows.push(`${indent} ${c.dim(rates)}`);
464
465
  const effort = cellContrast(e, cell.key);
465
466
  if (effort) rows.push(`${indent} ${c.dim(`effort: ${effortLabel(effort)}`)}`);
467
+ const checks = checksLabel(cell);
468
+ if (checks) rows.push(`${indent} ${c.dim(`checks: ${checks}`)}`);
466
469
  if (cell.overrides.length) rows.push(`${indent} ${c.dim(`overrides: ${cell.overrides.join(", ")}`)}`);
467
470
  return rows;
468
471
  });
@@ -474,11 +477,64 @@ function questionRows(c, e, indent) {
474
477
  return [`${indent}${c.dim("question")} ${a.error !== void 0 ? c.yellow(label) : label}`, ...sampleReasons(a.votes).map((reason) => `${indent} ${c.dim(reason)}`)];
475
478
  });
476
479
  }
477
- /** The run's evals as a file › group tree, one row per eval and per cell of a matrix. */
478
- function tree(c, evals) {
480
+ /** A family's mark: its pooled gate's and its cases' worst. */
481
+ function familyOutcome(family, cases) {
482
+ const outcomes = [family.outcome, ...cases.map(entryOutcome)];
483
+ for (const o of [
484
+ "fail",
485
+ "infra_error",
486
+ "cancelled"
487
+ ]) if (outcomes.includes(o)) return o;
488
+ return outcomes.every((o) => o === "skipped") ? "skipped" : "pass";
489
+ }
490
+ /** The width case marks wrap at. */
491
+ const CASE_WIDTH = 96;
492
+ /** A pooled family's rows under its header: its cases' marks, then each pooled rate or lift. */
493
+ function familyRows(c, family, cases, indent) {
494
+ const marks = cases.map((e) => `${mark(c, entryOutcome(e))} ${caseLabel(family.name, e.name)}`);
495
+ const plain = cases.map((e) => `x ${caseLabel(family.name, e.name)}`);
479
496
  const rows = [];
497
+ let line = [];
498
+ let width = 0;
499
+ marks.forEach((m, i) => {
500
+ const w = plain[i].length + 2;
501
+ if (line.length && width + w > CASE_WIDTH) {
502
+ rows.push(`${indent}${line.join(" ")}`);
503
+ line = [];
504
+ width = 0;
505
+ }
506
+ line.push(m);
507
+ width += w;
508
+ });
509
+ if (line.length) rows.push(`${indent}${line.join(" ")}`);
510
+ if (family.lifts.length) {
511
+ const keyWidth = Math.max(...family.lifts.map((l) => l.variant.length));
512
+ for (const lift of family.lifts) {
513
+ const below = lift.outcome === "fail";
514
+ const gate = lift.minLift !== void 0 ? ` (minLift ${Math.round(lift.minLift * 100)}${below ? " ✗" : ""})` : "";
515
+ const text = `${familyLiftLabel(lift)}${gate}`;
516
+ rows.push(`${indent}${c.dim(lift.variant.padEnd(keyWidth))} ${below ? c.red(text) : text}`);
517
+ const effort = familyEffortLabel(lift);
518
+ if (effort) rows.push(`${indent} ${c.dim(`effort: ${effort}`)}`);
519
+ }
520
+ } else if (family.rates.length === 1) rows.push(`${indent}${familyRateLabel(family.rates[0])}`);
521
+ else {
522
+ const keyWidth = Math.max(...family.rates.map((r) => r.cell.length));
523
+ for (const rate of family.rates) rows.push(`${indent}${c.dim(rate.cell.padEnd(keyWidth))} ${familyRateLabel(rate)}`);
524
+ }
525
+ return rows;
526
+ }
527
+ /**
528
+ * The run's evals as a file › group tree, one row per eval and per cell of a matrix. A pooled
529
+ * family is one row, its template, with its cases' marks and the pooled results under it.
530
+ */
531
+ function tree(c, evals, families = []) {
532
+ const rows = [];
533
+ const shown = /* @__PURE__ */ new Set();
480
534
  let path = [];
481
535
  for (const e of evals) {
536
+ const family = e.family && families.find((f) => f.id === e.family?.id);
537
+ if (family && shown.has(family.id)) continue;
482
538
  const next = [e.file, ...e.group];
483
539
  let same = 0;
484
540
  while (same < path.length && same < next.length && path[same] === next[same]) same++;
@@ -487,18 +543,30 @@ function tree(c, evals) {
487
543
  text: i === 0 ? c.bold(next[i] ?? "") : next[i] ?? ""
488
544
  });
489
545
  path = next;
490
- rows.push({
546
+ if (family) {
547
+ shown.add(family.id);
548
+ rows.push({
549
+ indent: next.length,
550
+ text: family.name,
551
+ family
552
+ });
553
+ } else rows.push({
491
554
  indent: next.length,
492
555
  text: e.name,
493
556
  entry: e
494
557
  });
495
558
  }
496
- const width = Math.max(...rows.filter((r) => r.entry).map((r) => r.indent * 2 + 2 + r.text.length));
497
- return rows.flatMap(({ indent, text, entry }) => {
559
+ const width = Math.max(...rows.filter((r) => r.entry || r.family).map((r) => r.indent * 2 + 2 + r.text.length));
560
+ return rows.flatMap(({ indent, text, entry, family }) => {
498
561
  const pad = " ".repeat(indent);
562
+ const fill = " ".repeat(Math.max(0, width - indent * 2 - 2 - text.length));
563
+ if (family) {
564
+ const cases = familyCases(family, evals);
565
+ return [` ${pad}${mark(c, familyOutcome(family, cases))} ${text}${fill} ${c.dim(familyHeadLabel(family))}`, ...familyRows(c, family, cases, ` ${pad} `)];
566
+ }
499
567
  if (!entry) return [` ${pad}${text}`];
500
568
  return [
501
- ` ${pad}${`${mark(c, entryOutcome(entry))} ${text}`}${" ".repeat(Math.max(0, width - indent * 2 - 2 - text.length))} ${evalColumns(c, entry)}`,
569
+ ` ${pad}${`${mark(c, entryOutcome(entry))} ${text}`}${fill} ${evalColumns(c, entry)}`,
502
570
  ...cellRows(c, entry, ` ${pad} `),
503
571
  ...questionRows(c, entry, ` ${pad} `)
504
572
  ];
@@ -517,6 +585,12 @@ function totals(c, s, cancelled = 0) {
517
585
  const scope = s.attempts === s.evals ? `${s.evals}` : `${s.attempts} attempts, ${s.evals} evals`;
518
586
  return parts.length ? `${parts.join(c.dim(" · "))} ${c.dim(`(${scope})`)}` : "no evals ran";
519
587
  }
588
+ /** `1 passed · 1 failed (2)`: the families' pooled gates. */
589
+ function familyTotals(c, families) {
590
+ const fail = families.filter((f) => f.outcome === "fail").length;
591
+ const pass = families.length - fail;
592
+ return `${[pass && c.green(`${pass} passed`), fail && c.red(`${fail} failed`)].filter(Boolean).join(c.dim(" · "))} ${c.dim(`(${families.length})`)}`;
593
+ }
520
594
  /** Failing attempts, in run order, including expected misses. */
521
595
  function failingAttempts(evals) {
522
596
  return evals.flatMap((entry) => entry.attempts.map((attempt) => ({
@@ -528,7 +602,7 @@ function failingAttempts(evals) {
528
602
  function renderSummary(c, e, attemptDir) {
529
603
  const { record } = e;
530
604
  const lines = [];
531
- if (record.evals.length) lines.push(c.bold("Summary"), ...tree(c, record.evals));
605
+ if (record.evals.length) lines.push(c.bold("Summary"), ...tree(c, record.evals, record.families));
532
606
  const all = failingAttempts(record.evals);
533
607
  const missed = all.filter(({ entry, attempt }) => isUngatedMiss(entry, attempt));
534
608
  const failing = all.filter((f) => !missed.includes(f));
@@ -550,7 +624,18 @@ function renderSummary(c, e, attemptDir) {
550
624
  }
551
625
  if (missed.length) {
552
626
  lines.push("", c.bold(`Expected misses, not gated (${missed.length})`));
627
+ const pooled = /* @__PURE__ */ new Map();
553
628
  for (const { entry, attempt } of missed) {
629
+ if (!entry.family) continue;
630
+ const key = `${entry.family.id}\0${attempt.cell}`;
631
+ pooled.set(key, (pooled.get(key) ?? 0) + 1);
632
+ }
633
+ for (const [key, n] of pooled) {
634
+ const [id, cell] = key.split("\0");
635
+ lines.push(` ${MISS_MARK(c)} ${id} ${c.dim(`${n} ${n === 1 ? "attempt" : "attempts"} on ${cell}`)}`);
636
+ }
637
+ for (const { entry, attempt } of missed) {
638
+ if (entry.family) continue;
554
639
  const which = entry.attempts.length > 1 ? ` ${c.dim(attempt.id)}` : "";
555
640
  const [reason] = failureLines(colors(false), resultFor(entry, attempt, e.results), { max: 1 }).filter((l) => l.trim());
556
641
  lines.push(` ${MISS_MARK(c)} ${entry.id}${which}`);
@@ -562,12 +647,23 @@ function renderSummary(c, e, attemptDir) {
562
647
  const cancelled = failing.filter((f) => f.outcome === "cancelled").length;
563
648
  const label = record.summary.attempts === record.summary.evals ? " Evals" : "Attempts";
564
649
  const lifted = record.evals.flatMap((entry) => entry.cells.flatMap((cell) => cell.lift?.minLift !== void 0 && cell.lift.interval.lo < cell.lift.minLift ? [`${entry.id} ${cell.key} ${liftLabel(cell.lift)}: its lower bound is below minLift ${Math.round(cell.lift.minLift * 100)}`] : []));
650
+ for (const family of record.families ?? []) for (const lift of family.lifts) {
651
+ if (lift.outcome !== "fail" || lift.minLift === void 0) continue;
652
+ lifted.push(`${family.id} ${lift.variant} pooled ${familyLiftLabel(lift)}: its lower bound is below minLift ${Math.round(lift.minLift * 100)}`);
653
+ }
654
+ const idle = undiscriminating(record.evals);
655
+ if (idle.length) {
656
+ lines.push("", c.bold(`Checks that don't discriminate (${idle.length})`));
657
+ for (const x of idle) lines.push(` ${c.dim("·")} ${undiscriminatingLabel(x)}`);
658
+ }
565
659
  if (lifted.length) {
566
660
  lines.push("", c.bold(c.red(`Lift below minLift (${lifted.length})`)));
567
661
  for (const line of lifted) lines.push(` ${c.red("✗")} ${line}`);
568
662
  }
569
663
  if (record.status === "budget") lines.push("", c.yellow("Budget reached: attempts that hadn’t started were skipped"));
570
- lines.push("", `${c.dim(label)} ${totals(c, record.summary, cancelled)}`, `${c.dim("Duration")} ${formatDuration(record.durationMs)}`);
664
+ lines.push("");
665
+ if (record.families?.length) lines.push(`${c.dim("Families")} ${familyTotals(c, record.families)}`);
666
+ lines.push(`${c.dim(label)} ${totals(c, record.summary, cancelled)}`, `${c.dim("Duration")} ${formatDuration(record.durationMs)}`);
571
667
  const tokens = formatUsage(record.cost.usage);
572
668
  if (tokens) lines.push(` ${c.dim("Tokens")} ${tokens}`);
573
669
  lines.push(` ${c.dim("Results")} ${e.summaryPath}`);
@@ -734,6 +830,14 @@ var AgentRenderer = class {
734
830
  this.#write(`question ${entry.id}: ${answersLabel(a)}`);
735
831
  for (const reason of sampleReasons(a.votes)) this.#write(` ${reason}`);
736
832
  }
833
+ for (const x of undiscriminating(e.record.evals)) this.#write(`check doesn't discriminate: ${undiscriminatingLabel(x)}`);
834
+ for (const family of e.record.families ?? []) {
835
+ const pooled = family.lifts.length ? family.lifts.map((l) => {
836
+ const gate = l.minLift === void 0 ? "" : ` (minLift ${Math.round(l.minLift * 100)}${l.outcome === "fail" ? ", FAIL" : ""})`;
837
+ return `${l.variant} ${familyLiftLabel(l)}${gate}`;
838
+ }) : family.rates.map((r) => `${r.cell} ${familyRateLabel(r)}`);
839
+ this.#write(`family ${family.id}: ${familyHeadLabel(family)} · ${pooled.join(" · ")}`);
840
+ }
737
841
  const s = e.record.summary;
738
842
  const cancelled = failing.filter((f) => f.outcome === "cancelled").length;
739
843
  const parts = [
@@ -1120,7 +1224,7 @@ async function run(argv) {
1120
1224
  return values.help ? EXIT.ok : EXIT.usage;
1121
1225
  }
1122
1226
  if (command === "init") {
1123
- const { initCommand } = await import("./init-DBHyi92L.js");
1227
+ const { initCommand } = await import("./init-B6vegaP_.js");
1124
1228
  return initCommand(values, filters, {
1125
1229
  out: (s) => console.log(s),
1126
1230
  input: process.stdin,
@@ -1129,7 +1233,7 @@ async function run(argv) {
1129
1233
  });
1130
1234
  }
1131
1235
  if (command === "doctor") {
1132
- const { doctorCommand } = await import("./doctor-B6oYTPoR.js");
1236
+ const { doctorCommand } = await import("./doctor-DlKycx5H.js");
1133
1237
  return doctorCommand(values, {
1134
1238
  out: (s) => console.log(s),
1135
1239
  color: !!process.stdout.isTTY && !process.env.NO_COLOR,
@@ -1137,7 +1241,7 @@ async function run(argv) {
1137
1241
  });
1138
1242
  }
1139
1243
  if (command === "report") {
1140
- const { reportCommand } = await import("./command-JPGNzFsA.js");
1244
+ const { reportCommand } = await import("./command-CzIFp1JQ.js");
1141
1245
  return reportCommand(values, filters, {
1142
1246
  out: (s) => console.log(s),
1143
1247
  err: (s) => console.error(dim(s)),
@@ -1152,7 +1256,7 @@ async function run(argv) {
1152
1256
  }
1153
1257
  if (command === "studio") {
1154
1258
  const config = await loadConfig(configPath, "studio");
1155
- const { studioCommand } = await import("./command-BdstSEHu.js");
1259
+ const { studioCommand } = await import("./command-BFP0hKEb.js");
1156
1260
  return studioCommand({
1157
1261
  config,
1158
1262
  flags: values,
@@ -1163,7 +1267,7 @@ async function run(argv) {
1163
1267
  if (command === "mcp") {
1164
1268
  if (!values.http) console.log = console.info = console.debug = console.error;
1165
1269
  const config = await loadConfig(configPath, "mcp");
1166
- const { mcpCommand } = await import("./command-BK4kOgkH.js");
1270
+ const { mcpCommand } = await import("./command-C5xFPKHM.js");
1167
1271
  return mcpCommand({
1168
1272
  config,
1169
1273
  flags: values,
@@ -1172,7 +1276,7 @@ async function run(argv) {
1172
1276
  }
1173
1277
  if (command in HISTORY_COMMANDS) {
1174
1278
  const config = await loadConfig(configPath, command);
1175
- const commands = await import("./commands-Duo2ur3r.js");
1279
+ const commands = await import("./commands-fI3G2Wnh.js");
1176
1280
  const ctx = {
1177
1281
  config,
1178
1282
  flags: values,
@@ -1185,7 +1289,7 @@ async function run(argv) {
1185
1289
  case "compare": return commands.compareCommand(ctx, filters);
1186
1290
  case "checkout": return commands.checkoutCommand(ctx, filters);
1187
1291
  case "query": {
1188
- const { queryCommand } = await import("./query-noGbekGF.js");
1292
+ const { queryCommand } = await import("./query-oPO_XrTy.js");
1189
1293
  return queryCommand({
1190
1294
  ...ctx,
1191
1295
  err: (s) => console.error(dim(s))
@@ -1193,7 +1297,7 @@ async function run(argv) {
1193
1297
  }
1194
1298
  case "analyze": {
1195
1299
  loadEnvFiles(configPath);
1196
- const { analyzeCommand } = await import("./command-CTVGuH8y.js");
1300
+ const { analyzeCommand } = await import("./command-BrmXUC-W.js");
1197
1301
  return analyzeCommand({
1198
1302
  ...ctx,
1199
1303
  err: (s) => console.error(dim(s))
@@ -1232,8 +1336,8 @@ async function cleanCommand(flags, configPath) {
1232
1336
  const where = fromCwd(debugRoot(config.root)) || ".";
1233
1337
  console.log(runs.length ? `Removed debug data for ${runs.length} run${runs.length === 1 ? "" : "s"} (${formatBytes(bytes)}) from ${where}` : `No debug data to remove in ${where}`);
1234
1338
  if (flags.images) {
1235
- const { pruneImages } = await import("./src-BT4dB5CO.js");
1236
- const { requireDocker } = await import("./providers-yXZZcPfx.js");
1339
+ const { pruneImages } = await import("./src-cdIVjC5b.js");
1340
+ const { requireDocker } = await import("./providers-CpEfNU1F.js");
1237
1341
  await requireDocker();
1238
1342
  const removed = await pruneImages();
1239
1343
  console.log(removed ? `Removed ${removed} image${removed === 1 ? "" : "s"} reeval built that nothing uses` : "No leftover images to remove");
@@ -1248,55 +1352,43 @@ function verbosityOf(flags) {
1248
1352
  /**
1249
1353
  * `reeval image build`: collects the evals (as `--dry-run` does) and builds every image their Docker
1250
1354
  * sandboxes need; with `--dry-run`, lists them instead. `--profile` plans as `reeval run --profile`
1251
- * does. Without a config, just reeval's image.
1355
+ * does. Needs a config, as `reeval run` does: there is no default image.
1252
1356
  */
1253
1357
  async function imageBuildCommand(flags, configPath, filters) {
1254
- const { buildImages, imagePlanLines, imageTargets } = await import("./images-CscddrJU.js");
1255
- const { docker } = await import("./sandbox.js");
1256
- let root = process.cwd();
1257
- const { fakeHarness } = await import("./harness.js");
1258
- let uses = [{
1358
+ const { buildImages, imagePlanLines, imageTargets } = await import("./images-BMgdpMAX.js");
1359
+ const { runId, stagingDir, config, runs, tags, concurrency, profile } = await startRun(await prepareRun({
1360
+ ...flags,
1361
+ "dry-run": true
1362
+ }, configPath));
1363
+ const root = config.root;
1364
+ const { runEngine } = await import("./node-Co7EXge0.js");
1365
+ let planned = [];
1366
+ await runEngine({
1367
+ run: JSON.parse(JSON.stringify({
1368
+ runId,
1369
+ stagingDir,
1370
+ config,
1371
+ runs,
1372
+ tags,
1373
+ concurrency,
1374
+ profile
1375
+ })),
1376
+ filters,
1377
+ onPlan: async (collected) => {
1378
+ if (collected.unmatched.length) throw unmatchedFilter(config, collected.unmatched);
1379
+ planned = collected.planned.filter((p) => !p.attempt.plan.skip);
1380
+ return false;
1381
+ }
1382
+ });
1383
+ const targets = imageTargets(planned.length ? planned.map((p) => ({
1384
+ id: p.id,
1385
+ harness: p.attempt.harness,
1386
+ sandbox: p.attempt.sandbox
1387
+ })) : config.harness.map((harness) => ({
1259
1388
  id: "",
1260
- harness: fakeHarness(),
1261
- sandbox: docker()
1262
- }];
1263
- if (!configPath && flags.profile) selectProfile(await loadConfig(void 0), flags.profile);
1264
- if (configPath) {
1265
- const { runId, stagingDir, config, runs, tags, concurrency, profile } = await startRun(await prepareRun({
1266
- ...flags,
1267
- "dry-run": true
1268
- }, configPath));
1269
- root = config.root;
1270
- const { runEngine } = await import("./node-Co7EXge0.js");
1271
- let planned = [];
1272
- await runEngine({
1273
- run: JSON.parse(JSON.stringify({
1274
- runId,
1275
- stagingDir,
1276
- config,
1277
- runs,
1278
- tags,
1279
- concurrency,
1280
- profile
1281
- })),
1282
- filters,
1283
- onPlan: async (collected) => {
1284
- if (collected.unmatched.length) throw unmatchedFilter(config, collected.unmatched);
1285
- planned = collected.planned.filter((p) => !p.attempt.plan.skip);
1286
- return false;
1287
- }
1288
- });
1289
- uses = planned.length ? planned.map((p) => ({
1290
- id: p.id,
1291
- harness: p.attempt.harness,
1292
- sandbox: p.attempt.sandbox
1293
- })) : config.harness.map((harness) => ({
1294
- id: "",
1295
- harness,
1296
- sandbox: config.sandbox
1297
- }));
1298
- }
1299
- const targets = imageTargets(uses);
1389
+ harness,
1390
+ sandbox: config.sandbox
1391
+ })));
1300
1392
  if (targets.length === 0) {
1301
1393
  console.log("No eval runs in a Docker sandbox, so there are no images to build.");
1302
1394
  return EXIT.ok;
@@ -1364,14 +1456,14 @@ async function runCommand(flags, configPath, filters) {
1364
1456
  const { engineRun, plan, sandboxVersions, budgetReached, live, notes, questions } = executed;
1365
1457
  invocation.unhandledErrors = engineRun.unhandledErrors;
1366
1458
  if ((interrupted || engineRun.cancelled) && plan?.sandboxes.some((s) => s.kind === "docker")) {
1367
- const { removeRunContainers } = await import("./docker-D6t23fZl.js");
1459
+ const { removeRunContainers } = await import("./docker-Df_YOxxB.js");
1368
1460
  await removeRunContainers(ctx.runId);
1369
1461
  }
1370
1462
  if (notes) {
1371
1463
  const cancelled = interrupted || engineRun.cancelled;
1372
1464
  const written = await notes.finish(cancelled);
1373
1465
  if (!cancelled && written.length) {
1374
- const { notesLine } = await import("./agent-B72lZ6w5.js");
1466
+ const { notesLine } = await import("./agent-6FefIhX7.js");
1375
1467
  const text = notesLine(ctx.config.root, ctx.runId, written);
1376
1468
  renderer.onEvent({
1377
1469
  type: "notice",
@@ -1388,8 +1480,8 @@ async function runCommand(flags, configPath, filters) {
1388
1480
  }
1389
1481
  const stopped = interrupted || engineRun.cancelled;
1390
1482
  const answers = questions && !stopped ? await questions.settle() : void 0;
1391
- const { lockfiles } = await import("./state-Bf_Vq_pV.js");
1392
- const { writeScratchRun } = await import("./results-BcSHWbgB.js");
1483
+ const { lockfiles } = await import("./state-Bo5zg4da.js");
1484
+ const { writeScratchRun } = await import("./results-Di7m8dQ3.js");
1393
1485
  const run = await writeScratchRun({
1394
1486
  ctx,
1395
1487
  author: ctx.author,
@@ -1414,8 +1506,8 @@ async function runCommand(flags, configPath, filters) {
1414
1506
  }, () => live?.stop());
1415
1507
  const { record } = run;
1416
1508
  if (notes && !stopped) {
1417
- const { summarizeRun } = await import("./agent-B72lZ6w5.js");
1418
- const { resolveAnalysisModel } = await import("./model-DMOraCcm.js");
1509
+ const { summarizeRun } = await import("./agent-6FefIhX7.js");
1510
+ const { resolveAnalysisModel } = await import("./model-FXko2kl7.js");
1419
1511
  const model = resolveAnalysisModel(ctx.config, "agent");
1420
1512
  const { level, text } = await summarizeRun(ctx.config, record.runId, model);
1421
1513
  renderer.onEvent({
@@ -1442,7 +1534,7 @@ async function runCommand(flags, configPath, filters) {
1442
1534
  const { config } = ctx;
1443
1535
  const mode = setup.record;
1444
1536
  if ((flags.record || mode === "always" || mode === "ci" && inCI()) && record.status !== "interrupted") {
1445
- const { record: recordCmd } = await import("./commands-Duo2ur3r.js");
1537
+ const { record: recordCmd } = await import("./commands-fI3G2Wnh.js");
1446
1538
  const allow = record.status === "budget" ? { "allow-incomplete": true } : {};
1447
1539
  console.log(await recordCmd(config, record.runId, {
1448
1540
  ...flags,
@@ -1468,9 +1560,10 @@ async function prepareRun(flags, configPath) {
1468
1560
  agent: detectAgent().name
1469
1561
  });
1470
1562
  if (flags.json && !flags["dry-run"]) throw new UsageError("reeval run --json only prints the plan: add --dry-run. A run writes its record to .reeval/runs; read it with reeval show --json.");
1471
- loadEnvFiles(configPath);
1563
+ const path = requireConfig(configPath);
1564
+ loadEnvFiles(path);
1472
1565
  const named = flags.profile ?? (process.env.REEVAL_PROFILE || void 0);
1473
- const config = await loadConfig(configPath, "run", named);
1566
+ const config = await loadConfig(path, "run", named);
1474
1567
  const profile = selectProfile(config, flags.profile);
1475
1568
  let runs;
1476
1569
  if (flags.runs !== void 0) {
@@ -1480,7 +1573,7 @@ async function prepareRun(flags, configPath) {
1480
1573
  const sandboxes = [environmentSandbox(config.environment, config.sandbox), ...profile?.defaults.environment ? [environmentSandbox(profile.defaults.environment, config.sandbox)] : []];
1481
1574
  const concurrency = await resolveConcurrency(config, flags.concurrency, async () => {
1482
1575
  if (!sandboxes.some((s) => s.kind === "docker")) return hostCapacity();
1483
- const { dockerCapacity } = await import("./src-BT4dB5CO.js");
1576
+ const { dockerCapacity } = await import("./src-cdIVjC5b.js");
1484
1577
  return await dockerCapacity() ?? hostCapacity();
1485
1578
  });
1486
1579
  return {
@@ -1496,9 +1589,9 @@ async function prepareRun(flags, configPath) {
1496
1589
  json: !!flags.json,
1497
1590
  force: !!flags.force,
1498
1591
  verbosity: verbosityOf(flags),
1499
- configFile: configPath && configLabel(configPath),
1592
+ configFile: configLabel(path),
1500
1593
  /** Named in the plan line when the project root isn't the current directory. */
1501
- configElsewhere: !!configPath && dirname(configPath) !== process.cwd(),
1594
+ configElsewhere: dirname(path) !== process.cwd(),
1502
1595
  /** `undefined` is a new run; `''` is newest resumable; a string is a run id or prefix. */
1503
1596
  resume: flags.resume
1504
1597
  };
@@ -1507,11 +1600,11 @@ async function prepareRun(flags, configPath) {
1507
1600
  async function startRun({ config, profile, runs, tags, concurrency, verbosity, configFile, resume, dryRun }) {
1508
1601
  const startedAt = /* @__PURE__ */ new Date();
1509
1602
  const git = await gitInfo(config.root, [config.history.dir]);
1510
- const { worktreePatch } = await import("./state-Bf_Vq_pV.js");
1603
+ const { worktreePatch } = await import("./state-Bo5zg4da.js");
1511
1604
  const patch = git?.dirty ? await worktreePatch(config.root, [config.history.dir]) : null;
1512
1605
  const who = await author(config.root);
1513
- const { stagingDir, sweepStaging } = await import("./results-BcSHWbgB.js");
1514
- const { scratchDir } = await import("./files-BpYgF2z0.js");
1606
+ const { stagingDir, sweepStaging } = await import("./results-Di7m8dQ3.js");
1607
+ const { scratchDir } = await import("./files-BMCvfB4X.js");
1515
1608
  const scratch = scratchDir(config.root);
1516
1609
  if (resume !== void 0) {
1517
1610
  const target = await resolveResume(config.root, resume || void 0);
@@ -1522,7 +1615,7 @@ async function startRun({ config, profile, runs, tags, concurrency, verbosity, c
1522
1615
  artifacts: target.previousArtifacts
1523
1616
  } : await loadPrevious(stagingDir(config.root, target.runId));
1524
1617
  if (!dryRun) try {
1525
- const { removeRunContainers } = await import("./docker-D6t23fZl.js");
1618
+ const { removeRunContainers } = await import("./docker-Df_YOxxB.js");
1526
1619
  await removeRunContainers(target.runId);
1527
1620
  } catch {}
1528
1621
  return {
@@ -1594,7 +1687,7 @@ async function executeRun(ctx, setup, filters, renderer) {
1594
1687
  completed: []
1595
1688
  }));
1596
1689
  const { runEngine } = await import("./node-Co7EXge0.js");
1597
- const { buildPlan, checkAttemptBudget, planDocument, planLine, planTable } = await import("./plan-PPc4-6xd.js");
1690
+ const { buildPlan, checkAttemptBudget, planDocument, planLine, planTable } = await import("./plan-DUydFc_1.js");
1598
1691
  let plan;
1599
1692
  let sandboxVersions = { images: [] };
1600
1693
  let preflightStop;
@@ -1621,7 +1714,7 @@ async function executeRun(ctx, setup, filters, renderer) {
1621
1714
  } : p);
1622
1715
  toRun = skipped;
1623
1716
  for (const p of skipped) for (const name of p.attempt.secretVars) registerSecret(process.env[name]);
1624
- const models = skipped.some((p) => !p.attempt.plan.skip && p.attempt.plan.questions?.length) ? await import("./model-DMOraCcm.js") : void 0;
1717
+ const models = skipped.some((p) => !p.attempt.plan.skip && p.attempt.plan.questions?.length) ? await import("./model-FXko2kl7.js") : void 0;
1625
1718
  plan = await buildPlan({
1626
1719
  planned: skipped,
1627
1720
  profile,
@@ -1637,7 +1730,7 @@ async function executeRun(ctx, setup, filters, renderer) {
1637
1730
  completed: completed.size
1638
1731
  };
1639
1732
  run.completed = [...completed];
1640
- const { imageStages, imageTargets } = await import("./images-CscddrJU.js");
1733
+ const { imageStages, imageTargets } = await import("./images-BMgdpMAX.js");
1641
1734
  const targets = imageTargets(skipped.filter((p) => !p.attempt.plan.skip).map((p) => ({
1642
1735
  id: p.id,
1643
1736
  harness: p.attempt.harness,
@@ -1658,8 +1751,8 @@ async function executeRun(ctx, setup, filters, renderer) {
1658
1751
  if (setup.dryRun) {
1659
1752
  const todos = excluded.filter((e) => e.mode === "todo").map((e) => e.id);
1660
1753
  lines.push(...planTable(plan, todos));
1661
- const { imageStatusLines } = await import("./images-CscddrJU.js");
1662
- const { dockerAvailable } = await import("./src-BT4dB5CO.js");
1754
+ const { imageStatusLines } = await import("./images-BMgdpMAX.js");
1755
+ const { dockerAvailable } = await import("./src-cdIVjC5b.js");
1663
1756
  if (targets.length && await dockerAvailable()) lines.push(...await imageStatusLines(targets, config.root));
1664
1757
  else if (targets.length) lines.push("images not checked: Docker is not running");
1665
1758
  }
@@ -1673,7 +1766,7 @@ async function executeRun(ctx, setup, filters, renderer) {
1673
1766
  });
1674
1767
  if (setup.dryRun) return false;
1675
1768
  checkAttemptBudget(plan, setup.force, config.file);
1676
- const analysis = config.analysis.agent ? await import("./model-DMOraCcm.js") : null;
1769
+ const analysis = config.analysis.agent ? await import("./model-FXko2kl7.js") : null;
1677
1770
  analysis?.analysisModelName(config, "agent");
1678
1771
  const questionModels = /* @__PURE__ */ new Set();
1679
1772
  const asked = [];
@@ -1703,7 +1796,7 @@ async function executeRun(ctx, setup, filters, renderer) {
1703
1796
  });
1704
1797
  if (malformed.length) throw new UsageError(`Credentials with whitespace or a line break in them: ${malformed.join(", ")}. A key copied from a wrapped terminal line picks these up; set it again as one line.`);
1705
1798
  if (analysis) {
1706
- const { startNotes } = await import("./agent-B72lZ6w5.js");
1799
+ const { startNotes } = await import("./agent-6FefIhX7.js");
1707
1800
  notes = startNotes({
1708
1801
  config,
1709
1802
  model: analysis.resolveAnalysisModel(config, "agent"),
@@ -1719,7 +1812,7 @@ async function executeRun(ctx, setup, filters, renderer) {
1719
1812
  });
1720
1813
  }
1721
1814
  if (asked.length) {
1722
- const { questionRunner } = await import("./questions-BEPj98fZ.js");
1815
+ const { questionRunner } = await import("./questions-B8by4Bbt.js");
1723
1816
  questions = questionRunner({
1724
1817
  evals: asked,
1725
1818
  stagingDir,
@@ -1736,7 +1829,7 @@ async function executeRun(ctx, setup, filters, renderer) {
1736
1829
  }
1737
1830
  });
1738
1831
  }
1739
- const { prepareWorkspaces, workspaceKey } = await import("./workspace-DzNL-3iO.js");
1832
+ const { prepareWorkspaces, workspaceKey } = await import("./workspace-Do_SiWBs.js");
1740
1833
  const live = skipped.filter((p) => !p.attempt.plan.skip);
1741
1834
  const outcomes = await prepareWorkspaces(live.flatMap(({ attempt: a }) => a.workspace ? [{
1742
1835
  workspace: a.workspace,
@@ -1884,9 +1977,9 @@ async function executeRun(ctx, setup, filters, renderer) {
1884
1977
  throw error;
1885
1978
  } finally {
1886
1979
  clearTimeout(budgetTimer);
1887
- const { removePrepared } = await import("./preflight-Zumy0adT.js");
1980
+ const { removePrepared } = await import("./preflight-D5LW7Oqi.js");
1888
1981
  removePrepared(config.root, runId);
1889
- const { removePreparedWorkspaces } = await import("./workspace-DzNL-3iO.js");
1982
+ const { removePreparedWorkspaces } = await import("./workspace-Do_SiWBs.js");
1890
1983
  removePreparedWorkspaces(config.root, runId);
1891
1984
  }
1892
1985
  if (preflightStop) throw preflightStop;
@@ -1969,4 +2062,4 @@ run(process.argv.slice(2)).finally(() => {
1969
2062
  //#endregion
1970
2063
  export {};
1971
2064
 
1972
- //# sourceMappingURL=cli-BMjTKY-D.js.map
2065
+ //# sourceMappingURL=cli-CVrMh_qz.js.map