reeval 0.11.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (312) hide show
  1. package/README.md +115 -257
  2. package/assets/package.json +1 -1
  3. package/assets/pnpm-lock.yaml +41 -30
  4. package/bin/mcp-timer.cjs +224 -0
  5. package/dist/{adapter-Bwy3QxAK.js → adapter-IKKo4sZj.js} +4 -4
  6. package/dist/{adapter-Bwy3QxAK.js.map → adapter-IKKo4sZj.js.map} +1 -1
  7. package/dist/{agent-DpE80WPz.js → agent-ClE-g9VL.js} +22 -7
  8. package/dist/{agent-DpE80WPz.js.map → agent-ClE-g9VL.js.map} +1 -1
  9. package/dist/{analysis-Bxub9LMT.js → analysis-B0nOfAzA.js} +3 -3
  10. package/dist/{analysis-Bxub9LMT.js.map → analysis-B0nOfAzA.js.map} +1 -1
  11. package/dist/{assemble-D9GWr-HS.js → assemble-BO93VAk1.js} +22 -20
  12. package/dist/assemble-BO93VAk1.js.map +1 -0
  13. package/dist/assemble-VQxyoDxK.js +1 -0
  14. package/dist/{attempt-CGPV3BZY.js → attempt-jI0OWxlz.js} +2 -2
  15. package/dist/{attempt-CGPV3BZY.js.map → attempt-jI0OWxlz.js.map} +1 -1
  16. package/dist/bridge/index.mjs +2 -1
  17. package/dist/{capture-BQlGHiMC.js → capture-dn2hjSLj.js} +29 -21
  18. package/dist/{capture-BQlGHiMC.js.map → capture-dn2hjSLj.js.map} +1 -1
  19. package/dist/capture-nIJ-7kUE.js +1 -0
  20. package/dist/{cli-ClpPT8kn.js → cli-BCE1xlm4.js} +176 -120
  21. package/dist/cli-BCE1xlm4.js.map +1 -0
  22. package/dist/{cli-spec-qmEnQ25_.js → cli-spec-BXIBUlaK.js} +34 -15
  23. package/dist/cli-spec-BXIBUlaK.js.map +1 -0
  24. package/dist/cli.js +2 -2
  25. package/dist/{command-BlM0y8jN.js → command-Bh3yhN_b.js} +8 -8
  26. package/dist/{command-BlM0y8jN.js.map → command-Bh3yhN_b.js.map} +1 -1
  27. package/dist/command-C6vwmjS7.js +91 -0
  28. package/dist/command-C6vwmjS7.js.map +1 -0
  29. package/dist/{command-DbAe1Rzb.js → command-CANun0m0.js} +16 -19
  30. package/dist/command-CANun0m0.js.map +1 -0
  31. package/dist/command-CBaHukyl.js +335 -0
  32. package/dist/command-CBaHukyl.js.map +1 -0
  33. package/dist/{command-TgbzPizb.js → command-D_kEnYcX.js} +17 -16
  34. package/dist/command-D_kEnYcX.js.map +1 -0
  35. package/dist/commands-7tH3EsVu.js +666 -0
  36. package/dist/commands-7tH3EsVu.js.map +1 -0
  37. package/dist/{commands-CthqwkAn.js → commands-BKGzBMgb.js} +1 -1
  38. package/dist/{config-DrVSEVN0.js → config-D7TFvUpL.js} +40 -55
  39. package/dist/config-D7TFvUpL.js.map +1 -0
  40. package/dist/{context-C1mxXh80.js → context-Dgn48BqT.js} +13 -2
  41. package/dist/context-Dgn48BqT.js.map +1 -0
  42. package/dist/{contrasts-5zsj32gk.js → contrasts-B4nOhn0Z.js} +3 -3
  43. package/dist/{contrasts-5zsj32gk.js.map → contrasts-B4nOhn0Z.js.map} +1 -1
  44. package/dist/db-DJUuFoWQ.js +602 -0
  45. package/dist/db-DJUuFoWQ.js.map +1 -0
  46. package/dist/db-W9EFlXnn.js +2 -0
  47. package/dist/{dist-CuY4ehEk.js → dist-Dp_AJgYN.js} +3 -3
  48. package/dist/{dist-CuY4ehEk.js.map → dist-Dp_AJgYN.js.map} +1 -1
  49. package/dist/{docker-D1HZDS6q.js → docker-CQxucRPe.js} +16 -15
  50. package/dist/docker-CQxucRPe.js.map +1 -0
  51. package/dist/{docker-DNmMPOBb.js → docker-Dac6Zalz.js} +1 -1
  52. package/dist/{docker-DOvjji9I.js → docker-DuHcQidD.js} +3 -3
  53. package/dist/{docker-DOvjji9I.js.map → docker-DuHcQidD.js.map} +1 -1
  54. package/dist/{doctor-D2MbNO8L.js → doctor-De_QlOTM.js} +72 -38
  55. package/dist/doctor-De_QlOTM.js.map +1 -0
  56. package/dist/{egress-2-qzPvGi.js → egress-DEAvq8Fl.js} +453 -31
  57. package/dist/egress-DEAvq8Fl.js.map +1 -0
  58. package/dist/env-BQqj93gu.js +21 -0
  59. package/dist/env-BQqj93gu.js.map +1 -0
  60. package/dist/{environment-Cca6a4wB.js → environment-B4IuURK1.js} +247 -14
  61. package/dist/environment-B4IuURK1.js.map +1 -0
  62. package/dist/{evaluate-DMyaGQEj.d.ts → evaluate-C9-ritA5.d.ts} +2 -2
  63. package/dist/{evaluate-DKIl54Hb.js → evaluate-Djk1YPFL.js} +540 -560
  64. package/dist/evaluate-Djk1YPFL.js.map +1 -0
  65. package/dist/facts-Cfx1H70y.js +898 -0
  66. package/dist/facts-Cfx1H70y.js.map +1 -0
  67. package/dist/files-Bs6H3HiG.js +65 -0
  68. package/dist/files-Bs6H3HiG.js.map +1 -0
  69. package/dist/{files-BpUYBwGu.js → files-CN1QfenC.js} +31 -8
  70. package/dist/files-CN1QfenC.js.map +1 -0
  71. package/dist/files-CtjEXWXm.js +1 -0
  72. package/dist/{files-BXHZFWmx.js → files-D27nUk0K.js} +6 -17
  73. package/dist/files-D27nUk0K.js.map +1 -0
  74. package/dist/files-D3gJa91B.js +1 -0
  75. package/dist/generate-BnrvBAzF.js +1646 -0
  76. package/dist/generate-BnrvBAzF.js.map +1 -0
  77. package/dist/{git-Crl3b87o.js → git-rPfl7AD1.js} +3 -3
  78. package/dist/{git-Crl3b87o.js.map → git-rPfl7AD1.js.map} +1 -1
  79. package/dist/{harness-CEuntrla.js → harness-1OkumOAm.js} +3 -3
  80. package/dist/{harness-CEuntrla.js.map → harness-1OkumOAm.js.map} +1 -1
  81. package/dist/harness.d.ts +1 -1
  82. package/dist/harness.js +1 -1
  83. package/dist/{header-DHQv_ZrF.js → header-BVzbRnNv.js} +10 -3
  84. package/dist/{header-DHQv_ZrF.js.map → header-BVzbRnNv.js.map} +1 -1
  85. package/dist/{images-Bi3aGxb9.js → images-m784ueGK.js} +61 -13
  86. package/dist/images-m784ueGK.js.map +1 -0
  87. package/dist/index.d.ts +3 -3
  88. package/dist/index.js +4 -4
  89. package/dist/init-hiTkiM4L.js +543 -0
  90. package/dist/init-hiTkiM4L.js.map +1 -0
  91. package/dist/init-kMkTgTZc.js +1 -0
  92. package/dist/insights-B2Xmhz9o.js +64 -0
  93. package/dist/insights-B2Xmhz9o.js.map +1 -0
  94. package/dist/{invocations-BYDPe3fV.js → invocations-D_ePcwyL.js} +4 -4
  95. package/dist/{invocations-BYDPe3fV.js.map → invocations-D_ePcwyL.js.map} +1 -1
  96. package/dist/{judge-DW_GDOmB.js → judge-CEDIfRiU.js} +50 -15
  97. package/dist/judge-CEDIfRiU.js.map +1 -0
  98. package/dist/judge.d.ts +7 -6
  99. package/dist/judge.js +8 -7
  100. package/dist/judge.js.map +1 -1
  101. package/dist/{live-jlfszAbb.js → live-DYd2QEyR.js} +2 -2
  102. package/dist/{live-jlfszAbb.js.map → live-DYd2QEyR.js.map} +1 -1
  103. package/dist/model-B8H3gL69.js +1 -0
  104. package/dist/{model-DaVCY3rb.js → model-CTiuzkWw.js} +9 -7
  105. package/dist/model-CTiuzkWw.js.map +1 -0
  106. package/dist/model-DcIbmggK.js +1 -0
  107. package/dist/{model-D0IcOQao.js → model-DpkclE4r.js} +60 -25
  108. package/dist/model-DpkclE4r.js.map +1 -0
  109. package/dist/{model-DaX4bNLZ.js → model-UgHDMhI1.js} +144 -46
  110. package/dist/model-UgHDMhI1.js.map +1 -0
  111. package/dist/{node-B3ydHo6t.js → node-CGZYh4Fj.js} +4 -4
  112. package/dist/{node-B3ydHo6t.js.map → node-CGZYh4Fj.js.map} +1 -1
  113. package/dist/{opencode-providers-J9colP0-.js → opencode-providers-snfeWd6Z.js} +86 -47
  114. package/dist/opencode-providers-snfeWd6Z.js.map +1 -0
  115. package/dist/{options-C0d0AzeR.js → options-CyAyLjgJ.js} +22 -11
  116. package/dist/options-CyAyLjgJ.js.map +1 -0
  117. package/dist/{pairs-CnInRu-G.js → pairs-DP6XOJby.js} +2 -2
  118. package/dist/{pairs-CnInRu-G.js.map → pairs-DP6XOJby.js.map} +1 -1
  119. package/dist/{patch-B1bnfhN-.js → patch-uMq9rCl_.js} +2 -2
  120. package/dist/{patch-B1bnfhN-.js.map → patch-uMq9rCl_.js.map} +1 -1
  121. package/dist/{plan-DgQxp9yy.js → plan-CZYgXnZh.js} +21 -8
  122. package/dist/plan-CZYgXnZh.js.map +1 -0
  123. package/dist/plugins-P-uh54VF.js +654 -0
  124. package/dist/plugins-P-uh54VF.js.map +1 -0
  125. package/dist/{preflight-DlQvbySb.js → preflight-BQlPTHVu.js} +1 -1
  126. package/dist/{preflight-BRzD30L5.js → preflight-D3HvKeAx.js} +14 -10
  127. package/dist/preflight-D3HvKeAx.js.map +1 -0
  128. package/dist/prepare-DCwM2KKD.js +2 -0
  129. package/dist/{prepare-B_y-AFMv.js → prepare-Dx7dOnJB.js} +70 -23
  130. package/dist/prepare-Dx7dOnJB.js.map +1 -0
  131. package/dist/{provenance-DQ0AXn6c.js → provenance-C_-8y-x3.js} +4 -4
  132. package/dist/{provenance-DQ0AXn6c.js.map → provenance-C_-8y-x3.js.map} +1 -1
  133. package/dist/{providers-DoTq1jHW.js → providers-CF5UEaP8.js} +24 -10
  134. package/dist/providers-CF5UEaP8.js.map +1 -0
  135. package/dist/providers-CTBYvMxu.js +1 -0
  136. package/dist/{query-BO-ux7RB.js → query-DXthKmq0.js} +3 -3
  137. package/dist/{query-BO-ux7RB.js.map → query-DXthKmq0.js.map} +1 -1
  138. package/dist/query-D_1ARx5q.js +1 -0
  139. package/dist/{questions-C2dym2ce.js → questions-KENpWnfV.js} +8 -9
  140. package/dist/questions-KENpWnfV.js.map +1 -0
  141. package/dist/{record-BKmMvZ6O.js → record-kk9M1hj-.js} +8 -4
  142. package/dist/record-kk9M1hj-.js.map +1 -0
  143. package/dist/{redact-DJ9JCShu.js → redact-CRGdfV2s.js} +4 -2
  144. package/dist/redact-CRGdfV2s.js.map +1 -0
  145. package/dist/remarks-1521zwfW.js +38 -0
  146. package/dist/remarks-1521zwfW.js.map +1 -0
  147. package/dist/remarks-BhAV1H4V.js +1 -0
  148. package/dist/remarks-Ml6bcSdV.js +278 -0
  149. package/dist/remarks-Ml6bcSdV.js.map +1 -0
  150. package/dist/{remote-CPPW86Q9.js → remote-Dkeghk8k.js} +3 -3
  151. package/dist/{remote-CPPW86Q9.js.map → remote-Dkeghk8k.js.map} +1 -1
  152. package/dist/resolve-CMmhACr6.js +1 -0
  153. package/dist/resolve-DzdWcIL6.js +724 -0
  154. package/dist/resolve-DzdWcIL6.js.map +1 -0
  155. package/dist/{results-BE2f-1XS.js → results-D-naai_Q.js} +33 -8
  156. package/dist/results-D-naai_Q.js.map +1 -0
  157. package/dist/{resume-Ca1c8vix.js → resume-8-nnW8iO.js} +4 -4
  158. package/dist/{resume-Ca1c8vix.js.map → resume-8-nnW8iO.js.map} +1 -1
  159. package/dist/{root-DICDHCtp.js → root-DNuLhaA5.js} +2 -2
  160. package/dist/root-DNuLhaA5.js.map +1 -0
  161. package/dist/rules-CcV3zLDR.js +318 -0
  162. package/dist/rules-CcV3zLDR.js.map +1 -0
  163. package/dist/run-Bel7Vde4.js +88 -0
  164. package/dist/run-Bel7Vde4.js.map +1 -0
  165. package/dist/{sandbox-DLrsvu7U.js → sandbox-YLbk9mO7.js} +2 -2
  166. package/dist/{sandbox-DLrsvu7U.js.map → sandbox-YLbk9mO7.js.map} +1 -1
  167. package/dist/sandbox.d.ts +1 -1
  168. package/dist/sandbox.js +1 -1
  169. package/dist/server-C-ysqkLv.js +1 -0
  170. package/dist/{server-TUY5xA_A.js → server-De8oH3bt.js} +10 -10
  171. package/dist/{server-TUY5xA_A.js.map → server-De8oH3bt.js.map} +1 -1
  172. package/dist/{source-DJGS0a0u.js → source-C686eZpY.js} +2 -2
  173. package/dist/{source-DJGS0a0u.js.map → source-C686eZpY.js.map} +1 -1
  174. package/dist/source-DjgypUHW.js +1 -0
  175. package/dist/src-3mP821Pt.js +2 -0
  176. package/dist/src-B3KCLZVk.js +3 -0
  177. package/dist/src-BAyg6CtQ.js +2 -0
  178. package/dist/{src-CF17Ug08.js → src-BYLM3hEz.js} +22 -6
  179. package/dist/src-BYLM3hEz.js.map +1 -0
  180. package/dist/src-BezgGX4X.js +2 -0
  181. package/dist/{src-DvCg0NBs.js → src-C7W6kg81.js} +40 -10
  182. package/dist/{src-DvCg0NBs.js.map → src-C7W6kg81.js.map} +1 -1
  183. package/dist/{src-ftu5wPSt.js → src-CIpKL45U.js} +782 -169
  184. package/dist/src-CIpKL45U.js.map +1 -0
  185. package/dist/src-ChBhk06Q.js +2 -0
  186. package/dist/{src-BxfCKA3_.js → src-CoqZYspK.js} +1 -1
  187. package/dist/{src-CFp86GtV.js → src-CzQrAcF8.js} +49 -49
  188. package/dist/src-CzQrAcF8.js.map +1 -0
  189. package/dist/src-D9fSTxlc.js +1 -0
  190. package/dist/{src-FGXhkEkH.js → src-DeY52Gyf.js} +182 -23
  191. package/dist/src-DeY52Gyf.js.map +1 -0
  192. package/dist/src-DrJSnoMR.js +2 -0
  193. package/dist/{src-DvK0EIZx.js → src-Xj_BZKbq.js} +112 -13
  194. package/dist/src-Xj_BZKbq.js.map +1 -0
  195. package/dist/{src-u8_ixn_F.js → src-cbCb-MPy.js} +20 -4
  196. package/dist/src-cbCb-MPy.js.map +1 -0
  197. package/dist/src-dhSTRN50.js +2 -0
  198. package/dist/{src-C7_1SqDP.js → src-djNNYIdP.js} +2 -2
  199. package/dist/{src-C7_1SqDP.js.map → src-djNNYIdP.js.map} +1 -1
  200. package/dist/state-BGWGAwdo.js +1 -0
  201. package/dist/{state-DfpHox6b.js → state-C0i_ujQZ.js} +19 -17
  202. package/dist/{state-DfpHox6b.js.map → state-C0i_ujQZ.js.map} +1 -1
  203. package/dist/studio-app/assets/{index-CBkhNAv8.js → index-Bb_cid9k.js} +9 -9
  204. package/dist/studio-app/index.html +1 -1
  205. package/dist/{suite-Cw_7G2RM.js → suite-DmuF_ApO.js} +80 -30
  206. package/dist/suite-DmuF_ApO.js.map +1 -0
  207. package/dist/suite-mn9g4veR.js +2 -0
  208. package/dist/{summary-BUKfU-9l.js → summary-BFMHMTz2.js} +273 -47
  209. package/dist/summary-BFMHMTz2.js.map +1 -0
  210. package/dist/testing.d.ts +2 -2
  211. package/dist/testing.js +2 -2
  212. package/dist/{text-gEcKjAyp.js → text-CrVy5ioL.js} +18 -2
  213. package/dist/text-CrVy5ioL.js.map +1 -0
  214. package/dist/{transcript-BNNANU8A.js → transcript-BTxJpW4R.js} +2 -2
  215. package/dist/{transcript-BNNANU8A.js.map → transcript-BTxJpW4R.js.map} +1 -1
  216. package/dist/{types-BYdlwMwo.d.ts → types-B-9b1MDV.d.ts} +850 -34
  217. package/dist/types-C5vI3g1C.js.map +1 -1
  218. package/dist/usage-BDo2q_yu.js +1 -0
  219. package/dist/{command-Bj39y-Wm.js → validate-DWjkshl1.js} +20 -377
  220. package/dist/validate-DWjkshl1.js.map +1 -0
  221. package/dist/view/index.d.ts +31 -263
  222. package/dist/view/index.js +8 -7
  223. package/dist/views-DE2A1jEX.js +2 -0
  224. package/dist/{views-B8w2J-gD.js → views-Dk8MCQKr.js} +8 -98
  225. package/dist/views-Dk8MCQKr.js.map +1 -0
  226. package/dist/{worker-entry-DNnveLqx.js → worker-entry-CqrzGPF4.js} +2 -2
  227. package/dist/{worker-entry-DNnveLqx.js.map → worker-entry-CqrzGPF4.js.map} +1 -1
  228. package/dist/workspace-B1eGO46M.js +1 -0
  229. package/dist/{workspace-C4RA3srV.js → workspace-CLeOybkr.js} +45 -11
  230. package/dist/workspace-CLeOybkr.js.map +1 -0
  231. package/package.json +5 -1
  232. package/skills/eval-rubric/SKILL.md +130 -0
  233. package/dist/agent-D483ru7D.js +0 -334
  234. package/dist/agent-D483ru7D.js.map +0 -1
  235. package/dist/assemble-D5KGrwnJ.js +0 -1
  236. package/dist/assemble-D9GWr-HS.js.map +0 -1
  237. package/dist/capture-CYGLpWxR.js +0 -1
  238. package/dist/cli-ClpPT8kn.js.map +0 -1
  239. package/dist/cli-spec-qmEnQ25_.js.map +0 -1
  240. package/dist/command-Bj39y-Wm.js.map +0 -1
  241. package/dist/command-C-cVjlny.js +0 -1
  242. package/dist/command-DbAe1Rzb.js.map +0 -1
  243. package/dist/command-TgbzPizb.js.map +0 -1
  244. package/dist/commands-YUwlyTbr.js +0 -228
  245. package/dist/commands-YUwlyTbr.js.map +0 -1
  246. package/dist/config-DrVSEVN0.js.map +0 -1
  247. package/dist/context-C1mxXh80.js.map +0 -1
  248. package/dist/db-CKg5NtiW.js +0 -2
  249. package/dist/db-DfhipHEF.js +0 -1416
  250. package/dist/db-DfhipHEF.js.map +0 -1
  251. package/dist/docker-D1HZDS6q.js.map +0 -1
  252. package/dist/doctor-D2MbNO8L.js.map +0 -1
  253. package/dist/egress-2-qzPvGi.js.map +0 -1
  254. package/dist/environment-Cca6a4wB.js.map +0 -1
  255. package/dist/evaluate-DKIl54Hb.js.map +0 -1
  256. package/dist/files-BXHZFWmx.js.map +0 -1
  257. package/dist/files-BpUYBwGu.js.map +0 -1
  258. package/dist/files-Bw8lWEjg.js +0 -1
  259. package/dist/files-D6J0iSdx.js +0 -1
  260. package/dist/images-Bi3aGxb9.js.map +0 -1
  261. package/dist/init-Cl3f3NBT.js +0 -360
  262. package/dist/init-Cl3f3NBT.js.map +0 -1
  263. package/dist/init-fhOXED8F.js +0 -1
  264. package/dist/judge-DW_GDOmB.js.map +0 -1
  265. package/dist/model-CXhrziBe.js +0 -1
  266. package/dist/model-D0IcOQao.js.map +0 -1
  267. package/dist/model-DaVCY3rb.js.map +0 -1
  268. package/dist/model-DaX4bNLZ.js.map +0 -1
  269. package/dist/model-_bxNrk2h.js +0 -1
  270. package/dist/opencode-providers-J9colP0-.js.map +0 -1
  271. package/dist/options-C0d0AzeR.js.map +0 -1
  272. package/dist/plan-DgQxp9yy.js.map +0 -1
  273. package/dist/preflight-BRzD30L5.js.map +0 -1
  274. package/dist/prepare-B_y-AFMv.js.map +0 -1
  275. package/dist/prepare-DCKTLHN3.js +0 -2
  276. package/dist/providers-B9yTdIqF.js +0 -1
  277. package/dist/providers-DoTq1jHW.js.map +0 -1
  278. package/dist/query-CRQfsw0e.js +0 -1
  279. package/dist/questions-C2dym2ce.js.map +0 -1
  280. package/dist/record-BKmMvZ6O.js.map +0 -1
  281. package/dist/redact-DJ9JCShu.js.map +0 -1
  282. package/dist/results-BE2f-1XS.js.map +0 -1
  283. package/dist/root-DICDHCtp.js.map +0 -1
  284. package/dist/server-Dp8eOeK5.js +0 -1
  285. package/dist/source-DdbLGR1M.js +0 -1
  286. package/dist/src-CF17Ug08.js.map +0 -1
  287. package/dist/src-CFp86GtV.js.map +0 -1
  288. package/dist/src-CLoOMVWI.js +0 -3
  289. package/dist/src-CcrQbpG8.js +0 -2
  290. package/dist/src-DCFtJRp0.js +0 -2
  291. package/dist/src-DSYYPEOj.js +0 -2
  292. package/dist/src-DYO3DdnQ.js +0 -1
  293. package/dist/src-DvK0EIZx.js.map +0 -1
  294. package/dist/src-FGXhkEkH.js.map +0 -1
  295. package/dist/src-WD-zgQYZ.js +0 -2
  296. package/dist/src-_oI9AePb.js +0 -2
  297. package/dist/src-ftu5wPSt.js.map +0 -1
  298. package/dist/src-qsKCqv7a.js +0 -2
  299. package/dist/src-u8_ixn_F.js.map +0 -1
  300. package/dist/state-DpAxYyED.js +0 -1
  301. package/dist/suite-Cw_7G2RM.js.map +0 -1
  302. package/dist/suite-DamAEnNF.js +0 -1
  303. package/dist/summary-BUKfU-9l.js.map +0 -1
  304. package/dist/summary-Baa4rTHS.js +0 -192
  305. package/dist/summary-Baa4rTHS.js.map +0 -1
  306. package/dist/text-gEcKjAyp.js.map +0 -1
  307. package/dist/tools-DLHgetpx.js +0 -249
  308. package/dist/tools-DLHgetpx.js.map +0 -1
  309. package/dist/views-B8w2J-gD.js.map +0 -1
  310. package/dist/views-DblnI3kA.js +0 -2
  311. package/dist/workspace-C4RA3srV.js.map +0 -1
  312. package/dist/workspace-C_X0tdv6.js +0 -1
