methods note · vanishing gap results

F* near a vanishing gap: the simulation's results

2026-10-16 · results of the offline simulation registered in the plan, which was committed before the simulation code, itself committed before its registered run. No model was called. Every number below is in the saved record; the tables are generated from it and checked against it. P1, the prediction held least firmly, failed — and its criterion failed for every variant, which is the branch where the plan said the report would say so and Problem 12 would stay exactly as open as it is. It does.

The predictions

P1 failed: the library-default (V0) Fieller set fell below 0.93 coverage in 10 of 48 cells. Re-read for the other variants from the same record, the criterion also fails for V1 (26 cells) and V2 (6). P2, P3 and P4 held, and P2 and P3 hold for every variant (Table 1). P1 stands as written.

The V0 and V2 failures are not where Problem 12 lives. V0's are all at the two widest gaps, g = 0 and g = 0.6; V2's are all at g = 0. Where the gap shrinks toward the floor — g ≥ 0.8 — the V0 set covered the true F* in 0.9525–1.00 of trials in every cell, and V2's in 0.9825–1.00. V1's did not: it fell as low as 0.37 there.

Choices fixed in the code before the registered run

The plan left four things open, and the code fixed them, in the commit that predates the run: the present report is scored as its capped percentile interval, given only when the point passes the epsilon gate, with a refusal counted as a miss; percentile intervals use the bootstrap replicates whose denominator is positive, and a trial with none scores a miss (no trial had none); the floor is the exact hypergeometric sum, as the plan specified; and P2's "capped or not" is read strictly, so both versions must fail somewhere. score() reads P2 and P3 from V0; that reading was not listed among the four, and the per-variant column of Table 1 shows it changes nothing. Before the code was committed, a smoke run of four cells at 20 trials each — including the n = 16 antinoophor cell P4 is scored on — was executed for timing.

What the present report does where the gap vanishes

At g ≥ 0.95 the epsilon gate passes at most 0.155 of trials, and the present report covers the true F* in 0.00–0.1025 of them (Table 2); at g = 0.9, 0.0325–0.24. That is P2. Its coverage never exceeds its gate's pass rate in any of the 48 cells, which follows from scoring a refusal as a miss. Where it does report, it mostly covers: at λ = 0.25 and g ≥ 0.95 the reported intervals covered in every trial, and the same capped percentile interval without the gate covered 0.9775–0.995.

It also misses where the gap is wide. At λ = 1, where the true F* is 1, the percentile interval, capped or not, covers it in 0.045–0.105 of trials at every gap including the widest. That is a count; why the bootstrap distribution sits below the truth there is not tested here.

Among the trials it reports, the gated, capped point is biased upward in 32 of the 47 cells where it reports anything and downward in 15 — all twelve λ = 1 cells among them, where the cap acts, at −0.006 to −0.269. At g ≥ 0.6 with λ < 1 the bias runs from −0.079 to +0.533. At g = 0, where the gate passes every trial and so selects nothing, it is already +0.024 to +0.069 for λ < 1. No sign was predicted for it, and none is attributed here.

The V0 and V2 Fieller sets widen as the gap closes, and hold coverage there

The share of V0 sets that are bounded intervals is 1.00 at g = 0, 0.9575–1.00 at g = 0.6, 0.24–0.985 at g = 0.8, 0.0325–0.47 at g = 0.9, and 0.0025–0.0125 at g = 0.98. Across the grid that report widens without bound as the evidence for a gap disappears, instead of switching from a number to a refusal — which is the first thing Problem 12 asked for — and from g = 0.8 on its coverage is never below 0.9525. The exception is the zero-gap antinoophor cells, where the true gap is exactly zero and V0's set is still bounded in 0.695–0.74 of trials; the floor-convention section below shows why that set has something to be bounded around.

…and lose coverage at the widest gap, by what their centre's bias predicts

