@tangle-network/agent-eval 1.0.21 → 1.0.23

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 (167) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/dist/adapters/http.d.ts +2 -2
  3. package/dist/{agent-profile-Dngk3LZ0.js → agent-profile-4j6f2n-x.js} +4 -4
  4. package/dist/agent-profile-4j6f2n-x.js.map +1 -0
  5. package/dist/{agent-profile-BO8ruI6R.d.ts → agent-profile-C80hNPYb.d.ts} +5 -5
  6. package/dist/{agent-profile-BO8ruI6R.d.ts.map → agent-profile-C80hNPYb.d.ts.map} +1 -1
  7. package/dist/analyst/index.d.ts +11 -11
  8. package/dist/analyst/index.js +1 -1
  9. package/dist/{analyze-runs-jLTRKuoK.js → analyze-runs-BCSHzqna.js} +2 -2
  10. package/dist/{analyze-runs-jLTRKuoK.js.map → analyze-runs-BCSHzqna.js.map} +1 -1
  11. package/dist/{analyze-runs-DYYe18Gw.d.ts → analyze-runs-DbHQHvDC.d.ts} +4 -4
  12. package/dist/{analyze-runs-DYYe18Gw.d.ts.map → analyze-runs-DbHQHvDC.d.ts.map} +1 -1
  13. package/dist/app-grade/index.d.ts +3 -3
  14. package/dist/{benchmark-command-CoNndRCk.js → benchmark-command-DkUpd9Q6.js} +2 -2
  15. package/dist/{benchmark-command-CoNndRCk.js.map → benchmark-command-DkUpd9Q6.js.map} +1 -1
  16. package/dist/benchmarks/index.d.ts +5 -5
  17. package/dist/benchmarks/index.js +2 -2
  18. package/dist/campaign/index.d.ts +6 -6
  19. package/dist/campaign/index.js +7 -7
  20. package/dist/{campaign-Bl07uIaf.js → campaign-D00Tbey-.js} +10 -10
  21. package/dist/{campaign-Bl07uIaf.js.map → campaign-D00Tbey-.js.map} +1 -1
  22. package/dist/{campaign-evidence-NtH29ctt.js → campaign-evidence-CVNKiK0q.js} +2 -2
  23. package/dist/{campaign-evidence-NtH29ctt.js.map → campaign-evidence-CVNKiK0q.js.map} +1 -1
  24. package/dist/cli.js +6 -6
  25. package/dist/contract/index.d.ts +10 -10
  26. package/dist/contract/index.js +7 -8
  27. package/dist/contract/index.js.map +1 -1
  28. package/dist/{default-registry-aPvwtzEM.d.ts → default-registry-CjgRr-l7.d.ts} +7 -7
  29. package/dist/{default-registry-aPvwtzEM.d.ts.map → default-registry-CjgRr-l7.d.ts.map} +1 -1
  30. package/dist/{define-agent-eval-Bx3b9B01.d.ts → define-agent-eval-BQBwKHwF.d.ts} +7 -7
  31. package/dist/{define-agent-eval-Bx3b9B01.d.ts.map → define-agent-eval-BQBwKHwF.d.ts.map} +1 -1
  32. package/dist/{define-agent-eval-BROmIwn1.js → define-agent-eval-BV16x8C0.js} +7 -7
  33. package/dist/{define-agent-eval-BROmIwn1.js.map → define-agent-eval-BV16x8C0.js.map} +1 -1
  34. package/dist/diagnosis/index.d.ts +2 -2
  35. package/dist/diagnosis/index.js +1 -1
  36. package/dist/{engine-BF8naBn7.d.ts → engine-s3t6uYH9.d.ts} +2 -2
  37. package/dist/{engine-BF8naBn7.d.ts.map → engine-s3t6uYH9.d.ts.map} +1 -1
  38. package/dist/{eval-campaign-Dq8DEKmy.js → eval-campaign-DpkToY_w.js} +2 -2
  39. package/dist/eval-campaign-DpkToY_w.js.map +1 -0
  40. package/dist/{evaluation-CFKj_IlJ.d.ts → evaluation-DRgHKEVV.d.ts} +4 -4
  41. package/dist/{evaluation-CFKj_IlJ.d.ts.map → evaluation-DRgHKEVV.d.ts.map} +1 -1
  42. package/dist/evaluation.d.ts +1 -1
  43. package/dist/{exact-types-VAFjtOQN.d.ts → exact-types-DTlZSygs.d.ts} +2 -2
  44. package/dist/{exact-types-VAFjtOQN.d.ts.map → exact-types-DTlZSygs.d.ts.map} +1 -1
  45. package/dist/experiment/index.d.ts +2 -2
  46. package/dist/experiment/index.js +2 -2
  47. package/dist/{feedback-trajectory-DTj8eVTR.d.ts → feedback-trajectory-DrKk79NU.d.ts} +3 -3
  48. package/dist/{feedback-trajectory-DTj8eVTR.d.ts.map → feedback-trajectory-DrKk79NU.d.ts.map} +1 -1
  49. package/dist/hosted/index.js +1 -1
  50. package/dist/{index-BlTbxHlY.d.ts → index-DAnkXnwF.d.ts} +3 -3
  51. package/dist/{index-BlTbxHlY.d.ts.map → index-DAnkXnwF.d.ts.map} +1 -1
  52. package/dist/{index-DfqAy8ct.d.ts → index-DLZp90hM.d.ts} +8 -8
  53. package/dist/{index-DfqAy8ct.d.ts.map → index-DLZp90hM.d.ts.map} +1 -1
  54. package/dist/{index-7tWvC0aW.d.ts → index-DZ_aqB7v.d.ts} +23 -179
  55. package/dist/index-DZ_aqB7v.d.ts.map +1 -0
  56. package/dist/{index-DFso1b2W.d.ts → index-DjrXBogW.d.ts} +9 -9
  57. package/dist/{index-DFso1b2W.d.ts.map → index-DjrXBogW.d.ts.map} +1 -1
  58. package/dist/{index-CM12lr9E.d.ts → index-DtX456kD.d.ts} +6 -6
  59. package/dist/{index-CM12lr9E.d.ts.map → index-DtX456kD.d.ts.map} +1 -1
  60. package/dist/{index-B62BaRzH.d.ts → index-DwscLCQX.d.ts} +2 -2
  61. package/dist/{index-B62BaRzH.d.ts.map → index-DwscLCQX.d.ts.map} +1 -1
  62. package/dist/index.d.ts +25 -25
  63. package/dist/index.js +14 -13
  64. package/dist/index.js.map +1 -1
  65. package/dist/{llm-judge-C813vmpc.js → llm-judge-Cbh7OHaO.js} +7 -7
  66. package/dist/{llm-judge-C813vmpc.js.map → llm-judge-Cbh7OHaO.js.map} +1 -1
  67. package/dist/{matrix-C-GxIgeJ.d.ts → matrix-8NhGDcmi.d.ts} +2 -2
  68. package/dist/{matrix-C-GxIgeJ.d.ts.map → matrix-8NhGDcmi.d.ts.map} +1 -1
  69. package/dist/meta-eval/index.d.ts +2 -2
  70. package/dist/{mint-yF51iBgY.js → mint-Ck92efNo.js} +2 -2
  71. package/dist/{mint-yF51iBgY.js.map → mint-Ck92efNo.js.map} +1 -1
  72. package/dist/multishot/golden/index.d.ts +1 -1
  73. package/dist/multishot/index.d.ts +2 -2
  74. package/dist/openapi.json +1 -1
  75. package/dist/paired-promotion-power-D03cUj9E.js +289 -0
  76. package/dist/paired-promotion-power-D03cUj9E.js.map +1 -0
  77. package/dist/{pareto-fJZg8pXm.js → pareto-UzjB3ZBk.js} +5 -288
  78. package/dist/pareto-UzjB3ZBk.js.map +1 -0
  79. package/dist/{prime-protocol-D1NkJRuD.d.ts → prime-protocol-CKxq_-cx.d.ts} +2 -2
  80. package/dist/{prime-protocol-D1NkJRuD.d.ts.map → prime-protocol-CKxq_-cx.d.ts.map} +1 -1
  81. package/dist/{promotion-gate-Da0xV4sa.d.ts → promotion-gate-HDtliGsh.d.ts} +3 -3
  82. package/dist/{promotion-gate-Da0xV4sa.d.ts.map → promotion-gate-HDtliGsh.d.ts.map} +1 -1
  83. package/dist/{registry-BAcEbzKm.d.ts → registry-BnenKvxM.d.ts} +3 -3
  84. package/dist/{registry-BAcEbzKm.d.ts.map → registry-BnenKvxM.d.ts.map} +1 -1
  85. package/dist/{release-confidence-DGtuPDxJ.js → release-confidence-B4Xxdpmn.js} +2 -2
  86. package/dist/{release-confidence-DGtuPDxJ.js.map → release-confidence-B4Xxdpmn.js.map} +1 -1
  87. package/dist/reporting.d.ts +4 -4
  88. package/dist/reporting.js +2 -2
  89. package/dist/{researcher-CSlc84Bp.d.ts → researcher-DEpedkOZ.d.ts} +4 -4
  90. package/dist/{researcher-CSlc84Bp.d.ts.map → researcher-DEpedkOZ.d.ts.map} +1 -1
  91. package/dist/{reward-ST4PXNXF.d.ts → reward-ap_R9mCH.d.ts} +2 -2
  92. package/dist/{reward-ST4PXNXF.d.ts.map → reward-ap_R9mCH.d.ts.map} +1 -1
  93. package/dist/{reward-hacking-C9hPVT0Q.d.ts → reward-hacking-CIdVwVe4.d.ts} +2 -2
  94. package/dist/{reward-hacking-C9hPVT0Q.d.ts.map → reward-hacking-CIdVwVe4.d.ts.map} +1 -1
  95. package/dist/rl.d.ts +8 -8
  96. package/dist/rl.js +5 -5
  97. package/dist/rollout/index.d.ts +3 -3
  98. package/dist/rollout/index.js +2 -2
  99. package/dist/{rollout-DKa54qer.js → rollout-DWl3Gg6A.js} +2 -2
  100. package/dist/{rollout-DKa54qer.js.map → rollout-DWl3Gg6A.js.map} +1 -1
  101. package/dist/{rubric-predictive-validity-B3RzbwOx.d.ts → rubric-predictive-validity-Bbi88Aut.d.ts} +2 -2
  102. package/dist/{rubric-predictive-validity-B3RzbwOx.d.ts.map → rubric-predictive-validity-Bbi88Aut.d.ts.map} +1 -1
  103. package/dist/{run-record-CFbnkE1K.js → run-record-DTTx9Ktr.js} +2 -2
  104. package/dist/{run-record-CFbnkE1K.js.map → run-record-DTTx9Ktr.js.map} +1 -1
  105. package/dist/{run-record-CpLS4Uid.js → run-record-DmX_ESC5.js} +7 -5
  106. package/dist/run-record-DmX_ESC5.js.map +1 -0
  107. package/dist/{run-record-D2BFMPGl.d.ts → run-record-pBlhZizT.d.ts} +8 -8
  108. package/dist/{run-record-D2BFMPGl.d.ts.map → run-record-pBlhZizT.d.ts.map} +1 -1
  109. package/dist/search/index.d.ts +2 -2
  110. package/dist/search/index.d.ts.map +1 -1
  111. package/dist/search/index.js +2 -2
  112. package/dist/{search-kernel-CQGLbmgn.d.ts → search-kernel-CoDJ21q9.d.ts} +3 -3
  113. package/dist/{search-kernel-CQGLbmgn.d.ts.map → search-kernel-CoDJ21q9.d.ts.map} +1 -1
  114. package/dist/{search-ledger-Dk-yk5Li.js → search-ledger-9liYyZf5.js} +2 -2
  115. package/dist/{search-ledger-Dk-yk5Li.js.map → search-ledger-9liYyZf5.js.map} +1 -1
  116. package/dist/{search-shipper-Dm-_Dtvy.js → search-shipper-B6tMNx1I.js} +2 -2
  117. package/dist/{search-shipper-Dm-_Dtvy.js.map → search-shipper-B6tMNx1I.js.map} +1 -1
  118. package/dist/{search-summary-sPWiYtSl.js → search-summary-CISbbxyr.js} +2 -2
  119. package/dist/{search-summary-sPWiYtSl.js.map → search-summary-CISbbxyr.js.map} +1 -1
  120. package/dist/sequential-BCzXKQab.d.ts +246 -0
  121. package/dist/sequential-BCzXKQab.d.ts.map +1 -0
  122. package/dist/{sequential-CAksw6EU.js → sequential-Ko7T-zvu.js} +65 -28
  123. package/dist/sequential-Ko7T-zvu.js.map +1 -0
  124. package/dist/{skillopt-optimization-method-QO1nU8Kz.js → skillopt-optimization-method-B1Hkfexf.js} +4 -4
  125. package/dist/{skillopt-optimization-method-QO1nU8Kz.js.map → skillopt-optimization-method-B1Hkfexf.js.map} +1 -1
  126. package/dist/{statistical-heldout-CvOwNqt9.d.ts → statistical-heldout-e2hbqDui.d.ts} +4 -4
  127. package/dist/{statistical-heldout-CvOwNqt9.d.ts.map → statistical-heldout-e2hbqDui.d.ts.map} +1 -1
  128. package/dist/{store-tool-spans-B3z_Qb5u.d.ts → store-tool-spans-mlmGj6n3.d.ts} +5 -5
  129. package/dist/{store-tool-spans-B3z_Qb5u.d.ts.map → store-tool-spans-mlmGj6n3.d.ts.map} +1 -1
  130. package/dist/{summary-report-DyZquTaH.d.ts → summary-report-DsiORzPc.d.ts} +3 -3
  131. package/dist/{summary-report-DyZquTaH.d.ts.map → summary-report-DsiORzPc.d.ts.map} +1 -1
  132. package/dist/{systemone-DVk-Crtu.d.ts → systemone-B93onE_a.d.ts} +7 -7
  133. package/dist/{systemone-DVk-Crtu.d.ts.map → systemone-B93onE_a.d.ts.map} +1 -1
  134. package/dist/{systemone-review-CToBl1oa.d.ts → systemone-review-BIggseLt.d.ts} +2 -2
  135. package/dist/{systemone-review-CToBl1oa.d.ts.map → systemone-review-BIggseLt.d.ts.map} +1 -1
  136. package/dist/systemone.d.ts +3 -3
  137. package/dist/{tool-groups-R5RO9OHn.d.ts → tool-groups-CCiATVZw.d.ts} +3 -3
  138. package/dist/tool-groups-CCiATVZw.d.ts.map +1 -0
  139. package/dist/{trace-questions-BY6taxnl.d.ts → trace-questions-B7lkyOlo.d.ts} +3 -3
  140. package/dist/{trace-questions-BY6taxnl.d.ts.map → trace-questions-B7lkyOlo.d.ts.map} +1 -1
  141. package/dist/trace-repair/index.d.ts +2 -2
  142. package/dist/traces.d.ts +4 -4
  143. package/dist/traces.js +2 -8
  144. package/dist/traces.js.map +1 -1
  145. package/dist/{tree-C-N2kP-8.js → tree-D2cNtu9m.js} +10 -10
  146. package/dist/tree-D2cNtu9m.js.map +1 -0
  147. package/dist/{types-BsdcSWnf.d.ts → types-3uX8odDK.d.ts} +3 -3
  148. package/dist/{types-BsdcSWnf.d.ts.map → types-3uX8odDK.d.ts.map} +1 -1
  149. package/dist/{types-kBMNdo1X.d.ts → types-Ob1blgI2.d.ts} +2 -2
  150. package/dist/{types-kBMNdo1X.d.ts.map → types-Ob1blgI2.d.ts.map} +1 -1
  151. package/dist/{types-ip2D3-Ib.d.ts → types-efIQ03Uo.d.ts} +4 -4
  152. package/dist/{types-ip2D3-Ib.d.ts.map → types-efIQ03Uo.d.ts.map} +1 -1
  153. package/dist/wire/index.d.ts +3 -3
  154. package/docs/adopt-stack.md +9 -0
  155. package/docs/eval-fixtures.md +2 -2
  156. package/docs/search-ledger.md +1 -0
  157. package/package.json +5 -5
  158. package/dist/agent-profile-Dngk3LZ0.js.map +0 -1
  159. package/dist/eval-campaign-Dq8DEKmy.js.map +0 -1
  160. package/dist/index-7tWvC0aW.d.ts.map +0 -1
  161. package/dist/pareto-fJZg8pXm.js.map +0 -1
  162. package/dist/run-record-CpLS4Uid.js.map +0 -1
  163. package/dist/sequential-B9p6uoV8.d.ts +0 -168
  164. package/dist/sequential-B9p6uoV8.d.ts.map +0 -1
  165. package/dist/sequential-CAksw6EU.js.map +0 -1
  166. package/dist/tool-groups-R5RO9OHn.d.ts.map +0 -1
  167. package/dist/tree-C-N2kP-8.js.map +0 -1
