peeksafe 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/CHANGELOG.md +325 -0
  2. package/LICENSE +190 -0
  3. package/NOTICE +78 -0
  4. package/README.md +490 -2
  5. package/RESEARCH-NOTES.md +274 -0
  6. package/dist/baseline.d.ts +45 -0
  7. package/dist/baseline.d.ts.map +1 -0
  8. package/dist/baseline.js +49 -0
  9. package/dist/baseline.js.map +1 -0
  10. package/dist/check.d.ts +64 -0
  11. package/dist/check.d.ts.map +1 -0
  12. package/dist/check.js +172 -0
  13. package/dist/check.js.map +1 -0
  14. package/dist/cluster.d.ts +328 -0
  15. package/dist/cluster.d.ts.map +1 -0
  16. package/dist/cluster.js +606 -0
  17. package/dist/cluster.js.map +1 -0
  18. package/dist/errors.d.ts +108 -0
  19. package/dist/errors.d.ts.map +1 -0
  20. package/dist/errors.js +192 -0
  21. package/dist/errors.js.map +1 -0
  22. package/dist/evidence.d.ts +15 -0
  23. package/dist/evidence.d.ts.map +1 -0
  24. package/dist/evidence.js +30 -0
  25. package/dist/evidence.js.map +1 -0
  26. package/dist/frontier.d.ts +271 -0
  27. package/dist/frontier.d.ts.map +1 -0
  28. package/dist/frontier.js +505 -0
  29. package/dist/frontier.js.map +1 -0
  30. package/dist/gate.d.ts +175 -0
  31. package/dist/gate.d.ts.map +1 -0
  32. package/dist/gate.js +200 -0
  33. package/dist/gate.js.map +1 -0
  34. package/dist/index.d.ts +60 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +79 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/plan.d.ts +280 -0
  39. package/dist/plan.d.ts.map +1 -0
  40. package/dist/plan.js +626 -0
  41. package/dist/plan.js.map +1 -0
  42. package/dist/rand.d.ts +17 -0
  43. package/dist/rand.d.ts.map +1 -0
  44. package/dist/rand.js +104 -0
  45. package/dist/rand.js.map +1 -0
  46. package/dist/stats.d.ts +401 -0
  47. package/dist/stats.d.ts.map +1 -0
  48. package/dist/stats.js +1304 -0
  49. package/dist/stats.js.map +1 -0
  50. package/dist/stop.d.ts +164 -0
  51. package/dist/stop.d.ts.map +1 -0
  52. package/dist/stop.js +270 -0
  53. package/dist/stop.js.map +1 -0
  54. package/package.json +62 -3
  55. package/src/baseline.ts +72 -0
  56. package/src/check.ts +238 -0
  57. package/src/cluster.ts +842 -0
  58. package/src/errors.ts +275 -0
  59. package/src/evidence.ts +62 -0
  60. package/src/frontier.ts +837 -0
  61. package/src/gate.ts +363 -0
  62. package/src/index.ts +206 -0
  63. package/src/plan.ts +968 -0
  64. package/src/rand.ts +137 -0
  65. package/src/stats.ts +1663 -0
  66. package/src/stop.ts +464 -0
