@tangle-network/agent-eval 1.0.19 → 1.0.20

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 (284) hide show
  1. package/CHANGELOG.md +15 -21
  2. package/dist/adapters/http.d.ts +2 -2
  3. package/dist/{agent-profile-CPv4tENR.d.ts → agent-profile-BO8ruI6R.d.ts} +3 -3
  4. package/dist/{agent-profile-CPv4tENR.d.ts.map → agent-profile-BO8ruI6R.d.ts.map} +1 -1
  5. package/dist/analyst/index.d.ts +14 -14
  6. package/dist/analyst/index.js +11 -12
  7. package/dist/analyst/index.js.map +1 -1
  8. package/dist/{analyze-runs-pJ4fhnYg.d.ts → analyze-runs-DicleUI_.d.ts} +4 -4
  9. package/dist/{analyze-runs-pJ4fhnYg.d.ts.map → analyze-runs-DicleUI_.d.ts.map} +1 -1
  10. package/dist/{analyze-runs-C7vWBDhl.js → analyze-runs-e9vfXY--.js} +6 -110
  11. package/dist/analyze-runs-e9vfXY--.js.map +1 -0
  12. package/dist/app-grade/index.d.ts +4 -4
  13. package/dist/app-grade/index.js +3 -3
  14. package/dist/{benchmark-command-DSJQeYom.js → benchmark-command-BGZD77Un.js} +13 -14
  15. package/dist/benchmark-command-BGZD77Un.js.map +1 -0
  16. package/dist/benchmarks/index.d.ts +4 -4
  17. package/dist/benchmarks/index.js +4 -5
  18. package/dist/benchmarks/index.js.map +1 -1
  19. package/dist/builder-eval/index.js +1 -1
  20. package/dist/{calibration-CbZPApIO.js → calibration-Ze7SjhT9.js} +2 -2
  21. package/dist/{calibration-CbZPApIO.js.map → calibration-Ze7SjhT9.js.map} +1 -1
  22. package/dist/campaign/index.d.ts +7 -7
  23. package/dist/campaign/index.js +10 -10
  24. package/dist/{campaign-BABipFel.js → campaign-BfDMncQN.js} +14 -15
  25. package/dist/{campaign-BABipFel.js.map → campaign-BfDMncQN.js.map} +1 -1
  26. package/dist/{campaign-evidence-DONEWvVY.js → campaign-evidence-BuKlRzSA.js} +3 -3
  27. package/dist/{campaign-evidence-DONEWvVY.js.map → campaign-evidence-BuKlRzSA.js.map} +1 -1
  28. package/dist/{chat-client-D0me8iwq.js → chat-client-Zz97O3NB.js} +2 -2
  29. package/dist/{chat-client-D0me8iwq.js.map → chat-client-Zz97O3NB.js.map} +1 -1
  30. package/dist/{chat-json-call-C473CwTt.js → chat-json-call-Dgi7-RH-.js} +2 -2
  31. package/dist/{chat-json-call-C473CwTt.js.map → chat-json-call-Dgi7-RH-.js.map} +1 -1
  32. package/dist/cli.js +7 -7
  33. package/dist/{types-0KglnQ9o.d.ts → cluster-Cd0MRbr9.d.ts} +44 -2
  34. package/dist/cluster-Cd0MRbr9.d.ts.map +1 -0
  35. package/dist/cluster-bootstrap-BYIW7QJ4.js +24 -0
  36. package/dist/cluster-bootstrap-BYIW7QJ4.js.map +1 -0
  37. package/dist/{completion-verifier-7KEfroqx.d.ts → completion-verifier-BEpsr3N4.d.ts} +2 -2
  38. package/dist/{completion-verifier-7KEfroqx.d.ts.map → completion-verifier-BEpsr3N4.d.ts.map} +1 -1
  39. package/dist/{completion-verifier-ClmJV_Yc.js → completion-verifier-DFyYFezn.js} +3 -3
  40. package/dist/{completion-verifier-ClmJV_Yc.js.map → completion-verifier-DFyYFezn.js.map} +1 -1
  41. package/dist/contract/index.d.ts +10 -10
  42. package/dist/contract/index.js +14 -15
  43. package/dist/contract/index.js.map +1 -1
  44. package/dist/{cost-ledger-CS8R3IZj.js → cost-ledger-DfhStGcZ.js} +2 -2
  45. package/dist/{cost-ledger-CS8R3IZj.js.map → cost-ledger-DfhStGcZ.js.map} +1 -1
  46. package/dist/{decision-point-CNyoKOkz.js → decision-point-DJWievVw.js} +4 -4
  47. package/dist/{decision-point-CNyoKOkz.js.map → decision-point-DJWievVw.js.map} +1 -1
  48. package/dist/{default-registry-BbXr18AT.d.ts → default-registry-BpGFsSpZ.d.ts} +7 -7
  49. package/dist/{default-registry-BbXr18AT.d.ts.map → default-registry-BpGFsSpZ.d.ts.map} +1 -1
  50. package/dist/{default-registry-BB9_jzyH.js → default-registry-CdMtoY-s.js} +5 -5
  51. package/dist/{default-registry-BB9_jzyH.js.map → default-registry-CdMtoY-s.js.map} +1 -1
  52. package/dist/{define-agent-eval-D_DQMH04.d.ts → define-agent-eval-DcK8mg63.d.ts} +7 -7
  53. package/dist/{define-agent-eval-D_DQMH04.d.ts.map → define-agent-eval-DcK8mg63.d.ts.map} +1 -1
  54. package/dist/{define-agent-eval-Q4FdXGj7.js → define-agent-eval-DuQNZajG.js} +6 -6
  55. package/dist/{define-agent-eval-Q4FdXGj7.js.map → define-agent-eval-DuQNZajG.js.map} +1 -1
  56. package/dist/diagnosis/index.d.ts +2 -2
  57. package/dist/diagnosis/index.js +1 -1
  58. package/dist/{dspy-rlm-engine-CqQc0R2l.js → dspy-rlm-engine-cWyn8G1a.js} +4 -4
  59. package/dist/{dspy-rlm-engine-CqQc0R2l.js.map → dspy-rlm-engine-cWyn8G1a.js.map} +1 -1
  60. package/dist/{engine-rfV8Ff8V.d.ts → engine-BF8naBn7.d.ts} +2 -2
  61. package/dist/{engine-rfV8Ff8V.d.ts.map → engine-BF8naBn7.d.ts.map} +1 -1
  62. package/dist/{eval-campaign-CZSCjxVb.js → eval-campaign-LmpC_5fm.js} +2 -2
  63. package/dist/{eval-campaign-CZSCjxVb.js.map → eval-campaign-LmpC_5fm.js.map} +1 -1
  64. package/dist/{evaluation-SDXKL6Fx.d.ts → evaluation-BCejQgkV.d.ts} +4 -4
  65. package/dist/{evaluation-SDXKL6Fx.d.ts.map → evaluation-BCejQgkV.d.ts.map} +1 -1
  66. package/dist/{evaluation-BBI37mRe.js → evaluation-bU_bhlv-.js} +2 -2
  67. package/dist/{evaluation-BBI37mRe.js.map → evaluation-bU_bhlv-.js.map} +1 -1
  68. package/dist/evaluation.d.ts +1 -1
  69. package/dist/evaluation.js +1 -1
  70. package/dist/{exact-types-CaLLU1Pz.d.ts → exact-types-VAFjtOQN.d.ts} +2 -2
  71. package/dist/{exact-types-CaLLU1Pz.d.ts.map → exact-types-VAFjtOQN.d.ts.map} +1 -1
  72. package/dist/experiment/index.d.ts +3 -5
  73. package/dist/experiment/index.d.ts.map +1 -1
  74. package/dist/experiment/index.js +7 -12
  75. package/dist/experiment/index.js.map +1 -1
  76. package/dist/{exporters-BYBG9b1n.d.ts → exporters-dQKYD_Zo.d.ts} +2 -2
  77. package/dist/{exporters-BYBG9b1n.d.ts.map → exporters-dQKYD_Zo.d.ts.map} +1 -1
  78. package/dist/{external-optimizer-process-CfrY-nJT.js → external-optimizer-process-2ImGH_LR.js} +2 -2
  79. package/dist/{external-optimizer-process-CfrY-nJT.js.map → external-optimizer-process-2ImGH_LR.js.map} +1 -1
  80. package/dist/{external-optimizer-subprocess-BtJk8UcU.js → external-optimizer-subprocess-_C_2yriN.js} +3 -3
  81. package/dist/{external-optimizer-subprocess-BtJk8UcU.js.map → external-optimizer-subprocess-_C_2yriN.js.map} +1 -1
  82. package/dist/{feedback-trajectory-P37ju-gW.d.ts → feedback-trajectory-DTj8eVTR.d.ts} +3 -3
  83. package/dist/{feedback-trajectory-P37ju-gW.d.ts.map → feedback-trajectory-DTj8eVTR.d.ts.map} +1 -1
  84. package/dist/{findings-store-BnYN57-h.js → findings-store-BSuaV3dN.js} +7 -24
  85. package/dist/findings-store-BSuaV3dN.js.map +1 -0
  86. package/dist/fuzz.js +2 -2
  87. package/dist/{index-BPmj-_ta.d.ts → index-Bc8BZfzb.d.ts} +10 -9
  88. package/dist/index-Bc8BZfzb.d.ts.map +1 -0
  89. package/dist/index-BdLmBInV.d.ts +1099 -0
  90. package/dist/index-BdLmBInV.d.ts.map +1 -0
  91. package/dist/{index-D4lT7aFu.d.ts → index-CeYLLnfi.d.ts} +28 -128
  92. package/dist/index-CeYLLnfi.d.ts.map +1 -0
  93. package/dist/{index-C3t17kHu.d.ts → index-CzfdjM6o.d.ts} +7 -100
  94. package/dist/index-CzfdjM6o.d.ts.map +1 -0
  95. package/dist/{index-HuSMvqR2.d.ts → index-DYNHOTTB.d.ts} +5 -5
  96. package/dist/{index-HuSMvqR2.d.ts.map → index-DYNHOTTB.d.ts.map} +1 -1
  97. package/dist/{index-AmfM3usI.d.ts → index-D_eAFB3T.d.ts} +8 -8
  98. package/dist/{index-AmfM3usI.d.ts.map → index-D_eAFB3T.d.ts.map} +1 -1
  99. package/dist/{index-DLVbfss9.d.ts → index-gSu9DUiw.d.ts} +8 -8
  100. package/dist/{index-DLVbfss9.d.ts.map → index-gSu9DUiw.d.ts.map} +1 -1
  101. package/dist/index.d.ts +29 -31
  102. package/dist/index.js +28 -164
  103. package/dist/index.js.map +1 -1
  104. package/dist/{integrity-BAdVzT8u.d.ts → integrity-CrmnGB2T.d.ts} +2 -2
  105. package/dist/{integrity-BAdVzT8u.d.ts.map → integrity-CrmnGB2T.d.ts.map} +1 -1
  106. package/dist/{judge-gate-CIlBrn6q.js → judge-gate-BliY81A0.js} +3 -3
  107. package/dist/{judge-gate-CIlBrn6q.js.map → judge-gate-BliY81A0.js.map} +1 -1
  108. package/dist/{kind-factory-Cfz8DUCc.js → kind-factory-CV0FNCMM.js} +2 -2
  109. package/dist/{kind-factory-Cfz8DUCc.js.map → kind-factory-CV0FNCMM.js.map} +1 -1
  110. package/dist/{llm-client-BdSiZ4qz.js → llm-client-DMMSg-Ro.js} +2 -2
  111. package/dist/{llm-client-BdSiZ4qz.js.map → llm-client-DMMSg-Ro.js.map} +1 -1
  112. package/dist/{llm-judge-VD_MI6kd.js → llm-judge-Bnxuwjxl.js} +13 -14
  113. package/dist/{llm-judge-VD_MI6kd.js.map → llm-judge-Bnxuwjxl.js.map} +1 -1
  114. package/dist/{matrix-Yg1lHIGI.d.ts → matrix-D6zEwLvE.d.ts} +2 -2
  115. package/dist/{matrix-Yg1lHIGI.d.ts.map → matrix-D6zEwLvE.d.ts.map} +1 -1
  116. package/dist/meta-eval/index.d.ts +2 -2
  117. package/dist/meta-eval/index.js +7 -7
  118. package/dist/{metrics-DNCAUtuB.js → metrics-zALlR17s.js} +16 -17
  119. package/dist/metrics-zALlR17s.js.map +1 -0
  120. package/dist/multishot/golden/index.d.ts +1 -1
  121. package/dist/multishot/index.d.ts +2 -2
  122. package/dist/multishot/index.js +1 -1
  123. package/dist/openapi.json +1 -1
  124. package/dist/{outcome-observations-DZu5hLYF.js → outcome-observations-BpicIVQi.js} +2 -3
  125. package/dist/{outcome-observations-DZu5hLYF.js.map → outcome-observations-BpicIVQi.js.map} +1 -1
  126. package/dist/paired-arms-Dep5tbsw.js +338 -0
  127. package/dist/paired-arms-Dep5tbsw.js.map +1 -0
  128. package/dist/{paired-promotion-decision-BDnqepZ1.d.ts → paired-promotion-decision-BNzPfXDw.d.ts} +3 -113
  129. package/dist/paired-promotion-decision-BNzPfXDw.d.ts.map +1 -0
  130. package/dist/{paired-promotion-decision-CiueaTTj.js → paired-promotion-decision-Nt4CkkOT.js} +2 -3
  131. package/dist/{paired-promotion-decision-CiueaTTj.js.map → paired-promotion-decision-Nt4CkkOT.js.map} +1 -1
  132. package/dist/{pareto-a3EOmjfe.js → pareto-C445lnEH.js} +3 -6
  133. package/dist/{pareto-a3EOmjfe.js.map → pareto-C445lnEH.js.map} +1 -1
  134. package/dist/pipelines/index.js +1 -1
  135. package/dist/{prime-protocol-DKRk4l4U.d.ts → prime-protocol-D1NkJRuD.d.ts} +2 -2
  136. package/dist/{prime-protocol-DKRk4l4U.d.ts.map → prime-protocol-D1NkJRuD.d.ts.map} +1 -1
  137. package/dist/{promotion-gate-DOkgJcLW.d.ts → promotion-gate-DjAsmBSZ.d.ts} +3 -67
  138. package/dist/promotion-gate-DjAsmBSZ.d.ts.map +1 -0
  139. package/dist/{promotion-policy-DLPcEnCf.js → promotion-policy-CUWOv01m.js} +4 -4
  140. package/dist/{promotion-policy-DLPcEnCf.js.map → promotion-policy-CUWOv01m.js.map} +1 -1
  141. package/dist/{proposal-findings-BfzzZ_lN.js → proposal-findings-DWs94yT8.js} +2 -2
  142. package/dist/{proposal-findings-BfzzZ_lN.js.map → proposal-findings-DWs94yT8.js.map} +1 -1
  143. package/dist/{registry-Ck7w-rr5.d.ts → registry-BAcEbzKm.d.ts} +4 -4
  144. package/dist/{registry-Ck7w-rr5.d.ts.map → registry-BAcEbzKm.d.ts.map} +1 -1
  145. package/dist/{release-confidence-nfQNh3eb.js → release-confidence-DDrkmWxT.js} +2 -2
  146. package/dist/{release-confidence-nfQNh3eb.js.map → release-confidence-DDrkmWxT.js.map} +1 -1
  147. package/dist/reporting.d.ts +4 -5
  148. package/dist/reporting.d.ts.map +1 -1
  149. package/dist/reporting.js +5 -7
  150. package/dist/reporting.js.map +1 -1
  151. package/dist/{researcher-CLnNJ7Or.d.ts → researcher-D35yo0B8.d.ts} +4 -4
  152. package/dist/{researcher-CLnNJ7Or.d.ts.map → researcher-D35yo0B8.d.ts.map} +1 -1
  153. package/dist/{reward-hacking-B88f-Kh7.js → reward-hacking-DRb8K6N1.js} +2 -3
  154. package/dist/{reward-hacking-B88f-Kh7.js.map → reward-hacking-DRb8K6N1.js.map} +1 -1
  155. package/dist/rl.d.ts +9 -8
  156. package/dist/rl.d.ts.map +1 -1
  157. package/dist/rl.js +8 -10
  158. package/dist/rl.js.map +1 -1
  159. package/dist/rollout/index.d.ts +4 -4
  160. package/dist/rollout/index.js +1 -1
  161. package/dist/{rollout-Cu7kHGIe.js → rollout-DKa54qer.js} +2 -2
  162. package/dist/{rollout-Cu7kHGIe.js.map → rollout-DKa54qer.js.map} +1 -1
  163. package/dist/{rubric-predictive-validity-D_6ZPTNR.js → rubric-predictive-validity-BMS7SUyh.js} +2 -2
  164. package/dist/{rubric-predictive-validity-D_6ZPTNR.js.map → rubric-predictive-validity-BMS7SUyh.js.map} +1 -1
  165. package/dist/{run-record-CbUi2adH.js → run-record-CIflWk6i.js} +2 -2
  166. package/dist/{run-record-CbUi2adH.js.map → run-record-CIflWk6i.js.map} +1 -1
  167. package/dist/{runtime-rollouts-kGn1K5ut.js → runtime-rollouts-CfRyjk60.js} +2 -2
  168. package/dist/{runtime-rollouts-kGn1K5ut.js.map → runtime-rollouts-CfRyjk60.js.map} +1 -1
  169. package/dist/{schema-CfoA9U_U.d.ts → schema-PDKQ_iNE.d.ts} +2 -131
  170. package/dist/schema-PDKQ_iNE.d.ts.map +1 -0
  171. package/dist/search/index.d.ts +2 -2
  172. package/dist/search/index.js +2 -2
  173. package/dist/{search-kernel-DjqaPJqL.d.ts → search-kernel-Ds2zILpY.d.ts} +3 -3
  174. package/dist/{search-kernel-DjqaPJqL.d.ts.map → search-kernel-Ds2zILpY.d.ts.map} +1 -1
  175. package/dist/{search-summary-RJ5zXjHN.js → search-summary-BSftVrGY.js} +4 -4
  176. package/dist/{search-summary-RJ5zXjHN.js.map → search-summary-BSftVrGY.js.map} +1 -1
  177. package/dist/{sequential-Bb_pdTqG.d.ts → sequential-B9p6uoV8.d.ts} +9 -2
  178. package/dist/{sequential-Bb_pdTqG.d.ts.map → sequential-B9p6uoV8.d.ts.map} +1 -1
  179. package/dist/{sequential-Bjs5roiK.js → sequential-CAksw6EU.js} +32 -2
  180. package/dist/{sequential-Bjs5roiK.js.map → sequential-CAksw6EU.js.map} +1 -1
  181. package/dist/{sequential-BPbvgzfe.js → sequential-CqG6aLWS.js} +3 -3
  182. package/dist/{sequential-BPbvgzfe.js.map → sequential-CqG6aLWS.js.map} +1 -1
  183. package/dist/{server-CPKyf3bz.js → server-DFVwfoZq.js} +3 -3
  184. package/dist/{server-CPKyf3bz.js.map → server-DFVwfoZq.js.map} +1 -1
  185. package/dist/{skillopt-optimization-method-D9Hlmhjg.js → skillopt-optimization-method-DYwEndON.js} +9 -9
  186. package/dist/{skillopt-optimization-method-D9Hlmhjg.js.map → skillopt-optimization-method-DYwEndON.js.map} +1 -1
  187. package/dist/{statistical-heldout-C-tgpUuu.d.ts → statistical-heldout--0b1lgx4.d.ts} +6 -282
  188. package/dist/statistical-heldout--0b1lgx4.d.ts.map +1 -0
  189. package/dist/{statistical-heldout-NBxC7jGo.js → statistical-heldout-D6i58CJ5.js} +3 -3
  190. package/dist/{statistical-heldout-NBxC7jGo.js.map → statistical-heldout-D6i58CJ5.js.map} +1 -1
  191. package/dist/statistics-DCZIC-qT.js +2627 -0
  192. package/dist/statistics-DCZIC-qT.js.map +1 -0
  193. package/dist/statistics.d.ts +3 -0
  194. package/dist/statistics.js +3 -0
  195. package/dist/{store-otlp-BfPRa2p8.js → store-otlp-C-jyj3WX.js} +2 -2
  196. package/dist/{store-otlp-BfPRa2p8.js.map → store-otlp-C-jyj3WX.js.map} +1 -1
  197. package/dist/{store-tool-spans-BgwVHXma.d.ts → store-tool-spans-B3z_Qb5u.d.ts} +5 -5
  198. package/dist/{store-tool-spans-BgwVHXma.d.ts.map → store-tool-spans-B3z_Qb5u.d.ts.map} +1 -1
  199. package/dist/{store-tool-spans-BrSWHB9O.js → store-tool-spans-DalWlKY8.js} +3 -3
  200. package/dist/{store-tool-spans-BrSWHB9O.js.map → store-tool-spans-DalWlKY8.js.map} +1 -1
  201. package/dist/{summary-report-0La5vejY.d.ts → summary-report-Cv1AC-iv.d.ts} +2 -2
  202. package/dist/{summary-report-0La5vejY.d.ts.map → summary-report-Cv1AC-iv.d.ts.map} +1 -1
  203. package/dist/{summary-report-C3IJvp0i.js → summary-report-D_uussI3.js} +4 -52
  204. package/dist/summary-report-D_uussI3.js.map +1 -0
  205. package/dist/supervisor-run/index.d.ts +2 -2
  206. package/dist/supervisor-run/index.js +1 -1
  207. package/dist/{systemone-CpDppX8s.d.ts → systemone-C3xyEKvG.d.ts} +7 -7
  208. package/dist/{systemone-CpDppX8s.d.ts.map → systemone-C3xyEKvG.d.ts.map} +1 -1
  209. package/dist/{systemone-review-nbuMxxmi.d.ts → systemone-review-CToBl1oa.d.ts} +2 -2
  210. package/dist/{systemone-review-nbuMxxmi.d.ts.map → systemone-review-CToBl1oa.d.ts.map} +1 -1
  211. package/dist/systemone.d.ts +3 -3
  212. package/dist/systemone.js +2 -2
  213. package/dist/{tool-groups-BQsjZD9F.d.ts → tool-groups-R5RO9OHn.d.ts} +3 -3
  214. package/dist/tool-groups-R5RO9OHn.d.ts.map +1 -0
  215. package/dist/{tool-waste-Czt3aWID.js → tool-waste-DEhKfiIE.js} +2 -3
  216. package/dist/{tool-waste-Czt3aWID.js.map → tool-waste-DEhKfiIE.js.map} +1 -1
  217. package/dist/{trace-questions-CpTrtEcm.d.ts → trace-questions-BY6taxnl.d.ts} +3 -3
  218. package/dist/{trace-questions-CpTrtEcm.d.ts.map → trace-questions-BY6taxnl.d.ts.map} +1 -1
  219. package/dist/trace-repair/index.d.ts +1 -1
  220. package/dist/trace-repair/index.js +1 -2
  221. package/dist/trace-repair/index.js.map +1 -1
  222. package/dist/traces.d.ts +5 -5
  223. package/dist/traces.js +3 -3
  224. package/dist/{tree-DIHp6UQ0.js → tree-B2y1UR8o.js} +4 -6
  225. package/dist/{tree-DIHp6UQ0.js.map → tree-B2y1UR8o.js.map} +1 -1
  226. package/dist/{types-DNB9hIXa.d.ts → types-BAJ2Hb-d.d.ts} +3 -2
  227. package/dist/types-BAJ2Hb-d.d.ts.map +1 -0
  228. package/dist/{types-DsuOcYsE.d.ts → types-BwF--ZRz.d.ts} +2 -2
  229. package/dist/{types-DsuOcYsE.d.ts.map → types-BwF--ZRz.d.ts.map} +1 -1
  230. package/dist/{types-wDBk14lj.d.ts → types-CeMZYsNF.d.ts} +5 -4
  231. package/dist/types-CeMZYsNF.d.ts.map +1 -0
  232. package/dist/{types-B9s9Xo5_.d.ts → types-kBMNdo1X.d.ts} +3 -9
  233. package/dist/types-kBMNdo1X.d.ts.map +1 -0
  234. package/dist/wire/index.d.ts +6 -6
  235. package/dist/wire/index.js +1 -1
  236. package/docs/design/statistics-decisions.md +38 -364
  237. package/docs/design.md +1 -1
  238. package/docs/research-report-methodology.md +1 -1
  239. package/package.json +6 -1
  240. package/dist/agreement-irr-DXcXEt4I.js +0 -182
  241. package/dist/agreement-irr-DXcXEt4I.js.map +0 -1
  242. package/dist/analyze-runs-C7vWBDhl.js.map +0 -1
  243. package/dist/benchmark-command-DSJQeYom.js.map +0 -1
  244. package/dist/cluster-bootstrap-BteuR1hg.js +0 -65
  245. package/dist/cluster-bootstrap-BteuR1hg.js.map +0 -1
  246. package/dist/descriptive-B3Eb7tX0.js +0 -229
  247. package/dist/descriptive-B3Eb7tX0.js.map +0 -1
  248. package/dist/findings-store-BnYN57-h.js.map +0 -1
  249. package/dist/index-BPmj-_ta.d.ts.map +0 -1
  250. package/dist/index-C3t17kHu.d.ts.map +0 -1
  251. package/dist/index-D4lT7aFu.d.ts.map +0 -1
  252. package/dist/judge-calibration-DKR6Xi-w.js +0 -319
  253. package/dist/judge-calibration-DKR6Xi-w.js.map +0 -1
  254. package/dist/judge-calibration-DnrbQaXI.d.ts +0 -144
  255. package/dist/judge-calibration-DnrbQaXI.d.ts.map +0 -1
  256. package/dist/mean-D1d6gedE.js +0 -284
  257. package/dist/mean-D1d6gedE.js.map +0 -1
  258. package/dist/metrics-DNCAUtuB.js.map +0 -1
  259. package/dist/multiplicity-DAd4xaDC.js +0 -100
  260. package/dist/multiplicity-DAd4xaDC.js.map +0 -1
  261. package/dist/multiplicity-D_SEsc5j.d.ts +0 -41
  262. package/dist/multiplicity-D_SEsc5j.d.ts.map +0 -1
  263. package/dist/paired-arms-3-tsXvvC.js +0 -740
  264. package/dist/paired-arms-3-tsXvvC.js.map +0 -1
  265. package/dist/paired-binary-CMzmSSd5.js +0 -372
  266. package/dist/paired-binary-CMzmSSd5.js.map +0 -1
  267. package/dist/paired-promotion-decision-BDnqepZ1.d.ts.map +0 -1
  268. package/dist/paired-tests-Buh6feJ4.js +0 -211
  269. package/dist/paired-tests-Buh6feJ4.js.map +0 -1
  270. package/dist/power-and-mde-g3vOn0XK.js +0 -99
  271. package/dist/power-and-mde-g3vOn0XK.js.map +0 -1
  272. package/dist/promotion-gate-DOkgJcLW.d.ts.map +0 -1
  273. package/dist/random-BN150Q_X.d.ts +0 -79
  274. package/dist/random-BN150Q_X.d.ts.map +0 -1
  275. package/dist/schema-CfoA9U_U.d.ts.map +0 -1
  276. package/dist/sequential-eprocess-C1YLwFaz.js +0 -129
  277. package/dist/sequential-eprocess-C1YLwFaz.js.map +0 -1
  278. package/dist/statistical-heldout-C-tgpUuu.d.ts.map +0 -1
  279. package/dist/summary-report-C3IJvp0i.js.map +0 -1
  280. package/dist/tool-groups-BQsjZD9F.d.ts.map +0 -1
  281. package/dist/types-0KglnQ9o.d.ts.map +0 -1
  282. package/dist/types-B9s9Xo5_.d.ts.map +0 -1
  283. package/dist/types-DNB9hIXa.d.ts.map +0 -1
  284. package/dist/types-wDBk14lj.d.ts.map +0 -1