@@ -0,0 +1,246 @@
1
+ import { o as PairedPromotionDecisionOptions, t as PairedDecisionMethod } from "./paired-promotion-decision-DJU3fZxH.js";
2
+ /** A serializable law for one scalar draw. */
3
+ type PairedValueLaw = {
4
+ kind: 'point';
5
+ value: number;
6
+ } | {
7
+ kind: 'atoms';
8
+ atoms: ReadonlyArray<{
9
+ value: number;
10
+ probability: number;
11
+ }>;
12
+ } | {
13
+ kind: 'normal';
14
+ mean: number;
15
+ sd: number;
16
+ };
17
+ interface PairedPromotionAlternativeCell {
18
+ /** Probability of this cell. The cells' probabilities sum to 1. */
19
+ probability: number;
20
+ /** Pass/fail outcome of each arm in this cell. Required by every call whose
21
+ * `outcome` is `'pass'`; ignored otherwise. */
22
+ pass?: {
23
+ control: boolean;
24
+ treatment: boolean;
25
+ };
26
+ /** Law of the candidate-minus-baseline delta on the continuous scale, given
27
+ * this cell. A tie is `{ kind: 'point', value: 0 }`. */
28
+ delta: PairedValueLaw;
29
+ }
30
+ interface PairedPromotionAlternative {
31
+ /** The registered joint law: the cell is drawn first, then the delta given
32
+ * the cell, so pass/fail and delta are dependent exactly as registered. */
33
+ cells: ReadonlyArray<PairedPromotionAlternativeCell>;
34
+ /**
35
+ * Law of the control arm's value on the continuous scale; the candidate is
36
+ * control plus delta. Default `{ kind: 'point', value: 0 }`. The mean and
37
+ * median bootstraps read only the deltas, so the baseline changes nothing
38
+ * there; it matters only when a `'delta'` call infers its shape from the
39
+ * observed values (see `continuous` on {@link PairedPromotionDecisionOptions}).
40
+ */
41
+ baseline?: PairedValueLaw;
42
+ }
43
+ interface PairedPromotionPowerCall {
44
+ /** What the call reads from each simulated pair: `'delta'` gives it
45
+ * `(control, control + delta)` on the continuous scale, `'pass'` gives it
46
+ * each arm's pass/fail as `0` or `options.binaryScale ?? 1`. */
47
+ outcome: 'delta' | 'pass';
48
+ /** The call's options, exactly as the caller will run it. `minPairs`
49
+ * defaults to the simulated n, the value a gate seals; a caller-supplied
50
+ * value is kept, and one above n refuses every simulation. A `'pass'` call
51
+ * must declare `binaryScale`: the simulation never declares one on the
52
+ * caller's behalf, because a declared scale routes an all-zero sample to
53
+ * the score interval where an inferred one refuses it. */
54
+ options: PairedPromotionDecisionOptions;
55
+ }
56
+ interface PairedPromotionPowerOptions {
57
+ /** Total paired episodes, ties included. */
58
+ n: number;
59
+ alternative: PairedPromotionAlternative;
60
+ /** Every call must return `promote: true` for a simulation to count as a
61
+ * promotion. At least one call. */
62
+ calls: ReadonlyArray<PairedPromotionPowerCall>;
63
+ /** Simulated data sets. Default 1000. */
64
+ simulations?: number;
65
+ /** PRNG seed for the simulated draws (not the bootstrap's seed, which each
66
+ * call carries in its own options). Default 1. */
67
+ seed?: number;
68
+ }
69
+ interface PairedPromotionCallRates {
70
+ outcome: 'delta' | 'pass';
71
+ /** Fraction of simulations in which this call alone promoted. */
72
+ promote: number;
73
+ /** Fractions of simulations in which each refusal channel fired. */
74
+ insufficient: number;
75
+ indeterminate: number;
76
+ exactTestVetoes: number;
77
+ /** Fraction in which the call was sufficient, determinate, not vetoed, and
78
+ * still did not clear its threshold. */
79
+ hold: number;
80
+ /** Fraction of simulations decided by each method; the regime the call
81
+ * actually ran in at this n. */
82
+ methods: Partial<Record<PairedDecisionMethod, number>>;
83
+ }
84
+ interface PairedPromotionPowerResult {
85
+ n: number;
86
+ simulations: number;
87
+ seed: number;
88
+ /** Fraction of simulations in which every call promoted: the joint power. */
89
+ power: number;
90
+ /** Monte Carlo standard error of `power`. */
91
+ standardError: number;
92
+ /** Wilson 95% interval on `power`. */
93
+ low: number;
94
+ high: number;
95
+ /** Fraction in which at least one call refused (insufficient, indeterminate
96
+ * or vetoed); the rest of the non-promotions are holds. */
97
+ refuse: number;
98
+ hold: number;
99
+ /** Per-call rates, in the order the calls were supplied. */
100
+ calls: PairedPromotionCallRates[];
101
+ }
102
+ interface RequiredPairsForPairedPromotionOptions {
103
+ /** Target joint power. Default 0.8. */
104
+ target?: number;
105
+ alternative: PairedPromotionAlternative;
106
+ calls: ReadonlyArray<PairedPromotionPowerCall>;
107
+ /** Smallest n to consider. Default 1. */
108
+ minPairs?: number;
109
+ /** Largest n to consider; the scan stops there with `n: null` if the target
110
+ * is never reached. Default 200. */
111
+ maxPairs?: number;
112
+ simulations?: number;
113
+ seed?: number;
114
+ }
115
+ interface RequiredPairsForPairedPromotionResult {
116
+ target: number;
117
+ /** First n scanned whose estimated joint power reaches the target, or null
118
+ * when no n up to `maxPairs` does. Descriptive only: power is not monotone
119
+ * in n on the exact and discrete routes, the scan reads one noisy estimate
120
+ * per n, and the first crossing of many is biased low. Read the curve. */
121
+ n: number | null;
122
+ /**
123
+ * The conservative choice, which a preregistration should prefer: the first
124
+ * scanned n whose Wilson lower bound reaches the target AND whose
125
+ * independent confirmation (a second simulation at that n on a fresh seed,
126
+ * `confirmation` below) also has its lower bound at or above the target. The
127
+ * confirmation is what keeps the 95 % coverage: a scan over many n gives
128
+ * Monte Carlo noise many chances to push one bound across, so the scan's own
129
+ * bound selects a candidate and never certifies it. Never set while `n` is
130
+ * null. Null when not reached by `maxPairs`.
131
+ */
132
+ nAtLowerBound: number | null;
133
+ /** The independent simulation at `nAtLowerBound`; null when not reached. */
134
+ confirmation: PairedPromotionPowerResult | null;
135
+ /** Every n scanned, in order, with its scan estimate; candidates whose
136
+ * confirmation failed are in `rejected`. The scan stops at `nAtLowerBound`
137
+ * when that is reached, else at `maxPairs`. */
138
+ curve: PairedPromotionPowerResult[];
139
+ /** Candidates the scan's bound selected and the confirmation refused. */
140
+ rejected: PairedPromotionPowerResult[];
141
+ }
142
+ /**
143
+ * Joint power of the configured calls at `n` under the registered alternative:
144
+ * the fraction of simulated data sets on which every call promotes.
145
+ */
146
+ declare function pairedPromotionPower(options: PairedPromotionPowerOptions): PairedPromotionPowerResult;
147
+ /**
148
+ * First n at which {@link pairedPromotionPower} reaches the target, scanning
149
+ * every n from `minPairs` upward. Both the point-estimate answer and the
150
+ * confirmed lower-bound answer are returned; the scan runs until the latter is
151
+ * reached (so the curve past `n` is retained) or `maxPairs` is exhausted. A
152
+ * candidate selected by the scan's bound is certified only by an independent
153
+ * simulation at that n on a different seed; a candidate that fails it is
154
+ * recorded and the scan continues.
155
+ */
156
+ declare function requiredPairsForPairedPromotion(options: RequiredPairsForPairedPromotionOptions): RequiredPairsForPairedPromotionResult;
157
+ type SequentialDecision = 'promote_now' | 'continue' | 'reject_now' | 'equivalent';
158
+ interface PairedEvalueOptions {
159
+ bound?: number;
160
+ alpha?: number;
161
+ rope?: {
162
+ low: number;
163
+ high: number;
164
+ };
165
+ initialBetShrinkage?: number;
166
+ }
167
+ interface PairedEvalueStep {
168
+ t: number;
169
+ delta: number;
170
+ evalue: number;
171
+ pValue: number;
172
+ csLow: number;
173
+ csHigh: number;
174
+ decision: SequentialDecision;
175
+ }
176
+ interface PairedEvalueSequence {
177
+ steps: PairedEvalueStep[];
178
+ finalDecision: SequentialDecision;
179
+ decisionFiredAt: number | null;
180
+ clipped: boolean;
181
+ }
182
+ declare function pairedEvalueSequence(deltas: number[], opts?: PairedEvalueOptions): PairedEvalueSequence;
183
+ interface SequentialCrossingHorizonOptions extends Pick<PairedEvalueOptions, 'alpha' | 'bound' | 'initialBetShrinkage'> {
184
+ maxPairs?: number;
185
+ }
186
+ interface SequentialCrossingHorizon {
187
+ readonly evidencePairs: number | null;
188
+ readonly decisionPairs: number | null;
189
+ readonly evidenceThreshold: number;
190
+ readonly decisionThreshold: number;
191
+ readonly maxPairs: number;
192
+ }
193
+ declare function sequentialCrossingHorizon(opts?: SequentialCrossingHorizonOptions): SequentialCrossingHorizon;
194
+ interface InterimReleaseConfidenceInput {
195
+ deltaSeries: Array<{
196
+ candidateId: string;
197
+ deltas: number[];
198
+ }>;
199
+ alpha?: number;
200
+ bound?: number;
201
+ rope?: {
202
+ low: number;
203
+ high: number;
204
+ };
205
+ }
206
+ interface InterimReleaseConfidence {
207
+ candidates: Array<{
208
+ candidateId: string;
209
+ decision: SequentialDecision;
210
+ decisionFiredAt: number | null;
211
+ finalEvalue: number;
212
+ finalPValue: number;
213
+ pairs: number;
214
+ csLow: number;
215
+ csHigh: number;
216
+ }>;
217
+ recommendation: {
218
+ decision: SequentialDecision;
219
+ candidateId: string | null;
220
+ };
221
+ }
222
+ declare function evaluateInterimReleaseConfidence(input: InterimReleaseConfidenceInput): InterimReleaseConfidence;
223
+ interface SequentialPairedPowerOptions {
224
+ alpha?: number;
225
+ bound: number;
226
+ power?: number;
227
+ alternative: PairedValueLaw;
228
+ maxPairs?: number;
229
+ trials?: number;
230
+ seed?: number;
231
+ }
232
+ interface SequentialPairedPower {
233
+ capForPower: number | null;
234
+ decisionRateByCap: Array<{
235
+ cap: number;
236
+ rate: number;
237
+ lower95: number;
238
+ }>;
239
+ realized: {
240
+ mean: number;
241
+ sd: number;
242
+ };
243
+ }
244
+ declare function sequentialPairedPower(opts: SequentialPairedPowerOptions): SequentialPairedPower;
245
+ export { requiredPairsForPairedPromotion as C, pairedPromotionPower as S, PairedPromotionPowerOptions as _, PairedEvalueStep as a, RequiredPairsForPairedPromotionOptions as b, SequentialDecision as c, sequentialCrossingHorizon as d, sequentialPairedPower as f, PairedPromotionPowerCall as g, PairedPromotionCallRates as h, PairedEvalueSequence as i, evaluateInterimReleaseConfidence as l, PairedPromotionAlternativeCell as m, InterimReleaseConfidenceInput as n, SequentialCrossingHorizon as o, PairedPromotionAlternative as p, PairedEvalueOptions as r, SequentialCrossingHorizonOptions as s, InterimReleaseConfidence as t, pairedEvalueSequence as u, PairedPromotionPowerResult as v, RequiredPairsForPairedPromotionResult as x, PairedValueLaw as y };
246
+ //# sourceMappingURL=sequential-BCzXKQab.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sequential-BCzXKQab.d.ts","names":[],"sources":["../src/paired-promotion-power.ts","../src/sequential.ts"],"mappings":";;KA8CY;EACN;EAAe;;EACf;EAAe,OAAO;IAAgB;IAAe;;;EACrD;EAAgB;EAAc;;UAEnB;;EAEf;;;EAGA;IAAS;IAAkB;;;;EAG3B,OAAO;;UAGQ;;;EAGf,OAAO,cAAc;;;;;;;;EAQrB,WAAW;;UAGI;;;;EAIf;;;;;;;EAOA,SAAS;;UAGM;;EAEf;EACA,aAAa;;;EAGb,OAAO,cAAc;;EAErB;;;EAGA;;UAGe;EACf;;EAEA;;EAEA;EACA;EACA;;;EAGA;;;EAGA,SAAS,QAAQ,OAAO;;UAGT;EACf;EACA;EACA;;EAEA;;EAEA;;EAEA;EACA;;;EAGA;EACA;;EAEA,OAAO;;UAGQ;;EAEf;EACA,aAAa;EACb,OAAO,cAAc;;EAErB;;;EAGA;EACA;EACA;;UAGe;EACf;;;;;EAKA;;;;;;;;;;;EAWA;;EAEA,cAAc;;;;EAId,OAAO;;EAEP,UAAU;;;;;;iBAOI,qBACd,SAAS,8BACR;;;;;;;;;;iBA4Fa,gCACd,SAAS,yCACR;KCrRS;UAEK;EACf;EACA;EACA;IAAS;IAAa;;EACtB;;UAGe;EACf;EACA;EACA;EACA;EACA;EACA;EACA,UAAU;;UAGK;EACf,OAAO;EACP,eAAe;EACf;EACA;;iBAGc,qBACd,kBACA,OAAM,sBACL;UAiEc,yCACP,KAAK;EACb;;UAGe;WACN;WACA;WACA;WACA;WACA;;iBAKK,0BACd,OAAM,mCACL;UAmCc;EACf,aAAa;IAAQ;IAAqB;;EAC1C;EACA;EACA;IAAS;IAAa;;;UAGP;EACf,YAAY;IACV;IACA,UAAU;IACV;IACA;IACA;IACA;IACA;IACA;;EAEF;IAAkB,UAAU;IAAoB;;;iBAGlC,iCACd,OAAO,gCACN;UAwCc;EACf;EACA;EACA;EACA,aAAa;EACb;EACA;EACA;;UAGe;EACf;EACA,mBAAmB;IAAQ;IAAa;IAAc;;EACtD;IAAY;IAAc;;;iBAGZ,sBAAsB,MAAM,+BAA+B"}
@@ -1,13 +1,7 @@
1
+ import { w as wilson } from "./statistics-CvvC-MPv.js";
2
+ import { t as mulberry32 } from "./random-DrzcgC7F.js";
3
+ import { t as drawValue } from "./paired-promotion-power-D03cUj9E.js";
1
4
  // src/sequential.ts