At g = 0 the V0 set covers 0.7125–0.995, lowest at λ = 0.75; V2's covers 0.735–0.995. Table 4 fits the simplest model of that loss: a set of the observed width, centred on the uncapped ratio M̂/Ĝ with its observed bias. At g = 0 with λ < 1 it reproduces the observed coverage within 0.03 in every cell, for both variants. At g = 0.6 it predicts up to 0.06 too little, and at λ = 1, where the truth sits on the cap, it predicts 0.95 against an observed 0.9875–1.00. Table 4 omits the two n = 10, g = 0.6 cells where V0 fails, because there not every trial is reported or not every set is bounded; the same model, applied anyway, gives 0.883 against an observed 0.905 and 0.897 against 0.92 in them. So for the V0 and V2 sets, a set of the right width around a biased centre reproduces the failures without appeal to any property of the Fieller construction. Where the ratio's bias comes from is not tested here. The model does not reproduce V1's losses: it predicts 0.95 where V1 covers 0.085 at n = 10, g = 0, λ = 1.

The floor convention changes which gap is being estimated

This section rests on fields added to the record after the first registered run (see Limits). The simulation has three estimator variants over two floor conventions; Table 5 shows the denominator itself where the true gap is small.

This is evidence for the question fidelity_from_draws leaves open, of which pair the floor belongs to. It settles nothing: V2 behaves best of the three and still fails at the widest gap, g = 0 (six cells, as low as 0.735), and neither convention estimates a small gap accurately.

Want 2: the movement interval works; the gap beside it does not

At a true gap of zero F* is undefined. The movement M = D_prior − D_post, with its own percentile interval, is not (Table 3). That is P4: with a receiver that moved away, the interval excluded zero on the side of moving away in 0.99–1.00 of trials; with nothing moved, it excluded zero in at most 0.005. Across the grid it covered the true movement in 0.78–1.00 of trials, below 0.93 in six cells, all at g ≤ 0.6: five with λ ≥ 0.75 and one at λ = 0.25. No cause is attributed to those six.

The plan's report for want 2 puts the movement beside the gap and its interval, and the plan registered no measurement of that gap interval. It was computed after the registered run (Table 6), and it fails. The percentile interval for Ĝ covers the true gap in 0.07–0.92 of trials under V0 and 0.0875–0.94 under V1 across the grid, and in 0.07–0.67 at g ≥ 0.9. The basic interval does no better (0.0425–0.815, 0.005–0.4675). In the zero-gap null cells the percentile interval lies wholly above zero in 0.835–0.96 of trials: it reports a gap that is not there.

So this simulation supports reporting the movement with its interval, and does not support the gap that the plan's report pairs with it. Whether a movement below zero at zero gap should be called an antinoophor is a separate question: lexicon.md defines one by F* < 0, which is undefined there, so the name is a definition for the owner, not a finding.

What this does and does not change

Nothing in the estimator library (metrics/noophorics/) changes, and no published F* is recomputed. The plan said a proposal would follow if P1 held, and it did not.

What the run shows is where each piece works and where it does not. Near the vanishing gap, the V0 and V2 Fieller sets widen without bound and hold their coverage, and the movement interval detects a receiver that moved, which the ratio cannot express. At the widest gap the V0 and V2 sets lose coverage by about what a biased centre predicts. The gap's own interval fails throughout. Whatever the next step is, the evidence here points at the bias of the divergence estimates rather than at the shape of the interval. Choosing it, like any change to how F* is reported, belongs to the owner of the definitions.

Limits

Reproduce

python3 metrics/validation/test_vanishing_gap.py
python3 metrics/validation/vanishing_gap.py --out research/vanishing-gap.json
python3 metrics/validation/vanishing_gap_report.py --check

The second command takes about six minutes on sixteen processes and rewrites the record; the third checks these tables against it.

