peeksafe 0.0.0-stage → 0.1.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 +146 -0
  2. package/LICENSE +190 -0
  3. package/NOTICE +78 -0
  4. package/README.md +492 -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 +598 -0
  17. package/dist/cluster.js.map +1 -0
  18. package/dist/errors.d.ts +87 -0
  19. package/dist/errors.d.ts.map +1 -0
  20. package/dist/errors.js +143 -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 +269 -0
  27. package/dist/frontier.d.ts.map +1 -0
  28. package/dist/frontier.js +460 -0
  29. package/dist/frontier.js.map +1 -0
  30. package/dist/gate.d.ts +173 -0
  31. package/dist/gate.d.ts.map +1 -0
  32. package/dist/gate.js +196 -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 +248 -0
  39. package/dist/plan.d.ts.map +1 -0
  40. package/dist/plan.js +482 -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 +92 -0
  45. package/dist/rand.js.map +1 -0
  46. package/dist/stats.d.ts +397 -0
  47. package/dist/stats.d.ts.map +1 -0
  48. package/dist/stats.js +1245 -0
  49. package/dist/stats.js.map +1 -0
  50. package/dist/stop.d.ts +163 -0
  51. package/dist/stop.d.ts.map +1 -0
  52. package/dist/stop.js +262 -0
  53. package/dist/stop.js.map +1 -0
  54. package/package.json +64 -4
  55. package/src/baseline.ts +72 -0
  56. package/src/check.ts +238 -0
  57. package/src/cluster.ts +830 -0
  58. package/src/errors.ts +208 -0
  59. package/src/evidence.ts +62 -0
  60. package/src/frontier.ts +782 -0
  61. package/src/gate.ts +358 -0
  62. package/src/index.ts +206 -0
  63. package/src/plan.ts +778 -0
  64. package/src/rand.ts +121 -0
  65. package/src/stats.ts +1579 -0
  66. package/src/stop.ts +452 -0