2
- /**
3
- * Run the paired e-value sequence over an in-order delta stream.
4
- *
5
- * Use for *streaming* / interim analyses: pass the deltas you have so
6
- * far, get the verdict at every prefix length. The decision is
7
- * monotone-stable in the sense that once `'reject_now'` or `'promote_now'`
8
- * fires, the verdict at later steps remains decisive (the e-value is a
9
- * non-negative martingale; once it crosses the threshold, it's crossed).
10
- */
11
5
  function pairedEvalueSequence(deltas, opts = {}) {
12
6
  const c = opts.bound ?? 1;
13
7
  const alpha = opts.alpha ?? .05;
@@ -69,12 +63,6 @@ function pairedEvalueSequence(deltas, opts = {}) {
69
63
  };
70
64
  }
71
65
  const MAX_SEQUENTIAL_CROSSING_PAIRS = 1e6;
72
- /**
73
- * Compute the minimum pair count at which even perfect, all-at-bound data can
74
- * reach the evidence and decision thresholds. The calculation intentionally
75
- * calls the canonical sequence implementation rather than maintaining a
76
- * second approximation that can drift from its bet schedule.
77
- */
78
66
  function sequentialCrossingHorizon(opts = {}) {
79
67
  const bound = opts.bound ?? 1;
80
68
  const alpha = opts.alpha ?? .05;
@@ -98,12 +86,6 @@ function sequentialCrossingHorizon(opts = {}) {
98
86
  maxPairs
99
87
  });
