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