@@ -0,0 +1,328 @@
1
+ /**
2
+ * cluster.ts: the suite-level effect, with the cases treated as what they are.
3
+ *
4
+ * ## The bug this module exists to fix
5
+ *
6
+ * The obvious summary of a suite effect is an ordinary normal interval over the
7
+ * per-case differences:
8
+ *
9
+ * mean ± 1.96 · sd / √n with n = 200 cases
10
+ *
11
+ * That formula is only correct if the 200 numbers are 200 independent draws.
12
+ * They usually are not. A suite of **40 case files, each expanded into 5
13
+ * variants**, is typical: `extract.pricing#saas` and `extract.pricing#api`
14
+ * share a prompt template, a grader, an expectation shape and a failure mode.
15
+ * When one moves, its four siblings move with it. The effective number of
16
+ * independent observations is closer to 40 than to 200, the true standard error
17
+ * is larger than √(s²/200), and the reported interval is **too narrow**.
18
+ *
19
+ * A too-narrow interval on the headline number is the exact failure this whole
20
+ * package exists to prevent, so it gets a proper estimator rather than a fudge
21
+ * factor.
22
+ *
23
+ * ## What is estimated here, and what is not
24
+ *
25
+ * Clustering touches **only the suite-level (and family-level) summary**.
26
+ * Specifically:
27
+ *
28
+ * affected the across-case mean difference and its interval
29
+ * (`clusteredEffect`), plus any family-level roll-up.
30
+ *
31
+ * NOT affected every per-case quantity. Each case's e-value is its own
32
+ * self-contained test on that case's own runs; nothing about
33
+ * case *A* enters case *B*'s likelihood ratio. And the
34
+ * multiplicity correction is **e-BH**, which controls FDR under
35
+ * *arbitrary* dependence between the tested hypotheses, that
36
+ * is the whole reason it was chosen over BH. So `gate`'s
37
+ * verdict, its regressed cases and its thresholds are all
38
+ * bit-for-bit identical whether or not the cases cluster.
39
+ *
40
+ * In other words: clustering makes the *description* honest. It does not, and
41
+ * must not, move the *decision*.
42
+ *
43
+ * ## Two estimators, because they fail in different directions
44
+ *
45
+ * **CR2 (the headline).** A cluster-robust sandwich with the Bell-McCaffrey
46
+ * bias reduction. For the intercept-only model that a mean is, the hat matrix
47
+ * is H = J/n, so each cluster's leverage block is (I − J_{n_g}/n) and the CR2
48
+ * adjustment `A_g = (I − H_gg)^{-1/2}` collapses to a scalar on the cluster's
49
+ * residual sum:
50
+ *
51
+ * Var̂(ȳ) = (1/n²) · Σ_g (Σ_{i∈g} ê_i)² / (1 − n_g/n)
52
+ *
53
+ * Assumption-light: it needs the *families* to be independent of each other and
54
+ * nothing at all about the correlation structure *inside* a family. It does not
55
+ * assume the family effects are normal, or exchangeable, or even
56
+ * identically distributed. Paired with Bell-McCaffrey/Satterthwaite degrees of
57
+ * freedom (which, for equal-sized families, reduce exactly to G − 1; see the
58
+ * derivation in the comment above `dfRaw` below) it is the estimator you want
59
+ * when there are 40 clusters rather than 4,000.
60
+ *
61
+ * **Random effects (the cross-check).** The one-way model
62
+ * y_gi = μ + u_g + e_gi with the ANOVA (Swamy-Arora) estimators for τ² and σ².
63
+ * More efficient *if* its assumptions hold, and it yields the number that
64
+ * actually explains the width change: the intra-class correlation
65
+ * ρ = τ²/(τ² + σ²). If the two estimators disagree materially, that is itself
66
+ * information, and `compareEstimators` says so rather than picking a winner.
67
+ *
68
+ * ## The design effect
69
+ *
70
+ * `designEffect` = (clustered SE / naive iid SE)². It is the factor by which
71
+ * the naive analysis overstated its own information, "these 200 cases carry
72
+ * the information of 200/DEFF independent ones". For roughly equal families of
73
+ * size k it tracks the textbook 1 + (k − 1)ρ, which is the sanity check the
74
+ * tests assert.
75
+ */
76
+ import { type Interval } from "./stats.js";
77
+ /**
78
+ * The cluster a case belongs to: its **case file**.
79
+ *
80
+ * Variant ids are expected as `<fileId>#<variant>`, so everything before
81
+ * the first `#` is the file, and the file is the unit an author actually wrote.
82
+ * A case with no `#` is its own family of one, which is correct, not a
83
+ * degenerate case: an unexpanded case file shares its template with nobody.
84
+ */
85
+ export declare function caseFamily(caseId: string): string;
86
+ /**
87
+ * The cluster key for a case: the one it **declares**, or its case file.
88
+ *
89
+ * `caseFamily` sees exactly one reason two cases correlate, that they were
90
+ * minted from the same file, and is blind to every other: a shared grader, a
91
+ * shared fixture directory, one flaky tool that six unrelated cases happen to
92
+ * call. Those cases are correlated too, and the interval will be too narrow
93
+ * again for a reason the id cannot express. So a case may declare its own key.
94
+ *
95
+ * A wrong key is worse than no key, which is why `clusterKeyDiagnostic` ships
96
+ * alongside: declaring two genuinely independent cases into one family throws
97
+ * away real information and widens the interval for nothing, and the only way
98
+ * to know is to look at the ICC the declared grouping actually exhibits.
99
+ */
100
+ export declare const clusterKey: (c: {
101
+ id: string;
102
+ cluster?: string;
103
+ }) => string;
104
+ export interface ClusterObservation {
105
+ /** the family this observation belongs to */
106
+ cluster: string;
107
+ value: number;
108
+ }
109
+ /** Group observations by cluster, preserving first-seen order. */
110
+ export declare function groupByCluster(obs: ClusterObservation[]): Map<string, number[]>;
111
+ export interface ClusteredMean extends Interval {
112
+ /** the mean itself, same number the naive estimator reports */
113
+ point: number;
114
+ low: number;
115
+ high: number;
116
+ /** number of *cases* behind the estimate */
117
+ observations: number;
118
+ /** number of *independent* units behind the estimate, the one that matters */
119
+ clusters: number;
120
+ largestCluster: number;
121
+ meanClusterSize: number;
122
+ /** CR2 cluster-robust standard error of the mean */
123
+ se: number;
124
+ /** the iid standard error the naive interval used, s/√n */
125
+ naiveSe: number;
126
+ /** (se / naiveSe)², the factor by which the naive analysis overstated its information */
127
+ designEffect: number;
128
+ /** how much wider the honest interval is, half-width to half-width */
129
+ widthRatio: number;
130
+ /** Bell-McCaffrey / Satterthwaite degrees of freedom */
131
+ df: number;
132
+ /** the t multiplier actually used (vs `normalQuantile` for the naive one) */
133
+ tCritical: number;
134
+ /** how many independent cases this suite is *worth*, n / designEffect */
135
+ effectiveSampleSize: number;
136
+ method: "CR2";
137
+ /** set when the estimate could not be formed; `low`/`high` are then vacuous */
138
+ degenerate: string | null;
139
+ }
140
+ /** The naive iid interval, kept so the two can be printed side by side. */
141
+ export declare function iidMean(values: number[], level?: number): Interval;
142
+ /**
143
+ * CR2 cluster-robust interval for a mean, with Bell-McCaffrey degrees of
144
+ * freedom. See the module header for the derivation; the short version is that
145
+ * for an intercept-only design the whole apparatus collapses to
146
+ *
147
+ * Var̂ = (1/n²) Σ_g (Σ_{i∈g} ê_i)² / (1 − n_g/n)
148
+ *
149
+ * and the Satterthwaite df to a closed form in the cluster sizes alone.
150
+ */
151
+ export declare function clusterRobustMean(obs: ClusterObservation[], level?: number): ClusteredMean;
152
+ export interface RandomEffectsMean extends Interval {
153
+ clusters: number;
154
+ observations: number;
155
+ /** between-family variance τ̂² (ANOVA / Swamy-Arora, floored at 0) */
156
+ tauSquared: number;
157
+ /** within-family variance σ̂² */
158
+ sigmaSquared: number;
159
+ /** intra-class correlation τ̂²/(τ̂²+σ̂²), the number that explains the widening */
160
+ icc: number;
161
+ se: number;
162
+ df: number;
163
+ method: "random-effects";
164
+ degenerate: string | null;
165
+ }
166
+ /**
167
+ * One-way random-effects (hierarchical) estimate of the same mean.
168
+ *
169
+ * y_gi = μ + u_g + e_gi, u_g ~ (0, τ²), e_gi ~ (0, σ²)
170
+ *
171
+ * τ² and σ² come from the ANOVA decomposition (the Swamy-Arora estimator,
172
+ * unbiased and closed-form, and it does not need the normality that REML would
173
+ * lean on). μ̂ is the GLS weighted mean of the family means with
174
+ * w_g = 1/(τ² + σ²/n_g), so its variance is 1/Σw_g.
175
+ *
176
+ * Two properties worth knowing before trusting it:
177
+ * - at τ̂² = 0 it degenerates **exactly** to the naive iid interval, which is
178
+ * the correct behaviour: no between-family variance means the cases really
179
+ * were exchangeable;
180
+ * - it weights families by information rather than by size, so unlike the
181
+ * unweighted mean it is not the same point estimate as CR2 when families
182
+ * differ in size. That difference is a feature and it is reported.
183
+ */
184
+ export declare function randomEffectsMean(obs: ClusterObservation[], level?: number): RandomEffectsMean;
185
+ export interface FamilyEffect {
186
+ family: string;
187
+ cases: number;
188
+ /** unweighted mean of the family's per-case effects */
189
+ point: number;
190
+ /**
191
+ * Spread of the family's own cases. Deliberately **not** an interval: the
192
+ * variants inside a family are the correlated things, so an interval over
193
+ * five of them would repeat the very mistake this module fixes, one level
194
+ * down. A family of five variants is one observation, not five.
195
+ */
196
+ sd: number;
197
+ min: number;
198
+ max: number;
199
+ }
200
+ export interface ClusteredEffect {
201
+ /** the honest headline: CR2 with small-cluster degrees of freedom */
202
+ cr2: ClusteredMean;
203
+ /** the hierarchical cross-check, and where the ICC comes from */
204
+ randomEffects: RandomEffectsMean;
205
+ /** the naive iid interval, which assumes every case is independent */
206
+ naive: Interval;
207
+ /** (clustered SE / naive SE)² */
208
+ designEffect: number;
209
+ /** how much wider the honest interval is */
210
+ widthRatio: number;
211
+ icc: number;
212
+ clusters: number;
213
+ observations: number;
214
+ /** per case-file roll-up, point estimates only, and the docs say why */
215
+ families: FamilyEffect[];
216
+ /**
217
+ * True when the naive interval excluded zero and the honest one does not.
218
+ * This is the finding: a claim that "the suite moved" which does not survive
219
+ * being told that the cases are not independent.
220
+ */
221
+ signFlippedByClustering: boolean;
222
+ /** one line an operator can read without knowing what CR2 is */
223
+ headline: string;
224
+ }
225
+ /**
226
+ * The whole suite-level story in one object: the honest interval, the naive one
227
+ * it replaces, the factor between them, and whether swapping them changes what
228
+ * a reader would conclude.
229
+ */
230
+ export declare function clusteredEffect(obs: ClusterObservation[], level?: number): ClusteredEffect;
231
+ /**
232
+ * Do the two estimators tell the same story? They rest on different
233
+ * assumptions, so agreement is evidence and disagreement is a warning worth
234
+ * printing rather than resolving by fiat.
235
+ */
236
+ export declare function compareEstimators(e: ClusteredEffect): {
237
+ agree: boolean;
238
+ /** ratio of the two standard errors, robust ÷ model-based */
239
+ seRatio: number;
240
+ note: string;
241
+ };
242
+ export interface GroupingSummary {
243
+ key: string;
244
+ /** why this grouping has no estimable interval, when it has none */
245
+ degenerate: string | null;
246
+ clusters: number;
247
+ meanClusterSize: number;
248
+ /**
249
+ * The ANOVA intra-class correlation, **only when `iccEstimable`**. With one
250
+ * case per family σ̂² is 0 by construction and this comes out at exactly 1,
251
+ * which is an artifact of the decomposition and not a measurement: a grouping
252
+ * of singletons says nothing at all about within-family correlation. Read the
253
+ * flag before the number.
254
+ */
255
+ icc: number;
256
+ designEffect: number;
257
+ /** how much wider this grouping's interval is than the iid one. Not 1/DEFF:
258
+ * a coarse grouping also costs degrees of freedom, and a few large clusters
259
+ * can have a *smaller* design effect and a *much wider* interval. */
260
+ widthRatio: number;
261
+ se: number;
262
+ /** cases per independent unit, `observations / designEffect` */
263
+ effectiveSampleSize: number;
264
+ /** false when the random-effects fit cannot separate τ² from σ², so `icc` is not a measurement */
265
+ iccEstimable: boolean;
266
+ }
267
+ export interface ClusterKeyDiagnostic {
268
+ declared: GroupingSummary;
269
+ /** the same observations grouped by case file, which is what ships by default */
270
+ fallback: GroupingSummary;
271
+ /**
272
+ * The declared grouping is *coarser* than the fallback and its groups show no
273
+ * material correlation, it merged cases that do not move together, and got
274
+ * nothing for it.
275
+ */
276
+ mergesUncorrelatedCases: boolean;
277
+ /**
278
+ * …and the resulting interval is **narrower** than the default's, on too few
279
+ * clusters for CR2 to be trusted. This is the dangerous direction, and it was
280
+ * not the one the first version of this diagnostic looked for: a coarse key
281
+ * with near-zero ICC can have a design effect *below* 1 and produce a tighter
282
+ * interval than the honest one, which is the exact failure `cluster.ts` was
283
+ * written to remove, reintroduced by a user-supplied key.
284
+ */
285
+ narrowsOnTooFewClusters: boolean;
286
+ /**
287
+ * The mirror image, and the one the first two flags cannot see because both
288
+ * require the declared key to be *coarser*: a key that is **finer** than the
289
+ * case-file default, splitting apart families that do move together, and
290
+ * buying a narrower interval with the split. It is the same too-narrow
291
+ * headline `narrowsOnTooFewClusters` catches, arrived at from the other side,
292
+ * and it is not a small effect: dissolving eight ten-variant files into
293
+ * eighty singletons takes the interval from 3.90× the iid one to 1.02×, a
294
+ * claim that the suite carries eighty independent cases' worth of evidence
295
+ * when it carries about eight. Both figures are asserted in
296
+ * `cluster.test.ts`.
297
+ */
298
+ narrowsBySplitting: boolean;
299
+ /** True when the declared grouping found correlation the case ids could not see. */
300
+ findsHiddenCorrelation: boolean;
301
+ verdict: string;
302
+ }
303
+ /**
304
+ * Below this many clusters, a cluster-robust standard error is optimistic even
305
+ * with small-cluster degrees of freedom. Standard practice; `compareEstimators`
306
+ * says the same thing from the other direction.
307
+ */
308
+ export declare const MIN_TRUSTWORTHY_CLUSTERS = 20;
309
+ /**
310
+ * Does a user-declared cluster key carry anything?
311
+ *
312
+ * The honest answer is a comparison, not a number: the same observations are
313
+ * grouped both ways and the intra-class correlation of each grouping is
314
+ * reported. A declared key that merges cases which do not in fact move together
315
+ * shows an ICC near zero while having *fewer, larger* clusters than the
316
+ * fallback, it has thrown away real information and widened the interval to
317
+ * pay for it. A declared key that finds correlation the case ids could not see
318
+ * shows a higher ICC and a larger design effect, and is doing its job. A
319
+ * declared key that is *finer* than the fallback, splitting apart files whose
320
+ * variants do move together, narrows the interval instead, and that is the
321
+ * dangerous direction rather than the merely wasteful one.
322
+ *
323
+ * Neither outcome is corrected automatically. A cluster key is a claim about
324
+ * the world and only the person who made it can say whether it is true; this
325
+ * says what the data thinks of it.
326
+ */
327
+ export declare function clusterKeyDiagnostic(declared: ClusterObservation[], fallback: ClusterObservation[]): ClusterKeyDiagnostic;
328
+ //# sourceMappingURL=cluster.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cluster.d.ts","sourceRoot":"","sources":["../src/cluster.ts"],"names":[],"mappings":"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"}