Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
259 commits
Select commit Hold shift + click to select a range
88dfde3
Rename validate_alignment to judge_alignment
ianarawjo Aug 11, 2026
b6b4743
Fix NIG's prior variance being reused unscaled for ci_paired's wider …
ianarawjo Aug 11, 2026
391422c
Merge branch 'claude/evalstats-compound-correction-tests-1ad9aa' into…
ianarawjo Aug 11, 2026
7a79229
Add quick primitives: mean_ci, summarize, stability, judge_debias_mea…
ianarawjo Aug 11, 2026
a8b3f54
Fix the 8 usability-audit findings in the quick primitives
ianarawjo Aug 12, 2026
11554f9
Add gradient CI bands to plot_ci_forest(), make it ComparisonResult.p…
ianarawjo Aug 12, 2026
38133e6
Polish plot_ci_forest for standalone/paper use: options, legend, caption
ianarawjo Aug 12, 2026
8b2c117
Move the methods subtitle above the plot, not below it
ianarawjo Aug 12, 2026
314cfd7
Rebalance subtitle spacing: further from the plot, closer to the title
ianarawjo Aug 12, 2026
52620c0
Revert "Rebalance subtitle spacing: further from the plot, closer to …
ianarawjo Aug 12, 2026
98e2ff0
Add color_rule param to plot_ci_forest; trim excess whitespace around…
ianarawjo Aug 12, 2026
cb93115
Make compare_to render gradient bands too, muted to the row's own hue
ianarawjo Aug 12, 2026
74608c7
Give compare_to a genuinely distinct treatment: lighter tint, thinner…
ianarawjo Aug 12, 2026
07ee2a0
Pull compare_to's band closer to its own sibling, not the row below
ianarawjo Aug 12, 2026
a0d8c6b
[DRAFT, not yet merged] Wire NIG into production as the auto default …
ianarawjo Aug 12, 2026
4b705ee
compare_e2e.py: pass compare()'s new eval_type explicitly instead of …
ianarawjo Aug 12, 2026
a311088
Fix style=single compare_to overlap and pad CI bands off the axis edges
ianarawjo Aug 12, 2026
9909b59
Scope NIG-for-likert rollout down to the one actually-verified path
ianarawjo Aug 12, 2026
f8dc0b4
Merge branch 'claude/evalstats-compound-correction-tests-1ad9aa' into…
ianarawjo Aug 12, 2026
1dd81ea
Add grouped two-factor forest plot via factors= on plot_ci_forest
ianarawjo Aug 12, 2026
6465b95
Merge branch 'worktree-quick-primitives' into compare-e2e
ianarawjo Aug 12, 2026
3d743e4
Fix single-template summary crash, clean up percent axis, add font_scale
ianarawjo Aug 12, 2026
ed8ebd1
Add BBQ non-transitive-ties example (real data, for paper figure)
ianarawjo Aug 12, 2026
ebdf22b
Trim degenerate summary sections, fix CLI's stale correction default,…
ianarawjo Aug 12, 2026
8e83317
Restructure pairwise-comparisons methods reporting for clarity
ianarawjo Aug 12, 2026
5ab35e1
Dim the pairwise methods block, drop 'FWER corrections:' prefix
ianarawjo Aug 12, 2026
1c7671d
Extend NIG default to multi-run pairwise Likert data, fix FWER widening
ianarawjo Aug 13, 2026
2bd55cd
Try adaptive shrinkage target for PPI power-tuning's bootstrap path
ianarawjo Aug 13, 2026
31cbf99
Merge branch 'claude/ppi-power-tuning-check-9b6a59' into ppi-power-tu…
ianarawjo Aug 13, 2026
1f1aeec
Extend adaptive shrinkage target to the analytic-mean backend
ianarawjo Aug 13, 2026
ded2464
Extend adaptive shrinkage target to the Walsh-theta (Wilcoxon) backend
ianarawjo Aug 13, 2026
b595537
Refactor adaptive shrinkage into shared helpers; fix 2 more sites
ianarawjo Aug 13, 2026
af8e452
Fix stale docstring: tango_score does get adaptive power-tuning
ianarawjo Aug 13, 2026
8f14bc4
Add ARC reliability example (real data, matched accuracy / different …
ianarawjo Aug 13, 2026
b76a7ca
Rework ARC reliability example: N=50 (small-sample regime), add stabi…
ianarawjo Aug 13, 2026
dfd48ad
Account for lambda's own estimation uncertainty in PPI power-tuning's…
ianarawjo Aug 13, 2026
790efce
Add StabilityResult.summary(): the same per-input noise strip compare…
ianarawjo Aug 13, 2026
3f54d1f
Add plot_run_disagreement: reliability plot for repeated-run binary e…
ianarawjo Aug 13, 2026
38a346a
Extend lambda-variance-inflation to the Romano-Wolf/max-T joint boots…
ianarawjo Aug 13, 2026
7b37b12
Un-square the label-efficiency plot's axes
ianarawjo Aug 13, 2026
14d3a4d
Update ARC demo script: agent-decision-backend framing, use stability…
ianarawjo Aug 13, 2026
cda158c
Track the PPI power-tuning investigation log
ianarawjo Aug 13, 2026
4418eea
Prototype power_tune=True for independent-groups ANOVA's F-statistic
ianarawjo Aug 13, 2026
5ee7513
Extend adaptive power-tuning to repeated ANOVA, Friedman, and Kruskal…
ianarawjo Aug 13, 2026
90beee5
Document Addenda 22-27: ANOVA/omnibus comprehensive validation and MN…
ianarawjo Aug 13, 2026
f252b4e
Merge branch 'merge-into-compare-e2e' into ppi-power-tuning-tuning
ianarawjo Aug 13, 2026
565dcf4
Merge branch 'prototype-noise-strip-plot' into ppi-power-tuning-tuning
ianarawjo Aug 13, 2026
fa5c7f5
Add noise plot to ARC reliability demo via plot_run_disagreement()
ianarawjo Aug 13, 2026
4d892b1
Retitle ARC reliability plot to match the agent scenario framing
ianarawjo Aug 13, 2026
ff8671f
Simplify seed-variance legend for lay readers
ianarawjo Aug 13, 2026
f64fa4a
Fix column alignment and shrink label column in seed-variance table
ianarawjo Aug 13, 2026
51919af
Fix real off-by-one in seed-variance table header, revert strip move
ianarawjo Aug 13, 2026
0b98418
Make the label-efficiency plot's square axes the default again, keep …
ianarawjo Aug 14, 2026
07c3759
Use one shared legend for the label-efficiency plot, labeled by IRR
ianarawjo Aug 14, 2026
dec8f2a
Tighten label-efficiency plot layout, pad the shared legend
ianarawjo Aug 14, 2026
16fc89c
Default power_tune=True for anova/friedman/kruskal, fix single-arm te…
ianarawjo Aug 14, 2026
1b1ed99
Surface the specific Wilson/Tango CI variant in terminal output
ianarawjo Aug 14, 2026
d69a3f0
Fix wilcoxon's Type-I inflation under adaptive tuning via cross-fitting
ianarawjo Aug 14, 2026
041572b
Fix ttest's Type-I inflation on binary/discrete data via closed-form CI
ianarawjo Aug 14, 2026
84f6bb5
Partially fix Friedman/anova_rep's mild Type-I inflation under power_…
ianarawjo Aug 14, 2026
ec17bc3
Add tradeoff() quick-primitive and plot_pareto_tradeoff() cloud plot
ianarawjo Aug 14, 2026
0cf9ae8
Add prompt-latency trade-off demo; fix label collision margin
ianarawjo Aug 14, 2026
a8d7f99
Shrink N to 30 and add a genuinely dominated prompt to the tradeoff demo
ianarawjo Aug 14, 2026
9798032
Make few-shot-3 a second confidently-dominated prompt in the demo
ianarawjo Aug 14, 2026
6c1a8b8
Fix ttest's MNAR catastrophe and residual binary bias via pooled lambda
ianarawjo Aug 14, 2026
e05ad9a
Replace single frontier line with a bootstrap frontier ensemble
ianarawjo Aug 14, 2026
7ea35fc
Replace frontier line-ensemble with a smooth percentile region band
ianarawjo Aug 14, 2026
4cfb071
Fix label/legend layout so plot_pareto_tradeoff scales down cleanly
ianarawjo Aug 14, 2026
fcc2380
Add a smaller paper-sized export to the tradeoff demo
ianarawjo Aug 14, 2026
12730ab
Draw point labels above markers; widen the paper figure export
ianarawjo Aug 14, 2026
96f28ad
Widen paper figure export slightly, (5.2, 3.4) -> (5.6, 3.7)
ianarawjo Aug 14, 2026
0dfe55c
Add method='pareto' to ComparisonResult.plot()
ianarawjo Aug 14, 2026
5df55f2
Rename compare()/tradeoff()'s secondary= param to secondary_metric=
ianarawjo Aug 14, 2026
e75feac
Merge branch 'worktree-pareto-tradeoff' into ppi-power-tuning-tuning
ianarawjo Aug 14, 2026
ea3e51b
Rename stability()/tradeoff() params to match compare()'s terminology
ianarawjo Aug 14, 2026
12604ea
Drop _col suffix: factor=/metric= directly matching compare()
ianarawjo Aug 14, 2026
ec23f30
Merge branch 'worktree-pareto-tradeoff' into ppi-power-tuning-tuning
ianarawjo Aug 14, 2026
23e9573
Migrate ttest_welch's remaining harness call sites to pooled-lambda fix
ianarawjo Aug 14, 2026
1553566
Help developers avoid MNAR-violating labeled subsets (options 3, 5, 4)
ianarawjo Aug 14, 2026
ba2b2a8
Surface the MCAR reminder in compare()'s own output, not just Alignme…
ianarawjo Aug 14, 2026
898e0b9
Print the full alignment report inline in compare()'s PPI output
ianarawjo Aug 14, 2026
f08080b
Harden Option 2's representativeness checks: 4 real robustness bugs
ianarawjo Aug 14, 2026
51fa6e3
Lower representativeness checks' significance threshold to 0.02
ianarawjo Aug 14, 2026
19f5fb3
Add 'evalstats label' CLI: guided random sampling for PPI human labeling
ianarawjo Aug 14, 2026
8258afa
Fix factor auto-detection: also try 'prompt', not just 'model'
ianarawjo Aug 14, 2026
fb1f049
Add a FILE FORMAT epilog to 'evalstats label --help'
ianarawjo Aug 14, 2026
789379d
Make --metric optional; add --score-type; rewrite --help with concret…
ianarawjo Aug 14, 2026
e1b6762
Merge branch 'worktree-pareto-tradeoff' into ppi-power-tuning-tuning
ianarawjo Aug 14, 2026
5b47c05
Fix wilcoxon cross-fit's low-noise Type-I residual via missing covari…
ianarawjo Aug 15, 2026
9a055e4
Fix stale _EvalStub missing _col, breaking most wilcoxon/ttest pytest…
ianarawjo Aug 15, 2026
4b58213
Fix single-arm PPI tests' MNAR catastrophe via label-shift-robust lambda
ianarawjo Aug 15, 2026
8b526cf
Fix regime-dependent over-correction in wilcoxon's cross-fit covarian…
ianarawjo Aug 15, 2026
009ef8c
Document bootstrap_t_single/anova_ind MNAR investigations (Addenda 36…
ianarawjo Aug 15, 2026
a99ae87
Fix wilcoxon real-data Type-I inflation and kruskal power collapse
ianarawjo Aug 15, 2026
3d64d1f
Fix anova_ind's real-data Type-I inflation via pooled lambda estimation
ianarawjo Aug 15, 2026
a0059e6
Document anova_ind pooled-lambda fix (Addendum 40)
ianarawjo Aug 15, 2026
97ea424
Replace wilcoxon's cross-fitted power-tuning with a score-type variance
ianarawjo Aug 16, 2026
ebc964f
Label efficiency: sweep effect sizes, add multiplier CIs and analysis…
ianarawjo Aug 16, 2026
5fb899f
Fix saturated-marker layout collisions in the label-efficiency figure
ianarawjo Aug 16, 2026
d7ca27c
Add rho^2 judge-quality axis and predicted-savings formula to label e…
ianarawjo Aug 16, 2026
51f5b49
Switch label-efficiency judge-quality axis to rho^2 for all three eva…
ianarawjo Aug 17, 2026
5058817
Phase 0: relocate design-detection to core/design.py
ianarawjo Aug 15, 2026
e63f509
Add AUTO_UNPAIRED_METHOD_TABLE + expose per-pair p-values from KW pai…
ianarawjo Aug 15, 2026
ae19d70
Build the between-subjects comparison engine (core/unpaired.py)
ianarawjo Aug 15, 2026
0e9f368
Fix ZeroDivisionError in PPI Kruskal-Wallis pairwise at k=2
ianarawjo Aug 15, 2026
c8e86d5
Wire design= into compare(), harden the engine, add Pareto-front support
ianarawjo Aug 15, 2026
9db416d
Share PPI banner, means table, and pairwise table with the paired path
ianarawjo Aug 15, 2026
18e2bf5
Add tests, battle-test harness, and executive summary
ianarawjo Aug 15, 2026
3bfbbc8
Move planning/report markdown files into notes/
ianarawjo Aug 15, 2026
2fa8825
Merge summary_unpaired.py into summary.py; add executive summary + CD…
ianarawjo Aug 15, 2026
845d7e4
Trim notes/ down to a single HOW_BETWEEN_SUBJECTS_ADDED.md
ianarawjo Aug 15, 2026
9db9a42
Fix stale param names in test_pareto.py/test_quick_primitives.py
ianarawjo Aug 15, 2026
aab31cd
Fix three robustness bugs surfaced by a final pre-release stress test
ianarawjo Aug 15, 2026
cd25095
Add regression tests for the three stress-test fixes
ianarawjo Aug 15, 2026
bcf3ea0
Add final pre-release stress-test script for compare()
ianarawjo Aug 15, 2026
b4b2a4e
Show raw mean difference alongside Delta-theta in unpaired pairwise t…
ianarawjo Aug 15, 2026
5530e46
Fix: PPI alignment never actually corrected the unpaired marginal mean
ianarawjo Aug 15, 2026
186ba6f
Defer to ppi-power-tuning-tuning's Kruskal fix, drop my own redundant…
ianarawjo Aug 16, 2026
c1baaaf
Fix misleading "tied for best" verdict when a CD-band chain touches r…
ianarawjo Aug 16, 2026
ecc3f5b
Add standalone App Store review collector (no judge scoring, separate…
ianarawjo Aug 16, 2026
5b05d0a
Add judge-scoring companion for the standalone App Store collector
ianarawjo Aug 16, 2026
e641cb9
Update paper_flipflop_example.py to the real 300/app data + Claude Haiku
ianarawjo Aug 16, 2026
eeb70c9
Commit the App Store review + judge-score data behind the FlipFlop ex…
ianarawjo Aug 16, 2026
5f5e22a
Add between-subjects support to `compare()` (#11)
ianarawjo Aug 17, 2026
0a58808
Derive threshold-plot markers from measured data; drop stale per-metr…
ianarawjo Aug 17, 2026
7068889
Snap threshold markers to round rho^2 values for a memorable rule of …
ianarawjo Aug 17, 2026
5a5a3fe
Add pooled es-invariance figure: one line per rho^2 tier, all eval types
ianarawjo Aug 17, 2026
a482f6b
Fix biased power-curve inversion; add per-method views and a curve cache
ianarawjo Aug 17, 2026
fa9a4ed
Revert label-efficiency ref_n_mc to 3000; align the per-method default
ianarawjo Aug 17, 2026
0f303a3
Honour the seed parameter when building per-method reference curves
ianarawjo Aug 17, 2026
627617e
Add a parallel warmer for the reference-curve cache
ianarawjo Aug 17, 2026
15a4964
Write effect_size at full precision in the raw result CSVs
ianarawjo Aug 17, 2026
4009f6d
Use each method's own influence-function correlation for the PPI pred…
ianarawjo Aug 17, 2026
c3ffcdf
Record why rank-based PPI's shortfall is not the classical Wilcoxon ARE
ianarawjo Aug 18, 2026
d690d70
Confirm rho^2 pins the mean-test multiplier across judge noise shapes
ianarawjo Aug 18, 2026
8ec9e8e
Show rho^2 stays sufficient under non-Gaussian judge noise, and locat…
ianarawjo Aug 18, 2026
6bf74c4
Gate label-efficiency cells on power-curve inversion conditioning
ianarawjo Aug 18, 2026
1f2159d
Document the inversion artifact, and resolve mwu's placeholder mapping
ianarawjo Aug 18, 2026
986fb14
Add a judge-error-shape axis to the label-efficiency sweep
ianarawjo Aug 18, 2026
4b003ec
Emit the rho^2 robustness figures from the sweep, behind a disk cache
ianarawjo Aug 18, 2026
45e9b56
Record noise_family in the label-efficiency results and raw CSVs
ianarawjo Aug 18, 2026
de6b7fd
Drop binary's contaminated arm: measured null, not assumed
ianarawjo Aug 18, 2026
a57906a
Fix per-method reference curves being built at the wrong effect size
ianarawjo Aug 18, 2026
26ff1a4
Correct the rank-shortfall numbers after the effect-size fix
ianarawjo Aug 18, 2026
2fb2999
Fix the noise-family figure's legend omitting the contaminated series
ianarawjo Aug 18, 2026
29c58c1
Break label-efficiency lines at unusable cells instead of drawing thr…
ianarawjo Aug 18, 2026
22dff8b
Re-tune the inversion gate, and split the noise-family figure by test…
ianarawjo Aug 18, 2026
a3c24d2
Stop drawing omitted cells as ceiling markers
ianarawjo Aug 18, 2026
a164677
Add a figure-regeneration entry point that needs no re-simulation
ianarawjo Aug 18, 2026
dba7ea2
Predict the pooled multiplier from the pooled methods' own correlations
ianarawjo Aug 18, 2026
4c74a8b
State the judge-quality threshold per test family, on that family's o…
ianarawjo Aug 18, 2026
8653115
Add a pooled threshold figure, put ticks on round values, trim the ca…
ianarawjo Aug 18, 2026
4d07550
Anchor the threshold annotations to round rho^2, starting at 0.20
ianarawjo Aug 18, 2026
8e64d4e
Extend the threshold grid to cover the data, and require every eval t…
ianarawjo Aug 18, 2026
ab29b61
Place each eval type at its OWN realized rho^2, not the pooled mean
ianarawjo Aug 18, 2026
ef7ffcf
Add a four-panel practitioner lookup, one panel per experimental design
ianarawjo Aug 18, 2026
508252b
Measure the label-efficiency multiplier directly as a variance ratio
ianarawjo Aug 18, 2026
b480b94
Give each eval type its own judge-quality ladder so the lookup panels…
ianarawjo Aug 18, 2026
21584dc
Pin the pay-off marker to rho^2 = 0.40 across all threshold figures
ianarawjo Aug 18, 2026
659097d
Refit the judge-quality ladders from measured data; likert's map is c…
ianarawjo Aug 18, 2026
927cb06
Lower likert's ladder floor so every eval type spans ~0.20-0.75
ianarawjo Aug 18, 2026
224adc3
Cover all four lookup axes, and put the legend back on round rho^2 steps
ianarawjo Aug 18, 2026
5675d96
Average the prediction over the same arms the measurement is averaged…
ianarawjo Aug 18, 2026
0a8e844
Use the rho-squared symbol in the prediction legend entry
ianarawjo Aug 18, 2026
6af08d3
Update the notes to the 300-rep numbers, and record the variance route
ianarawjo Aug 18, 2026
4f42537
Diagnose binary's top-tier overshoot: the reference curve runs out of…
ianarawjo Aug 18, 2026
7f2de3d
Record two failed fixes for binary's overshoot, so neither is retried
ianarawjo Aug 18, 2026
0651aba
Confirm a real Type I bug at binary's clean tier; refute it as the ov…
ianarawjo Aug 18, 2026
ca5d542
Fix group-structure rho^2 measuring only one of the two groups
ianarawjo Aug 18, 2026
b18d099
Replace zero-width CIs on zero-variance samples with a Clopper-Pearso…
ianarawjo Aug 19, 2026
ae3c18c
Carry the variance-route fields through replot_label_efficiency
ianarawjo Aug 19, 2026
fc8fbd1
Add the label-efficiency appendix, and a flag to drop figure titles
ianarawjo Aug 19, 2026
4a831ee
Suppress in-figure subcaptions too, and move their content into the c…
ianarawjo Aug 19, 2026
4bff373
Add the multiplication sign to the multiplier table, and promote its …
ianarawjo Aug 19, 2026
06f99fc
Restructure the multiplier table by labeling budget
ianarawjo Aug 19, 2026
bda7850
Shade coverage cells and mark best/runner-up Score in LaTeX CI tables
ianarawjo Aug 19, 2026
1458705
Fix LaTeX table caption escaping, full-width layout, and column trim
ianarawjo Aug 19, 2026
62eb44a
Shorten Type column, split ci_single's likert from continuous, trim Time
ianarawjo Aug 19, 2026
8f78023
Shorten Coverage column header to Cov
ianarawjo Aug 19, 2026
395fbc7
Round before thresholding coverage_cell, not after
ianarawjo Aug 19, 2026
4f9bb5e
Disable label-efficiency check in official_args_ppi_factorial
ianarawjo Aug 21, 2026
6bdfc1e
Add multi-condition judge_alignment() and label_efficiency()
ianarawjo Aug 21, 2026
5671e04
Add omnibus label-efficiency report: which rho each test follows
ianarawjo Aug 21, 2026
c149574
Remove dead PPI omnibus wrappers; correct kruskalwallis power_tune co…
ianarawjo Aug 21, 2026
e353221
Update omnibus label-efficiency report: rho is not effect-invariant f…
ianarawjo Aug 21, 2026
af34d2f
Document in _METHOD_CORR_KIND that rho is not effect-invariant for ra…
ianarawjo Aug 21, 2026
b381884
Add drift x power exhibit: where the rank-test effect-size drift actu…
ianarawjo Aug 21, 2026
36d7309
Correct the drift-exhibit verification: closest cell is 0.996, not 1.000
ianarawjo Aug 21, 2026
32bf67b
Correct drift exhibit: Friedman's recipe is not shift-invariant, and …
ianarawjo Aug 21, 2026
10aa973
Centre each group before pooling lambda in _pooled_two_group_lambda
ianarawjo Aug 21, 2026
c2910e1
Add --rho-drift-check: is rho a property of the judge, or of judge AN…
ianarawjo Aug 21, 2026
31fb14c
Replace naive Pearson/Spearman rho with test-specific linearizations
ianarawjo Aug 21, 2026
d17371a
rho-drift check: control against measured score rho^2, not flatness
ianarawjo Aug 21, 2026
12ed0b7
Collapse label_efficiency into judge_alignment; fix Kruskal lineariza…
ianarawjo Aug 21, 2026
a2ec82e
Fix Wilcoxon/MWU linearizations; remove hajek_experimental; add oracl…
ianarawjo Aug 22, 2026
2e3d3fc
Record validation of Friedman/Kruskal linearizations vs published fig…
ianarawjo Aug 22, 2026
10366bc
rho-drift plot: show all 9 tests, the score-level control, and what e…
ianarawjo Aug 22, 2026
7b963a3
rho-drift: use n_workers, pool the whole grid, stop double-paying kru…
ianarawjo Aug 22, 2026
199b77f
Split the fused .gitignore entry that un-ignored examples/.cache/
ianarawjo Aug 22, 2026
def1b59
Fix PPI joint-bootstrap SE collapse, likert routing, and logit-t bounds
ianarawjo Aug 22, 2026
d3867e4
compare_e2e: realistic judge, non-degenerate truth, per-eval-type eff…
ianarawjo Aug 22, 2026
a034e3b
Add the joint-bootstrap SE-floor validation harness and its record
ianarawjo Aug 22, 2026
61177e8
compare_e2e: exclude n_lab >= 60% of N, extend sizes to 1000
ianarawjo Aug 22, 2026
4bc5eac
Centre groups before pooling in _pooled_k_group_lambda
ianarawjo Aug 22, 2026
141a962
Use Tango's score interval for the binary PPI rectifier term
ianarawjo Aug 22, 2026
024a2ba
Route the binary PPI rectifier to continuity-corrected Tango at low c…
ianarawjo Aug 22, 2026
73b4a02
Check the k-group lambda fix on binary and likert, not just continuous
ianarawjo Aug 22, 2026
f18ce70
compare_e2e: --null-reps-mult, and document k=5's effect on Type-I pr…
ianarawjo Aug 22, 2026
532982c
WIP fixes
ianarawjo Aug 24, 2026
4911f0f
Rename the fake "tango" to mj_floor; repoint "tango" to the real inte…
ianarawjo Aug 24, 2026
7dda13c
Add the paired-binary CIs Fagerland et al. (2014) recommends
ianarawjo Aug 24, 2026
2c67262
Drop the discordant-pairs Newcombe; fix Tango at the all-discordant b…
ianarawjo Aug 24, 2026
04fe07e
Give every co-plotted method a visually distinct colour
ianarawjo Aug 24, 2026
53139a0
Decompose the interval score into Width + Penalty in ci_paired reports
ianarawjo Aug 24, 2026
a3a00d0
Surface the coverage tail in ci_single and ci_paired LaTeX tables
ianarawjo Aug 24, 2026
ff244aa
Track compress_tables.py under simulations/; abbreviate Penalty to Pen
ianarawjo Aug 24, 2026
30ec253
Report Type-I/Power in ci_paired; add McNemar mid-p to the p-value sweep
ianarawjo Aug 25, 2026
7f2c0f5
Make McNemar mid-p the default; drop the redundant newcombe p-value row
ianarawjo Aug 25, 2026
eb0f197
Add exact calibration analysis for the paired-binary tests
ianarawjo Aug 25, 2026
3495a0e
Add exact Type-I analysis for the paired-binary CI decision rule
ianarawjo Aug 25, 2026
13c3bb1
Add violin replot tool; regenerate head-to-head figures from existing…
ianarawjo Aug 25, 2026
2fac80c
Show that mj_floor_er's effective-runs correction is inert or inflating
ianarawjo Aug 25, 2026
bd534d7
Identify why no multi-run mj_floor variant fixes the coverage tail
ianarawjo Aug 25, 2026
0630201
Adopt multi-run Bonett-Price; retire the effective-runs mj_floor vari…
ianarawjo Aug 25, 2026
8d7427e
Add the published clustered matched-pair CIs as comparators
ianarawjo Aug 25, 2026
543bc76
Keep one multi-run Bonett-Price; drop modified Obuchowski from the sweep
ianarawjo Aug 25, 2026
424814f
Add compact 1x4 FWER panel plots; use them in the paper
ianarawjo Aug 25, 2026
2a0d454
Add opt-in Friedman/Wilcoxon/Shaffer path to compare_e2e
ianarawjo Aug 25, 2026
f19e5c3
Shrink the multi-run Bonett-Price pseudo-item magnitude; route binary…
ianarawjo Aug 26, 2026
3a1081d
Drop bonett_price_cluster from the official multi-run set; add a LaTe…
ianarawjo Aug 26, 2026
baed9b5
Give the PPI Bonett-Price its own Method name and colour-align the PP…
ianarawjo Aug 26, 2026
4e08d6b
Let load_from() take a filename, not just an in-memory table
ianarawjo Aug 27, 2026
d9a1777
Order summary tables by mean, and fix the gradient CI percentages
ianarawjo Aug 27, 2026
b668783
Stop reporting "no sign of judge bias", and add ci=False to skip boot…
ianarawjo Aug 27, 2026
c6ad1d3
Make paper_flipflop_example reproduce the numbers the paper prints
ianarawjo Aug 27, 2026
601caf9
Ignore *.log
ianarawjo Aug 27, 2026
5d08e53
Defer the rank bootstrap until someone reads the ranks
ianarawjo Aug 27, 2026
d0e0484
Give the pairwise CI formula one source of truth, and fix the drift i…
ianarawjo Aug 27, 2026
002ba5e
Make the rho-drift check report its own Monte Carlo error, and add th…
ianarawjo Aug 27, 2026
305cd86
Calibrate the joint bootstrap against the interval's own tails
ianarawjo Aug 27, 2026
705008f
Recommend Sidak for every simultaneous CI, and drop the N split
ianarawjo Aug 27, 2026
cd30be4
Add the FlipFlop draw-robustness sweep behind the paper's footnote
ianarawjo Aug 27, 2026
dca3730
Let build_multiarm_sources grade effects across arms
ianarawjo Aug 27, 2026
e8e94b7
Stop double-noising compare_e2e's no-PPI arm, and sweep icc
ianarawjo Aug 27, 2026
d384115
Give the icc sweep one definition, not two
ianarawjo Aug 27, 2026
dcf0ca5
Stop bare CLI runs from sweeping an eval type the presets exclude
ianarawjo Aug 28, 2026
4939a52
Let the five-way replot drop absent columns and clip the effect tail
ianarawjo Aug 28, 2026
130ffcb
Rebuild Which Method page around the paper's decision trees
ianarawjo Aug 28, 2026
4ac52fc
Rewrite README for a 1.0-ready package: correct defaults, add citation
ianarawjo Aug 28, 2026
3b7d56b
Fix stale defaults, broken links, and dead nav across the website
ianarawjo Aug 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ simulations/out/*
!simulations/out/judge_bias_privacy_judge_items.csv
!simulations/out/judge_bias_iclr_metareview.csv
!simulations/out/judge_bias_iclr_metareview_items.csv
!simulations/out/results_why_ppi_shrink_1_over_0.md
!simulations/out/appstore_scenario_reviews.csv
!simulations/out/appstore_scenario_judge_scores.csv
.agent-study-venv-full/
.agent-study-venv-baseline/
.agent-study-venv-runner/
Expand All @@ -38,4 +41,9 @@ simulations/harness/methods_table.tex
simulations/harness/revise_latex_tables.py
simulations/PPI_TESTBED_REVIEW.md
coefs.csv
examples/.cache/
examples/.cache/
lit_review/api_key.txt
simulations/papers

# Simulation and LaTeX scratch logs (drift.log, texput.log, ...)
*.log
422 changes: 154 additions & 268 deletions README.md

Large diffs are not rendered by default.

154 changes: 154 additions & 0 deletions RESUME_ppi_fixes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
# PPI fixes + compare_e2e scenario rework — 2026-08-21/22

Verification is COMPLETE; this file is kept as the validation record.

Originally written as a handoff when a session closed mid-verification. All
outstanding items below have since been run and are recorded inline.

## What changed

**1. `evalstats/api.py` — relative floor on the joint bootstrap's SE**
New module constant `_JOINT_BOOT_SE_REL_FLOOR = 0.20` and one line in
`_ppi_bootstrap_t_joint_stats`:

boot_se = np.maximum(boot_se, _JOINT_BOOT_SE_REL_FLOOR * obs_se[None, :])

Set the constant to `0.0` to get the old behaviour back exactly.

Fixes: a near-degenerate pair's bootstrap SE could collapse (the old guard
was absolute, `1e-12`, so it could not see a small-but-nonzero collapse),
sending that pair's `|T|` to 60–2000. Both consumers of this ONE joint
resample reduce it with a MAX over pairs — Romano-Wolf's step-down
suffix-max, and `_M_b_from_T` for max-T / "boot" CI widening — so one bad
pair poisons the whole family. Measured: a degenerate pair with |T|max=66
drove an UNRELATED pair's Romano-Wolf p from ~0 to 0.363 while that pair's
CI still excluded 0 by a wide margin.

**2. `evalstats/api.py` + `core/bundles.py` + `core/router.py` — likert PPI routing**
PPI's `method="auto"` re-derived `data_kind` locally with only
binary/bounded_01/unbounded branches, ignoring `score_range` and
`eval_type`. Likert (e.g. 1–5) fell through to `unbounded` and silently took
`ppi_t_interval`, making `PPI_AUTO_METHOD_TABLE`'s `likert -> ppi_logit_t`
row unreachable. Now the router's single decision is recorded as
`AnalysisBundle.resolved_data_kind` and reused; the old local test remains
as the fallback for non-`auto` callers. (`data_kind` also had to be
initialized to `None` in router.py — it was only bound inside the
`method == "auto"` branch.)

## Verification status

DONE, before touching api.py:
- binding rates: 12–19% on degenerate cells, **0.0000%** on 8
non-degenerate conditions at every c up to 0.50
- FWER on the non-degenerate DGP: identical for c in {0,.1,.2,.3,.5}
- power on degenerate cells: 0.665 -> 1.000, FWER unchanged
- symptom: contradictory reps 7/20 -> 0/20; romano_wolf p 0.371 -> 0.001
- `tests/test_auto_ci_routing.py`, `test_bayes_binary_routing.py`: 78 pass
(routing fix only — run BEFORE the boot_se floor was added)

DONE after resuming — shipped-vs-prefix validation (validate3 / 400 reps,
`simulations/out/joint_bootstrap_se_floor/val3.log`). FWER **identical to 4
decimals in all 10 conditions**; power on the degenerate cells:
continuous k=3 N=100 0.6425 -> 0.9975
continuous k=3 N=200 0.6825 -> 1.0000
continuous k=5 N=100 0.3850 -> 1.0000
likert (all N) unchanged, as predicted
all 4 non-degenerate unchanged to 4 decimals
So the floor recovers power exactly where the bootstrap had broken down and
changes literally nothing anywhere else.

DONE: regression tests — **167 passed** (test_compound_ppi_fwer.py incl.
TestRomanoWolfCalibration, test_ppi_ci_methods.py, test_simultaneous_ci.py,
test_auto_ci_routing.py), 23 min.

DONE: null-binding FWER test — the hole in the earlier evidence. Ordinary
nulls have uniq(d_true)==1 so the floor is inert and "FWER unchanged" was
trivial. Built a null where it DOES bind (near-identical arms: shared base,
each arm perturbs a small random subset by ±delta with mean-zero signs).
**With binding up to 12% under a genuine null, FWER is unchanged** (largest
move +0.0025 at 0.28% binding = 0.23 MC SE). See
`simulations/investigate_joint_bootstrap_se_floor_nullbind.py` and
`simulations/out/joint_bootstrap_se_floor/val6.log`.

REMAINING:
3. End-to-end:
`.venv/bin/python -m simulations.harness.cli compare_e2e --reps 60 --eval-types likert continuous --k-values 3 --sizes 50 100 200 --ppi-fracs none 0.20 0.40 --plots off --save-results off --progress off`
Pass = continuous PPI power clears its subset-only `ref.pwr` floor
(was 20 points BELOW it), and likert `fam.cov` falls from 99.5%.
4. Not reviewed: the max-T CI path and other consumers of this same joint
resample may want the same treatment.

## Caveat on likert

Its low-N conservatism is MOSTLY LEGITIMATE, not this bug. `alpha_eff` comes
from `M_b`'s p95 (3.07 -> 0.00214, matching the observed 0.002116), and a
max-|T| p95 of 3.07 at n_lab=20 is ordinary bootstrap-t small-sample
inflation; the degenerate tail sits in the p99/max. Likert binds only ~1% at
c=0.2 vs continuous's 18%. Expect a small move, not a large one.

UNVERIFIED residual suspect, do not act on without checking: the bootstrap-t
critical value is converted to an effective alpha through a NORMAL quantile
in `_ppi_alpha_eff_from_M_b`, then fed to a t-based CI formula — possibly
double-counting small-sample inflation.

## Also disproven this session

The hypothesis that likert's conservatism came from `logit_t` hitting its
Clopper-Pearson fallback (`degenerate_sample_ci`): instrumented every
module-level reference, **0 calls** in every likert and continuous cell at
N=20/50, PPI and non-PPI. Instrument verified against a forced constant
sample, which does trigger it.

## Files

Untracked helpers (safe to delete):
simulations/investigate_joint_bootstrap_se_floor_*.py (validation harness)
simulations/out/joint_bootstrap_se_floor/ (pre-fix logs + api.py backup)
RESUME_ppi_fixes.md (this file)


---

## Final status (2026-08-22)

All verification complete:

- **167 regression tests** pass (test_compound_ppi_fwer incl.
TestRomanoWolfCalibration, test_ppi_ci_methods, test_simultaneous_ci,
test_auto_ci_routing), plus 115 routing/dispatch and 58 unpaired.
- **Shipped-vs-prefix, 400 reps**: FWER identical to 4dp in all 10 conditions;
power on degenerate cells 0.6425 -> 0.9975 / 0.3850 -> 1.0000.
- **Null-binding FWER test**: with the floor binding up to 12% of replicates
under a genuine null, FWER is unchanged (largest move +0.0025 = 0.23 MC SE).
- **compare_e2e end-to-end**: Type-I nominal on both paths; PPI power above
the human-subset floor on all three eval types.

## Two findings that were NOT library bugs

1. **"PPI below the human-subset floor"** -- a k-mismatch in the PLOTTING
code, not in evalstats. oracle/subset rates exist only at
REFERENCE_ESTIMATOR_K=3 while PPI's power_rate exists at every k, so
pooling PPI over k=2+3 against a k=3-only reference compared a 1-step
effect against a 2-step one. At continuous N=250: PPI(k=2+3)=0.840,
PPI(k=3)=0.962, subset(k=3)=0.905. PPI was winning throughout.
2. **Romano-Wolf "missing" on the non-PPI path** -- not missing. Both paths
share AUTO_PVALUE_CORRECTION_METHOD_TABLE (Shaffer <30, Romano-Wolf >=30);
they differ only because the subset arm legitimately sees fewer items.

## Romano-Wolf vs Shaffer under PPI (the open question)

Same cells, only the correction varied. Romano-Wolf matches or edges Shaffer
everywhere and is slightly LESS conservative (Type-I 0.017 vs 0.008 at
k=3/N=250), consistent with the existing simulation findings. Differences are
inside MC noise at 80 reps (SE ~0.028), so the defensible claim is
"indistinguishable, no evidence of a power cost" -- not "Romano-Wolf wins".

## Still open

- `nlab=30, N=250` Type-I: a small fixed label budget with a large unlabelled
pool is where the rectifier is estimated from fewest labels. Every look so
far has been at rep counts where any drift is inside noise. Worth a
dedicated high-rep check.
- `_pooled_k_group_lambda` still carries the uncentered-pooling defect its
two-group sibling had (fixed in 836f811), deliberately unfixed pending
Type-I/coverage validation.
2 changes: 1 addition & 1 deletion agent_study/sweep/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ presupposing in advance that it's important enough to fully cross.

**Held fixed / out of scope for this sweep** (see the design discussion that
produced this grid, in conversation history, for the reasoning):
- Judge-score-correction (PPI/`validate_alignment`) task type -- deferred to
- Judge-score-correction (PPI/`judge_alignment`) task type -- deferred to
a separate, smaller sub-sweep with its own axes (judge reliability,
human-label fraction), since those don't apply to `prompts`/`models`.
- Correlation structure: paired throughout (`base_corr=1.0` -- the same
Expand Down
Binary file added docs/decision-tree-ci.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/decision-tree-pvalue.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
27 changes: 25 additions & 2 deletions evalstats/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,16 +33,28 @@
# "compare" name if it were imported before the submodule.
from evalstats.loader import load_from, EvalResults, EvalLoadError
from evalstats.api import compare, compare_models, compare_prompts, ComparisonResult
from evalstats.alignment import validate_alignment, AlignmentResult
from evalstats.alignment import judge_alignment, AlignmentResult
from evalstats import ppi
from evalstats import tests
from evalstats.quick import (
mean_ci,
MeanCI,
summarize,
GroupSummary,
stability,
StabilityResult,
tradeoff,
TradeoffResult,
judge_debias_mean_ci,
DebiasedMeanCI,
)

__version__ = "0.2.4"

__all__ = [
# High-level spec API
"load_from",
"validate_alignment",
"judge_alignment",
"AlignmentResult",
"ppi",
"tests",
Expand All @@ -52,6 +64,17 @@
"compare_models",
"compare_prompts",
"ComparisonResult",
# Quick primitives
"mean_ci",
"MeanCI",
"summarize",
"GroupSummary",
"stability",
"StabilityResult",
"tradeoff",
"TradeoffResult",
"judge_debias_mean_ci",
"DebiasedMeanCI",
# Core types
"BenchmarkResult",
"MultiModelBenchmark",
Expand Down
Loading
Loading