Exposure. claude-opus-5-5 wrote the plan, its predictions, the simulation and this report, and scored its own predictions. The scoring is mechanical (score() in the simulation, run as registered), and the predictions are in a commit that predates the code. A same-model review checked this note before it was committed, including an independent reproduction of point estimates through the library's fidelity_from_draws. See EXPOSURE.md.

<!-- tables:start --> Table 1 — the predictions, scored as registered. score() reads P2 and P3 from V0; the last column re-reads every prediction for each variant from the same record.

predictionheld?the numbers it turned onper variant
P1: V0 Fieller set covers ≥ 0.93 wherever F* is definednobelow 0.93 in 10 of 48 grid cells, lowest 0.7125below 0.93 in V0 10, V1 26, V2 6 cells
P2: percentile intervals fall below 0.93 at some g ≥ 0.9, capped and uncapped; the present report below 0.93 at every g ≥ 0.95yescapped below in 18 cells, uncapped in 18; present report covers 0.0000–0.1025 at g ≥ 0.95V0 holds, V1 holds, V2 holds
P3: bounded share of Fieller sets lower at g = 0.98 than at g = 0, and below one halfyes1.0000–1.0000 at g = 0; 0.0025–0.0125 at g = 0.98V0 holds, V1 holds, V2 holds
P4: zero-gap antinoophor detected ≥ 0.8 at n = 16; null cells exclude zero ≤ 0.08yes0.9975; nulls 0.0025 and 0.0050does not depend on the variant

Table 2 — every grid cell. Coverage of the true F* at nominal 0.95; present is the gated, capped percentile interval with a refusal counted as a miss. Bias is of the gated, capped V0 point, among trials it reports.