@@ -1,211 +0,0 @@
1
- import { s as ValidationError } from "./errors-DeEEV9Vx.js";
2
- import { a as assertFiniteSample, l as makeRng, o as binomialHalfUpperTail, p as studentTCdf, u as medianInPlace } from "./mean-D1d6gedE.js";
3
- // src/statistics/paired-tests.ts
4
- /**
5
- * Paired significance tests on continuous scores: the paired t-test, the
6
- * promotion-gate paired bootstrap, the exact sign test, and the package-wide
7
- * paired-delta decision statistic.
8
- */
9
- /**
10
- * Paired t-test — before/after measurements on the SAME items.
11
- * Pairing removes inter-item variance, giving tighter significance than
12
- * an unpaired test when comparing prompt v1 vs prompt v2 on identical
13
- * scenarios.
14
- *
15
- * Returns `t = p = null` where the statistic is undefined: fewer than two
16
- * pairs, or a non-zero constant delta whose observed variance is zero. A
17
- * constant shift carries no information about the variance it would have to
18
- * be compared against, so the honest answer is "undefined", not `p = 0` —
19
- * three observations cannot buy absolute certainty. This is the same contract
20
- * {@link pairedCohensDz} states for the same condition. An all-zero delta is
21
- * different: it is a measured null, and returns `t = 0, p = 1`.
22
- */
23
- function pairedTTest(before, after) {
24
- if (before.length !== after.length) throw new ValidationError(`pairedTTest: unequal sample sizes (${before.length} vs ${after.length})`);
25
- assertFiniteSample("pairedTTest", "before", before);
26
- assertFiniteSample("pairedTTest", "after", after);
27
- const n = before.length;
28
- if (n < 2) return {
29
- t: null,
30
- df: 0,
31
- p: null
32
- };
33
- const diffs = before.map((b, i) => after[i] - b);
34
- const mean = diffs.reduce((a, b) => a + b, 0) / n;
35
- const variance = diffs.reduce((acc, d) => acc + (d - mean) ** 2, 0) / (n - 1);
36
- const se = Math.sqrt(variance / n);
37
- if (se === 0) return mean === 0 ? {
38
- t: 0,
39
- df: n - 1,
40
- p: 1
41
- } : {
42
- t: null,
43
- df: n - 1,
44
- p: null
45
- };
46
- const t = mean / se;
47
- const df = n - 1;
48
- return {
49
- t,
50
- df,
51
- p: 2 * (1 - studentTCdf(Math.abs(t), df))
52
- };
53
- }
54
- /**
55
- * Pairs below which a percentile bootstrap interval is descriptive spread only.
56
- *
57
- * `P(low > 0)` under a true null, against a nominal 2.5 %, measured over 4000
58
- * seeded trials: 13.53 % at n = 3, 3.52 % at n = 10, 3.10 % at n = 20 on the
59
- * median; 13.85 %, 4.90 %, 3.80 % on the mean. This is intrinsic to resampling
60
- * three points, not an implementation error — scipy's BCa gives 16.0 % on the
61
- * same n = 3 data — so no change to the estimator moves it. Below this floor
62
- * the decision belongs to the exact sign test or exact signed-rank test.
63
- */
64
- const BOOTSTRAP_GATE_MIN_N = 20;
65
- /**
66
- * Paired bootstrap on (after − before) deltas. Returns a CI on the chosen
67
- * statistic (median by default); pairs are resampled with replacement. Throws
68
- * on unequal sample sizes.
69
- *
70
- * `low > threshold` carries the stated confidence ONLY at `n ≥
71
- * {@link BOOTSTRAP_GATE_MIN_N}`, which `gateEligible` reports. Below it the
72
- * check fires under a true null several times more often than nominal, so the
73
- * interval is descriptive spread and a promotion must not turn on it.
74
- */
75
- function pairedBootstrap(before, after, opts = {}) {
76
- if (before.length !== after.length) throw new Error(`pairedBootstrap: unequal sample sizes (${before.length} vs ${after.length})`);
77
- const confidence = opts.confidence ?? .95;
78
- const resamples = opts.resamples ?? 2e3;
79
- const statistic = opts.statistic ?? "median";
80
- if (confidence <= 0 || confidence >= 1) throw new Error(`pairedBootstrap: confidence must be in (0,1), got ${confidence}`);
81
- const n = before.length;
82
- const deltas = before.map((b, i) => after[i] - b);
83
- const gateEligible = n >= 20;
84
- if (n === 0) return {
85
- n: 0,
86
- median: 0,
87
- mean: 0,
88
- low: 0,
89
- high: 0,
90
- confidence,
91
- resamples,
92
- gateEligible
93
- };
94
- if (n === 1) {
95
- const d = deltas[0];
96
- return {
97
- n: 1,
98
- median: d,
99
- mean: d,
100
- low: d,
101
- high: d,
102
- confidence,
103
- resamples,
104
- gateEligible
105
- };
106
- }
107
- const rng = makeRng(opts.seed, deltas);
108
- const samples = new Array(resamples);
109
- for (let b = 0; b < resamples; b++) if (statistic === "mean") {
110
- let sum = 0;
111
- for (let k = 0; k < n; k++) sum += deltas[Math.floor(rng() * n)];
112
- samples[b] = sum / n;
113
- } else {
114
- const acc = new Array(n);
115
- for (let k = 0; k < n; k++) acc[k] = deltas[Math.floor(rng() * n)];
116
- samples[b] = medianInPlace(acc);
117
- }
118
- samples.sort((a, b) => a - b);
119
- const alpha = 1 - confidence;
120
- const lowIdx = Math.floor(alpha / 2 * resamples);
121
- const highIdx = Math.min(resamples - 1, Math.ceil((1 - alpha / 2) * resamples) - 1);
122
- return {
123
- n,
124
- median: medianInPlace([...deltas]),
125
- mean: deltas.reduce((s, x) => s + x, 0) / n,
126
- low: samples[lowIdx],
127
- high: samples[Math.max(highIdx, lowIdx)],
128
- confidence,
129
- resamples,
130
- gateEligible
131
- };
132
- }
133
- /**
134
- * Exact one-sided sign test over paired differences.
135
- *
136
- * Pass `after[i] - before[i]` for each matched item. `alternative = 'greater'`
137
- * tests whether positive signs are more likely than negative signs and returns
138
- * `P(Binomial(nNonTies, 0.5) >= positive)`. `alternative = 'less'` treats
139
- * negative signs as successes instead. With a continuous difference
140
- * distribution this is the usual directional median test. Exact zero
141
- * differences are ties and do not enter the binomial denominator. All-tie and
142
- * empty inputs return p = 1. Every input difference must be finite, and the
143
- * direction must be chosen explicitly so a caller cannot select it after
144
- * seeing the signs.
145
- */
146
- function pairedSignTest(differences, alternative) {
147
- if (alternative !== "greater" && alternative !== "less") throw new ValidationError(`pairedSignTest: alternative must be 'greater' or 'less', got ${alternative}`);
148
- let positive = 0;
149
- let negative = 0;
150
- let ties = 0;
151
- for (let i = 0; i < differences.length; i++) {
152
- const difference = differences[i];
153
- if (!Number.isFinite(difference)) throw new ValidationError(`pairedSignTest: difference at index ${i} must be finite, got ${difference}`);
154
- if (difference > 0) positive++;
155
- else if (difference < 0) negative++;
156
- else ties++;
157
- }
158
- const nNonTies = positive + negative;
159
- const successes = alternative === "greater" ? positive : negative;
160
- return {
161
- n: differences.length,
162
- positive,
163
- negative,
164
- ties,
165
- nNonTies,
166
- alternative,
167
- pValue: binomialHalfUpperTail(successes, nNonTies)
168
- };
169
- }
170
- /** Fraction of paired observations whose delta is an exact tie (|after − before|
171
- * < 1e-9). Throws on unequal sample sizes; 0 pairs ⇒ 0. */
172
- function pairedDeltaTieFraction(before, after) {
173
- if (before.length !== after.length) throw new Error(`pairedDeltaTieFraction: unequal sample sizes (${before.length} vs ${after.length})`);
174
- const n = before.length;
175
- if (n === 0) return 0;
176
- let ties = 0;
177
- for (let i = 0; i < n; i++) if (Math.abs(after[i] - before[i]) < 1e-9) ties++;
178
- return ties / n;
179
- }
180
- /**
181
- * The paired-delta statistic a DECISION is computed on, package-wide.
182
- *
183
- * The mean paired delta is the estimator that answers the question a promotion
184
- * gate asks — "by how much did the candidate move the score" — in the caller's
185
- * own units, and it equals the aggregate lift everyone quotes. The MEDIAN
186
- * answers a different question and loses the answer to this one in every regime
187
- * eval data actually lands in:
188
- * - TWO-POINT (pass/fail) outcomes on any encoding: the delta vector lives in
189
- * {−s, 0, +s} dominated by zeros, so the median and its whole bootstrap CI
190
- * are pinned at exactly 0 however large the shift. (Decide these on
191
- * {@link pairedRiskDifferenceExact} instead — same estimand, exact interval.)
192
- * - TIE-DOMINATED outcomes: at half the pairs tied the sample median is 0 by
193
- * construction, and `ci.low > threshold` then answers "no" forever at a
194
- * non-negative threshold and "yes" forever at a negative one.
195
- * - LOW-CARDINALITY outcomes, even well below half ties: judge dimensions on
196
- * integer 0-100, and block scores like {⅔, 1} from averaging pass/fail
197
- * leaves, put the median on a coarse lattice whose bootstrap percentiles
198
- * land on atoms. Measured: 26 blocks of 3 pass/fail leaves carrying a real
199
- * +12.8pp lift, only 23% of pairs tied, gives a median CI of [0, 0.333] —
200
- * lower bound exactly 0, so a gate at threshold 0 refuses a real lift.
201
- * That last case is why there is no tie-fraction threshold here: any cutoff on
202
- * ties leaves the lattice case open on the other side of it.
203
- *
204
- * `heldoutSignificance` has defaulted to the mean since #316 for the same
205
- * reason. The median remains available per call site for callers who
206
- * specifically want outlier robustness and accept the blindness.
207
- */
208
- const DECISION_PAIRED_DELTA_STATISTIC = "mean";
209
- export { pairedSignTest as a, pairedDeltaTieFraction as i, DECISION_PAIRED_DELTA_STATISTIC as n, pairedTTest as o, pairedBootstrap as r, BOOTSTRAP_GATE_MIN_N as t };
210
-
211
- //# sourceMappingURL=paired-tests-Buh6feJ4.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"paired-tests-Buh6feJ4.js","names":[],"sources":["../src/statistics/paired-tests.ts"],"sourcesContent":["/**\n * Paired significance tests on continuous scores: the paired t-test, the\n * promotion-gate paired bootstrap, the exact sign test, and the package-wide\n * paired-delta decision statistic.\n */\n\nimport { ValidationError } from '../errors'\nimport { studentTCdf } from '../math/student-t'\nimport { assertFiniteSample, binomialHalfUpperTail, makeRng, medianInPlace } from './internal'\n\nexport interface PairedTTestResult {\n /** Null when the statistic is undefined — see {@link pairedTTest}. */\n t: number | null\n df: number\n /** Null exactly when `t` is null. */\n p: number | null\n}\n\n/**\n * Paired t-test — before/after measurements on the SAME items.\n * Pairing removes inter-item variance, giving tighter significance than\n * an unpaired test when comparing prompt v1 vs prompt v2 on identical\n * scenarios.\n *\n * Returns `t = p = null` where the statistic is undefined: fewer than two\n * pairs, or a non-zero constant delta whose observed variance is zero. A\n * constant shift carries no information about the variance it would have to\n * be compared against, so the honest answer is \"undefined\", not `p = 0` —\n * three observations cannot buy absolute certainty. This is the same contract\n * {@link pairedCohensDz} states for the same condition. An all-zero delta is\n * different: it is a measured null, and returns `t = 0, p = 1`.\n */\nexport function pairedTTest(before: number[], after: number[]): PairedTTestResult {\n if (before.length !== after.length) {\n throw new ValidationError(\n `pairedTTest: unequal sample sizes (${before.length} vs ${after.length})`,\n )\n }\n assertFiniteSample('pairedTTest', 'before', before)\n assertFiniteSample('pairedTTest', 'after', after)\n const n = before.length\n if (n < 2) return { t: null, df: 0, p: null }\n\n const diffs = before.map((b, i) => after[i]! - b)\n const mean = diffs.reduce((a, b) => a + b, 0) / n\n const variance = diffs.reduce((acc, d) => acc + (d - mean) ** 2, 0) / (n - 1)\n const se = Math.sqrt(variance / n)\n if (se === 0) {\n return mean === 0 ? { t: 0, df: n - 1, p: 1 } : { t: null, df: n - 1, p: null }\n }\n\n const t = mean / se\n const df = n - 1\n const p = 2 * (1 - studentTCdf(Math.abs(t), df))\n return { t, df, p }\n}\n\n// ── Paired bootstrap (promotion-gate effect size) ────────────────────\n\nexport interface PairedBootstrapResult {\n /** Number of paired observations. */\n n: number\n /** Median of paired deltas (after − before). */\n median: number\n /** Mean of paired deltas. */\n mean: number\n /** Lower bound of the bootstrap CI on the chosen statistic. */\n low: number\n /** Upper bound of the bootstrap CI on the chosen statistic. */\n high: number\n /** Confidence level used (e.g. 0.95). */\n confidence: number\n /** Number of bootstrap resamples used. */\n resamples: number\n /** False below {@link BOOTSTRAP_GATE_MIN_N}. See {@link pairedBootstrap}. */\n gateEligible: boolean\n}\n\n/**\n * Pairs below which a percentile bootstrap interval is descriptive spread only.\n *\n * `P(low > 0)` under a true null, against a nominal 2.5 %, measured over 4000\n * seeded trials: 13.53 % at n = 3, 3.52 % at n = 10, 3.10 % at n = 20 on the\n * median; 13.85 %, 4.90 %, 3.80 % on the mean. This is intrinsic to resampling\n * three points, not an implementation error — scipy's BCa gives 16.0 % on the\n * same n = 3 data — so no change to the estimator moves it. Below this floor\n * the decision belongs to the exact sign test or exact signed-rank test.\n */\nexport const BOOTSTRAP_GATE_MIN_N = 20\n\nexport interface PairedBootstrapOptions {\n /** Confidence level. Default 0.95. */\n confidence?: number\n /** Bootstrap resample count. Default 2000. */\n resamples?: number\n /** Statistic to bootstrap. Default 'median'. */\n statistic?: 'median' | 'mean'\n /** Deterministic seed. If omitted, derived from the deltas so the interval\n * is reproducible regardless. */\n seed?: number\n}\n\n/**\n * Paired bootstrap on (after − before) deltas. Returns a CI on the chosen\n * statistic (median by default); pairs are resampled with replacement. Throws\n * on unequal sample sizes.\n *\n * `low > threshold` carries the stated confidence ONLY at `n ≥\n * {@link BOOTSTRAP_GATE_MIN_N}`, which `gateEligible` reports. Below it the\n * check fires under a true null several times more often than nominal, so the\n * interval is descriptive spread and a promotion must not turn on it.\n */\nexport function pairedBootstrap(\n before: number[],\n after: number[],\n opts: PairedBootstrapOptions = {},\n): PairedBootstrapResult {\n if (before.length !== after.length) {\n throw new Error(`pairedBootstrap: unequal sample sizes (${before.length} vs ${after.length})`)\n }\n const confidence = opts.confidence ?? 0.95\n const resamples = opts.resamples ?? 2000\n const statistic = opts.statistic ?? 'median'\n if (confidence <= 0 || confidence >= 1) {\n throw new Error(`pairedBootstrap: confidence must be in (0,1), got ${confidence}`)\n }\n\n const n = before.length\n const deltas = before.map((b, i) => after[i]! - b)\n const gateEligible = n >= BOOTSTRAP_GATE_MIN_N\n if (n === 0) {\n return { n: 0, median: 0, mean: 0, low: 0, high: 0, confidence, resamples, gateEligible }\n }\n if (n === 1) {\n const d = deltas[0]!\n return { n: 1, median: d, mean: d, low: d, high: d, confidence, resamples, gateEligible }\n }\n\n const rng = makeRng(opts.seed, deltas)\n const samples = new Array<number>(resamples)\n for (let b = 0; b < resamples; b++) {\n if (statistic === 'mean') {\n let sum = 0\n for (let k = 0; k < n; k++) {\n sum += deltas[Math.floor(rng() * n)]!\n }\n samples[b] = sum / n\n } else {\n const acc = new Array<number>(n)\n for (let k = 0; k < n; k++) {\n acc[k] = deltas[Math.floor(rng() * n)]!\n }\n samples[b] = medianInPlace(acc)\n }\n }\n samples.sort((a, b) => a - b)\n\n const alpha = 1 - confidence\n const lowIdx = Math.floor((alpha / 2) * resamples)\n const highIdx = Math.min(resamples - 1, Math.ceil((1 - alpha / 2) * resamples) - 1)\n\n return {\n n,\n median: medianInPlace([...deltas]),\n mean: deltas.reduce((s, x) => s + x, 0) / n,\n low: samples[lowIdx]!,\n high: samples[Math.max(highIdx, lowIdx)]!,\n confidence,\n resamples,\n gateEligible,\n }\n}\n\n/** Pre-registered direction for a one-sided paired sign test. */\nexport type SignTestAlternative = 'greater' | 'less'\n\n/** Exact one-sided sign-test result for paired numeric differences. */\nexport interface PairedSignTestResult {\n /** Total supplied differences, including zero ties. */\n n: number\n /** Strictly positive differences. */\n positive: number\n /** Strictly negative differences. */\n negative: number\n /** Zero differences excluded from the binomial test. */\n ties: number\n /** Non-zero differences used by the binomial test. */\n nNonTies: number\n /** Direction of the pre-registered alternative hypothesis. */\n alternative: SignTestAlternative\n /** Exact one-sided p-value under P(positive) = P(negative) = 0.5. */\n pValue: number\n}\n\n/**\n * Exact one-sided sign test over paired differences.\n *\n * Pass `after[i] - before[i]` for each matched item. `alternative = 'greater'`\n * tests whether positive signs are more likely than negative signs and returns\n * `P(Binomial(nNonTies, 0.5) >= positive)`. `alternative = 'less'` treats\n * negative signs as successes instead. With a continuous difference\n * distribution this is the usual directional median test. Exact zero\n * differences are ties and do not enter the binomial denominator. All-tie and\n * empty inputs return p = 1. Every input difference must be finite, and the\n * direction must be chosen explicitly so a caller cannot select it after\n * seeing the signs.\n */\nexport function pairedSignTest(\n differences: readonly number[],\n alternative: SignTestAlternative,\n): PairedSignTestResult {\n if (alternative !== 'greater' && alternative !== 'less') {\n throw new ValidationError(\n `pairedSignTest: alternative must be 'greater' or 'less', got ${alternative}`,\n )\n }\n\n let positive = 0\n let negative = 0\n let ties = 0\n for (let i = 0; i < differences.length; i++) {\n const difference = differences[i]!\n if (!Number.isFinite(difference)) {\n throw new ValidationError(\n `pairedSignTest: difference at index ${i} must be finite, got ${difference}`,\n )\n }\n if (difference > 0) positive++\n else if (difference < 0) negative++\n else ties++\n }\n\n const nNonTies = positive + negative\n const successes = alternative === 'greater' ? positive : negative\n return {\n n: differences.length,\n positive,\n negative,\n ties,\n nNonTies,\n alternative,\n pValue: binomialHalfUpperTail(successes, nNonTies),\n }\n}\n\n/** Fraction of paired observations whose delta is an exact tie (|after − before|\n * < 1e-9). Throws on unequal sample sizes; 0 pairs ⇒ 0. */\nexport function pairedDeltaTieFraction(\n before: ArrayLike<number>,\n after: ArrayLike<number>,\n): number {\n if (before.length !== after.length) {\n throw new Error(\n `pairedDeltaTieFraction: unequal sample sizes (${before.length} vs ${after.length})`,\n )\n }\n const n = before.length\n if (n === 0) return 0\n let ties = 0\n for (let i = 0; i < n; i++) {\n if (Math.abs(after[i]! - before[i]!) < 1e-9) ties++\n }\n return ties / n\n}\n\n/**\n * The paired-delta statistic a DECISION is computed on, package-wide.\n *\n * The mean paired delta is the estimator that answers the question a promotion\n * gate asks — \"by how much did the candidate move the score\" — in the caller's\n * own units, and it equals the aggregate lift everyone quotes. The MEDIAN\n * answers a different question and loses the answer to this one in every regime\n * eval data actually lands in:\n * - TWO-POINT (pass/fail) outcomes on any encoding: the delta vector lives in\n * {−s, 0, +s} dominated by zeros, so the median and its whole bootstrap CI\n * are pinned at exactly 0 however large the shift. (Decide these on\n * {@link pairedRiskDifferenceExact} instead — same estimand, exact interval.)\n * - TIE-DOMINATED outcomes: at half the pairs tied the sample median is 0 by\n * construction, and `ci.low > threshold` then answers \"no\" forever at a\n * non-negative threshold and \"yes\" forever at a negative one.\n * - LOW-CARDINALITY outcomes, even well below half ties: judge dimensions on\n * integer 0-100, and block scores like {⅔, 1} from averaging pass/fail\n * leaves, put the median on a coarse lattice whose bootstrap percentiles\n * land on atoms. Measured: 26 blocks of 3 pass/fail leaves carrying a real\n * +12.8pp lift, only 23% of pairs tied, gives a median CI of [0, 0.333] —\n * lower bound exactly 0, so a gate at threshold 0 refuses a real lift.\n * That last case is why there is no tie-fraction threshold here: any cutoff on\n * ties leaves the lattice case open on the other side of it.\n *\n * `heldoutSignificance` has defaulted to the mean since #316 for the same\n * reason. The median remains available per call site for callers who\n * specifically want outlier robustness and accept the blindness.\n */\nexport const DECISION_PAIRED_DELTA_STATISTIC: 'mean' = 'mean'\n"],"mappings":"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"}
@@ -1,99 +0,0 @@
1
- import { o as normalCdf } from "./paired-arms-3-tsXvvC.js";
2
- import { f as zQuantile } from "./mean-D1d6gedE.js";
3
- // src/statistics/power-and-mde.ts
4
- /**
5
- * Required N per arm for a two-sample comparison at target effect size,
6
- * alpha, and power. Normal-approximation formula:
7
- * n = 2 * ( (z_{1-α/2} + z_{1-β}) / d )^2
8
- * where d is Cohen's d. Returns Infinity for effect ≤ 0.
9
- */
10
- function requiredSampleSize(opts) {
11
- const effect = opts.effect;
12
- if (!Number.isFinite(effect) || effect <= 0) return Infinity;
13
- const alpha = opts.alpha ?? .05;
14
- const power = opts.power ?? .8;
15
- const twoSided = opts.twoSided ?? true;
16
- const n = 2 * ((zQuantile(twoSided ? 1 - alpha / 2 : 1 - alpha) + zQuantile(power)) / effect) ** 2;
17
- return Math.ceil(n);
18
- }
19
- /**
20
- * Required number of paired observations for a target Cohen's dz.
21
- * Unlike the independent-groups formula, this has no two-arm factor of two.
22
- *
23
- * Normal quantiles with no t correction, so treat the result as a LOWER bound:
24
- * it returns 32 where the exact t-based answer is 34 at dz = 0.5, and 13 where
25
- * it is 15 at dz = 0.8 — a 6–13 % shortfall precisely in the range a caller
26
- * consults to decide whether 3–10 repetitions suffice.
27
- */
28
- function requiredPairedSampleSize(opts) {
29
- const effect = opts.effect;
30
- if (!Number.isFinite(effect) || effect <= 0) return Infinity;
31
- const alpha = opts.alpha ?? .05;
32
- const power = opts.power ?? .8;
33
- const twoSided = opts.twoSided ?? true;
34
- const zAlpha = zQuantile(twoSided ? 1 - alpha / 2 : 1 - alpha);
35
- const zBeta = zQuantile(power);
36
- return Math.ceil(((zAlpha + zBeta) / effect) ** 2);
37
- }
38
- /**
39
- * Minimum detectable paired effect (standardised units) for a target paired
40
- * sample size: d_min = (z_{1-α/2} + z_β) / sqrt(n_paired). Multiply by
41
- * sd(deltas) for score units; treat as a lower bound — Wilcoxon and bootstrap
42
- * have asymptotic relative efficiency below 1 vs the t-test on heavy tails.
43
- */
44
- function pairedMde(opts) {
45
- if (!Number.isFinite(opts.nPaired) || opts.nPaired <= 0) return Infinity;
46
- const alpha = opts.alpha ?? .05;
47
- const power = opts.power ?? .8;
48
- const twoSided = opts.twoSided ?? true;
49
- return (zQuantile(twoSided ? 1 - alpha / 2 : 1 - alpha) + zQuantile(power)) / Math.sqrt(opts.nPaired);
50
- }
51
- /**
52
- * Number of paired observations needed for a McNemar test to reach a target
53
- * power — the pre-registration companion to {@link mcnemar}. Parametrised by the
54
- * expected discordant-cell probabilities `p10` (P[treatment wins on a pair]) and
55
- * `p01` (P[control wins]); concordant pairs carry no information, so the count
56
- * is driven entirely by the discordant rate. Lachin's (1992) asymptotic normal
57
- * approximation: with discordant rate `pDisc = p10 + p01` and marginal effect
58
- * `δ = p10 − p01`,
59
- * n = ( z_{1-α/2}·√pDisc + z_{1-β}·√(pDisc − δ²) )² / δ².
60
- * Returns Infinity when there is no effect (p10 === p01). Asymptotic — at the
61
- * tiny discordant counts where the exact {@link mcnemar} differs from the normal
62
- * approximation, treat the result as a lower bound and prefer the discordant-pair
63
- * floor.
64
- */
65
- function mcnemarRequiredN(opts) {
66
- const { p10, p01 } = opts;
67
- if (p10 < 0 || p01 < 0 || p10 + p01 > 1) throw new Error(`mcnemarRequiredN: require p10,p01 ≥ 0 and p10+p01 ≤ 1 (got ${p10}, ${p01})`);
68
- const delta = p10 - p01;
69
- if (delta === 0) return Infinity;
70
- const alpha = opts.alpha ?? .05;
71
- const power = opts.power ?? .8;
72
- const twoSided = opts.twoSided ?? true;
73
- const pDisc = p10 + p01;
74
- const zAlpha = zQuantile(twoSided ? 1 - alpha / 2 : 1 - alpha);
75
- const zBeta = zQuantile(power);
76
- const n = (zAlpha * Math.sqrt(pDisc) + zBeta * Math.sqrt(Math.max(0, pDisc - delta * delta))) ** 2 / (delta * delta);
77
- return Math.ceil(n);
78
- }
79
- /**
80
- * Power of a McNemar test at a given number of paired observations, the inverse
81
- * of {@link mcnemarRequiredN} (same Lachin asymptotic model, same parameters).
82
- * Returns a value in [0, 1]; equals `alpha` when there is no effect.
83
- */
84
- function mcnemarPower(opts) {
85
- const { p10, p01, nPairs } = opts;
86
- if (p10 < 0 || p01 < 0 || p10 + p01 > 1) throw new Error(`mcnemarPower: require p10,p01 ≥ 0 and p10+p01 ≤ 1 (got ${p10}, ${p01})`);
87
- const alpha = opts.alpha ?? .05;
88
- const twoSided = opts.twoSided ?? true;
89
- const delta = p10 - p01;
90
- if (delta === 0 || nPairs <= 0) return alpha;
91
- const pDisc = p10 + p01;
92
- const zAlpha = zQuantile(twoSided ? 1 - alpha / 2 : 1 - alpha);
93
- const denom = Math.sqrt(Math.max(1e-12, pDisc - delta * delta));
94
- const zBeta = (Math.sqrt(nPairs) * Math.abs(delta) - zAlpha * Math.sqrt(pDisc)) / denom;
95
- return Math.min(1, Math.max(0, normalCdf(zBeta)));
96
- }
97
- export { requiredSampleSize as a, requiredPairedSampleSize as i, mcnemarRequiredN as n, pairedMde as r, mcnemarPower as t };
98
-
99
- //# sourceMappingURL=power-and-mde-g3vOn0XK.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"power-and-mde-g3vOn0XK.js","names":[],"sources":["../src/statistics/power-and-mde.ts"],"sourcesContent":["import { normalCdf } from '../math/normal'\nimport { zQuantile } from './internal'\n\n// ── Power analysis + minimum detectable effect ───────────────────────\n\n/**\n * Required N per arm for a two-sample comparison at target effect size,\n * alpha, and power. Normal-approximation formula:\n * n = 2 * ( (z_{1-α/2} + z_{1-β}) / d )^2\n * where d is Cohen's d. Returns Infinity for effect ≤ 0.\n */\nexport function requiredSampleSize(opts: {\n effect: number\n alpha?: number\n power?: number\n twoSided?: boolean\n}): number {\n const effect = opts.effect\n if (!Number.isFinite(effect) || effect <= 0) return Infinity\n const alpha = opts.alpha ?? 0.05\n const power = opts.power ?? 0.8\n const twoSided = opts.twoSided ?? true\n const zAlpha = zQuantile(twoSided ? 1 - alpha / 2 : 1 - alpha)\n const zBeta = zQuantile(power)\n const n = 2 * ((zAlpha + zBeta) / effect) ** 2\n return Math.ceil(n)\n}\n\n/**\n * Required number of paired observations for a target Cohen's dz.\n * Unlike the independent-groups formula, this has no two-arm factor of two.\n *\n * Normal quantiles with no t correction, so treat the result as a LOWER bound:\n * it returns 32 where the exact t-based answer is 34 at dz = 0.5, and 13 where\n * it is 15 at dz = 0.8 — a 6–13 % shortfall precisely in the range a caller\n * consults to decide whether 3–10 repetitions suffice.\n */\nexport function requiredPairedSampleSize(opts: {\n effect: number\n alpha?: number\n power?: number\n twoSided?: boolean\n}): number {\n const effect = opts.effect\n if (!Number.isFinite(effect) || effect <= 0) return Infinity\n const alpha = opts.alpha ?? 0.05\n const power = opts.power ?? 0.8\n const twoSided = opts.twoSided ?? true\n const zAlpha = zQuantile(twoSided ? 1 - alpha / 2 : 1 - alpha)\n const zBeta = zQuantile(power)\n return Math.ceil(((zAlpha + zBeta) / effect) ** 2)\n}\n\n/**\n * Minimum detectable paired effect (standardised units) for a target paired\n * sample size: d_min = (z_{1-α/2} + z_β) / sqrt(n_paired). Multiply by\n * sd(deltas) for score units; treat as a lower bound — Wilcoxon and bootstrap\n * have asymptotic relative efficiency below 1 vs the t-test on heavy tails.\n */\nexport function pairedMde(opts: {\n nPaired: number\n alpha?: number\n power?: number\n twoSided?: boolean\n}): number {\n if (!Number.isFinite(opts.nPaired) || opts.nPaired <= 0) return Infinity\n const alpha = opts.alpha ?? 0.05\n const power = opts.power ?? 0.8\n const twoSided = opts.twoSided ?? true\n const zAlpha = zQuantile(twoSided ? 1 - alpha / 2 : 1 - alpha)\n const zBeta = zQuantile(power)\n return (zAlpha + zBeta) / Math.sqrt(opts.nPaired)\n}\n\n/**\n * Number of paired observations needed for a McNemar test to reach a target\n * power — the pre-registration companion to {@link mcnemar}. Parametrised by the\n * expected discordant-cell probabilities `p10` (P[treatment wins on a pair]) and\n * `p01` (P[control wins]); concordant pairs carry no information, so the count\n * is driven entirely by the discordant rate. Lachin's (1992) asymptotic normal\n * approximation: with discordant rate `pDisc = p10 + p01` and marginal effect\n * `δ = p10 − p01`,\n * n = ( z_{1-α/2}·√pDisc + z_{1-β}·√(pDisc − δ²) )² / δ².\n * Returns Infinity when there is no effect (p10 === p01). Asymptotic — at the\n * tiny discordant counts where the exact {@link mcnemar} differs from the normal\n * approximation, treat the result as a lower bound and prefer the discordant-pair\n * floor.\n */\nexport function mcnemarRequiredN(opts: {\n p10: number\n p01: number\n alpha?: number\n power?: number\n twoSided?: boolean\n}): number {\n const { p10, p01 } = opts\n if (p10 < 0 || p01 < 0 || p10 + p01 > 1) {\n throw new Error(`mcnemarRequiredN: require p10,p01 ≥ 0 and p10+p01 ≤ 1 (got ${p10}, ${p01})`)\n }\n const delta = p10 - p01\n if (delta === 0) return Infinity\n const alpha = opts.alpha ?? 0.05\n const power = opts.power ?? 0.8\n const twoSided = opts.twoSided ?? true\n const pDisc = p10 + p01\n const zAlpha = zQuantile(twoSided ? 1 - alpha / 2 : 1 - alpha)\n const zBeta = zQuantile(power)\n const n =\n (zAlpha * Math.sqrt(pDisc) + zBeta * Math.sqrt(Math.max(0, pDisc - delta * delta))) ** 2 /\n (delta * delta)\n return Math.ceil(n)\n}\n\n/**\n * Power of a McNemar test at a given number of paired observations, the inverse\n * of {@link mcnemarRequiredN} (same Lachin asymptotic model, same parameters).\n * Returns a value in [0, 1]; equals `alpha` when there is no effect.\n */\nexport function mcnemarPower(opts: {\n p10: number\n p01: number\n nPairs: number\n alpha?: number\n twoSided?: boolean\n}): number {\n const { p10, p01, nPairs } = opts\n if (p10 < 0 || p01 < 0 || p10 + p01 > 1) {\n throw new Error(`mcnemarPower: require p10,p01 ≥ 0 and p10+p01 ≤ 1 (got ${p10}, ${p01})`)\n }\n const alpha = opts.alpha ?? 0.05\n const twoSided = opts.twoSided ?? true\n const delta = p10 - p01\n if (delta === 0 || nPairs <= 0) return alpha\n const pDisc = p10 + p01\n const zAlpha = zQuantile(twoSided ? 1 - alpha / 2 : 1 - alpha)\n const denom = Math.sqrt(Math.max(1e-12, pDisc - delta * delta))\n const zBeta = (Math.sqrt(nPairs) * Math.abs(delta) - zAlpha * Math.sqrt(pDisc)) / denom\n return Math.min(1, Math.max(0, normalCdf(zBeta)))\n}\n"],"mappings":";;;;;;;;;AAWA,SAAgB,mBAAmB,MAKxB;CACT,MAAM,SAAS,KAAK;CACpB,IAAI,CAAC,OAAO,SAAS,MAAM,KAAK,UAAU,GAAG,OAAO;CACpD,MAAM,QAAQ,KAAK,SAAS;CAC5B,MAAM,QAAQ,KAAK,SAAS;CAC5B,MAAM,WAAW,KAAK,YAAY;CAGlC,MAAM,IAAI,MAFK,UAAU,WAAW,IAAI,QAAQ,IAAI,IAAI,KAEnC,IADP,UAAU,KACK,KAAK,WAAW;CAC7C,OAAO,KAAK,KAAK,CAAC;AACpB;;;;;;;;;;AAWA,SAAgB,yBAAyB,MAK9B;CACT,MAAM,SAAS,KAAK;CACpB,IAAI,CAAC,OAAO,SAAS,MAAM,KAAK,UAAU,GAAG,OAAO;CACpD,MAAM,QAAQ,KAAK,SAAS;CAC5B,MAAM,QAAQ,KAAK,SAAS;CAC5B,MAAM,WAAW,KAAK,YAAY;CAClC,MAAM,SAAS,UAAU,WAAW,IAAI,QAAQ,IAAI,IAAI,KAAK;CAC7D,MAAM,QAAQ,UAAU,KAAK;CAC7B,OAAO,KAAK,OAAO,SAAS,SAAS,WAAW,CAAC;AACnD;;;;;;;AAQA,SAAgB,UAAU,MAKf;CACT,IAAI,CAAC,OAAO,SAAS,KAAK,OAAO,KAAK,KAAK,WAAW,GAAG,OAAO;CAChE,MAAM,QAAQ,KAAK,SAAS;CAC5B,MAAM,QAAQ,KAAK,SAAS;CAC5B,MAAM,WAAW,KAAK,YAAY;CAGlC,QAFe,UAAU,WAAW,IAAI,QAAQ,IAAI,IAAI,KAE3C,IADC,UAAU,KACH,KAAK,KAAK,KAAK,KAAK,OAAO;AAClD;;;;;;;;;;;;;;;AAgBA,SAAgB,iBAAiB,MAMtB;CACT,MAAM,EAAE,KAAK,QAAQ;CACrB,IAAI,MAAM,KAAK,MAAM,KAAK,MAAM,MAAM,GACpC,MAAM,IAAI,MAAM,8DAA8D,IAAI,IAAI,IAAI,EAAE;CAE9F,MAAM,QAAQ,MAAM;CACpB,IAAI,UAAU,GAAG,OAAO;CACxB,MAAM,QAAQ,KAAK,SAAS;CAC5B,MAAM,QAAQ,KAAK,SAAS;CAC5B,MAAM,WAAW,KAAK,YAAY;CAClC,MAAM,QAAQ,MAAM;CACpB,MAAM,SAAS,UAAU,WAAW,IAAI,QAAQ,IAAI,IAAI,KAAK;CAC7D,MAAM,QAAQ,UAAU,KAAK;CAC7B,MAAM,KACH,SAAS,KAAK,KAAK,KAAK,IAAI,QAAQ,KAAK,KAAK,KAAK,IAAI,GAAG,QAAQ,QAAQ,KAAK,CAAC,MAAM,KACtF,QAAQ;CACX,OAAO,KAAK,KAAK,CAAC;AACpB;;;;;;AAOA,SAAgB,aAAa,MAMlB;CACT,MAAM,EAAE,KAAK,KAAK,WAAW;CAC7B,IAAI,MAAM,KAAK,MAAM,KAAK,MAAM,MAAM,GACpC,MAAM,IAAI,MAAM,0DAA0D,IAAI,IAAI,IAAI,EAAE;CAE1F,MAAM,QAAQ,KAAK,SAAS;CAC5B,MAAM,WAAW,KAAK,YAAY;CAClC,MAAM,QAAQ,MAAM;CACpB,IAAI,UAAU,KAAK,UAAU,GAAG,OAAO;CACvC,MAAM,QAAQ,MAAM;CACpB,MAAM,SAAS,UAAU,WAAW,IAAI,QAAQ,IAAI,IAAI,KAAK;CAC7D,MAAM,QAAQ,KAAK,KAAK,KAAK,IAAI,OAAO,QAAQ,QAAQ,KAAK,CAAC;CAC9D,MAAM,SAAS,KAAK,KAAK,MAAM,IAAI,KAAK,IAAI,KAAK,IAAI,SAAS,KAAK,KAAK,KAAK,KAAK;CAClF,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,UAAU,KAAK,CAAC,CAAC;AAClD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"promotion-gate-DOkgJcLW.d.ts","names":[],"sources":["../src/statistics/rank-tests.ts","../src/release-confidence.ts","../src/promotion-gate.ts"],"mappings":";;;;KAYY;;KAGA;UAEK;;EAEf,SAAS;;EAET;;;EAGA;;UAYe;;EAEf;;EAEA;;EAEA;;EAEA,QAAQ;;EAER;;;;;;;;;;;;;;iBAec,aACd,aACA,aACA,OAAM,kBACL;UAuFc;;;EAGf;;EAEA;;EAEA,QAAQ;;EAER;;EAEA;;;;;;;;;;;;;;;iBAgBc,mBACd,kBACA,iBACA,OAAM,kBACL;;KChKE;;UAGY;;EAEf;;EAEA;EACA,WAAW;;EAEX;;EAEA;;EAEA;;EAEA;EACA,WAAW;;KAGD;KACA;UAQK;EACf;EACA;EACA,QAAQ;EACR;EACA;EACA;EACA;EACA;;EAEA,eAAe;EACf,MAAM;EACN,WAAW;;UAGI;;EAEf;EACA;EACA;EACA;;EAEA;EACA;EACA;;EAEA;EACA;EACA;;EAEA;;EAEA;;UAGe;EACf;EACA;EACA;EACA,UAAU;EACV,qBAAqB;EACrB,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EACf,aAAa;;UAGE;EACf,MAAM;EACN,QAAQ;EACR;EACA;;UAGe;EACf,MAAM;EACN;EACA;EACA;;UAGe;EACf;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,aAAa,OAAO;EACpB,cAAc;EACd,oBAAoB,QAAQ,OAAO;EACnC,0BAA0B;;;;;;;EAO1B;;UAGe;EACf;EACA;EACA;EACA,QAAQ;EACR;EACA,MAAM;EACN,QAAQ;EACR,SAAS;EACT,SAAS;EACT,cAAc;EACd;;iBAkBc,0BACd,OAAO,yBACN;;;;;;;;;;;;;;;;;;;;;;;;;KC3JS;UAEK;EACf;EACA;;EAEA;;EAEA;;EAEA;;EAEA;EACA;EACA,SAAS;;UAGM;;EAEf;;EAEA;;;;;;EAMA;;;EAGA;;;;;;;;;iBAUc,YACd,oBACA,qBACA,UAAS,mBACR;;;;;;;;;;;;;;;;UA0Gc,oBAAoB;EACnC,iBAAiB;EACjB,kBAAkB;;EAElB,QAAQ,QAAQ,YAAY;EAC5B;EACA;;EAEA;;EAEA;;;;;iBAMoB,gBAAgB,SACpC,MAAM,oBAAoB,WACzB,QAAQ;EAAoB;EAAyB"}
@@ -1,79 +0,0 @@
1
- /**
2
- * Required N per arm for a two-sample comparison at target effect size,
3
- * alpha, and power. Normal-approximation formula:
4
- * n = 2 * ( (z_{1-α/2} + z_{1-β}) / d )^2
5
- * where d is Cohen's d. Returns Infinity for effect ≤ 0.
6
- */
7
- declare function requiredSampleSize(opts: {
8
- effect: number;
9
- alpha?: number;
10
- power?: number;
11
- twoSided?: boolean;
12
- }): number;
13
- /**
14
- * Required number of paired observations for a target Cohen's dz.
15
- * Unlike the independent-groups formula, this has no two-arm factor of two.
16
- *
17
- * Normal quantiles with no t correction, so treat the result as a LOWER bound:
18
- * it returns 32 where the exact t-based answer is 34 at dz = 0.5, and 13 where
19
- * it is 15 at dz = 0.8 — a 6–13 % shortfall precisely in the range a caller
20
- * consults to decide whether 3–10 repetitions suffice.
21
- */
22
- declare function requiredPairedSampleSize(opts: {
23
- effect: number;
24
- alpha?: number;
25
- power?: number;
26
- twoSided?: boolean;
27
- }): number;
28
- /**
29
- * Minimum detectable paired effect (standardised units) for a target paired
30
- * sample size: d_min = (z_{1-α/2} + z_β) / sqrt(n_paired). Multiply by
31
- * sd(deltas) for score units; treat as a lower bound — Wilcoxon and bootstrap
32
- * have asymptotic relative efficiency below 1 vs the t-test on heavy tails.
33
- */
34
- declare function pairedMde(opts: {
35
- nPaired: number;
36
- alpha?: number;
37
- power?: number;
38
- twoSided?: boolean;
39
- }): number;
40
- /**
41
- * Number of paired observations needed for a McNemar test to reach a target
42
- * power — the pre-registration companion to {@link mcnemar}. Parametrised by the
43
- * expected discordant-cell probabilities `p10` (P[treatment wins on a pair]) and
44
- * `p01` (P[control wins]); concordant pairs carry no information, so the count
45
- * is driven entirely by the discordant rate. Lachin's (1992) asymptotic normal
46
- * approximation: with discordant rate `pDisc = p10 + p01` and marginal effect
47
- * `δ = p10 − p01`,
48
- * n = ( z_{1-α/2}·√pDisc + z_{1-β}·√(pDisc − δ²) )² / δ².
49
- * Returns Infinity when there is no effect (p10 === p01). Asymptotic — at the
50
- * tiny discordant counts where the exact {@link mcnemar} differs from the normal
51
- * approximation, treat the result as a lower bound and prefer the discordant-pair
52
- * floor.
53
- */
54
- declare function mcnemarRequiredN(opts: {
55
- p10: number;
56
- p01: number;
57
- alpha?: number;
58
- power?: number;
59
- twoSided?: boolean;
60
- }): number;
61
- /**
62
- * Power of a McNemar test at a given number of paired observations, the inverse
63
- * of {@link mcnemarRequiredN} (same Lachin asymptotic model, same parameters).
64
- * Returns a value in [0, 1]; equals `alpha` when there is no effect.
65
- */
66
- declare function mcnemarPower(opts: {
67
- p10: number;
68
- p01: number;
69
- nPairs: number;
70
- alpha?: number;
71
- twoSided?: boolean;
72
- }): number;
73
- /** Tiny seedable PRNG (mulberry32) — deterministic resampling/shuffling, not
74
- * cryptographic. Exported so e-process shuffles and bootstrap resampling
75
- * share ONE PRNG implementation. Every distinct 32-bit seed gives a distinct
76
- * stream, including 0. */
77
- declare function mulberry32(seed: number): () => number;
78
- export { requiredPairedSampleSize as a, pairedMde as i, mcnemarPower as n, requiredSampleSize as o, mcnemarRequiredN as r, mulberry32 as t };
79
- //# sourceMappingURL=random-BN150Q_X.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"random-BN150Q_X.d.ts","names":[],"sources":["../src/statistics/power-and-mde.ts","../src/statistics/random.ts"],"mappings":";;;;;;iBAWgB,mBAAmB;EACjC;EACA;EACA;EACA;;;;;;;;;;;iBAsBc,yBAAyB;EACvC;EACA;EACA;EACA;;;;;;;;iBAkBc,UAAU;EACxB;EACA;EACA;EACA;;;;;;;;;;;;;;;;iBAyBc,iBAAiB;EAC/B;EACA;EACA;EACA;EACA;;;;;;;iBAyBc,aAAa;EAC3B;EACA;EACA;EACA;EACA;;;;;;iBCrHc,WAAW"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema-CfoA9U_U.d.ts","names":[],"sources":["../src/statistics/descriptive.ts","../src/rollout/license.ts","../src/rollout/schema.ts"],"mappings":";;;;;iBAWgB,aAAa;EAAU;EAAe;;;;;;;;;;iBAoBtC,mBACd,kBACA,qBACA;EAAQ;EAAe;;EACpB;EAAc;EAAe;;;;;;;iBAqClB,iBAAiB,YAAY;;UAW5B;WACN;;WAEA;;WAEA;WACA;WACA;;WAEA;;;;;;;;;iBAUK,uBACd,4BACA,sBACC;;iBAkCa,cAAc,iBAAiB;;UAM9B;WACN;WACA;WACA;WACA;WACA;WACA;WACA,cAAc,SAAS;WACvB;aACE;aACA;aACA;aACA;aACA;aACA;aACA;;;UAII;;EAEf;;EAEA;IAAmB;;;;;;;;;;iBAUL,sBACd,2BACA,UAAU,4BACT;;;;;iBA6Ea,MAAM;;;;;;iBAmBN,SAAS,aAAa;;;;;iBAuBtB,UAAU,aAAa;UAKtB;;EAEf,MAAM;;;;;EAKN,SAAS;;EAET;;UAGe;EACf;EACA;;;;;;;;;;;iBAYc,kBAAkB,OAAO,yBAAyB;KClTtD;cACC,0BAA0B;;iBAYvB,mBAAmB,kCAAkC;;iBAQrD,eAAe,MAAM,KAAK,yBAAyB;;iBASnD,kBACd,MAAM,KAAK,wBACX,mBAAmB;cCLR;;KAGD;cACC,wBAAwB;;KAUzB;cACC,yBAAyB;iBAItB,iBAAiB,OAAO;;KAK5B;cACC,2BAA2B;KAM5B;UAGK;EACf;EACA;EACA;IACE;;IAEA;;;UAIa;EACf,MAAM;EACN;;EAEA;EACA,aAAa;;EAEb;EACA;;;;;;;;EAQA;;UAGe;EACf;EACA;IACE;IACA;IACA,aAAa;;;;;;;;UASA;EACf;EACA;;EAEA;;EAEA;EACA;EACA;;;;;EAUA;;EAEA;;EAEA;;;;;;EAMA;;UAOe;;EAEf;EACA;EACA,OAAO;;EAEP;;EAEA;;UAGe;;EAEf;EACA;EACA;EACA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA,UAAU;;EAEV,gBAAgB;;UAGD;;;;;EAKf;;EAEA;;EAEA;;EAEA,SAAS;EACT;EACA;EACA;;;;;;;;;;;;;EAaA;;;;;;;;;;;;;;;;;;;;;EAqBA;;UAGe;EACf;EACA;EACA;EACA;EACA;EACA;EACA;;;;;EAKA;;UAGe;EACf;EACA;;;EAGA;;;;;;;UAQe;;EAEf,UAAU;;EAEV;;;;;;;;;EASA;;UAGe;EACf;EACA;EACA;EACA;EACA;EACA;EACA;;;UAIe;WACN;WACA;;WAEA;WACA;WACA;;WAEA;WACA;WACA;;UAGM;EACf;EACA,SAAS;;EAET;IAAW;IAAkB;IAAgB;IAAgB;;;EAE7D,WAAW;;EAEX,8BAA8B;;EAE9B;;;;;;;EAOA;;;;;;;EAOA,iBAAiB;;UAGF;EACf,eAAe;EACf;;;EAGA;EACA;;EAEA;;EAEA;;EAEA;;EAEA;EACA,MAAM;EACN,MAAM;EACN,QAAQ;;EAER,UAAU;EACV,WAAW;;EAEX,QAAQ;EACR,SAAS;EACT,MAAM;EACN,WAAW;EACX,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA0GE,iBAAiB,MAAM,cAAc;iBAgXrC,oBAAoB;iBAmBpB,kBACd,gBACA,2BACS,SAAS;iBAOJ,cAAc,iBAAiB,SAAS;;;;;;cAa1C;;;;;;UAOG,6BAA6B;EAC5C;;;;;;;;;;;;;;;;;;;;;;KAuBU,oBAAoB,KAAK;YACzB;EACV,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsCK,aAAa,gBAAgB,mBAA2B;;iBAiBxD,kBACd,4BACA,mBACC"}
@@ -1,129 +0,0 @@
1
- import { s as ValidationError } from "./errors-DeEEV9Vx.js";
2
- // src/statistics/sequential-eprocess.ts
3
- /**
4
- * Betting test-martingale for bounded observations — the e-process core of
5
- * anytime-valid sequential testing (Waudby-Smith & Ramdas, "Estimating means
6
- * of bounded random variables by betting", JRSS-B 2024).
7
- *
8
- * Observations x_i ∈ [0,1]; H0: E[x] ≤ m₀ (`nullMean`, default 1/2). Wealth
9
- *
10
- * W_t = Π_{i≤t} (1 + λ_i (x_i − m₀)), W_0 = 1
11
- *
12
- * with the truncated GROW-style plug-in bet computed from PRIOR observations:
13
- *
14
- * λ_i = clamp((μ̂_{i−1} − m₀) / (σ̂²_{i−1} + (μ̂_{i−1} − m₀)²), 0, maxBet)
15
- *
16
- * where μ̂/σ̂² are the shrunk running estimates μ̂_t = (1/2 + Σx_i)/(t+1),
17
- * σ̂²_t = (1/4 + Σ(x_i − μ̂_i)²)/(t+1).
18
- *
19
- * PREDICTABILITY INVARIANT (load-bearing): λ_i is a function of x_1..x_{i−1}
20
- * ONLY — it may never see x_i. With λ_i ≥ 0 predictable, each factor has
21
- * E[1 + λ_i(x_i − m₀) | past] ≤ 1 under H0, so W is a nonnegative
22
- * supermartingale and Ville's inequality gives P(∃t: W_t ≥ 1/α) ≤ α — the
23
- * type-I guarantee holds at ANY data-dependent stopping time. λ_1 is always 0
24
- * (no prior evidence), so the first observation never moves wealth.
25
- *
26
- * `decided` latches at the first crossing W_t ≥ 1/α and never un-latches;
27
- * wealth keeps updating after the crossing (the e-process remains valid), but
28
- * the decision time is the first crossing.
29
- */
30
- function eProcess(opts = {}) {
31
- const alpha = opts.alpha ?? .05;
32
- const maxBet = opts.maxBet ?? .5;
33
- const nullMean = opts.nullMean ?? .5;
34
- if (!Number.isFinite(alpha) || alpha <= 0 || alpha >= 1) throw new ValidationError(`eProcess: alpha must be in (0,1), got ${alpha}`);
35
- if (!Number.isFinite(nullMean) || nullMean <= 0 || nullMean >= 1) throw new ValidationError(`eProcess: nullMean must be in (0,1), got ${nullMean}`);
36
- if (!Number.isFinite(maxBet) || maxBet <= 0 || maxBet >= 1 / nullMean) throw new ValidationError(`eProcess: maxBet must be in (0, 1/nullMean=${(1 / nullMean).toFixed(4)}) so wealth factors stay positive, got ${maxBet}`);
37
- const threshold = 1 / alpha;
38
- let wealth = 1;
39
- let n = 0;
40
- let decided = false;
41
- let decidedAtN;
42
- let sumX = 0;
43
- let varSum = 0;
44
- if (opts.resume !== void 0) {
45
- const r = assertResumable(opts.resume, {
46
- alpha,
47
- maxBet,
48
- nullMean,
49
- threshold
50
- });
51
- wealth = r.wealth;
52
- n = r.n;
53
- decided = r.decided;
54
- decidedAtN = r.decidedAtN;
55
- sumX = r.sumX;
56
- varSum = r.varSum;
57
- }
58
- return {
59
- update(x) {
60
- if (typeof x !== "number" || !Number.isFinite(x) || x < 0 || x > 1) throw new ValidationError(`eProcess: observation must be a finite number in [0,1], got ${x}`);
61
- const muPrev = (.5 + sumX) / (n + 1);
62
- const varPrev = (.25 + varSum) / (n + 1);
63
- const edge = muPrev - nullMean;
64
- const lambda = Math.min(maxBet, Math.max(0, edge / (varPrev + edge * edge)));
65
- wealth *= 1 + lambda * (x - nullMean);
66
- n += 1;
67
- sumX += x;
68
- const muNow = (.5 + sumX) / (n + 1);
69
- varSum += (x - muNow) ** 2;
70
- if (!decided && wealth >= threshold) {
71
- decided = true;
72
- decidedAtN = n;
73
- }
74
- return {
75
- wealth,
76
- n,
77
- decided
78
- };
79
- },
80
- state() {
81
- return {
82
- wealth,
83
- n,
84
- decided,
85
- alpha,
86
- maxBet,
87
- nullMean,
88
- threshold,
89
- decidedAtN,
90
- sumX,
91
- varSum
92
- };
93
- }
94
- };
95
- }
96
- /**
97
- * Refuse a snapshot that was not produced by an e-process with exactly these
98
- * parameters, or whose fields cannot all be true at once. Every check names
99
- * the field, so a refused restart reports what disagrees.
100
- */
101
- function assertResumable(resume, params) {
102
- const fail = (detail) => {
103
- throw new ValidationError(`eProcess: cannot resume — ${detail}`);
104
- };
105
- if (typeof resume !== "object" || resume === null) fail(`resume must be an EProcessState object, got ${String(resume)}`);
106
- for (const key of [
107
- "alpha",
108
- "maxBet",
109
- "nullMean",
110
- "threshold"
111
- ]) if (resume[key] !== params[key]) fail(`snapshot ${key}=${resume[key]} differs from the process ${key}=${params[key]}; a snapshot continues only the process it was taken from`);
112
- const { wealth, n, decided, decidedAtN, sumX, varSum } = resume;
113
- if (!Number.isInteger(n) || n < 0) fail(`n must be a non-negative integer, got ${n}`);
114
- if (!Number.isFinite(wealth) || wealth <= 0) fail(`wealth must be a finite positive number, got ${wealth}`);
115
- if (!Number.isFinite(sumX) || sumX < 0 || sumX > n) fail(`sumX must lie in [0, n=${n}] for observations in [0,1], got ${sumX}`);
116
- if (!Number.isFinite(varSum) || varSum < 0) fail(`varSum must be a finite non-negative number, got ${varSum}`);
117
- if (typeof decided !== "boolean") fail(`decided must be a boolean, got ${String(decided)}`);
118
- if (n === 0 && (wealth !== 1 || sumX !== 0 || varSum !== 0 || decided)) fail("n=0 requires wealth=1, sumX=0, varSum=0, decided=false");
119
- if (decided) {
120
- if (decidedAtN === void 0 || !Number.isInteger(decidedAtN) || decidedAtN < 1 || decidedAtN > n) fail(`decided requires decidedAtN to be an integer in [1, n=${n}], got ${decidedAtN}`);
121
- } else {
122
- if (decidedAtN !== void 0) fail(`decidedAtN=${decidedAtN} is set while decided=false`);
123
- if (wealth >= params.threshold) fail(`wealth ${wealth} ≥ threshold ${params.threshold} while decided=false; decided latches at the first crossing`);
124
- }
125
- return resume;
126
- }
127
- export { eProcess as t };
128
-
129
- //# sourceMappingURL=sequential-eprocess-C1YLwFaz.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sequential-eprocess-C1YLwFaz.js","names":[],"sources":["../src/statistics/sequential-eprocess.ts"],"sourcesContent":["import { ValidationError } from '../errors'\n\n// ── Anytime-valid e-process (betting test-martingale) ────────────────\n\nexport interface EProcessOptions {\n /** Type-I error budget. The process decides when wealth ≥ 1/alpha\n * (Ville's inequality). Default 0.05. */\n alpha?: number\n /** Truncation bound on the predictable bet λ ∈ [0, maxBet]. Must satisfy\n * maxBet < 1/nullMean so every wealth factor stays strictly positive.\n * Default 0.5. */\n maxBet?: number\n /** The null boundary m₀ for H0: E[x] ≤ m₀ on x ∈ [0,1]. Default 0.5\n * (the paired-delta encoding x = (d+1)/2 maps \"no effect\" to 1/2).\n * A pre-registered minEffect shifts this — see `sequentialPairedGate`. */\n nullMean?: number\n /** Continue a process from a `state()` snapshot taken before a restart.\n * The snapshot never supplies the parameters: `alpha`, `maxBet`, and\n * `nullMean` resolve from this options object exactly as for a fresh\n * process, and a snapshot recorded under different parameters is refused\n * (`ValidationError`) — re-deciding the same stream under new parameters\n * would reopen optional stopping. A snapshot whose fields are not\n * mutually consistent (tampered or truncated) is refused the same way. */\n resume?: EProcessState\n}\n\nexport interface EProcessStep {\n /** Current wealth W_n — the e-value against H0 after n observations. */\n wealth: number\n /** Observations consumed so far. */\n n: number\n /** True from the first n where W_n ≥ 1/alpha onward (sticky). */\n decided: boolean\n}\n\n/**\n * Complete snapshot of an e-process. Together with the parameters it is\n * sufficient to continue the process after a restart: `sumX` and `varSum`\n * are the running sums the next bet is computed from, so a process rebuilt\n * from a snapshot produces the same wealth sequence and decision as one that\n * was never interrupted. Plain data: a JSON round-trip preserves it\n * (`decidedAtN` is undefined, and therefore omitted, until decided).\n */\nexport interface EProcessState extends EProcessStep {\n alpha: number\n maxBet: number\n nullMean: number\n /** The decision boundary 1/alpha. */\n threshold: number\n /** Observation count at the first threshold crossing; undefined until decided. */\n decidedAtN?: number\n /** Σ x_i over the n observations consumed. */\n sumX: number\n /** Σ (x_i − μ̂_i)² over the n observations consumed, μ̂_i the shrunk running\n * mean after observation i. */\n varSum: number\n}\n\nexport interface EProcess {\n /** Consume one observation x ∈ [0,1]. Throws on non-finite / out-of-range\n * input — a silent clamp would corrupt the type-I guarantee. */\n update(x: number): EProcessStep\n state(): EProcessState\n}\n\n/**\n * Betting test-martingale for bounded observations — the e-process core of\n * anytime-valid sequential testing (Waudby-Smith & Ramdas, \"Estimating means\n * of bounded random variables by betting\", JRSS-B 2024).\n *\n * Observations x_i ∈ [0,1]; H0: E[x] ≤ m₀ (`nullMean`, default 1/2). Wealth\n *\n * W_t = Π_{i≤t} (1 + λ_i (x_i − m₀)), W_0 = 1\n *\n * with the truncated GROW-style plug-in bet computed from PRIOR observations:\n *\n * λ_i = clamp((μ̂_{i−1} − m₀) / (σ̂²_{i−1} + (μ̂_{i−1} − m₀)²), 0, maxBet)\n *\n * where μ̂/σ̂² are the shrunk running estimates μ̂_t = (1/2 + Σx_i)/(t+1),\n * σ̂²_t = (1/4 + Σ(x_i − μ̂_i)²)/(t+1).\n *\n * PREDICTABILITY INVARIANT (load-bearing): λ_i is a function of x_1..x_{i−1}\n * ONLY — it may never see x_i. With λ_i ≥ 0 predictable, each factor has\n * E[1 + λ_i(x_i − m₀) | past] ≤ 1 under H0, so W is a nonnegative\n * supermartingale and Ville's inequality gives P(∃t: W_t ≥ 1/α) ≤ α — the\n * type-I guarantee holds at ANY data-dependent stopping time. λ_1 is always 0\n * (no prior evidence), so the first observation never moves wealth.\n *\n * `decided` latches at the first crossing W_t ≥ 1/α and never un-latches;\n * wealth keeps updating after the crossing (the e-process remains valid), but\n * the decision time is the first crossing.\n */\nexport function eProcess(opts: EProcessOptions = {}): EProcess {\n const alpha = opts.alpha ?? 0.05\n const maxBet = opts.maxBet ?? 0.5\n const nullMean = opts.nullMean ?? 0.5\n if (!Number.isFinite(alpha) || alpha <= 0 || alpha >= 1) {\n throw new ValidationError(`eProcess: alpha must be in (0,1), got ${alpha}`)\n }\n if (!Number.isFinite(nullMean) || nullMean <= 0 || nullMean >= 1) {\n throw new ValidationError(`eProcess: nullMean must be in (0,1), got ${nullMean}`)\n }\n if (!Number.isFinite(maxBet) || maxBet <= 0 || maxBet >= 1 / nullMean) {\n throw new ValidationError(\n `eProcess: maxBet must be in (0, 1/nullMean=${(1 / nullMean).toFixed(4)}) so wealth ` +\n `factors stay positive, got ${maxBet}`,\n )\n }\n const threshold = 1 / alpha\n let wealth = 1\n let n = 0\n let decided = false\n let decidedAtN: number | undefined\n // Running sums over observations consumed so far — read BEFORE folding in\n // the next x, so every bet is predictable.\n let sumX = 0\n let varSum = 0\n if (opts.resume !== undefined) {\n const r = assertResumable(opts.resume, { alpha, maxBet, nullMean, threshold })\n wealth = r.wealth\n n = r.n\n decided = r.decided\n decidedAtN = r.decidedAtN\n sumX = r.sumX\n varSum = r.varSum\n }\n return {\n update(x: number): EProcessStep {\n if (typeof x !== 'number' || !Number.isFinite(x) || x < 0 || x > 1) {\n throw new ValidationError(\n `eProcess: observation must be a finite number in [0,1], got ${x}`,\n )\n }\n // λ from prior observations ONLY — x has not touched sumX/varSum yet.\n const muPrev = (0.5 + sumX) / (n + 1)\n const varPrev = (0.25 + varSum) / (n + 1)\n const edge = muPrev - nullMean\n const lambda = Math.min(maxBet, Math.max(0, edge / (varPrev + edge * edge)))\n wealth *= 1 + lambda * (x - nullMean)\n n += 1\n sumX += x\n const muNow = (0.5 + sumX) / (n + 1)\n varSum += (x - muNow) ** 2\n if (!decided && wealth >= threshold) {\n decided = true\n decidedAtN = n\n }\n return { wealth, n, decided }\n },\n state(): EProcessState {\n return { wealth, n, decided, alpha, maxBet, nullMean, threshold, decidedAtN, sumX, varSum }\n },\n }\n}\n\ninterface ResolvedEProcessParameters {\n alpha: number\n maxBet: number\n nullMean: number\n threshold: number\n}\n\n/**\n * Refuse a snapshot that was not produced by an e-process with exactly these\n * parameters, or whose fields cannot all be true at once. Every check names\n * the field, so a refused restart reports what disagrees.\n */\nfunction assertResumable(resume: EProcessState, params: ResolvedEProcessParameters): EProcessState {\n const fail = (detail: string): never => {\n throw new ValidationError(`eProcess: cannot resume — ${detail}`)\n }\n if (typeof resume !== 'object' || resume === null) {\n fail(`resume must be an EProcessState object, got ${String(resume)}`)\n }\n for (const key of ['alpha', 'maxBet', 'nullMean', 'threshold'] as const) {\n if (resume[key] !== params[key]) {\n fail(\n `snapshot ${key}=${resume[key]} differs from the process ${key}=${params[key]}; ` +\n 'a snapshot continues only the process it was taken from',\n )\n }\n }\n const { wealth, n, decided, decidedAtN, sumX, varSum } = resume\n if (!Number.isInteger(n) || n < 0) fail(`n must be a non-negative integer, got ${n}`)\n if (!Number.isFinite(wealth) || wealth <= 0) {\n fail(`wealth must be a finite positive number, got ${wealth}`)\n }\n if (!Number.isFinite(sumX) || sumX < 0 || sumX > n) {\n fail(`sumX must lie in [0, n=${n}] for observations in [0,1], got ${sumX}`)\n }\n if (!Number.isFinite(varSum) || varSum < 0) {\n fail(`varSum must be a finite non-negative number, got ${varSum}`)\n }\n if (typeof decided !== 'boolean') fail(`decided must be a boolean, got ${String(decided)}`)\n if (n === 0 && (wealth !== 1 || sumX !== 0 || varSum !== 0 || decided)) {\n fail('n=0 requires wealth=1, sumX=0, varSum=0, decided=false')\n }\n if (decided) {\n if (\n decidedAtN === undefined ||\n !Number.isInteger(decidedAtN) ||\n decidedAtN < 1 ||\n decidedAtN > n\n ) {\n fail(`decided requires decidedAtN to be an integer in [1, n=${n}], got ${decidedAtN}`)\n }\n } else {\n if (decidedAtN !== undefined) {\n fail(`decidedAtN=${decidedAtN} is set while decided=false`)\n }\n if (wealth >= params.threshold) {\n fail(\n `wealth ${wealth} ≥ threshold ${params.threshold} while decided=false; ` +\n 'decided latches at the first crossing',\n )\n }\n }\n return resume\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"statistical-heldout-C-tgpUuu.d.ts","names":["_$__evidence_receipt0.EvidenceReceipt"],"sources":["../src/statistics/paired-binary.ts","../src/statistics/sequential-eprocess.ts","../src/experiment/final-evidence.ts","../src/attestation.ts","../src/experiment/evidence-receipt.ts","../src/experiment/campaign-evidence.ts","../src/pareto.ts","../src/campaign/gates/promotion-policy.ts","../src/campaign/gates/power-preflight.ts","../src/arm-populations.ts","../src/paired-arms.ts","../src/pre-registration.ts","../src/campaign/gates/sequential.ts","../src/campaign/gates/statistical-heldout.ts"],"mappings":";;;;;;;UAgBiB;;EAEf;;EAEA;;EAEA;;;;;;;;;;;;iBAac,OAAO,mBAAmB,WAAW,sBAAoB;;UA2DxD;;EAEf;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;;;;;;;;;;;;;iBAec,QACd,SAAS,6BACT,WAAW,8BACV;;UAmBc;;EAEf;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;;;;;;;;;;;;;;;;;iBAmBc,qBACd,SAAS,6BACT,WAAW,6BACX,sBACC;;;;UAkCc;;EAEf;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgCc,0BACd,SAAS,6BACT,WAAW,6BACX,sBACC;;;UAyEc;;EAEf;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA8Dc,0BACd,SAAS,6BACT,WAAW,6BACX,sBACC;;;;;;;;;;;iBA6Ga,QAAQ,WAAW,WAAW;UChhB7B;;;EAGf;;;;EAIA;;;;EAIA;;;;;;;;EAQA,SAAS;;UAGM;;EAEf;;EAEA;;EAEA;;;;;;;;;;UAWe,sBAAsB;EACrC;EACA;EACA;;EAEA;;EAEA;;EAEA;;;EAGA;;UAGe;;;EAGf,OAAO,YAAY;EACnB,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA8BK,SAAS,OAAM,kBAAuB;cCnFhD,mBAAiB,EAAA;;;;;;GAQZ,EAAA,KAAA;;KAGC,2BAA2B,EAAE,aAAa;cAEhD,mBAAiB,EAAA;;;GAKZ,EAAA,KAAA;KAEC,2BAA2B,EAAE,aAAa;UAgCrC;EACf,aAAa;EACb,iBAAiB;EACjB;IAAY,aAAa;IAA0B,WAAW;;;KAGpD,qBAAqB;EAC3B;EAAiB,OAAO;;EACxB;EAAkB;IAAS;IAA8C;;;UAE9D;EACf,QACE,OAAO,2BACN,QAAQ;IAAuB,QAAQ;IAAqB;;EAC/D,OACE,mBACA,aAAa,2BACZ,QAAQ;IAAuB,QAAQ;IAAqB;;EAC/D,QAAQ,QAAQ,qBAAqB;;;cAI1B,2BAA2B;WAE3B;EAAA,YAAA,8CACT;;;cAQS,mCAAmC;EAClC,YAAA;;;iBA+HE,wBAAwB;EAAW;IAAiB;;;;;;;;;;;;;;;;;;;;;cCvMvD;UAEI;;EAEf,eAAe;;EAEf;;;EAGA;;EAEA;;EAEA;;;EAGA;;UAGe;;EAEf;EACA,YAAY;EACZ,kBAAkB;;EAElB;;UAGe;EACf;;EAEA;;;;;;;;iBAiBc,OAAO,iBAAiB,YAAY,wBAAwB;;;;;;;;;;iBAoB5D,kBACd,iBACA,UAAU,iBACT;cC1EG;;cAGA;KAQM,gCAAgC;UAS3B;WACN,MAAM;;WAEN;;UAGM;WACN,sBAAsB;;WAEtB;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;WACA,WAAW;;WAEX;;WAEA;;UAGM;WACN,SAAS;WACT,aAAa;;UAGP;WACN;WACA;;UAGM,mCAAmC,KAAK;;;;;;;iBAQzC,sBACd,OAAO,4BACP,YAAY,wBACX;;;;;iBA4Ba,sBAAsB,SAAS,kBAAkB;;;;;;iBAkCjD,sBAAsB,SAAS;;KCjJnC,0BAA0B,KACpC;EAOI,YAAY,KAAK;;;iBAGP,8BAA8B,UAAU,UAAU,GAAG;EACnE,UAAU,eAAe,GAAG;EAC5B,SAAS;EACT,SAAS;IAAAA;;;;;;;;;;;;;;;;KCPC;UAEK,UAAU;;EAEzB;EACA,WAAW;EACX,QAAQ,WAAW;;UAGJ,aAAa;EAC5B,UAAU;EACV,WAAW;;EAEX,cAAc;IAAQ,WAAW;IAAG,WAAW;;;;iBAIjC,UAAU,GAAG,GAAG,GAAG,GAAG,GAAG,YAAY,UAAU;;;;;;iBAmB/C,eAAe,GAAG,YAAY,KAAK,YAAY,UAAU,OAAO,aAAa;;;KCxBjF;EAAoB;;EAAwB;EAAmB;;UAE1D;;EAEf;EACA,QAAQ;;;EAGR,WAAW;;;;EAIX;;;;EAIA;;;;;EAKA;;;;KAKU;UAEK;EACf;EACA,QAAQ;EACR,WAAW;;;;;;;;EAQX,WAAW;;;;;EAKX;;;EAGA;IAAM;IAAa;;;EAEnB,mBAAmB;;EAEnB,SAAS;;;EAGT;;EAEA;EACA;EACA,gBAAgB;EAChB;EACA;EACA,SAAS;;UAGM;;EAEf,MAAM;;;EAGN;;;EAGA;IAAQ;IAAmB;;;;;;KAMjB,mBAAmB,IAAI,mBAAmB;UAErC;;;;EAIf;;EAEA;;EAEA;;EAEA;;;EAGA;;;;;;;;iBASc,oBAAoB,WAAW,kBAAkB,UAC/D,KAAK,YAAY,WAAW,YAC5B,YAAY,sBACZ,OAAM,6BACL;;;;;;cAkIU,cAAc;UA+EV,sCAAsC;;EAErD,YAAY;;;EAGZ,SAAS;;EAET;;;;;;;iBAQc,uBAAuB,qBAAqB,kBAAkB,WAAW,UACvF,SAAS,gCACR,KAAK,WAAW;;;;;;;;;;;;;;;UCzVF;;EAEf;;;EAGA;;EAEA;;EAEA;;;;EAIA;;UAGe;;EAEf;;EAEA;;EAEA;;EAEA;;EAEA;;;EAGA;;;EAGA;EACA;EACA;;EAEA;;EAEA;;;iBAYc,eAAe,MAAM,wBAAwB;;UC5D5C;EACf;EACA;EACA;EACA,YAAY;;UAEG;EACf;EACA;EACA;EACA;;EAEA;EACA,SAAS;IAAiB;IAAW;IAAiB;IAAoB;;;UAE3D;EACf;EACA,aAAa;EACb;EACA;IAAa;IAAgB;IAAmB;;EAChD,YAAY;EACZ,UAAU;;;;UCoBK;;;EAGf;;;;;EAKA;;EAEA;;EAEA;;EAEA;IAAc;IAAwB;;;EAEtC,YAAY;;EAEZ,UAAU;;UAGK;;EAEf;;EAEA;;;UAIe;EACf;;;;EAIA;EACA,UAAU;EACV,WAAW;;UAGI;;EAEf,OAAO;;;EAGP,kBAAkB;;EAElB,mBAAmB;;;;;;;;;;;;;;;;;;;;iBAqBL,SAAS,eAAe,gBAAgB,MAAM,kBAAkB;;UA8G/D;;EAEf;;EAEA;;EAEA,SAAS;;EAET,gBAAgB;;;UAID;EACf;;EAEA;;EAEA;;EAEA;;EAEA;;;;EAIA,aAAa;;EAEb;IAAY;IAAW;;;UAGR,iCAAiC;;EAEhD,uBAAuB;;;;EAIvB;;EAEA,YAAY;;UAGG;;EAEf,iBAAiB;EACjB;EACA;EACA;;;EAGA,aAAa;EACb,cAAc;;;;;;;;;;;;;;;;;;iBAmBA,kBACd,eAAe,gBACf,MAAM,2BACL;UAsEc;EACf;EACA;EACA,UAAU;EACV,WAAW;;UAGI;EACf,OAAO;EACP,kBAAkB;EAClB,mBAAmB;;;;;;;;;iBAeL,eACd,uBAAuB,aACvB,wBAAwB,cACvB;;;;;;;;;;;;;;UCzXc;EACf;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;EACA;;;KAIU;UAEK,uBAAuB;;EAEtC;;EAEA,MAAM;;UAGS;EACf,UAAU;EACV;EACA;EACA;;;EAGA;;EAEA,kBAAkB;EAGlB;;;;;;;;;;;;;;;;;iBAkBoB,SAAS,GAAG,KAAK,IAAI;;;;;iBAQ3B,sBAAsB,UAAU;;;;;;iBAc1B,aAAa,GAAG,qBAAqB,QAAQ;;;;;iBAS7C,eAAe,GAAG,iBAAiB;KCtE7C;UAEK;EACf,UAAU;;EAEV;;EAEA;;;EAGA;;UAGe;;;EAGf;;;;EAIA;;;EAGA;;EAEA;;;;EAIA;;;EAGA;;;;EAIA,8BAA8B;;;EAG9B,kBAAkB;;EAElB;;;;;;;EAOA,SAAS;;;;;;KAOC,wBAAwB;EAAkB,UAAU;;UAE/C,qBAAqB,qBAAqB,kBAAkB,WAAW,kBAC9E,KAAK,WAAW;;;;;;;;;;EAUxB,QAAQ,gBAAgB;;;EAGxB,SAAS;;;;;;;;;;;;;;;;;iBAuPK,qBAAqB,qBAAqB,kBAAkB,WAAW,UACrF,SAAS,8BACR,qBAAqB,WAAW;UA6GlB;;EAEf;;EAEA;;EAEA;;EAEA;;UAGe;GACd;IAAQ,SAAS;;IAAyB;IAAe;;;EAE1D,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;iBA0BK,iBAAiB,UAAS,0BAA+B;UC9dxD;;EAEf;;EAEA;;EAEA;;;;;;;;;;;;;iBA4Ec,YACd,WAAW,YAAY,eAAe,cACtC,UAAU,YAAY,eAAe,cACrC,aAAa,aACb,SAAS,GAAG,oCACX;UAkEc;EACf,QAAQ;;;;;;;;;;;;EAYR,WAAW;;;;EAIX,iBAAiB;;;;;;;EAOjB,UAAU;;EAEV,mBAAmB;;EAEnB,SAAS;;;;EAIT;;EAEA;;EAEA;EACA;;EAEA;;EAEA;;EAEA,gBAAgB;;EAEhB;;;;EAIA;;EAEA;;UAGe;EACf;EACA;EACA;EACA;;EAEA;EACA;;EAEA,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA6BhB,oBACd,QAAQ,eACR,OAAM,6BACL;UA2Ec;EACf;;;EAGA,WAAW;;;;EAIX;;EAEA;IAAM;IAAa;;;EAEnB,mBAAmB;;EAEnB,SAAS;;EAET;;;;EAIA;EACA;EACA;EACA;EACA;;EAEA;EACA;;EAEA;;EAEA;;;;;;;;;;iBAkBc,qBACd,WAAW,YAAY,eAAe,cACtC,UAAU,YAAY,eAAe,cACrC,aAAa,aACb,8BACA;EACE;EACA;EACA;EACA;;;EAGA;EACA,8BAA8B;EAC9B;IAED"}