reeval 0.11.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.
- package/README.md +3 -1
- package/bin/mcp-timer.cjs +224 -0
- package/dist/{adapter-Bwy3QxAK.js → adapter-DigeVFWC.js} +3 -3
- package/dist/{adapter-Bwy3QxAK.js.map → adapter-DigeVFWC.js.map} +1 -1
- package/dist/{agent-DpE80WPz.js → agent-CatUEo5h.js} +21 -6
- package/dist/{agent-DpE80WPz.js.map → agent-CatUEo5h.js.map} +1 -1
- package/dist/{assemble-D9GWr-HS.js → assemble-CF063ms6.js} +19 -17
- package/dist/assemble-CF063ms6.js.map +1 -0
- package/dist/assemble-CJoD_Rzr.js +1 -0
- package/dist/bridge/index.mjs +2 -1
- package/dist/{capture-BQlGHiMC.js → capture-BiD7lVaM.js} +25 -17
- package/dist/{capture-BQlGHiMC.js.map → capture-BiD7lVaM.js.map} +1 -1
- package/dist/capture-Dp3q7K7Y.js +1 -0
- package/dist/{cli-ClpPT8kn.js → cli-B5zQCR2r.js} +161 -116
- package/dist/cli-B5zQCR2r.js.map +1 -0
- package/dist/{cli-spec-qmEnQ25_.js → cli-spec-BXIBUlaK.js} +34 -15
- package/dist/cli-spec-BXIBUlaK.js.map +1 -0
- package/dist/cli.js +2 -2
- package/dist/{command-TgbzPizb.js → command-BMHXHqMT.js} +15 -14
- package/dist/command-BMHXHqMT.js.map +1 -0
- package/dist/command-C94CQNh8.js +91 -0
- package/dist/command-C94CQNh8.js.map +1 -0
- package/dist/command-CVtgyqlM.js +335 -0
- package/dist/command-CVtgyqlM.js.map +1 -0
- package/dist/{command-DbAe1Rzb.js → command-CaZgCTIw.js} +14 -17
- package/dist/command-CaZgCTIw.js.map +1 -0
- package/dist/{command-BlM0y8jN.js → command-DTgBZR0k.js} +6 -6
- package/dist/{command-BlM0y8jN.js.map → command-DTgBZR0k.js.map} +1 -1
- package/dist/{commands-CthqwkAn.js → commands-BXzIDB3X.js} +1 -1
- package/dist/commands-CjpGBUWr.js +666 -0
- package/dist/commands-CjpGBUWr.js.map +1 -0
- package/dist/{config-DrVSEVN0.js → config-Dv5MG7Rp.js} +27 -48
- package/dist/config-Dv5MG7Rp.js.map +1 -0
- package/dist/{context-C1mxXh80.js → context-Dgn48BqT.js} +13 -2
- package/dist/context-Dgn48BqT.js.map +1 -0
- package/dist/{contrasts-5zsj32gk.js → contrasts-CcoMLC_y.js} +3 -3
- package/dist/{contrasts-5zsj32gk.js.map → contrasts-CcoMLC_y.js.map} +1 -1
- package/dist/db-BeqRiWLl.js +602 -0
- package/dist/db-BeqRiWLl.js.map +1 -0
- package/dist/db-CJDRVQal.js +2 -0
- package/dist/{dist-CuY4ehEk.js → dist-CMjp3qqF.js} +2 -2
- package/dist/{dist-CuY4ehEk.js.map → dist-CMjp3qqF.js.map} +1 -1
- package/dist/{docker-DOvjji9I.js → docker-BbTlMmYi.js} +2 -2
- package/dist/{docker-DOvjji9I.js.map → docker-BbTlMmYi.js.map} +1 -1
- package/dist/{docker-D1HZDS6q.js → docker-CCXdbREk.js} +20 -4
- package/dist/{docker-D1HZDS6q.js.map → docker-CCXdbREk.js.map} +1 -1
- package/dist/{docker-DNmMPOBb.js → docker-DC69dKxB.js} +1 -1
- package/dist/{doctor-D2MbNO8L.js → doctor-CqttrZcs.js} +57 -22
- package/dist/doctor-CqttrZcs.js.map +1 -0
- package/dist/{egress-2-qzPvGi.js → egress-BfK_O9ce.js} +435 -30
- package/dist/egress-BfK_O9ce.js.map +1 -0
- package/dist/env-BQqj93gu.js +21 -0
- package/dist/env-BQqj93gu.js.map +1 -0
- package/dist/{environment-Cca6a4wB.js → environment-BBz1Yes9.js} +224 -10
- package/dist/environment-BBz1Yes9.js.map +1 -0
- package/dist/{evaluate-DKIl54Hb.js → evaluate-CXQ1o-pd.js} +539 -559
- package/dist/evaluate-CXQ1o-pd.js.map +1 -0
- package/dist/{evaluate-DMyaGQEj.d.ts → evaluate-yjZKUexW.d.ts} +2 -2
- package/dist/facts-DtENlf9s.js +898 -0
- package/dist/facts-DtENlf9s.js.map +1 -0
- package/dist/{files-BpUYBwGu.js → files-B-eUpCZ1.js} +30 -7
- package/dist/files-B-eUpCZ1.js.map +1 -0
- package/dist/files-BsQbYz2i.js +65 -0
- package/dist/files-BsQbYz2i.js.map +1 -0
- package/dist/{files-BXHZFWmx.js → files-COHQLEHE.js} +6 -17
- package/dist/files-COHQLEHE.js.map +1 -0
- package/dist/files-DqCBW7i8.js +1 -0
- package/dist/files-Ha-jsQXf.js +1 -0
- package/dist/generate-Cs2TMH_k.js +1647 -0
- package/dist/generate-Cs2TMH_k.js.map +1 -0
- package/dist/{git-Crl3b87o.js → git-DhykwgKF.js} +2 -2
- package/dist/{git-Crl3b87o.js.map → git-DhykwgKF.js.map} +1 -1
- package/dist/{harness-CEuntrla.js → harness-BAjw1fcr.js} +2 -2
- package/dist/{harness-CEuntrla.js.map → harness-BAjw1fcr.js.map} +1 -1
- package/dist/harness.d.ts +1 -1
- package/dist/harness.js +1 -1
- package/dist/{header-DHQv_ZrF.js → header-kSmWatcO.js} +10 -3
- package/dist/{header-DHQv_ZrF.js.map → header-kSmWatcO.js.map} +1 -1
- package/dist/{images-Bi3aGxb9.js → images-BmJRuTpm.js} +61 -13
- package/dist/images-BmJRuTpm.js.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.js +4 -4
- package/dist/init-Bwc9byQr.js +543 -0
- package/dist/init-Bwc9byQr.js.map +1 -0
- package/dist/init-D7Y1ny1z.js +1 -0
- package/dist/insights-B2Xmhz9o.js +64 -0
- package/dist/insights-B2Xmhz9o.js.map +1 -0
- package/dist/{invocations-BYDPe3fV.js → invocations-CQTbP092.js} +3 -3
- package/dist/{invocations-BYDPe3fV.js.map → invocations-CQTbP092.js.map} +1 -1
- package/dist/{judge-DW_GDOmB.js → judge-Dt6KW6_O.js} +5 -3
- package/dist/judge-Dt6KW6_O.js.map +1 -0
- package/dist/judge.d.ts +7 -6
- package/dist/judge.js +8 -7
- package/dist/judge.js.map +1 -1
- package/dist/{live-jlfszAbb.js → live-DYd2QEyR.js} +2 -2
- package/dist/{live-jlfszAbb.js.map → live-DYd2QEyR.js.map} +1 -1
- package/dist/{model-D0IcOQao.js → model-B-mel-Gv.js} +43 -18
- package/dist/model-B-mel-Gv.js.map +1 -0
- package/dist/model-BGKYVpoj.js +1 -0
- package/dist/{model-DaVCY3rb.js → model-C7tSwT7f.js} +2 -2
- package/dist/{model-DaVCY3rb.js.map → model-C7tSwT7f.js.map} +1 -1
- package/dist/{model-DaX4bNLZ.js → model-CWlAqmbU.js} +135 -40
- package/dist/model-CWlAqmbU.js.map +1 -0
- package/dist/model-DHY-dfoO.js +1 -0
- package/dist/{node-B3ydHo6t.js → node-D0mtjRAO.js} +3 -3
- package/dist/{node-B3ydHo6t.js.map → node-D0mtjRAO.js.map} +1 -1
- package/dist/{options-C0d0AzeR.js → options-CPUW97_7.js} +7 -9
- package/dist/options-CPUW97_7.js.map +1 -0
- package/dist/{pairs-CnInRu-G.js → pairs-DP6XOJby.js} +2 -2
- package/dist/{pairs-CnInRu-G.js.map → pairs-DP6XOJby.js.map} +1 -1
- package/dist/{patch-B1bnfhN-.js → patch-D4oluWzH.js} +2 -2
- package/dist/{patch-B1bnfhN-.js.map → patch-D4oluWzH.js.map} +1 -1
- package/dist/{plan-DgQxp9yy.js → plan-OkwUcJQ9.js} +21 -8
- package/dist/plan-OkwUcJQ9.js.map +1 -0
- package/dist/plugins-CUWMnSNb.js +654 -0
- package/dist/plugins-CUWMnSNb.js.map +1 -0
- package/dist/{preflight-DlQvbySb.js → preflight-B6pY89bF.js} +1 -1
- package/dist/{preflight-BRzD30L5.js → preflight-Bjm7_ylE.js} +14 -10
- package/dist/preflight-Bjm7_ylE.js.map +1 -0
- package/dist/{prepare-B_y-AFMv.js → prepare-CQmK3SBn.js} +70 -23
- package/dist/prepare-CQmK3SBn.js.map +1 -0
- package/dist/prepare-DbdgtZKe.js +2 -0
- package/dist/{provenance-DQ0AXn6c.js → provenance-B3Y17oCC.js} +3 -3
- package/dist/{provenance-DQ0AXn6c.js.map → provenance-B3Y17oCC.js.map} +1 -1
- package/dist/providers-CXN2RFz-.js +1 -0
- package/dist/{providers-DoTq1jHW.js → providers-eoniqK6w.js} +24 -10
- package/dist/providers-eoniqK6w.js.map +1 -0
- package/dist/{query-BO-ux7RB.js → query-CLRZmWBT.js} +3 -3
- package/dist/{query-BO-ux7RB.js.map → query-CLRZmWBT.js.map} +1 -1
- package/dist/query-CmBDYt0_.js +1 -0
- package/dist/{questions-C2dym2ce.js → questions-1XOulevV.js} +6 -6
- package/dist/{questions-C2dym2ce.js.map → questions-1XOulevV.js.map} +1 -1
- package/dist/{record-BKmMvZ6O.js → record-kk9M1hj-.js} +8 -4
- package/dist/record-kk9M1hj-.js.map +1 -0
- package/dist/remarks-1521zwfW.js +38 -0
- package/dist/remarks-1521zwfW.js.map +1 -0
- package/dist/remarks-BhAV1H4V.js +1 -0
- package/dist/remarks-DlJCqWRs.js +278 -0
- package/dist/remarks-DlJCqWRs.js.map +1 -0
- package/dist/{remote-CPPW86Q9.js → remote-cE2VWfkJ.js} +3 -3
- package/dist/{remote-CPPW86Q9.js.map → remote-cE2VWfkJ.js.map} +1 -1
- package/dist/resolve-C4zeccCH.js +724 -0
- package/dist/resolve-C4zeccCH.js.map +1 -0
- package/dist/resolve-D30yZYmB.js +1 -0
- package/dist/{results-BE2f-1XS.js → results-Drtt0uFl.js} +33 -8
- package/dist/results-Drtt0uFl.js.map +1 -0
- package/dist/{resume-Ca1c8vix.js → resume-BEFazUfy.js} +4 -4
- package/dist/{resume-Ca1c8vix.js.map → resume-BEFazUfy.js.map} +1 -1
- package/dist/rules-BFzQqPIm.js +317 -0
- package/dist/rules-BFzQqPIm.js.map +1 -0
- package/dist/run-BeMy92Us.js +88 -0
- package/dist/run-BeMy92Us.js.map +1 -0
- package/dist/{sandbox-DLrsvu7U.js → sandbox-CQaJj7n9.js} +2 -2
- package/dist/{sandbox-DLrsvu7U.js.map → sandbox-CQaJj7n9.js.map} +1 -1
- package/dist/sandbox.d.ts +1 -1
- package/dist/sandbox.js +1 -1
- package/dist/server-V4-2w0l8.js +1 -0
- package/dist/{server-TUY5xA_A.js → server-xK0les4f.js} +8 -8
- package/dist/{server-TUY5xA_A.js.map → server-xK0les4f.js.map} +1 -1
- package/dist/source-BDow_oW8.js +1 -0
- package/dist/{source-DJGS0a0u.js → source-Q1hEKbCs.js} +2 -2
- package/dist/{source-DJGS0a0u.js.map → source-Q1hEKbCs.js.map} +1 -1
- package/dist/src-B9L9yGKI.js +1 -0
- package/dist/{src-CLoOMVWI.js → src-Bcah6ZkT.js} +1 -1
- package/dist/{src-DvCg0NBs.js → src-BhmaorOU.js} +28 -6
- package/dist/{src-DvCg0NBs.js.map → src-BhmaorOU.js.map} +1 -1
- package/dist/{src-CF17Ug08.js → src-C0CeKiLU.js} +19 -4
- package/dist/{src-CF17Ug08.js.map → src-C0CeKiLU.js.map} +1 -1
- package/dist/src-C0xowZ3C.js +2 -0
- package/dist/src-CHIfIKUu.js +2 -0
- package/dist/src-DLtyz4w5.js +2 -0
- package/dist/src-DPIjmReZ.js +2 -0
- package/dist/{src-BxfCKA3_.js → src-DXNh5mTr.js} +1 -1
- package/dist/{src-FGXhkEkH.js → src-DiLMkIr9.js} +142 -13
- package/dist/src-DiLMkIr9.js.map +1 -0
- package/dist/{src-ftu5wPSt.js → src-LekQrr_S.js} +209 -29
- package/dist/src-LekQrr_S.js.map +1 -0
- package/dist/src-bCnsA6Vp.js +2 -0
- package/dist/{src-u8_ixn_F.js → src-cbCb-MPy.js} +20 -4
- package/dist/src-cbCb-MPy.js.map +1 -0
- package/dist/{src-DvK0EIZx.js → src-qGoFkuJF.js} +55 -6
- package/dist/{src-DvK0EIZx.js.map → src-qGoFkuJF.js.map} +1 -1
- package/dist/{src-DSYYPEOj.js → src-ynBVosfX.js} +1 -1
- package/dist/state-BQR_BCm4.js +1 -0
- package/dist/{state-DfpHox6b.js → state-BmZ8QVZ8.js} +12 -12
- package/dist/{state-DfpHox6b.js.map → state-BmZ8QVZ8.js.map} +1 -1
- package/dist/studio-app/assets/{index-CBkhNAv8.js → index-CnYJijyI.js} +9 -9
- package/dist/studio-app/index.html +1 -1
- package/dist/suite-BaHPmAGy.js +1 -0
- package/dist/{suite-Cw_7G2RM.js → suite-C8sw2pox.js} +80 -28
- package/dist/suite-C8sw2pox.js.map +1 -0
- package/dist/{summary-BUKfU-9l.js → summary-0oQNGskv.js} +273 -47
- package/dist/summary-0oQNGskv.js.map +1 -0
- package/dist/testing.d.ts +2 -2
- package/dist/testing.js +2 -2
- package/dist/{text-gEcKjAyp.js → text-CrVy5ioL.js} +18 -2
- package/dist/text-CrVy5ioL.js.map +1 -0
- package/dist/{transcript-BNNANU8A.js → transcript-BTxJpW4R.js} +2 -2
- package/dist/{transcript-BNNANU8A.js.map → transcript-BTxJpW4R.js.map} +1 -1
- package/dist/types-C5vI3g1C.js.map +1 -1
- package/dist/{types-BYdlwMwo.d.ts → types-GraZtfHN.d.ts} +848 -34
- package/dist/usage-BDo2q_yu.js +1 -0
- package/dist/{command-Bj39y-Wm.js → validate-BdoXUuL_.js} +15 -372
- package/dist/validate-BdoXUuL_.js.map +1 -0
- package/dist/view/index.d.ts +20 -257
- package/dist/view/index.js +7 -6
- package/dist/{views-B8w2J-gD.js → views-BoUoX4_A.js} +8 -98
- package/dist/views-BoUoX4_A.js.map +1 -0
- package/dist/views-noVQNCUP.js +2 -0
- package/dist/{worker-entry-DNnveLqx.js → worker-entry-D0-GErmU.js} +2 -2
- package/dist/{worker-entry-DNnveLqx.js.map → worker-entry-D0-GErmU.js.map} +1 -1
- package/dist/{workspace-C_X0tdv6.js → workspace-B90YDU_a.js} +1 -1
- package/dist/{workspace-C4RA3srV.js → workspace-tjZFkjxC.js} +4 -4
- package/dist/{workspace-C4RA3srV.js.map → workspace-tjZFkjxC.js.map} +1 -1
- package/package.json +3 -1
- package/skills/eval-rubric/SKILL.md +130 -0
- package/dist/agent-D483ru7D.js +0 -334
- package/dist/agent-D483ru7D.js.map +0 -1
- package/dist/assemble-D5KGrwnJ.js +0 -1
- package/dist/assemble-D9GWr-HS.js.map +0 -1
- package/dist/capture-CYGLpWxR.js +0 -1
- package/dist/cli-ClpPT8kn.js.map +0 -1
- package/dist/cli-spec-qmEnQ25_.js.map +0 -1
- package/dist/command-Bj39y-Wm.js.map +0 -1
- package/dist/command-C-cVjlny.js +0 -1
- package/dist/command-DbAe1Rzb.js.map +0 -1
- package/dist/command-TgbzPizb.js.map +0 -1
- package/dist/commands-YUwlyTbr.js +0 -228
- package/dist/commands-YUwlyTbr.js.map +0 -1
- package/dist/config-DrVSEVN0.js.map +0 -1
- package/dist/context-C1mxXh80.js.map +0 -1
- package/dist/db-CKg5NtiW.js +0 -2
- package/dist/db-DfhipHEF.js +0 -1416
- package/dist/db-DfhipHEF.js.map +0 -1
- package/dist/doctor-D2MbNO8L.js.map +0 -1
- package/dist/egress-2-qzPvGi.js.map +0 -1
- package/dist/environment-Cca6a4wB.js.map +0 -1
- package/dist/evaluate-DKIl54Hb.js.map +0 -1
- package/dist/files-BXHZFWmx.js.map +0 -1
- package/dist/files-BpUYBwGu.js.map +0 -1
- package/dist/files-Bw8lWEjg.js +0 -1
- package/dist/files-D6J0iSdx.js +0 -1
- package/dist/images-Bi3aGxb9.js.map +0 -1
- package/dist/init-Cl3f3NBT.js +0 -360
- package/dist/init-Cl3f3NBT.js.map +0 -1
- package/dist/init-fhOXED8F.js +0 -1
- package/dist/judge-DW_GDOmB.js.map +0 -1
- package/dist/model-CXhrziBe.js +0 -1
- package/dist/model-D0IcOQao.js.map +0 -1
- package/dist/model-DaX4bNLZ.js.map +0 -1
- package/dist/model-_bxNrk2h.js +0 -1
- package/dist/options-C0d0AzeR.js.map +0 -1
- package/dist/plan-DgQxp9yy.js.map +0 -1
- package/dist/preflight-BRzD30L5.js.map +0 -1
- package/dist/prepare-B_y-AFMv.js.map +0 -1
- package/dist/prepare-DCKTLHN3.js +0 -2
- package/dist/providers-B9yTdIqF.js +0 -1
- package/dist/providers-DoTq1jHW.js.map +0 -1
- package/dist/query-CRQfsw0e.js +0 -1
- package/dist/record-BKmMvZ6O.js.map +0 -1
- package/dist/results-BE2f-1XS.js.map +0 -1
- package/dist/server-Dp8eOeK5.js +0 -1
- package/dist/source-DdbLGR1M.js +0 -1
- package/dist/src-CcrQbpG8.js +0 -2
- package/dist/src-DCFtJRp0.js +0 -2
- package/dist/src-DYO3DdnQ.js +0 -1
- package/dist/src-FGXhkEkH.js.map +0 -1
- package/dist/src-WD-zgQYZ.js +0 -2
- package/dist/src-_oI9AePb.js +0 -2
- package/dist/src-ftu5wPSt.js.map +0 -1
- package/dist/src-qsKCqv7a.js +0 -2
- package/dist/src-u8_ixn_F.js.map +0 -1
- package/dist/state-DpAxYyED.js +0 -1
- package/dist/suite-Cw_7G2RM.js.map +0 -1
- package/dist/suite-DamAEnNF.js +0 -1
- package/dist/summary-BUKfU-9l.js.map +0 -1
- package/dist/summary-Baa4rTHS.js +0 -192
- package/dist/summary-Baa4rTHS.js.map +0 -1
- package/dist/text-gEcKjAyp.js.map +0 -1
- package/dist/tools-DLHgetpx.js +0 -249
- package/dist/tools-DLHgetpx.js.map +0 -1
- package/dist/views-B8w2J-gD.js.map +0 -1
- package/dist/views-DblnI3kA.js +0 -2
|
@@ -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
|
-
/**
|
|
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;
|
|
@@ -268,7 +271,10 @@ type AttemptRecord = {
|
|
|
268
271
|
outcome: Outcome;
|
|
269
272
|
error: AttemptError | null;
|
|
270
273
|
durationMs: number;
|
|
271
|
-
/**
|
|
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
|
+
*/
|
|
272
278
|
turns: Array<{
|
|
273
279
|
prompt: string;
|
|
274
280
|
status: TurnStatus;
|
|
@@ -283,6 +289,8 @@ type AttemptRecord = {
|
|
|
283
289
|
unreported: WebEventType[];
|
|
284
290
|
/** The turn's first error, such as a provider's billing or auth error, cut at 1 KB; else null. */
|
|
285
291
|
error: string | null;
|
|
292
|
+
/** Each stdio MCP server start during the turn; see `McpStartup`. */
|
|
293
|
+
mcpStartup?: McpStartup[];
|
|
286
294
|
}>;
|
|
287
295
|
/** Tokens across the attempt's turns; null when the harness reported none. */
|
|
288
296
|
usage: TokenUsage | null;
|
|
@@ -413,7 +421,10 @@ type FamilyEffortMetric = {
|
|
|
413
421
|
ratio: number | null;
|
|
414
422
|
/** Wilcoxon signed-rank over the per-case differences; null when every difference is 0. */
|
|
415
423
|
p: number | null;
|
|
416
|
-
/**
|
|
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
|
+
*/
|
|
417
428
|
verdict: 'fewer' | 'more' | 'noise' | 'insufficient';
|
|
418
429
|
};
|
|
419
430
|
/** The variant's effort against the control's, paired by case. */
|
|
@@ -671,6 +682,11 @@ type RunRecord = {
|
|
|
671
682
|
evals: EvalEntry[];
|
|
672
683
|
/** Each pooled `evaluate.each` that ran; unset when none did. */
|
|
673
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[];
|
|
674
690
|
};
|
|
675
691
|
/** What ran and graded the agents: the machine, images, harnesses and judge. */
|
|
676
692
|
type Stack = {
|
|
@@ -719,7 +735,7 @@ type Stack = {
|
|
|
719
735
|
effort: string | null;
|
|
720
736
|
/**
|
|
721
737
|
* The models the harness reported serving, across every turn in the run, with the variant it
|
|
722
|
-
* resolved (`composer-2.5[fast=
|
|
738
|
+
* resolved (`composer-2.5[fast=false]` for `composer-2.5` with no `params`); empty when it
|
|
723
739
|
* reports none.
|
|
724
740
|
*/
|
|
725
741
|
resolvedModels: string[];
|
|
@@ -774,6 +790,8 @@ type HistoryCell = Pick<CellRecord, 'key' | 'role' | 'variant' | 'harness' | 'mo
|
|
|
774
790
|
};
|
|
775
791
|
/** Median tool calls, agent time and tokens over the counted attempts; null when none counted. */
|
|
776
792
|
effort: CellEffort | null;
|
|
793
|
+
/** Of `fail`, the attempts the run's interrupt cancelled (`error.kind: 'aborted'`); unset when none. */
|
|
794
|
+
cancelled?: number;
|
|
777
795
|
};
|
|
778
796
|
/**
|
|
779
797
|
* One line of the derived history listing: cached locally by the CLI, and the run header in the
|
|
@@ -814,6 +832,592 @@ type HistoryEntry = {
|
|
|
814
832
|
}>;
|
|
815
833
|
/** The run's pooled families; unset when none ran. */
|
|
816
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
|
+
}>;
|
|
817
1421
|
};
|
|
818
1422
|
//#endregion
|
|
819
1423
|
//#region src/types.d.ts
|
|
@@ -1346,8 +1950,8 @@ type CursorHarnessDescriptor = {
|
|
|
1346
1950
|
/** A model id `Cursor.models.list()` returns for the key, e.g. `composer-2.5`. */
|
|
1347
1951
|
model: string;
|
|
1348
1952
|
/**
|
|
1349
|
-
* Model parameters, e.g. `{ fast: '
|
|
1350
|
-
* model catalog
|
|
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.
|
|
1351
1955
|
*/
|
|
1352
1956
|
params?: Record<string, string>;
|
|
1353
1957
|
/**
|
|
@@ -1809,6 +2413,103 @@ type EnvironmentSpec = {
|
|
|
1809
2413
|
skills?: SkillSource[];
|
|
1810
2414
|
/** MCP servers the agent gets, by name. */
|
|
1811
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;
|
|
1812
2513
|
};
|
|
1813
2514
|
/** One environment in an `extend` chain. */
|
|
1814
2515
|
type EnvironmentLayer = {
|
|
@@ -1842,6 +2543,7 @@ type EnvironmentHelpers = {
|
|
|
1842
2543
|
secret: SecretHelper;
|
|
1843
2544
|
skill: SkillHelper;
|
|
1844
2545
|
mcp: McpHelper;
|
|
2546
|
+
plugin: PluginHelper;
|
|
1845
2547
|
/** A host file, relative to the file that calls it (or an absolute path or `URL`). */
|
|
1846
2548
|
file: (path: string | URL) => HostFile;
|
|
1847
2549
|
/**
|
|
@@ -2236,30 +2938,11 @@ type Profile = {
|
|
|
2236
2938
|
/** Tag filters for this profile, like `--tag` (`'!slow'` excludes). */
|
|
2237
2939
|
tags?: string[];
|
|
2238
2940
|
};
|
|
2239
|
-
/** What a fake note is written from: the eval, the harness, and what its tools returned. */
|
|
2240
|
-
type FakeNoteInput = {
|
|
2241
|
-
eval: string;
|
|
2242
|
-
harness: string;
|
|
2243
|
-
attempts: Array<{
|
|
2244
|
-
id: string;
|
|
2245
|
-
outcome: string;
|
|
2246
|
-
}>;
|
|
2247
|
-
/** Each failed attempt the fake opened beside a passing one, and the step where they diverged. */
|
|
2248
|
-
compared: Array<{
|
|
2249
|
-
failed: string;
|
|
2250
|
-
passed: string;
|
|
2251
|
-
divergedAt: number | null;
|
|
2252
|
-
}>;
|
|
2253
|
-
};
|
|
2254
2941
|
/** A canned analysis for tests; see `fakeAnalysis()` in `reeval/judge`. */
|
|
2255
2942
|
type FakeAnalysisModel = {
|
|
2256
2943
|
kind: 'fake-analysis';
|
|
2257
2944
|
/** The model's structured answer, or a function of the digest it was given. */
|
|
2258
2945
|
output?: unknown | ((digest: unknown) => unknown);
|
|
2259
|
-
/** `analysis.agent`'s note on each eval and harness: text, a function of its tools' results, or an error to throw. */
|
|
2260
|
-
note?: string | ((input: FakeNoteInput) => string) | {
|
|
2261
|
-
error: string;
|
|
2262
|
-
};
|
|
2263
2946
|
/**
|
|
2264
2947
|
* How it answers compare questions: a fixed pick, a function of the blinded pair, or
|
|
2265
2948
|
* `{ error }` to fail every call. A pick may be `{ winner, reason? }`. Default `'tie'`.
|
|
@@ -2267,6 +2950,74 @@ type FakeAnalysisModel = {
|
|
|
2267
2950
|
vote?: FakePick | ((pair: BlindPair) => FakePick) | {
|
|
2268
2951
|
error: string;
|
|
2269
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;
|
|
2270
3021
|
};
|
|
2271
3022
|
/** A blinded label's pick: the attempt shown first (`A`), second (`B`), or neither. */
|
|
2272
3023
|
type FakeVote = 'A' | 'B' | 'tie';
|
|
@@ -2318,15 +3069,24 @@ type BlindSide = BlindTurn & {
|
|
|
2318
3069
|
missing: true;
|
|
2319
3070
|
}>;
|
|
2320
3071
|
};
|
|
2321
|
-
/** `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. */
|
|
2322
3073
|
type AnalysisConfig = {
|
|
2323
|
-
/**
|
|
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
|
+
*/
|
|
2324
3078
|
model?: string | FakeAnalysisModel;
|
|
2325
3079
|
/**
|
|
2326
|
-
* `reeval run`
|
|
2327
|
-
*
|
|
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).
|
|
2328
3082
|
*/
|
|
2329
|
-
|
|
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;
|
|
2330
3090
|
/** Added to the prompt, e.g. "Fewer tool calls count as a win. The skill under test is reeval-good." */
|
|
2331
3091
|
instructions?: string;
|
|
2332
3092
|
/** The digest's cap; evidence is dropped, lowest priority first, to fit (default 20000). */
|
|
@@ -2392,7 +3152,7 @@ type ReevalConfig = {
|
|
|
2392
3152
|
keep?: number;
|
|
2393
3153
|
traceBufferMb?: number;
|
|
2394
3154
|
};
|
|
2395
|
-
/** `reeval analyze`, compare questions without a model
|
|
3155
|
+
/** Insights during `reeval run`, `reeval analyze`, and compare questions without a model. */
|
|
2396
3156
|
analysis?: AnalysisConfig;
|
|
2397
3157
|
};
|
|
2398
3158
|
/** What a `defineConfig` callback gets: the environment helpers plus the run's context. */
|
|
@@ -2441,6 +3201,23 @@ type AttemptError = {
|
|
|
2441
3201
|
prepare?: PrepareFailureRecord;
|
|
2442
3202
|
resource?: ResourceFailureRecord;
|
|
2443
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
|
+
};
|
|
2444
3221
|
/** Where an eval's time went, in ms. `agentMs` is the harness turns; `diffMs` reading changes. */
|
|
2445
3222
|
type PhaseTimings = {
|
|
2446
3223
|
setupMs: number;
|
|
@@ -2466,6 +3243,38 @@ type Cell = {
|
|
|
2466
3243
|
/** The variant's name, for variant cells. */
|
|
2467
3244
|
variant?: string;
|
|
2468
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
|
+
};
|
|
2469
3278
|
/** An environment as it was applied, without secret values. */
|
|
2470
3279
|
type EnvironmentRecord = {
|
|
2471
3280
|
name: string;
|
|
@@ -2484,8 +3293,13 @@ type EnvironmentRecord = {
|
|
|
2484
3293
|
placement: SkillPlacement;
|
|
2485
3294
|
/** Paths left out of the sandbox by `exclude` (directories end in `/`); `.git` isn't listed. */
|
|
2486
3295
|
excluded: string[];
|
|
3296
|
+
/** The plugin the skill came with; unset for a skill from `skills`. */
|
|
3297
|
+
plugin?: string;
|
|
2487
3298
|
}>;
|
|
3299
|
+
/** Every MCP server, a plugin's as `<plugin>:<server>`. */
|
|
2488
3300
|
mcp: string[];
|
|
3301
|
+
/** The plugins placed, each with what it placed; in the digest. Unset when there are none. */
|
|
3302
|
+
plugins?: PluginRecord[];
|
|
2489
3303
|
files: Array<{
|
|
2490
3304
|
path: string;
|
|
2491
3305
|
sha256: string;
|
|
@@ -2550,7 +3364,7 @@ type AttemptImage = {
|
|
|
2550
3364
|
/** Content-addressed image id (`sha256:…`). */
|
|
2551
3365
|
id: string;
|
|
2552
3366
|
agentCli: string | null;
|
|
2553
|
-
/** The harness image `install`
|
|
3367
|
+
/** The harness image `install` and plugin builds were baked onto: `ref` itself without either. */
|
|
2554
3368
|
base: string;
|
|
2555
3369
|
/** The `docker({ install })` commands, in order. */
|
|
2556
3370
|
install: string[];
|
|
@@ -2621,5 +3435,5 @@ type SandboxWarning = {
|
|
|
2621
3435
|
message: string;
|
|
2622
3436
|
};
|
|
2623
3437
|
//#endregion
|
|
2624
|
-
export { GooseHarnessDescriptor as $,
|
|
2625
|
-
//# sourceMappingURL=types-
|
|
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
|