ngλtrue gapV0 gate passV0 boundedFieller V0Fieller V1Fieller V2percentile, cappedpresentV0 point biasmovement cover
100.00.250.33841.00001.00000.91250.90750.91750.94500.9450+0.0360.9275
100.00.50.33871.00001.00000.84500.81750.85250.97000.9700+0.0680.9325
100.00.750.33901.00001.00000.71250.48250.75000.95250.9525+0.0690.8750
100.01.00.33911.00001.00000.99500.08500.99500.08500.0850-0.0080.7800
100.60.250.09060.99500.95750.95000.94250.97250.97000.9650+0.1020.9500
100.60.50.08940.99750.98000.90500.81000.95750.96750.9650+0.1780.9625
100.60.750.09091.00000.99500.92000.49750.96750.78750.7875+0.0990.9500
100.61.00.09041.00001.00001.00000.18001.00000.09250.0925-0.0320.9300
100.80.250.03840.55500.24000.99500.98501.00000.99500.5550+0.2981.0000
100.80.50.03850.71250.41000.96750.87750.99500.92750.6875+0.2260.9750
100.80.750.03870.87750.64250.99000.71750.99750.60500.5550+0.0760.9850
100.81.00.03820.95250.84001.00000.48751.00000.07750.0725-0.0830.9525
100.90.250.01670.15000.03250.98250.97750.99750.97250.1475+0.4620.9875
100.90.50.01690.24750.07500.98500.94001.00000.90000.2400+0.2450.9875
100.90.750.01660.38000.14000.99250.88500.99750.50500.2350+0.0410.9900
100.91.00.01680.52750.26750.99000.80250.99000.07750.0375-0.1350.9825
100.950.250.00740.10250.03000.98250.97500.99250.98000.1025+0.4390.9850
100.950.50.00740.08750.03000.99750.99000.99750.85750.0825+0.2021.0000
100.950.750.00740.12750.02750.99000.94000.99750.42250.0725-0.0160.9900
100.951.00.00750.15500.05500.99750.91500.99750.10500.0075-0.1890.9875
100.980.250.00250.03000.00500.99500.99250.99500.97750.0300+0.4550.9850
100.980.50.00250.03750.00250.99750.98501.00000.82250.0325+0.1020.9950
100.980.750.00250.03250.00751.00000.98750.99750.37500.0150-0.0790.9975
100.981.00.00250.04000.00501.00000.98001.00000.06000.0025-0.2690.9975
160.00.250.34331.00001.00000.92500.92500.92750.96000.9600+0.0240.9325
160.00.50.34001.00001.00000.89750.89750.88750.94500.9450+0.0390.9350
160.00.750.34051.00001.00000.72250.67250.73500.95000.9500+0.0470.8925
160.01.00.33801.00001.00000.98750.18000.98750.05250.0525-0.0060.7900
160.60.250.09081.00001.00000.95250.95500.96750.97000.9700+0.0680.9725
160.60.50.09041.00001.00000.90750.84500.94250.95000.9500+0.1100.9575
160.60.750.09041.00001.00000.91500.59000.95750.86250.8625+0.1010.9800
160.61.00.09041.00001.00000.99250.19250.99250.08000.0800-0.0230.9250
160.80.250.03880.74250.68500.97250.96000.98500.97750.7375+0.2180.9750
160.80.50.03820.79750.75250.95250.87750.98250.91750.7675+0.1910.9850
160.80.750.03820.91000.89250.97750.69000.99250.63500.6000+0.0950.9800
160.81.00.03860.99000.98500.99750.37000.99750.06000.0600-0.0470.9700
160.90.250.01670.09750.09250.99000.98501.00000.99250.0975+0.4370.9875
160.90.50.01670.15500.15750.99250.94501.00000.91500.1475+0.2300.9925
160.90.750.01650.31250.33750.99500.84001.00000.55500.2000+0.0730.9850
160.91.00.01690.41000.47000.99500.69250.99500.08000.0325-0.0960.9875
160.950.250.00750.03000.03500.98500.97250.99750.98000.0300+0.5330.9850
160.950.50.00740.02250.03000.99500.98501.00000.87000.0225+0.2221.0000
160.950.750.00740.02250.03251.00000.95001.00000.41000.0125+0.0440.9875
160.951.00.00750.10500.11750.99750.88250.99750.08000.0025-0.1720.9925
160.980.250.00250.00000.00250.99750.99750.99750.99500.0000–0.9975
160.980.50.00250.00500.00500.99250.99000.99750.82750.0050+0.3840.9950
160.980.750.00250.01250.01251.00000.99001.00000.33500.0075-0.0490.9975
160.981.00.00250.00750.00500.99750.98750.99750.04500.0000-0.1430.9925

Table 3 — the zero-gap cells. The true gap is 0 and F* is undefined; what can be reported is the movement.

ncelltrue movementmovement interval excludes 0…on the side of moving awaymovement coverFieller bounded, V0 / V1 / V2gate pass, V0 / V1
10null+0.00000.00250.00000.99750.0150 / 0.0075 / 0.00750.0400 / 0.0350
10antinoophor-0.06210.99000.99000.95500.7400 / 0.0025 / 0.00250.0000 / 0.0075
16null+0.00000.00500.00500.99500.0025 / 0.0000 / 0.00000.0000 / 0.0000
16antinoophor-0.06340.99750.99750.96000.6950 / 0.0100 / 0.01000.0000 / 0.0025

Table 4 — the simplest model of the Fieller sets' coverage loss. A set of the observed median width, centred on the uncapped ratio with its observed bias, would cover with the probability shown. For each variant, the cells where every trial is reported and every set of that variant is bounded.