package/dist/plan.d.ts ADDED
@@ -0,0 +1,280 @@
1
+ /**
2
+ * plan.ts: power economics. What will this cost, and can we even detect it?
3
+ *
4
+ * Without a plan, the first sign that a suite cannot be decided is a large bill
5
+ * and no certified case. This module tells you *before* you spend anything, and it will tell you that the honest answer is
6
+ * sometimes "you cannot detect this at any price".
7
+ *
8
+ * The three numbers that matter, per case:
9
+ *
10
+ * 1. **The bar.** e-BH at FDR q over m cases certifies a case on its own only
11
+ * once its e-value clears m/q. That is the target the evidence has to hit.
12
+ *
13
+ * 2. **The ceiling.** `evidenceCeilingLogE`, the limit of the unpaired
14
+ * two-sample e-value as candidate runs go to infinity. Both marginals are
15
+ * the same binomial likelihood under different priors, so everything that
16
+ * grows with n cancels and the Bayes factor converges to the prior density
17
+ * ratio at the observed rate. If the ceiling is under the bar, no number of
18
+ * candidate runs will certify the case. This is not a budget problem and no
19
+ * budget fixes it: **more baseline runs** fix it, by sharpening the null.
20
+ *
21
+ * 3. **The paired alternative.** Re-run the baseline alongside the candidate
22
+ * on the same seed and the null becomes an exact point mass at ½ (a
23
+ * discordant pair points either way with probability exactly one half under
24
+ * "nothing changed"). Nothing is estimated, so nothing caps the evidence:
25
+ * the paired e-value grows linearly in discordant pairs. It costs two runs
26
+ * per observation and it is still, routinely, the cheaper design, and it
27
+ * is the only one that works at all for a case whose ceiling is under the
28
+ * bar.
29
+ *
30
+ * Everything here is a *plan*: it evaluates the mean trajectory (the candidate
31
+ * scores exactly its expected successes). Realised sample counts vary around
32
+ * it.
33
+ */
34
+ import { type BaselineStat, type CaseRef } from "./baseline.js";
35
+ import { type PairedCounts } from "./stats.js";
36
+ export interface PlanConfig {
37
+ /** the drop we want to be able to detect, in probability units (0.15 = 15 points) */
38
+ mde: number;
39
+ /** suite-level false discovery rate */
40
+ fdr: number;
41
+ /** USD per candidate run */
42
+ costPerRunUsd: number;
43
+ /** milliseconds per run, wall clock, at concurrency 1 */
44
+ msPerRun: number;
45
+ /** how many runs the screening pass spends per case */
46
+ screenRuns: number;
47
+ /**
48
+ * Measured coupling between the paired arms, in [0,1]. 0 means the seeds
49
+ * bought nothing; 1 means perfect common-random-numbers coupling. Measure it
50
+ * with `pairPhi` on a pilot rather than assuming it, and plan at 0 as well
51
+ * so the sensitivity is visible.
52
+ */
53
+ pairCoupling: number;
54
+ /** how many runs to fan out in parallel, only affects wall time */
55
+ concurrency: number;
56
+ /** beyond this many runs for one case we stop calling it "affordable" */
57
+ runsPerCaseCeiling: number;
58
+ /**
59
+ * Which design the *expected* bill and the screening pass are priced for. A
60
+ * paired observation is two runs, and a paired case's observation count is
61
+ * the pairs `shouldStopPaired` takes to settle it at its coupling; an
62
+ * unpaired case's is the runs `shouldStop` takes to stop it.
63
+ *
64
+ * `undefined` prices each case at its own `PlanCase.design`, and a case with
65
+ * none at the suite's `recommendedDesign`. Setting it prices every case at
66
+ * that one design.
67
+ */
68
+ design?: "unpaired" | "paired";
69
+ alpha: number;
70
+ beta: number;
71
+ minTrials: number;
72
+ maxTrials: number;
73
+ batchSize: number;
74
+ nullQuantile: number;
75
+ /**
76
+ * The `futilityConfidence` you run `shouldStop` and `shouldStopPaired` at.
77
+ * The expected bill counts the runs or pairs a case takes to stop at this
78
+ * level, so a higher one prices more. `undefined` takes the stopping rules'
79
+ * own default.
80
+ */
81
+ futilityConfidence?: number;
82
+ }
83
+ export declare const DEFAULT_PLAN: PlanConfig;
84
+ export type Detectability =
85
+ /** the unpaired sequential test can certify this case within the run ceiling */
86
+ "UNPAIRED"
87
+ /** only the paired design can certify it, the unpaired evidence ceiling is under the bar */
88
+ | "PAIRED_ONLY"
89
+ /** the run count is finite but past the ceiling: technically possible, practically not */
90
+ | "TOO_EXPENSIVE"
91
+ /** the case cannot lose `mde` points at all, its baseline rate is not that high */
92
+ | "IMPOSSIBLE";
93
+ export interface PlanCase {
94
+ caseId: string;
95
+ suite: string;
96
+ baseline: {
97
+ successes: number;
98
+ trials: number;
99
+ rate: number;
100
+ };
101
+ /** the rate the alternative sits at: baseline − mde, floored at 0 */
102
+ alternativeRate: number;
103
+ /** log of the e-value a case must reach to be certified on its own evidence */
104
+ barLogE: number;
105
+ /** the limit of the unpaired log e-value as runs → ∞ */
106
+ ceilingLogE: number;
107
+ unpaired: {
108
+ runs: number;
109
+ costUsd: number;
110
+ wallMs: number;
111
+ };
112
+ paired: {
113
+ pairs: number;
114
+ runs: number;
115
+ costUsd: number;
116
+ wallMs: number;
117
+ };
118
+ /**
119
+ * The coupling `paired` is priced at: `pairPhi` of this case's pilot when
120
+ * `makePlan` was given one, floored at 0, otherwise `config.pairCoupling`.
121
+ */
122
+ pairCoupling: number;
123
+ detectability: Detectability;
124
+ /**
125
+ * The design to run this case with: of the designs that decide it within
126
+ * `runsPerCaseCeiling`, the one that needs fewer runs, unpaired on a tie.
127
+ * Null when neither does.
128
+ */
129
+ design: "unpaired" | "paired" | null;
130
+ /**
131
+ * How many baseline runs this case would need for the *unpaired* design to
132
+ * work, or null if it already works. This is the actionable half of an
133
+ * "undetectable" verdict.
134
+ */
135
+ baselineRunsNeeded: number | null;
136
+ /** what a fixed-N two-proportion design would spend per arm, for comparison */
137
+ fixedNPerArm: number;
138
+ reason: string;
139
+ }
140
+ export interface PlanTotals {
141
+ cases: number;
142
+ /** how many cases each design can actually certify */
143
+ decidableUnpaired: number;
144
+ decidableBest: number;
145
+ /** every case run to certification, unpaired */
146
+ unpairedRuns: number;
147
+ unpairedCostUsd: number;
148
+ /** every case run to certification, paired */
149
+ pairedRuns: number;
150
+ pairedCostUsd: number;
151
+ /** per case, the cheaper of the two designs that can decide it */
152
+ bestRuns: number;
153
+ bestCostUsd: number;
154
+ /** screen everything cheaply, then pay only for what the screen keeps */
155
+ screenedRuns: number;
156
+ screenedCostUsd: number;
157
+ /** the fixed-N design with the same nominal guarantees */
158
+ fixedNRuns: number;
159
+ fixedNCostUsd: number;
160
+ wallMsUnpaired: number;
161
+ wallMsPaired: number;
162
+ wallMsBest: number;
163
+ wallMsScreened: number;
164
+ /** fraction of cases the screen is budgeted to carry through to the full test */
165
+ screenContinueFraction: number;
166
+ /**
167
+ * What one observation of the expected bill costs in runs, averaged over its
168
+ * cases: 1 when every case runs unpaired, 2 when every case is paired, and in
169
+ * between for a suite that mixes the two.
170
+ */
171
+ runsPerObservation: number;
172
+ /** expected *runs* (not observations) for a pull request in which nothing moved */
173
+ typicalRuns: number;
174
+ typicalCostUsd: number;
175
+ wallMsTypical: number;
176
+ /** the same, with a screening pass in front */
177
+ typicalScreenedRuns: number;
178
+ typicalScreenedCostUsd: number;
179
+ }
180
+ export interface Plan {
181
+ config: PlanConfig;
182
+ cases: PlanCase[];
183
+ totals: PlanTotals;
184
+ /** cases no budget can decide with the current baseline */
185
+ undecidable: PlanCase[];
186
+ /** cases only the paired design can reach */
187
+ pairedOnly: PlanCase[];
188
+ /** cases whose baseline rate is too low to lose `mde` points at all */
189
+ impossible: PlanCase[];
190
+ /**
191
+ * The design the recommendation names: paired when more than a quarter of
192
+ * the suite is `PAIRED_ONLY` or most decidable cases' own `design` is
193
+ * paired. `expectedCostUsd` prices each case at
194
+ * its own `design` and falls back to this one only for a case with none,
195
+ * unless `config.design` fixes one design for the whole suite.
196
+ */
197
+ recommendedDesign: "unpaired" | "paired";
198
+ /** the cheapest design that decides every decidable case */
199
+ recommendation: string;
200
+ /** honest one-liner about affordability at the configured cost per run */
201
+ verdict: string;
202
+ /**
203
+ * What a *typical* pull request costs, one in which nothing moved, so most
204
+ * cases stop at the H₀ wall. This is the headline number.
205
+ */
206
+ expectedCostUsd: number;
207
+ /**
208
+ * What a pull request in which *every* case regressed would cost.
209
+ *
210
+ * Not an upper bound on `expectedCostUsd`, despite running every case to
211
+ * certification: the sequential test stops a case as soon as it clears the
212
+ * bar, so an all-regressed suite can finish cheaper than one that did not
213
+ * move and ran its full schedule. `verdict` says which way round they came
214
+ * out rather than presenting this as the worst case.
215
+ */
216
+ ceilingCostUsd: number;
217
+ }
218
+ export declare function planCase(c: CaseRef, b: BaselineStat | undefined, cfg: PlanConfig, m: number): PlanCase;
219
+ /**
220
+ * Expected total samples for the sequential design, priced under Wald's
221
+ * expected sample number at a supplied "true" rate per case, and clamped into
222
+ * the gate's own [minTrials, maxTrials] batch grid.
223
+ *
224
+ * `makePlan` no longer bills from it: an unpaired case there is counted in
225
+ * the runs `shouldStop` takes, which this figure misses either way (#105).
226
+ * `samplesForEvidence`, the one behind `PlanCase.unpaired.runs`, answers a
227
+ * different question: how many runs it takes to *certify a regression*. A case
228
+ * that did not regress never gets there; it hits the H₀ wall in a few batches
229
+ * and stops. Pricing every case at the certification cost over-predicts the
230
+ * bill.
231
+ *
232
+ * `trueRate` defaults to the case's own baseline rate, i.e. "nothing moved", * which is what almost every pull request looks like.
233
+ */
234
+ export declare function expectedSequentialSamples(cases: Array<CaseRef>, baseline: Map<string, BaselineStat>, cfg: PlanConfig, trueRate?: (caseId: string, b: BaselineStat) => number): {
235
+ samples: number;
236
+ perCase: Map<string, number>;
237
+ };
238
+ type TrialGrid = Pick<PlanConfig, "minTrials" | "maxTrials" | "batchSize">;
239
+ /** Refuses a set `futilityConfidence` outside (0, 1), where the settle bar is 0 or Infinity. */
240
+ export declare function requireSettleConfidence(cfg: Pick<PlanConfig, "futilityConfidence">, where: string): void;
241
+ /**
242
+ * Expected pairs for a paired case that did not move: the first pair count at
243
+ * which `shouldStopPaired`'s settle e-value, on the mean trajectory at coupling
244
+ * `rho` and `cfg.futilityConfidence` (the stopping rule's default when unset),
245
+ * rules out a drop of `mde`, on the same batch grid as
246
+ * `expectedSequentialSamples`, and `maxTrials` when it never does. The
247
+ * unpaired SPRT figure knows nothing of this rule or of the coupling, which
248
+ * sets how often an unmoved pair disagrees.
249
+ */
250
+ export declare function expectedSettlePairs(rate: number, rho: number, mde: number, cfg: TrialGrid & Pick<PlanConfig, "futilityConfidence">): number;
251
+ /**
252
+ * Plan a suite. `pilots` holds a pair table per case from a pilot run of the
253
+ * paired design, ideally with both arms on the same revision; a case with one
254
+ * prices pairing at its measured `pairPhi` instead of `cfg.pairCoupling`, so
255
+ * its `design` is chosen from a coupling the runner actually delivers.
256
+ */
257
+ export declare function makePlan(cases: Array<CaseRef>, baseline: Map<string, BaselineStat>, cfg?: PlanConfig, pilots?: Map<string, PairedCounts>): Plan;
258
+ /**
259
+ * The suite size / MDE combinations that *are* affordable at a given per-run
260
+ * cost and budget. This is the honest answer to "is this usable for a
261
+ * coding-agent benchmark at $1 a run?", usually "not at 200 cases and 15
262
+ * points, but yes at 20 cases and 25 points".
263
+ */
264
+ export interface AffordabilityCell {
265
+ cases: number;
266
+ mde: number;
267
+ /** runs to certify every case, the ceiling */
268
+ runs: number;
269
+ costUsd: number;
270
+ /** runs a pull request that moved nothing actually spends, the expected bill */
271
+ typicalRuns: number;
272
+ typicalCostUsd: number;
273
+ /** does the *ceiling* fit the budget? */
274
+ affordable: boolean;
275
+ /** does the *expected* cost fit the budget? */
276
+ typicallyAffordable: boolean;
277
+ }
278
+ export declare function affordabilityGrid(baselineRate: number, baselineTrials: number, cfg: PlanConfig, budgetUsd: number, caseCounts?: number[], mdes?: number[]): AffordabilityCell[];
279
+ export {};
280
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"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"}