100
88
  }
101
- /**
102
- * Run interim sequential analyses across many candidates at once,
103
- * preserving the time-uniform α guarantee for each candidate's series and
104
- * synthesising a campaign-level recommendation. Designed to be called on
105
- * every campaign tick — the recommendation is anytime-valid.
106
- */
107
89
  function evaluateInterimReleaseConfidence(input) {
108
90
  const candidates = input.deltaSeries.map((s) => {
109
91
  const seq = pairedEvalueSequence(s.deltas, {
@@ -154,6 +136,66 @@ function evaluateInterimReleaseConfidence(input) {
154
136
  }
155
137
  };
156
138
  }
139
+ const MAX_SEQUENTIAL_POWER_PAIRS = 1e4;
140
+ const MAX_SEQUENTIAL_POWER_TRIALS = 1e4;
141
+ function sequentialPairedPower(opts) {
142
+ const alpha = opts.alpha ?? .05;
143
+ const power = opts.power ?? .8;
144
+ const maxPairs = opts.maxPairs ?? 256;
145
+ const trials = opts.trials ?? 200;
146
+ const seed = opts.seed ?? 1;
147
+ assertSequentialScalarConfiguration(opts.bound, alpha, .5, "sequentialPairedPower");
148
+ if (!Number.isFinite(power) || power <= 0 || power >= 1) throw new Error(`sequentialPairedPower: power must be in (0,1), got ${power}`);
149
+ if (!Number.isSafeInteger(maxPairs) || maxPairs < 1 || maxPairs > MAX_SEQUENTIAL_POWER_PAIRS) throw new Error(`sequentialPairedPower: maxPairs must be a safe integer in [1, ${MAX_SEQUENTIAL_POWER_PAIRS}]`);
150
+ if (!Number.isSafeInteger(trials) || trials < 1 || trials > MAX_SEQUENTIAL_POWER_TRIALS) throw new Error(`sequentialPairedPower: trials must be a safe integer in [1, ${MAX_SEQUENTIAL_POWER_TRIALS}]`);
151
+ if (!Number.isFinite(seed)) throw new Error(`sequentialPairedPower: seed must be finite, got ${seed}`);
152
+ if (opts.alternative.kind === "atoms" && opts.alternative.atoms.length === 0) throw new Error("sequentialPairedPower: atoms must be non-empty");
153
+ const rng = mulberry32(seed);
154
+ const bound = opts.bound;
155
+ let sum = 0;
156
+ let sumSq = 0;
157
+ const firedAt = new Array(trials);
158
+ for (let trial = 0; trial < trials; trial++) {
159
+ const deltas = new Array(maxPairs);
160
+ for (let i = 0; i < maxPairs; i++) {
161
+ const raw = drawValue(opts.alternative, rng);
162
+ if (!Number.isFinite(raw)) throw new Error("sequentialPairedPower: alternative produced a non-finite draw");
163
+ const clipped = Math.max(-bound, Math.min(bound, raw));
164
+ deltas[i] = clipped;
165
+ sum += clipped;
166
+ sumSq += clipped * clipped;
167
+ }
168
+ const sequence = pairedEvalueSequence(deltas, {
169
+ alpha,
170
+ bound
171
+ });
172
+ firedAt[trial] = sequence.decisionFiredAt ?? maxPairs + 1;
173
+ }
174
+ const n = trials * maxPairs;
175
+ const mean = sum / n;
176
+ const sd = Math.sqrt(Math.max(0, sumSq / n - mean * mean));
177
+ const decisionRateByCap = [];
178
+ let capForPower = null;
179
+ for (let cap = 1; cap <= maxPairs; cap++) {
180
+ let hits = 0;
181
+ for (let trial = 0; trial < trials; trial++) if (firedAt[trial] <= cap) hits += 1;
182
+ const interval = wilson(hits, trials);
183
+ decisionRateByCap.push({
184
+ cap,
185
+ rate: interval.estimate,
186
+ lower95: interval.lower
187
+ });
188
+ if (capForPower === null && interval.lower >= power) capForPower = cap;
189
+ }
190
+ return {
191
+ capForPower,
192
+ decisionRateByCap,
193
+ realized: {
194
+ mean,
195
+ sd
196
+ }
197
+ };
198
+ }
157
199
  function assertSequentialScalarConfiguration(bound, alpha, initialBetShrinkage, context) {
158
200
  if (!Number.isFinite(bound) || bound <= 0) throw new Error(`${context}: bound must be a finite number > 0`);
159
201
  if (!Number.isFinite(alpha) || alpha <= 0 || alpha >= 1) throw new Error(`${context}: alpha must be a finite number in (0,1)`);
@@ -165,11 +207,6 @@ function sequentialThresholds(alpha) {
165
207
  decisionThreshold: 2 / alpha
166
208
  };
167
209
  }
168
- /**
169
- * Empirical Bernstein confidence sequence on the mean of bounded variables.
170
- * Adapted from Howard et al. (2021) §4.4. Provides a time-uniform CI on
171
- * the running mean; valid at every stopping time.
172
- */
173
210
  function empiricalBernsteinCs(sum, sumSq, n, bound, alpha) {
174
211
  if (n === 0) return {
175
212
  low: -bound,
@@ -184,6 +221,6 @@ function empiricalBernsteinCs(sum, sumSq, n, bound, alpha) {
184
221
  high: mean + radius
185
222
  };
186
223
  }
187
- export { pairedEvalueSequence as n, sequentialCrossingHorizon as r, evaluateInterimReleaseConfidence as t };
224
+ export { sequentialPairedPower as i, pairedEvalueSequence as n, sequentialCrossingHorizon as r, evaluateInterimReleaseConfidence as t };
188
225
 
189
- //# sourceMappingURL=sequential-CAksw6EU.js.map
226
+ //# sourceMappingURL=sequential-Ko7T-zvu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sequential-Ko7T-zvu.js","names":[],"sources":["../src/sequential.ts"],"sourcesContent":["import { drawValue, type PairedValueLaw } from './paired-promotion-power'\nimport { wilson } from './statistics/paired-binary'\nimport { mulberry32 } from './statistics/random'\n\nexport type SequentialDecision = 'promote_now' | 'continue' | 'reject_now' | 'equivalent'\n\nexport interface PairedEvalueOptions {\n bound?: number\n alpha?: number\n rope?: { low: number; high: number }\n initialBetShrinkage?: number\n}\n\nexport interface PairedEvalueStep {\n t: number\n delta: number\n evalue: number\n pValue: number\n csLow: number\n csHigh: number\n decision: SequentialDecision\n}\n\nexport interface PairedEvalueSequence {\n steps: PairedEvalueStep[]\n finalDecision: SequentialDecision\n decisionFiredAt: number | null\n clipped: boolean\n}\n\nexport function pairedEvalueSequence(\n deltas: number[],\n opts: PairedEvalueOptions = {},\n): PairedEvalueSequence {\n const c = opts.bound ?? 1\n const alpha = opts.alpha ?? 0.05\n const initialShrink = opts.initialBetShrinkage ?? 0.5\n const rope = opts.rope ?? null\n assertSequentialScalarConfiguration(c, alpha, initialShrink, 'pairedEvalueSequence')\n if (rope && !(Number.isFinite(rope.low) && Number.isFinite(rope.high) && rope.low <= rope.high)) {\n throw new Error('pairedEvalueSequence: rope must satisfy low ≤ high')\n }\n const { decisionThreshold } = sequentialThresholds(alpha)\n\n const steps: PairedEvalueStep[] = []\n let clipped = false\n let evalue = 1\n let decisionFiredAt: number | null = null\n\n let sum = 0\n let sumSq = 0\n let count = 0\n\n for (let i = 0; i < deltas.length; i++) {\n let d = deltas[i]!\n if (!Number.isFinite(d)) {\n throw new Error(`pairedEvalueSequence: delta[${i}] must be finite`)\n }\n if (d < -c || d > c) {\n d = Math.max(-c, Math.min(c, d))\n clipped = true\n }\n\n const muHat = count === 0 ? 0 : sum / count\n const varHat = count === 0 ? c * c : Math.max(1e-12, sumSq / count - muHat * muHat)\n const t = i + 1\n const shrink = initialShrink * Math.min(1, count / 32)\n let lambda = (muHat / (varHat + c * c)) * shrink\n const lambdaMax = 0.99 / c\n if (lambda > lambdaMax) lambda = lambdaMax\n if (lambda < -lambdaMax) lambda = -lambdaMax\n\n evalue = evalue * (1 + lambda * d)\n if (!Number.isFinite(evalue) || evalue < 0) evalue = 0\n\n sum += d\n sumSq += d * d\n count += 1\n\n const pValue = Math.min(1, 1 / Math.max(evalue, 1e-300))\n\n const cs = empiricalBernsteinCs(sum, sumSq, count, c, alpha)\n\n let decision: SequentialDecision = 'continue'\n if (rope && cs.low >= rope.low && cs.high <= rope.high) decision = 'equivalent'\n else if (evalue >= decisionThreshold && muHat > 0) decision = 'promote_now'\n else if (evalue >= decisionThreshold && muHat < 0) decision = 'reject_now'\n else if (rope && cs.high < rope.low) decision = 'reject_now'\n\n if (decision !== 'continue' && decisionFiredAt === null) decisionFiredAt = t\n\n steps.push({ t, delta: d, evalue, pValue, csLow: cs.low, csHigh: cs.high, decision })\n }\n\n const finalDecision = steps.length === 0 ? 'continue' : steps[steps.length - 1]!.decision\n return { steps, finalDecision, decisionFiredAt, clipped }\n}\n\nexport interface SequentialCrossingHorizonOptions\n extends Pick<PairedEvalueOptions, 'alpha' | 'bound' | 'initialBetShrinkage'> {\n maxPairs?: number\n}\n\nexport interface SequentialCrossingHorizon {\n readonly evidencePairs: number | null\n readonly decisionPairs: number | null\n readonly evidenceThreshold: number\n readonly decisionThreshold: number\n readonly maxPairs: number\n}\n\nconst MAX_SEQUENTIAL_CROSSING_PAIRS = 1_000_000\n\nexport function sequentialCrossingHorizon(\n opts: SequentialCrossingHorizonOptions = {},\n): SequentialCrossingHorizon {\n const bound = opts.bound ?? 1\n const alpha = opts.alpha ?? 0.05\n const initialBetShrinkage = opts.initialBetShrinkage ?? 0.5\n const maxPairs = opts.maxPairs ?? 10_000\n assertSequentialScalarConfiguration(\n bound,\n alpha,\n initialBetShrinkage,\n 'sequentialCrossingHorizon',\n )\n if (!Number.isSafeInteger(maxPairs) || maxPairs < 1) {\n throw new Error('sequentialCrossingHorizon: maxPairs must be a positive safe integer')\n }\n if (maxPairs > MAX_SEQUENTIAL_CROSSING_PAIRS) {\n throw new Error(\n `sequentialCrossingHorizon: maxPairs must be <= ${MAX_SEQUENTIAL_CROSSING_PAIRS}`,\n )\n }\n const sequence = pairedEvalueSequence(Array<number>(maxPairs).fill(bound), {\n bound,\n alpha,\n initialBetShrinkage,\n })\n const { evidenceThreshold, decisionThreshold } = sequentialThresholds(alpha)\n const evidencePairs = sequence.steps.find((step) => step.evalue >= evidenceThreshold)?.t ?? null\n return Object.freeze({\n evidencePairs,\n decisionPairs: sequence.decisionFiredAt,\n evidenceThreshold,\n decisionThreshold,\n maxPairs,\n })\n}\n\nexport interface InterimReleaseConfidenceInput {\n deltaSeries: Array<{ candidateId: string; deltas: number[] }>\n alpha?: number\n bound?: number\n rope?: { low: number; high: number }\n}\n\nexport interface InterimReleaseConfidence {\n candidates: Array<{\n candidateId: string\n decision: SequentialDecision\n decisionFiredAt: number | null\n finalEvalue: number\n finalPValue: number\n pairs: number\n csLow: number\n csHigh: number\n }>\n recommendation: { decision: SequentialDecision; candidateId: string | null }\n}\n\nexport function evaluateInterimReleaseConfidence(\n input: InterimReleaseConfidenceInput,\n): InterimReleaseConfidence {\n const candidates = input.deltaSeries.map((s) => {\n const seq = pairedEvalueSequence(s.deltas, {\n alpha: input.alpha,\n bound: input.bound,\n rope: input.rope,\n })\n const last = seq.steps[seq.steps.length - 1]\n return {\n candidateId: s.candidateId,\n decision: seq.finalDecision,\n decisionFiredAt: seq.decisionFiredAt,\n finalEvalue: last?.evalue ?? 1,\n finalPValue: last?.pValue ?? 1,\n pairs: seq.steps.length,\n csLow: last?.csLow ?? Number.NEGATIVE_INFINITY,\n csHigh: last?.csHigh ?? Number.POSITIVE_INFINITY,\n }\n })\n\n const promote = candidates.find((c) => c.decision === 'promote_now')\n if (promote)\n return {\n candidates,\n recommendation: { decision: 'promote_now', candidateId: promote.candidateId },\n }\n const live = candidates.find((c) => c.decision === 'continue')\n if (live) return { candidates, recommendation: { decision: 'continue', candidateId: null } }\n const equiv = candidates.find((c) => c.decision === 'equivalent')\n if (equiv)\n return {\n candidates,\n recommendation: { decision: 'equivalent', candidateId: equiv.candidateId },\n }\n return { candidates, recommendation: { decision: 'reject_now', candidateId: null } }\n}\n\nconst MAX_SEQUENTIAL_POWER_PAIRS = 10_000\nconst MAX_SEQUENTIAL_POWER_TRIALS = 10_000\n\nexport interface SequentialPairedPowerOptions {\n alpha?: number\n bound: number\n power?: number\n alternative: PairedValueLaw\n maxPairs?: number\n trials?: number\n seed?: number\n}\n\nexport interface SequentialPairedPower {\n capForPower: number | null\n decisionRateByCap: Array<{ cap: number; rate: number; lower95: number }>\n realized: { mean: number; sd: number }\n}\n\nexport function sequentialPairedPower(opts: SequentialPairedPowerOptions): SequentialPairedPower {\n const alpha = opts.alpha ?? 0.05\n const power = opts.power ?? 0.8\n const maxPairs = opts.maxPairs ?? 256\n const trials = opts.trials ?? 200\n const seed = opts.seed ?? 1\n assertSequentialScalarConfiguration(opts.bound, alpha, 0.5, 'sequentialPairedPower')\n if (!Number.isFinite(power) || power <= 0 || power >= 1) {\n throw new Error(`sequentialPairedPower: power must be in (0,1), got ${power}`)\n }\n if (!Number.isSafeInteger(maxPairs) || maxPairs < 1 || maxPairs > MAX_SEQUENTIAL_POWER_PAIRS) {\n throw new Error(\n `sequentialPairedPower: maxPairs must be a safe integer in [1, ${MAX_SEQUENTIAL_POWER_PAIRS}]`,\n )\n }\n if (!Number.isSafeInteger(trials) || trials < 1 || trials > MAX_SEQUENTIAL_POWER_TRIALS) {\n throw new Error(\n `sequentialPairedPower: trials must be a safe integer in [1, ${MAX_SEQUENTIAL_POWER_TRIALS}]`,\n )\n }\n if (!Number.isFinite(seed)) {\n throw new Error(`sequentialPairedPower: seed must be finite, got ${seed}`)\n }\n if (opts.alternative.kind === 'atoms' && opts.alternative.atoms.length === 0) {\n throw new Error('sequentialPairedPower: atoms must be non-empty')\n }\n const rng = mulberry32(seed)\n const bound = opts.bound\n let sum = 0\n let sumSq = 0\n const firedAt = new Array<number>(trials)\n for (let trial = 0; trial < trials; trial++) {\n const deltas = new Array<number>(maxPairs)\n for (let i = 0; i < maxPairs; i++) {\n const raw = drawValue(opts.alternative, rng)\n if (!Number.isFinite(raw)) {\n throw new Error('sequentialPairedPower: alternative produced a non-finite draw')\n }\n const clipped = Math.max(-bound, Math.min(bound, raw))\n deltas[i] = clipped\n sum += clipped\n sumSq += clipped * clipped\n }\n const sequence = pairedEvalueSequence(deltas, { alpha, bound })\n firedAt[trial] = sequence.decisionFiredAt ?? maxPairs + 1\n }\n const n = trials * maxPairs\n const mean = sum / n\n const sd = Math.sqrt(Math.max(0, sumSq / n - mean * mean))\n const decisionRateByCap: SequentialPairedPower['decisionRateByCap'] = []\n let capForPower: number | null = null\n for (let cap = 1; cap <= maxPairs; cap++) {\n let hits = 0\n for (let trial = 0; trial < trials; trial++) if (firedAt[trial]! <= cap) hits += 1\n const interval = wilson(hits, trials)\n decisionRateByCap.push({ cap, rate: interval.estimate, lower95: interval.lower })\n if (capForPower === null && interval.lower >= power) capForPower = cap\n }\n return { capForPower, decisionRateByCap, realized: { mean, sd } }\n}\n\nfunction assertSequentialScalarConfiguration(\n bound: number,\n alpha: number,\n initialBetShrinkage: number,\n context: string,\n): void {\n if (!Number.isFinite(bound) || bound <= 0) {\n throw new Error(`${context}: bound must be a finite number > 0`)\n }\n if (!Number.isFinite(alpha) || alpha <= 0 || alpha >= 1) {\n throw new Error(`${context}: alpha must be a finite number in (0,1)`)\n }\n if (\n !Number.isFinite(initialBetShrinkage) ||\n initialBetShrinkage <= 0 ||\n initialBetShrinkage > 1\n ) {\n throw new Error(`${context}: initialBetShrinkage must be a finite number in (0,1]`)\n }\n}\n\nfunction sequentialThresholds(alpha: number): {\n evidenceThreshold: number\n decisionThreshold: number\n} {\n return { evidenceThreshold: 1 / alpha, decisionThreshold: 2 / alpha }\n}\n\nfunction empiricalBernsteinCs(\n sum: number,\n sumSq: number,\n n: number,\n bound: number,\n alpha: number,\n): { low: number; high: number } {\n if (n === 0) return { low: -bound, high: bound }\n const mean = sum / n\n const variance = Math.max(0, sumSq / n - mean * mean)\n const psi = Math.log(2 / alpha) + 1.7 * Math.log(Math.log(Math.max(Math.E, n)) + 1)\n const radius = Math.sqrt((2 * variance * psi) / n) + (3 * bound * psi) / n\n return { low: mean - radius, high: mean + radius }\n}\n"],"mappings":"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"}
@@ -4,13 +4,13 @@ import { t as decidePairedPromotion } from "./paired-promotion-decision-Bi9__RQS
4
4
  import { a as heldoutSignificance, o as pairHoldout } from "./statistical-heldout-DLO4Ebos.js";
5
5
  import { d as mapConcurrent } from "./journal-CTX5uK-n.js";
6
6
  import { n as contentHash, t as canonicalJson } from "./verdict-cache-BVH-fl18.js";
7
- import { $ as resolveRunDir, C as surfaceDiff, G as assertIndependentEvaluationSplit, J as exposeFinalEvidence, K as captureFinalEvidencePolicy, R as captureJudge, T as assertSearchHistoryAdmissionOptions, Y as reserveFinalEvidence, Z as runCampaign, b as SearchRecorder, c as readGepaCandidatePopulationArtifact, d as optimizationTokenUsageFromSummary, l as combineComparisonCosts, o as executeOptimizationMethod, q as evaluationUnitMap, s as assertGepaCandidatePopulationSummary, u as costFromLedgerSummary, w as surfaceNode, x as developmentClaim } from "./llm-judge-C813vmpc.js";
8
- import { D as assertCompleteCampaign, T as assertCampaignDesign, f as campaignBreakdown, t as createCampaignEvidenceReceipt } from "./campaign-evidence-NtH29ctt.js";
7
+ import { $ as resolveRunDir, C as surfaceDiff, G as assertIndependentEvaluationSplit, J as exposeFinalEvidence, K as captureFinalEvidencePolicy, R as captureJudge, T as assertSearchHistoryAdmissionOptions, Y as reserveFinalEvidence, Z as runCampaign, b as SearchRecorder, c as readGepaCandidatePopulationArtifact, d as optimizationTokenUsageFromSummary, l as combineComparisonCosts, o as executeOptimizationMethod, q as evaluationUnitMap, s as assertGepaCandidatePopulationSummary, u as costFromLedgerSummary, w as surfaceNode, x as developmentClaim } from "./llm-judge-Cbh7OHaO.js";
8
+ import { D as assertCompleteCampaign, T as assertCampaignDesign, f as campaignBreakdown, t as createCampaignEvidenceReceipt } from "./campaign-evidence-CVNKiK0q.js";
9
9
  import { t as deepFreezeCanonicalJson } from "./deep-freeze-CK8-2W7p.js";
10
10
  import { M as fsCampaignStorage, _ as resolveExternalOptimizerCallbackLimits, d as assertExternalOptimizerModelBudget, f as assertJsonValue, g as removeCredentialEnvironment, h as isExternalTextCandidate, i as startExternalOptimizerModelProxy, j as createRunCostLedger, m as isCandidateText, n as closeExternalOptimizerResources, p as assertNoCredentialValues, r as runWithCleanup, t as runExternalOptimizerProcess, v as resolveExternalOptimizerProcessLimits, y as safePathComponent } from "./external-optimizer-subprocess-_C_2yriN.js";
11
11
  import { s as surfaceContentHash } from "./json-recovery-DK4MDm5r.js";
12
12
  import { r as summarizeEvaluationUnits, t as defineEvaluationClaim } from "./claim-Dod_mjk3.js";
13
- import { n as openSearchLedger } from "./search-ledger-Dk-yk5Li.js";
13
+ import { n as openSearchLedger } from "./search-ledger-9liYyZf5.js";
14
14
  import { t as acquireSingleRunLock } from "./single-run-lock-CUj2tjxT.js";
15
15
  import { n as isRecord } from "./json-DtvZNAU9.js";
16
16
  import { c as combineAbortSignals, f as assertServedModelPolicy } from "./llm-client-DMMSg-Ro.js";
@@ -3223,4 +3223,4 @@ async function finishSkillOptRun(context, result, outputDir, modelProxy) {
3223
3223
  }
3224
3224
  export { importExternalEvaluations as a, composeGate as c, readExternalOptimizerObservationArtifact as d, externalSurface as i, externalTextOptimizationMethod as l, compareOptimizationMethods as n, importGepaPopulation as o, gepaOptimizationMethod as r, heldOutGate as s, skillOptOptimizationMethod as t, decodeExternalTextCandidate as u };
3225
3225
 
3226
- //# sourceMappingURL=skillopt-optimization-method-QO1nU8Kz.js.map
3226
+ //# sourceMappingURL=skillopt-optimization-method-B1Hkfexf.js.map