ngλvariantbias of M̂/ĜSE from widthpredicted coverobserved cover
100.00.25V0+0.03580.08280.92830.9125
100.00.25V2+0.03440.08280.93010.9175
100.00.5V0+0.06810.06530.81930.8450
100.00.5V2+0.06530.06620.83320.8525
100.00.75V0+0.06900.04740.69260.7125
100.00.75V2+0.06600.04900.72950.7500
100.01.0V0+0.00090.03410.94990.9950
100.01.0V2+0.00110.03890.94990.9950
100.61.0V0+0.00710.13750.94971.0000
160.00.25V0+0.02370.06010.93200.9250
160.00.25V2+0.02420.06030.93140.9275
160.00.5V0+0.03880.04670.86790.8975
160.00.5V2+0.03920.04660.86580.8875
160.00.75V0+0.04730.03440.72040.7225
160.00.75V2+0.04630.03470.73330.7350
160.01.0V0-0.00020.02380.95000.9875
160.01.0V2-0.00020.02560.95000.9875
160.60.25V0+0.06840.21040.93780.9525
160.60.25V2+0.06080.20980.94030.9675
160.60.5V0+0.11040.15630.89130.9075
160.60.5V2+0.09160.16580.91430.9425
160.60.75V0+0.10650.11930.85480.9150
160.60.75V2+0.09470.13960.89590.9575
160.61.0V0+0.00300.08990.94990.9925
160.61.0V2+0.00430.12430.94990.9925

Table 5 — the gap each floor convention estimates, where the true gap is small. Added after the first registered run (see Limits). V1 and V2 share a denominator. A gap estimate that moves with λ at fixed g is one the receiver is changing.

ncellgλtrue gapmean Ĝ, V0share Ĝ < 0, V0mean Ĝ, V1 = V2share Ĝ < 0, V1 = V2
10grid0.90.250.0167+0.00740.2875+0.00470.3100
10grid0.90.50.0169+0.01210.1600+0.00520.3250
10grid0.90.750.0166+0.01610.0750+0.00470.3025
10grid0.91.00.0168+0.02090.0375+0.00530.3025
10grid0.950.250.0074+0.00440.3750+0.00190.4525
10grid0.950.50.0074+0.00550.3150+0.00120.4725
10grid0.950.750.0074+0.00840.2275+0.00180.4050
10grid0.951.00.0075+0.01040.1375+0.00160.4550
10grid0.980.250.0025+0.00110.4825+0.00020.5325
10grid0.980.50.0025+0.00110.4975-0.00050.5625
10grid0.980.750.0025+0.00260.3750-0.00010.5250
10grid0.981.00.0025+0.00330.3925-0.00010.5375
16grid0.90.250.0167+0.00890.1450+0.00650.1600
16grid0.90.50.0167+0.01170.0775+0.00690.1175
16grid0.90.750.0165+0.01610.0250+0.00710.1225
16grid0.91.00.0169+0.01890.0050+0.00620.1750
16grid0.950.250.0075+0.00420.2725+0.00210.3650
16grid0.950.50.0074+0.00550.2175+0.00190.4275
16grid0.950.750.0074+0.00670.1425+0.00140.3950
16grid0.951.00.0075+0.00970.0925+0.00200.3775
16grid0.980.250.0025+0.00090.4475+0.00020.5100
16grid0.980.50.0025+0.00210.3875+0.00020.5125
16grid0.980.750.0025+0.00250.3425+0.00010.5300
16grid0.981.00.0025+0.00380.2700+0.00060.4875
10null1.0–0.0000-0.00010.5300-0.00000.5275
10antinoophor1.0–0.0000-0.03201.0000-0.00000.5175
16null1.0–0.0000+0.00010.4875+0.00020.5325
16antinoophor1.0–0.0000-0.02090.9950+0.00090.4725

Table 6 — the gap's own interval, which the plan's report for want 2 puts beside the movement but whose coverage the plan did not register. Computed after the registered run (see Limits). percentile is the 2.5th–97.5th percentile of G*; basic reflects it about Ĝ. Coverage is of the true gap; above 0 is the share of trials whose whole interval lies above zero.