@@ -0,0 +1,898 @@
1
+ import { t as SKILL_LOAD_TOOLS } from "./tool-target-D2mcYlSQ.js";
2
+ import { n as isRuntimeState } from "./context-Dgn48BqT.js";
3
+ import { Q as contrastEffort, _t as round3, dt as containsZero, ft as liftInterval, ht as median, nt as effortOf, yt as wilson } from "./model-UgHDMhI1.js";
4
+ import { n as contrastPairs, t as checkVerdict } from "./contrasts-B4nOhn0Z.js";
5
+ //#region src/history/rows.ts
6
+ /** A statement's rows as `Row`, the columns its SQL selects: SQLite checks none of them. */
7
+ const rowsOf = (statement, ...params) => statement.all(...params);
8
+ //#endregion
9
+ //#region src/history/tool-class.ts
10
+ const TOOL_CLASSES = [
11
+ "context",
12
+ "dependency",
13
+ "web",
14
+ "verify",
15
+ "workspace"
16
+ ];
17
+ const SHELL_TOOL = /shell|bash|terminal|command|exec/i;
18
+ const WEB_TOOL = /web|fetch|browse|url/i;
19
+ const DEPENDENCY = /(^|\/)(node_modules|site-packages|dist-packages|vendor|\.venv|\.cargo\/registry|go\/pkg\/mod)(\/|$)/;
20
+ const VERIFY = /\b(?:(?:npm|pnpm|yarn|bun)\s+(?:run\s+)?(?:test|build|lint|typecheck|check)|npx\s+(?:tsc|vitest|jest|eslint|biome)|tsc|vitest|jest|pytest|eslint|cargo\s+(?:test|build|check)|go\s+(?:test|build|vet))\b/;
21
+ /** Words of a shell command, quotes removed; `;`, `|` and `&&` split words. */
22
+ function shellWords(command) {
23
+ const words = [];
24
+ let word = "";
25
+ let quote = null;
26
+ let started = false;
27
+ const flush = () => {
28
+ if (started) words.push(word);
29
+ word = "";
30
+ started = false;
31
+ };
32
+ for (const ch of command) {
33
+ if (quote) {
34
+ if (ch === quote) quote = null;
35
+ else word += ch;
36
+ continue;
37
+ }
38
+ if (ch === "\"" || ch === "'") {
39
+ quote = ch;
40
+ started = true;
41
+ } else if (/\s/.test(ch)) flush();
42
+ else if (ch === ";" || ch === "|" || ch === "&") {
43
+ flush();
44
+ words.push(ch);
45
+ } else {
46
+ word += ch;
47
+ started = true;
48
+ }
49
+ }
50
+ flush();
51
+ return words;
52
+ }
53
+ /** A command's words, with a `bash -c '…'` (or `-lc`) script split into its own words. */
54
+ function commandWords(command) {
55
+ const words = shellWords(command);
56
+ return words.flatMap((w, i) => i > 0 && /^-[a-z]*c$/.test(words[i - 1]) && /\s/.test(w) ? commandWords(w) : [w]);
57
+ }
58
+ const EXCLUDING_FLAG = /^--(?:exclude|exclude-dir|ignore|ignore-dir)(?:=|$)/;
59
+ /** The words of a command that name something it reads, without the ones it excludes. */
60
+ function readWords(words) {
61
+ const out = [];
62
+ let test = false;
63
+ for (let i = 0; i < words.length; i++) {
64
+ const w = words[i];
65
+ const prev = words[i - 1];
66
+ if (w === "[" || w === "[[" || w === "test") test = true;
67
+ else if (w === "]" || w === "]]" || w === ";" || w === "|" || w === "&") test = false;
68
+ if (test && /^-[defsrwx]$/.test(w)) {
69
+ i++;
70
+ continue;
71
+ }
72
+ if (EXCLUDING_FLAG.test(w)) {
73
+ if (!w.includes("=")) i++;
74
+ continue;
75
+ }
76
+ if ((w === "-path" || w === "-name" || w === "-ipath" || w === "-wholename") && i + 1 < words.length) {
77
+ const pruned = words[i + 2] === "-prune";
78
+ if (prev === "-not" || prev === "!" || pruned) {
79
+ i++;
80
+ continue;
81
+ }
82
+ }
83
+ if ((w === "-g" || w === "--glob" || w === "--iglob") && words[i + 1]?.startsWith("!")) {
84
+ i++;
85
+ continue;
86
+ }
87
+ if (/^--i?glob=!/.test(w)) continue;
88
+ if (w === "-v" && i > 0) {
89
+ i++;
90
+ continue;
91
+ }
92
+ out.push(w);
93
+ }
94
+ return out;
95
+ }
96
+ /** `/home/<user>/x` and `/root/x` as `~/x`; `./x` as `x`. */
97
+ const normalise = (p) => p.replace(/^\/home\/[^/]+\//, "~/").replace(/^\/root\//, "~/").replace(/^\$HOME\//, "~/").replace(/^\.\//, "");
98
+ const GLOB = /[*?[{]/;
99
+ /** `*`, `**` and `?` as wildcards; every other character, `[` included, literally. */
100
+ function wildcards(glob) {
101
+ let re = "";
102
+ for (let i = 0; i < glob.length; i++) {
103
+ const ch = glob[i];
104
+ if (ch === "*") {
105
+ if (glob[i + 1] === "*") {
106
+ re += ".*";
107
+ i++;
108
+ } else re += "[^/]*";
109
+ } else if (ch === "?") re += "[^/]";
110
+ else re += ch.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
111
+ }
112
+ return re;
113
+ }
114
+ /** A glob as a regex, with `{a,b}` alternatives. Words come from transcripts, so it never throws. */
115
+ function globRegex(glob) {
116
+ let re = "";
117
+ let from = 0;
118
+ for (let i = 0; i < glob.length; i++) {
119
+ if (glob[i] !== "{") continue;
120
+ const end = glob.indexOf("}", i);
121
+ if (end < 0) break;
122
+ re += wildcards(glob.slice(from, i));
123
+ re += `(?:${glob.slice(i + 1, end).split(",").map(wildcards).join("|")})`;
124
+ from = end + 1;
125
+ i = end;
126
+ }
127
+ return new RegExp(`^${re}${wildcards(glob.slice(from))}$`);
128
+ }
129
+ /** The declared files one word names: the file itself, one of a glob's matches, or a directory's. */
130
+ function filesOf(word, files) {
131
+ const w = normalise(word).replace(/\/+$/, "");
132
+ if (!w) return {
133
+ files: [],
134
+ dir: false
135
+ };
136
+ const forms = (f) => f.startsWith("~/") ? [f, f.slice(2)] : [f];
137
+ const matches = (f, test) => forms(f).some((form) => test(form) || !w.startsWith("~/") && test(`~/${form}`));
138
+ if (GLOB.test(w)) {
139
+ const re = globRegex(w);
140
+ const fromWorkspace = /^[*?[{]/.test(w);
141
+ return {
142
+ files: files.filter((f) => fromWorkspace ? !f.startsWith("~/") && re.test(f) : matches(f, (form) => re.test(form))),
143
+ dir: false
144
+ };
145
+ }
146
+ const exact = files.filter((f) => matches(f, (form) => form === w || form.endsWith(`/${w}`)));
147
+ if (exact.length) return {
148
+ files: exact,
149
+ dir: false
150
+ };
151
+ return {
152
+ files: [],
153
+ dir: files.filter((f) => matches(f, (form) => form.startsWith(`${w}/`))).length > 0
154
+ };
155
+ }
156
+ /** A tool call's class, and the declared files it read (for `skill_files`). */
157
+ function classifyCall(tool, target, ctx) {
158
+ if (SKILL_LOAD_TOOLS.has(tool)) {
159
+ if (!ctx.skills.includes(target)) return {
160
+ class: "workspace",
161
+ files: []
162
+ };
163
+ return {
164
+ class: "context",
165
+ files: ctx.files.filter((f) => f.endsWith(`skills/${target}/SKILL.md`))
166
+ };
167
+ }
168
+ if (ctx.mcp.some((s) => tool.startsWith(`mcp__${s}__`) || tool.startsWith(`${s}__`))) return {
169
+ class: "context",
170
+ files: []
171
+ };
172
+ const shell = SHELL_TOOL.test(tool);
173
+ const words = shell ? readWords(commandWords(target)) : [target];
174
+ const files = /* @__PURE__ */ new Set();
175
+ let context = false;
176
+ for (const w of words) {
177
+ const hit = filesOf(w, ctx.files);
178
+ for (const f of hit.files) files.add(f);
179
+ if (hit.files.length || hit.dir) context = true;
180
+ if (ctx.skills.some((s) => normalise(w).includes(`skills/${s}/`) || normalise(w).endsWith(`skills/${s}`))) context = true;
181
+ }
182
+ if (context) return {
183
+ class: "context",
184
+ files: [...files]
185
+ };
186
+ if (words.some((w) => DEPENDENCY.test(normalise(w))) || shell && words.includes("--help")) return {
187
+ class: "dependency",
188
+ files: []
189
+ };
190
+ if (!shell && WEB_TOOL.test(tool)) return {
191
+ class: "web",
192
+ files: []
193
+ };
194
+ if (shell && words.some((w) => w === "curl" || w === "wget") && /https?:\/\//.test(target)) return {
195
+ class: "web",
196
+ files: []
197
+ };
198
+ if (shell) {
199
+ const command = target.trim();
200
+ if (ctx.verify.some((v) => v.trim().length >= 4 && command.includes(v.trim()))) return {
201
+ class: "verify",
202
+ files: []
203
+ };
204
+ if (VERIFY.test(command)) return {
205
+ class: "verify",
206
+ files: []
207
+ };
208
+ }
209
+ return {
210
+ class: "workspace",
211
+ files: []
212
+ };
213
+ }
214
+ /** A failing verdict this close to its threshold points at the judge, not the agent. */
215
+ const JUDGE_MARGIN = .1;
216
+ const DERIVED_TABLES = `
217
+ CREATE TABLE effort_m (
218
+ run_id TEXT, eval_key TEXT, cell_key TEXT, role TEXT, variant TEXT, harness TEXT,
219
+ environment TEXT, n INTEGER, tools_median REAL, tools_q1 REAL, tools_q3 REAL,
220
+ agent_s_median REAL, agent_s_q1 REAL, agent_s_q3 REAL, file_edits_median REAL,
221
+ tokens_median REAL, tokens_q1 REAL, tokens_q3 REAL,
222
+ control_key TEXT, control_n INTEGER, control_tools_median REAL, control_agent_s_median REAL,
223
+ control_tokens_median REAL,
224
+ tools_ratio REAL, agent_s_ratio REAL, agent_s_delta REAL, tokens_ratio REAL,
225
+ tools_p REAL, agent_s_p REAL, tokens_p REAL,
226
+ separated INTEGER, time_separated INTEGER, tokens_separated INTEGER,
227
+ verdict TEXT, time_verdict TEXT, tokens_verdict TEXT, tokens_note TEXT,
228
+ context_calls_median REAL, dependency_calls_median REAL, web_calls_median REAL,
229
+ verify_calls_median REAL, workspace_calls_median REAL
230
+ );
231
+ CREATE TABLE contrasts_m (
232
+ run_id TEXT, eval_key TEXT, harness TEXT, sandbox TEXT, a_key TEXT, b_key TEXT,
233
+ a_environment TEXT, b_environment TEXT, a_pass INTEGER, a_counted INTEGER, b_pass INTEGER,
234
+ b_counted INTEGER, points REAL, lo REAL, hi REAL, pass_verdict TEXT,
235
+ a_tools_median REAL, b_tools_median REAL, tools_ratio REAL, tools_p REAL, separated INTEGER,
236
+ verdict TEXT, agent_s_ratio REAL, time_separated INTEGER, time_verdict TEXT,
237
+ tokens_ratio REAL, tokens_separated INTEGER, tokens_verdict TEXT,
238
+ checks INTEGER, discriminating TEXT
239
+ );
240
+ CREATE TABLE factor_effects_m (
241
+ factor TEXT, level TEXT, baseline TEXT, context TEXT, tier TEXT, run_id TEXT, eval_key TEXT,
242
+ strata INTEGER, runs INTEGER, variant_pass INTEGER, variant_counted INTEGER,
243
+ control_pass INTEGER, control_counted INTEGER, points REAL, lo REAL, hi REAL,
244
+ within_noise INTEGER, pass_verdict TEXT, tools_ratio REAL, tools_ratios TEXT,
245
+ agent_s_ratio REAL, tools_p REAL, consistent INTEGER, separated INTEGER, effort_verdict TEXT,
246
+ tokens_ratio REAL, tokens_p REAL, tokens_verdict TEXT, tokens_note TEXT,
247
+ note TEXT
248
+ );
249
+ CREATE TABLE flaky_m (
250
+ eval_key TEXT, cell_key TEXT, fingerprint TEXT, runs INTEGER, flaky_runs INTEGER,
251
+ first_seen TEXT, last_seen TEXT, pass INTEGER, counted INTEGER, infra_error INTEGER,
252
+ pass_at_1 REAL, lo REAL, hi REAL, verdict TEXT, cause TEXT, min_attempts INTEGER
253
+ );
254
+ CREATE TABLE drift_m (
255
+ run_id TEXT, prev_run_id TEXT, eval_key TEXT, cell_key TEXT, changed TEXT,
256
+ changed_paths TEXT, noise INTEGER, real_changed TEXT
257
+ );
258
+ CREATE TABLE check_streaks_m (
259
+ eval_key TEXT, cell_key TEXT, label TEXT, fingerprint TEXT, branch TEXT, runs INTEGER,
260
+ fails INTEGER, streak_runs INTEGER, streak_tries INTEGER, streak_since TEXT, last_run TEXT,
261
+ ended_by TEXT
262
+ );
263
+ `;
264
+ const FAMILY_COLUMNS = [
265
+ "run_id",
266
+ "family_id",
267
+ "harness",
268
+ "variant",
269
+ "pairs",
270
+ "points",
271
+ "lo",
272
+ "hi",
273
+ "within_noise",
274
+ "verdict",
275
+ "tools_ratio",
276
+ "tools_p",
277
+ "effort_verdict",
278
+ "agent_s_ratio",
279
+ "tokens_ratio",
280
+ "tokens_p",
281
+ "tokens_verdict"
282
+ ];
283
+ const DERIVED = [
284
+ "effort_m",
285
+ "contrasts_m",
286
+ "factor_effects_m",
287
+ "flaky_m",
288
+ "drift_m",
289
+ "check_streaks_m"
290
+ ];
291
+ const PARTS = [
292
+ ["sources", "fp_sources"],
293
+ ["harness", "fp_harness"],
294
+ ["environment", "fp_environment"],
295
+ ["image", "fp_image"],
296
+ ["agent_cli", "fp_agent_cli"],
297
+ ["judge", "fp_judge"],
298
+ ["context", "fp_context"]
299
+ ];
300
+ const r4 = (x) => x === null ? null : Math.round(x * 1e4) / 1e4;
301
+ const s1 = (ms) => Math.round(ms / 100) / 10;
302
+ const cellId = (run, evalKey, cell) => `${run}\0${evalKey}\0${cell}`;
303
+ function passCols(v, c) {
304
+ const lift = liftInterval({
305
+ pass: v.pass,
306
+ n: v.counted
307
+ }, {
308
+ pass: c.pass,
309
+ n: c.counted
310
+ });
311
+ const noise = containsZero(lift.low, lift.high);
312
+ return {
313
+ variant_pass: v.pass,
314
+ variant_counted: v.counted,
315
+ control_pass: c.pass,
316
+ control_counted: c.counted,
317
+ points: round3(lift.points),
318
+ lo: round3(lift.low),
319
+ hi: round3(lift.high),
320
+ within_noise: noise ? 1 : 0,
321
+ pass_verdict: Math.min(v.counted, c.counted) < 4 ? "insufficient" : noise ? "noise" : "effect"
322
+ };
323
+ }
324
+ function tokenCols(e) {
325
+ return {
326
+ tokens_ratio: r4(e?.tokensRatio ?? null),
327
+ tokens_p: r4(e?.tokensP ?? null),
328
+ tokens_verdict: e?.tokensVerdict ?? null,
329
+ tokens_note: e?.tokensNote ?? null
330
+ };
331
+ }
332
+ function effortCols(e) {
333
+ return {
334
+ tools_ratio: r4(e?.toolsRatio ?? null),
335
+ tools_ratios: e?.toolsRatio === null || !e ? null : `×${e.toolsRatio.toFixed(2)}`,
336
+ agent_s_ratio: r4(e?.agentMsRatio ?? null),
337
+ tools_p: r4(e?.toolsP ?? null),
338
+ consistent: e && (e.verdict === "fewer" || e.verdict === "more") ? 1 : 0,
339
+ separated: e?.separated ? 1 : 0,
340
+ effort_verdict: e?.verdict ?? null,
341
+ ...tokenCols(e)
342
+ };
343
+ }
344
+ /** Across strata: an effect when ≥ 2/3 of them show it in the same direction at p < 0.05. */
345
+ function pooledEffort(strata) {
346
+ const known = strata.filter((s) => s !== null);
347
+ const k = strata.length;
348
+ const count = (v) => known.filter((s) => s.verdict === v).length;
349
+ const needed = Math.ceil(2 * k / 3);
350
+ let verdict = "noise";
351
+ if (count("fewer") >= needed && count("more") === 0) verdict = "fewer";
352
+ else if (count("more") >= needed && count("fewer") === 0) verdict = "more";
353
+ else if (known.length && count("insufficient") === known.length) verdict = "insufficient";
354
+ const sorted = [...known.map((s) => s.toolsRatio).filter((r) => r !== null)].sort((a, b) => a - b);
355
+ const mid = sorted.length ? sorted.length % 2 ? sorted[(sorted.length - 1) / 2] : (sorted[sorted.length / 2 - 1] + sorted[sorted.length / 2]) / 2 : null;
356
+ return {
357
+ tools_ratio: r4(mid),
358
+ tools_ratios: known.map((s) => s.toolsRatio === null ? "×–" : `×${s.toolsRatio.toFixed(2)}`).join(" / "),
359
+ agent_s_ratio: null,
360
+ tools_p: r4(known.length ? Math.max(...known.map((s) => s.toolsP ?? 1)) : null),
361
+ consistent: verdict === "fewer" || verdict === "more" ? count(verdict) : 0,
362
+ separated: known.filter((s) => s.separated).length,
363
+ effort_verdict: verdict,
364
+ ...pooledTokens(known)
365
+ };
366
+ }
367
+ /**
368
+ * Token verdict over the strata that reported usage. A stratum without token samples is
369
+ * dropped from this pool only — not `insufficient`, and it does not blank tokens on the rest.
370
+ */
371
+ function pooledTokens(known) {
372
+ const withTokens = known.filter((s) => s.tokensVerdict !== null);
373
+ if (withTokens.length === 0) return {
374
+ tokens_ratio: null,
375
+ tokens_p: null,
376
+ tokens_verdict: null,
377
+ tokens_note: null
378
+ };
379
+ const k = withTokens.length;
380
+ const count = (v) => withTokens.filter((s) => s.tokensVerdict === v).length;
381
+ const needed = Math.ceil(2 * k / 3);
382
+ let verdict = "noise";
383
+ if (count("fewer") >= needed && count("more") === 0) verdict = "fewer";
384
+ else if (count("more") >= needed && count("fewer") === 0) verdict = "more";
385
+ else if (count("insufficient") === k) verdict = "insufficient";
386
+ const sorted = [...withTokens.map((s) => s.tokensRatio).filter((r) => r !== null)].sort((a, b) => a - b);
387
+ const mid = sorted.length ? sorted.length % 2 ? sorted[(sorted.length - 1) / 2] : (sorted[sorted.length / 2 - 1] + sorted[sorted.length / 2]) / 2 : null;
388
+ return {
389
+ tokens_ratio: r4(mid),
390
+ tokens_p: r4(Math.max(...withTokens.map((s) => s.tokensP ?? 1))),
391
+ tokens_verdict: verdict,
392
+ tokens_note: known.some((s) => s.tokensNote) || withTokens.length < known.length ? "some cells did not report usage" : null
393
+ };
394
+ }
395
+ const merge = (sides) => ({
396
+ pass: sides.reduce((n, s) => n + s.pass, 0),
397
+ counted: sides.reduce((n, s) => n + s.counted, 0),
398
+ samples: sides.flatMap((s) => s.samples)
399
+ });
400
+ function insertAll(db, table, rows) {
401
+ if (rows.length === 0) return;
402
+ const cols = rowsOf(db.prepare(`PRAGMA table_info("${table}")`)).map((c) => c.name);
403
+ const statement = db.prepare(`INSERT INTO ${table} (${cols.join(", ")}) VALUES (${cols.map(() => "?").join(", ")})`);
404
+ for (const row of rows) statement.run(...cols.map((c) => row[c] ?? null));
405
+ }
406
+ /** Recomputes every derived table from the projected rows; run inside the sync's transaction. */
407
+ function deriveFacts(db) {
408
+ for (const table of DERIVED) db.exec(`DELETE FROM ${table}`);
409
+ const cells = rowsOf(db.prepare("SELECT c.*, r.started_at FROM cells c JOIN runs r USING (run_id) ORDER BY c.run_id, c.rowid"));
410
+ const attempts = rowsOf(db.prepare(`SELECT run_id, eval_key, cell_key, key, outcome, error_kind, tools, agent_ms, file_edits,
411
+ input_tokens, output_tokens, cache_read_tokens, cache_write_tokens, reasoning_tokens
412
+ FROM attempts ORDER BY run_id, rowid`));
413
+ const nearThreshold = new Set(rowsOf(db.prepare(`SELECT DISTINCT run_id, attempt_key FROM judgements WHERE verdict = 'fail' AND ABS(score - threshold) <= ${JUDGE_MARGIN}`)).map((r) => `${r.run_id}\0${r.attempt_key}`));
414
+ const diffs = new Map(rowsOf(db.prepare(`SELECT run_id, attempt_key, sha256 FROM artifacts WHERE kind = 'diff' AND bytes > 0`)).flatMap((r) => r.sha256 ? [[`${r.run_id}\0${r.attempt_key}`, r.sha256]] : []));
415
+ const samples = /* @__PURE__ */ new Map();
416
+ const byCell = /* @__PURE__ */ new Map();
417
+ for (const a of attempts) {
418
+ const id = cellId(a.run_id, a.eval_key, a.cell_key);
419
+ byCell.set(id, [...byCell.get(id) ?? [], a]);
420
+ if (a.outcome !== "pass" && a.outcome !== "fail") continue;
421
+ const tokens = a.input_tokens === null ? void 0 : a.input_tokens + (a.output_tokens ?? 0) + (a.cache_read_tokens ?? 0) + (a.cache_write_tokens ?? 0) + (a.reasoning_tokens ?? 0);
422
+ samples.set(id, [...samples.get(id) ?? [], {
423
+ tools: a.tools,
424
+ agentMs: a.agent_ms,
425
+ fileEdits: a.file_edits,
426
+ ...tokens !== void 0 ? { tokens } : {}
427
+ }]);
428
+ }
429
+ const side = (c) => ({
430
+ pass: c.pass,
431
+ counted: c.pass + c.fail,
432
+ samples: samples.get(cellId(c.run_id, c.eval_key, c.key)) ?? []
433
+ });
434
+ const find = (run, evalKey, key) => cells.find((c) => c.run_id === run && c.eval_key === evalKey && c.key === key);
435
+ const classCounts = /* @__PURE__ */ new Map();
436
+ for (const r of rowsOf(db.prepare("SELECT run_id, attempt_key, class, COUNT(*) AS n FROM tool_calls GROUP BY run_id, attempt_key, class"))) {
437
+ const id = `${r.run_id}\0${r.attempt_key}`;
438
+ const m = classCounts.get(id) ?? /* @__PURE__ */ new Map();
439
+ m.set(r.class, r.n);
440
+ classCounts.set(id, m);
441
+ }
442
+ const classMedians = (c) => {
443
+ const known = (byCell.get(cellId(c.run_id, c.eval_key, c.key)) ?? []).filter((a) => a.outcome === "pass" || a.outcome === "fail").flatMap((a) => {
444
+ const m = classCounts.get(`${a.run_id}\0${a.key}`);
445
+ return m ? [m] : [];
446
+ });
447
+ return Object.fromEntries(TOOL_CLASSES.map((k) => [`${k}_calls_median`, known.length ? median(known.map((m) => m.get(k) ?? 0)) ?? null : null]));
448
+ };
449
+ insertAll(db, "effort_m", cells.map((c) => {
450
+ const own = effortOf(side(c).samples);
451
+ const control = c.lift_vs ? find(c.run_id, c.eval_key, c.lift_vs) : void 0;
452
+ const vs = control ? contrastEffort(side(c).samples, side(control).samples) : null;
453
+ return {
454
+ run_id: c.run_id,
455
+ eval_key: c.eval_key,
456
+ cell_key: c.key,
457
+ role: c.role,
458
+ variant: c.variant,
459
+ harness: c.harness,
460
+ environment: c.environment,
461
+ n: own?.n ?? 0,
462
+ tools_median: own?.tools.median ?? null,
463
+ tools_q1: own?.tools.q1 ?? null,
464
+ tools_q3: own?.tools.q3 ?? null,
465
+ agent_s_median: own ? s1(own.agentMs.median) : null,
466
+ agent_s_q1: own ? s1(own.agentMs.q1) : null,
467
+ agent_s_q3: own ? s1(own.agentMs.q3) : null,
468
+ file_edits_median: own?.fileEdits ?? null,
469
+ tokens_median: own?.tokens?.median ?? null,
470
+ tokens_q1: own?.tokens?.q1 ?? null,
471
+ tokens_q3: own?.tokens?.q3 ?? null,
472
+ control_key: control?.key ?? null,
473
+ control_n: vs?.control.n ?? null,
474
+ control_tools_median: vs?.control.tools.median ?? null,
475
+ control_agent_s_median: vs ? s1(vs.control.agentMs.median) : null,
476
+ control_tokens_median: vs?.control.tokens?.median ?? null,
477
+ tools_ratio: r4(vs?.toolsRatio ?? null),
478
+ agent_s_ratio: r4(vs?.agentMsRatio ?? null),
479
+ agent_s_delta: vs ? s1(vs.agentMsDelta) : null,
480
+ tokens_ratio: r4(vs?.tokensRatio ?? null),
481
+ tools_p: r4(vs?.toolsP ?? null),
482
+ agent_s_p: r4(vs?.agentMsP ?? null),
483
+ tokens_p: r4(vs?.tokensP ?? null),
484
+ separated: vs ? vs.separated ? 1 : 0 : null,
485
+ time_separated: vs ? vs.timeSeparated ? 1 : 0 : null,
486
+ tokens_separated: vs?.tokensSeparated == null ? null : vs.tokensSeparated ? 1 : 0,
487
+ verdict: vs?.verdict ?? null,
488
+ time_verdict: vs?.timeVerdict ?? null,
489
+ tokens_verdict: vs?.tokensVerdict ?? null,
490
+ tokens_note: vs?.tokensNote ?? null,
491
+ ...classMedians(c)
492
+ };
493
+ }));
494
+ const checkRows = rowsOf(db.prepare("SELECT run_id, eval_key, cell_key, label, pass, fail, error, not_run FROM cell_checks"));
495
+ const checksOf = /* @__PURE__ */ new Map();
496
+ for (const k of checkRows) {
497
+ const id = cellId(k.run_id, k.eval_key, k.cell_key);
498
+ const m = checksOf.get(id) ?? /* @__PURE__ */ new Map();
499
+ m.set(k.label, {
500
+ pass: k.pass,
501
+ fail: k.fail,
502
+ error: k.error,
503
+ notRun: k.not_run
504
+ });
505
+ checksOf.set(id, m);
506
+ }
507
+ const evalCells = /* @__PURE__ */ new Map();
508
+ for (const c of cells) {
509
+ const id = `${c.run_id}\0${c.eval_key}`;
510
+ evalCells.set(id, [...evalCells.get(id) ?? [], c]);
511
+ }
512
+ const contrastRows = [];
513
+ for (const group of evalCells.values()) for (const [a, b] of contrastPairs(group)) {
514
+ const x = side(a);
515
+ const y = side(b);
516
+ const e = contrastEffort(x.samples, y.samples);
517
+ const ka = checksOf.get(cellId(a.run_id, a.eval_key, a.key)) ?? /* @__PURE__ */ new Map();
518
+ const kb = checksOf.get(cellId(b.run_id, b.eval_key, b.key)) ?? /* @__PURE__ */ new Map();
519
+ const verdicts = [...ka].flatMap(([label, t]) => {
520
+ const other = kb.get(label);
521
+ const verdict = other && checkVerdict(t, other);
522
+ return verdict ? [{
523
+ label,
524
+ verdict
525
+ }] : [];
526
+ });
527
+ const pass = passCols(x, y);
528
+ contrastRows.push({
529
+ run_id: a.run_id,
530
+ eval_key: a.eval_key,
531
+ harness: a.harness,
532
+ sandbox: a.sandbox,
533
+ a_key: a.key,
534
+ b_key: b.key,
535
+ a_environment: a.environment,
536
+ b_environment: b.environment,
537
+ a_pass: x.pass,
538
+ a_counted: x.counted,
539
+ b_pass: y.pass,
540
+ b_counted: y.counted,
541
+ points: pass.points ?? null,
542
+ lo: pass.lo ?? null,
543
+ hi: pass.hi ?? null,
544
+ pass_verdict: pass.pass_verdict ?? null,
545
+ a_tools_median: e?.variant.tools.median ?? null,
546
+ b_tools_median: e?.control.tools.median ?? null,
547
+ tools_ratio: r4(e?.toolsRatio ?? null),
548
+ tools_p: r4(e?.toolsP ?? null),
549
+ separated: e ? e.separated ? 1 : 0 : null,
550
+ verdict: e?.verdict ?? null,
551
+ agent_s_ratio: r4(e?.agentMsRatio ?? null),
552
+ time_separated: e ? e.timeSeparated ? 1 : 0 : null,
553
+ time_verdict: e?.timeVerdict ?? null,
554
+ tokens_ratio: r4(e?.tokensRatio ?? null),
555
+ tokens_separated: e?.tokensSeparated == null ? null : e.tokensSeparated ? 1 : 0,
556
+ tokens_verdict: e?.tokensVerdict ?? null,
557
+ checks: verdicts.length,
558
+ discriminating: verdicts.filter((v) => v.verdict === "discriminates").map((v) => v.label).join(" · ") || null
559
+ });
560
+ }
561
+ insertAll(db, "contrasts_m", contrastRows);
562
+ const pairs = [];
563
+ const groups = /* @__PURE__ */ new Map();
564
+ for (const c of cells) {
565
+ const id = `${c.run_id}\0${c.eval_key}`;
566
+ groups.set(id, [...groups.get(id) ?? [], c]);
567
+ }
568
+ for (const group of groups.values()) {
569
+ for (const v of group) {
570
+ const control = v.lift_vs ? group.find((c) => c.key === v.lift_vs) : void 0;
571
+ if (!control) continue;
572
+ pairs.push({
573
+ factor: "environment",
574
+ level: v.variant ?? v.environment,
575
+ baseline: "control",
576
+ context: v.harness,
577
+ run: v.run_id,
578
+ evalKey: v.eval_key,
579
+ pool: `${v.comparable}\0${control.comparable}`,
580
+ v: side(v),
581
+ c: side(control)
582
+ });
583
+ }
584
+ const bySetup = /* @__PURE__ */ new Map();
585
+ for (const c of group) {
586
+ const id = `${c.variant ?? c.role}\0${c.sandbox}`;
587
+ bySetup.set(id, [...bySetup.get(id) ?? [], c]);
588
+ }
589
+ for (const same of bySetup.values()) {
590
+ const base = same[0];
591
+ for (const other of same.slice(1)) {
592
+ if (other.harness === base.harness) continue;
593
+ pairs.push({
594
+ factor: other.harness_kind === base.harness_kind ? "model" : "harness",
595
+ level: other.harness,
596
+ baseline: base.harness,
597
+ context: other.variant ?? "control",
598
+ run: other.run_id,
599
+ evalKey: other.eval_key,
600
+ pool: `${other.comparable}\0${base.comparable}`,
601
+ v: side(other),
602
+ c: side(base)
603
+ });
604
+ }
605
+ }
606
+ }
607
+ const factorRows = [];
608
+ const head = (p) => ({
609
+ factor: p.factor,
610
+ level: p.level,
611
+ baseline: p.baseline,
612
+ context: p.context
613
+ });
614
+ for (const p of pairs) factorRows.push({
615
+ ...head(p),
616
+ tier: "controlled",
617
+ run_id: p.run,
618
+ eval_key: p.evalKey,
619
+ strata: 1,
620
+ runs: 1,
621
+ ...passCols(p.v, p.c),
622
+ ...effortCols(contrastEffort(p.v.samples, p.c.samples)),
623
+ note: null
624
+ });
625
+ const pooled = /* @__PURE__ */ new Map();
626
+ for (const p of pairs) {
627
+ const id = [
628
+ p.factor,
629
+ p.level,
630
+ p.baseline,
631
+ p.context,
632
+ p.evalKey,
633
+ p.pool
634
+ ].join("\0");
635
+ pooled.set(id, [...pooled.get(id) ?? [], p]);
636
+ }
637
+ const strata = /* @__PURE__ */ new Map();
638
+ for (const group of pooled.values()) {
639
+ const first = group[0];
640
+ const v = merge(group.map((p) => p.v));
641
+ const c = merge(group.map((p) => p.c));
642
+ if (group.length > 1) factorRows.push({
643
+ ...head(first),
644
+ tier: "pooled",
645
+ run_id: null,
646
+ eval_key: first.evalKey,
647
+ strata: 1,
648
+ runs: group.length,
649
+ ...passCols(v, c),
650
+ ...effortCols(contrastEffort(v.samples, c.samples)),
651
+ note: null
652
+ });
653
+ const id = [
654
+ first.factor,
655
+ first.level,
656
+ first.baseline,
657
+ first.context
658
+ ].join("\0");
659
+ strata.set(id, [...strata.get(id) ?? [], {
660
+ evalKey: first.evalKey,
661
+ pool: first.pool,
662
+ v,
663
+ c
664
+ }]);
665
+ }
666
+ for (const [id, list] of strata) {
667
+ const poolsByEval = /* @__PURE__ */ new Map();
668
+ for (const s of list) poolsByEval.set(s.evalKey, /* @__PURE__ */ new Set([...poolsByEval.get(s.evalKey) ?? [], s.pool]));
669
+ const comparable = list.filter((s) => (poolsByEval.get(s.evalKey)?.size ?? 0) === 1);
670
+ if (new Set(comparable.map((s) => s.evalKey)).size < 2) continue;
671
+ const [factor, level, baseline, context] = id.split("\0");
672
+ const v = merge(comparable.map((s) => s.v));
673
+ const c = merge(comparable.map((s) => s.c));
674
+ factorRows.push({
675
+ ...head({
676
+ factor,
677
+ level,
678
+ baseline,
679
+ context
680
+ }),
681
+ tier: "pooled",
682
+ run_id: null,
683
+ eval_key: null,
684
+ strata: comparable.length,
685
+ runs: null,
686
+ ...passCols(v, c),
687
+ ...pooledEffort(comparable.map((s) => contrastEffort(s.v.samples, s.c.samples))),
688
+ note: "pass@1: summed counts; effort: an effect in at least 2/3 of strata"
689
+ });
690
+ }
691
+ const familyLifts = rowsOf(db.prepare(`SELECT ${FAMILY_COLUMNS.join(", ")} FROM family_lift_m`));
692
+ for (const f of familyLifts) factorRows.push({
693
+ factor: "environment",
694
+ level: f.variant,
695
+ baseline: "control",
696
+ context: f.harness,
697
+ tier: "paired",
698
+ run_id: f.run_id,
699
+ eval_key: f.family_id,
700
+ strata: f.pairs,
701
+ runs: 1,
702
+ points: f.points,
703
+ lo: f.lo,
704
+ hi: f.hi,
705
+ within_noise: f.within_noise,
706
+ pass_verdict: f.verdict === "insufficient" ? "insufficient" : f.within_noise ? "noise" : "effect",
707
+ tools_ratio: f.tools_ratio,
708
+ agent_s_ratio: f.agent_s_ratio,
709
+ tools_p: f.tools_p,
710
+ effort_verdict: f.effort_verdict,
711
+ tokens_ratio: f.tokens_ratio,
712
+ tokens_p: f.tokens_p,
713
+ tokens_verdict: f.tokens_verdict,
714
+ note: "paired by case over a pooled evaluate.each: strata is the paired cases"
715
+ });
716
+ const driftRows = [];
717
+ const series = /* @__PURE__ */ new Map();
718
+ for (const c of cells) {
719
+ const id = `${c.eval_key}\0${c.key}`;
720
+ series.set(id, [...series.get(id) ?? [], c]);
721
+ }
722
+ const contextOf = db.prepare("SELECT path, sha256 FROM attempt_context WHERE run_id = ? AND attempt_key = ?");
723
+ const cellContext = (c) => {
724
+ const files = /* @__PURE__ */ new Map();
725
+ for (const a of byCell.get(cellId(c.run_id, c.eval_key, c.key)) ?? []) for (const f of rowsOf(contextOf, c.run_id, a.key)) files.set(f.path, f.sha256);
726
+ return files;
727
+ };
728
+ for (const list of series.values()) {
729
+ list.sort((a, b) => a.run_id < b.run_id ? -1 : 1);
730
+ for (let i = 1; i < list.length; i++) {
731
+ const prev = list[i - 1];
732
+ const cur = list[i];
733
+ if (prev.fingerprint === cur.fingerprint) continue;
734
+ const changed = PARTS.filter(([, col]) => prev[col] !== cur[col]).map(([name]) => name);
735
+ let paths = [];
736
+ if (changed.includes("context")) {
737
+ const a = cellContext(prev);
738
+ const b = cellContext(cur);
739
+ paths = [.../* @__PURE__ */ new Set([...a.keys(), ...b.keys()])].filter((p) => a.get(p) !== b.get(p)).sort();
740
+ }
741
+ const contextNoise = paths.length > 0 && paths.every(isRuntimeState);
742
+ const real = changed.filter((part) => part !== "context" || !contextNoise);
743
+ driftRows.push({
744
+ run_id: cur.run_id,
745
+ prev_run_id: prev.run_id,
746
+ eval_key: cur.eval_key,
747
+ cell_key: cur.key,
748
+ changed: changed.join(" "),
749
+ changed_paths: paths.length ? paths.join(", ") : null,
750
+ noise: real.length === 0 ? 1 : 0,
751
+ real_changed: real.join(" ") || null
752
+ });
753
+ if (real.length === 0) continue;
754
+ const judgeOnly = real.length === 1 && real[0] === "judge";
755
+ const sourcesChanged = real.includes("sources");
756
+ const cols = passCols(side(cur), side(prev));
757
+ if (sourcesChanged) cols.pass_verdict = "not_comparable";
758
+ factorRows.push({
759
+ factor: real.length === 1 ? real[0] : "confounded",
760
+ level: cur.run_id,
761
+ baseline: prev.run_id,
762
+ context: `${cur.eval_key} # ${cur.key}`,
763
+ tier: "observed",
764
+ run_id: cur.run_id,
765
+ eval_key: cur.eval_key,
766
+ strata: 1,
767
+ runs: 2,
768
+ ...cols,
769
+ ...effortCols(contrastEffort(side(cur).samples, side(prev).samples)),
770
+ note: sourcesChanged ? "the eval changed: not comparable, not an effect of the thing under test" : judgeOnly ? "the judge changed: a measurement change, not an effect of the thing under test" : real.length > 1 ? `confounded: ${real.join(", ")} changed together` : null
771
+ });
772
+ }
773
+ }
774
+ insertAll(db, "drift_m", driftRows);
775
+ const levels = (pick) => [...new Set(cells.map(pick))];
776
+ const single = [
777
+ ["harness", levels((c) => c.harness_kind)],
778
+ ["model", levels((c) => `${c.harness_kind}:${c.model ?? "-"}`)],
779
+ ["sandbox", levels((c) => c.sandbox)]
780
+ ];
781
+ if (cells.length && !cells.some((c) => c.role === "variant")) single.push(["environment", levels((c) => c.environment)]);
782
+ for (const [factor, values] of single) {
783
+ if (values.length !== 1) continue;
784
+ factorRows.push({
785
+ factor,
786
+ level: values[0],
787
+ baseline: null,
788
+ context: null,
789
+ tier: "not_measured",
790
+ note: "one level in every run, so its effect is not measured"
791
+ });
792
+ }
793
+ insertAll(db, "factor_effects_m", factorRows);
794
+ const flaky = /* @__PURE__ */ new Map();
795
+ for (const c of cells) {
796
+ const id = `${c.eval_key}\0${c.key}\0${c.comparable}`;
797
+ flaky.set(id, [...flaky.get(id) ?? [], c]);
798
+ }
799
+ const flakyRows = [];
800
+ for (const list of flaky.values()) {
801
+ const pass = list.reduce((n, c) => n + c.pass, 0);
802
+ const fail = list.reduce((n, c) => n + c.fail, 0);
803
+ if (!(pass > 0 && fail > 0)) continue;
804
+ const first = list[0];
805
+ const infra = list.reduce((n, c) => n + c.infra_error, 0);
806
+ const failing = list.flatMap((c) => (byCell.get(cellId(c.run_id, c.eval_key, c.key)) ?? []).filter((a) => a.outcome === "fail"));
807
+ const w = wilson(pass, pass + fail);
808
+ const passedDiffs = new Set(list.flatMap((c) => (byCell.get(cellId(c.run_id, c.eval_key, c.key)) ?? []).flatMap((a) => {
809
+ const sha = a.outcome === "pass" && diffs.get(`${a.run_id}\0${a.key}`);
810
+ return sha ? [sha] : [];
811
+ })));
812
+ const sameWork = failing.length > 0 && failing.every((a) => a.error_kind === "assertion" && passedDiffs.has(diffs.get(`${a.run_id}\0${a.key}`) ?? ""));
813
+ const cause = infra > 0 || failing.some((a) => a.error_kind === "infra") ? "infra" : failing.some((a) => nearThreshold.has(`${a.run_id}\0${a.key}`)) ? "judge" : sameWork ? "check" : "agent";
814
+ const starts = list.map((c) => c.started_at).sort();
815
+ flakyRows.push({
816
+ eval_key: first.eval_key,
817
+ cell_key: first.key,
818
+ fingerprint: first.comparable,
819
+ runs: list.length,
820
+ flaky_runs: list.filter((c) => c.pass > 0 && c.fail > 0).length,
821
+ first_seen: starts[0] ?? null,
822
+ last_seen: starts.at(-1) ?? null,
823
+ pass,
824
+ counted: pass + fail,
825
+ infra_error: infra,
826
+ pass_at_1: round3(pass / (pass + fail)),
827
+ lo: round3(w.low),
828
+ hi: round3(w.high),
829
+ verdict: pass + fail >= 6 ? "flaky" : "insufficient",
830
+ cause,
831
+ min_attempts: 6
832
+ });
833
+ }
834
+ flakyRows.sort((a, b) => String(a.first_seen).localeCompare(String(b.first_seen)));
835
+ insertAll(db, "flaky_m", flakyRows);
836
+ insertAll(db, "check_streaks_m", checkStreaks(db));
837
+ }
838
+ /**
839
+ * check_streaks: each check per cell, comparable fingerprint and branch, over recorded runs only:
840
+ * how many of its newest runs in a row it passed without a fail or an error (on a variant, only
841
+ * runs where its control passed it too, `both-pass`), the tries those runs counted, and the run
842
+ * that ended it. A run that never reached the check neither extends nor ends the streak.
843
+ */
844
+ function checkStreaks(db) {
845
+ const checks = rowsOf(db.prepare(`SELECT k.run_id, k.eval_key, k.cell_key, k.label, c.comparable, r.branch, c.role, k.pass,
846
+ k.fail, k.error, k.verdict
847
+ FROM cell_checks k JOIN runs r USING (run_id)
848
+ JOIN cells c ON c.run_id = k.run_id AND c.eval_key = k.eval_key AND c.key = k.cell_key
849
+ WHERE r.recorded = 1 ORDER BY k.run_id`));
850
+ const series = /* @__PURE__ */ new Map();
851
+ for (const k of checks) {
852
+ const id = [
853
+ k.eval_key,
854
+ k.cell_key,
855
+ k.label,
856
+ k.comparable,
857
+ k.branch ?? ""
858
+ ].join("\0");
859
+ series.set(id, [...series.get(id) ?? [], k]);
860
+ }
861
+ const rows = [];
862
+ for (const list of series.values()) {
863
+ const first = list[0];
864
+ let streakRuns = 0;
865
+ let streakTries = 0;
866
+ let since = null;
867
+ let endedBy = null;
868
+ for (const k of [...list].reverse()) {
869
+ if (k.pass + k.fail + k.error === 0) continue;
870
+ if (!(k.fail === 0 && k.error === 0 && (k.role !== "variant" || k.verdict === "both-pass"))) {
871
+ endedBy = k.run_id;
872
+ break;
873
+ }
874
+ streakRuns++;
875
+ streakTries += k.pass;
876
+ since = k.run_id;
877
+ }
878
+ rows.push({
879
+ eval_key: first.eval_key,
880
+ cell_key: first.cell_key,
881
+ label: first.label,
882
+ fingerprint: first.comparable,
883
+ branch: first.branch,
884
+ runs: list.length,
885
+ fails: list.reduce((n, k) => n + k.fail, 0),
886
+ streak_runs: streakRuns,
887
+ streak_tries: streakTries,
888
+ streak_since: since,
889
+ last_run: list.at(-1)?.run_id ?? null,
890
+ ended_by: endedBy
891
+ });
892
+ }
893
+ return rows;
894
+ }
895
+ //#endregion
896
+ export { classifyCall as a, TOOL_CLASSES as i, DERIVED_TABLES as n, rowsOf as o, deriveFacts as r, DERIVED as t };
897
+
898
+ //# sourceMappingURL=facts-Cfx1H70y.js.map