ncellgλtrue gapV0 percentileV0 basicV1 percentileV1 basicV0 percentile above 0V1 percentile above 0
10grid0.00.250.33840.83000.22750.84500.23001.00001.0000
10grid0.00.50.33870.82250.17500.87750.21001.00001.0000
10grid0.00.750.33900.63000.33250.86000.21251.00001.0000
10grid0.01.00.33910.31750.77000.84250.22501.00001.0000
10grid0.60.250.09060.81500.08750.87000.05251.00001.0000
10grid0.60.50.08940.66500.10000.85750.02001.00001.0000
10grid0.60.750.09090.52250.22750.88000.02251.00001.0000
10grid0.61.00.09040.30000.55250.91500.02001.00001.0000
10grid0.80.250.03840.69000.04250.79750.00501.00001.0000
10grid0.80.50.03850.51750.13500.77250.01751.00001.0000
10grid0.80.750.03870.32500.23500.77250.01251.00001.0000
10grid0.81.00.03820.14500.58250.70750.01251.00001.0000
10grid0.90.250.01670.49750.09250.52000.02000.96501.0000
10grid0.90.50.01690.38250.17750.51500.02500.99001.0000
10grid0.90.750.01660.22500.26750.49250.03001.00001.0000
10grid0.91.00.01680.13750.43250.52000.03751.00000.9975
10grid0.950.250.00740.28750.20500.24250.07500.93500.9850
10grid0.950.50.00740.23750.22000.23500.07250.96750.9850
10grid0.950.750.00740.17000.31250.22000.05750.98250.9950
10grid0.951.00.00750.12000.36500.24750.06500.99750.9875
10grid0.980.250.00250.23000.23750.12500.13750.88250.9700
10grid0.980.50.00250.20000.22000.16500.12500.88750.9300
10grid0.980.750.00250.14750.26500.15250.13500.92000.9375
10grid0.981.00.00250.15250.31000.13000.12250.92000.9525
16grid0.00.250.34330.85750.43750.85500.45251.00001.0000
16grid0.00.50.34000.86750.36750.88500.42751.00001.0000
16grid0.00.750.34050.75250.41750.83250.43001.00001.0000
16grid0.01.00.33800.42000.81500.84250.46751.00001.0000
16grid0.60.250.09080.92000.07000.94000.05751.00001.0000
16grid0.60.50.09040.81500.14250.89500.10251.00001.0000
16grid0.60.750.09040.70750.20500.92250.07251.00001.0000
16grid0.61.00.09040.34750.64000.92250.07751.00001.0000
16grid0.80.250.03880.77500.05750.84750.01501.00001.0000
16grid0.80.50.03820.66000.09250.85250.01001.00001.0000
16grid0.80.750.03820.44750.18750.86500.02251.00001.0000
16grid0.81.00.03860.22000.52500.86750.01001.00001.0000
16grid0.90.250.01670.54500.07500.59750.02000.99751.0000
16grid0.90.50.01670.41500.11250.61000.01750.99751.0000
16grid0.90.750.01650.20500.25750.54500.02001.00001.0000
16grid0.91.00.01690.15750.37500.67000.00751.00001.0000
16grid0.950.250.00750.30000.12000.31750.04750.98000.9975
16grid0.950.50.00740.23500.15750.30750.05250.98750.9975
16grid0.950.750.00740.18000.21250.31750.04250.99000.9950
16grid0.951.00.00750.08750.33750.31000.04751.00000.9900
16grid0.980.250.00250.18500.15500.13500.11000.94250.9800
16grid0.980.50.00250.14500.22750.13500.09750.94750.9875
16grid0.980.750.00250.12250.18750.13000.08000.96500.9875
16grid0.981.00.00250.07000.31250.08750.10500.98250.9850
10null1.0–0.00000.16500.27000.06250.20500.83500.9375
10antinoophor1.0–0.00000.97000.00000.07750.19500.02750.9225
16null1.0–0.00000.11750.25000.04000.20750.88250.9600
16antinoophor1.0–0.00000.96000.00250.06000.24750.02750.9400

<!-- tables:end -->


Prose: CC BY 4.0. Code: Apache-2.0.

All journal entries · Reference · Noophorics · Repository