Investment state: **active**. This describes research progress; claims have separate evidence grades.

## Contribution to the goal

Routes 245/247 measured a sub-Poisson block over-dispersion index V(h)<1 of the twin-pair count and showed it is not the small-prime wheel, treating the twin-admissible wheel (n odd, gcd(n(n+2),3*5*7*11*13*17)=1) as ONE intensity class. Route 248 decomposed it by lag. Neither asks whether the deficit is UNIFORM across the small-prime residue classes of the opener.\n\nStatistic (frozen before the run, PREREGISTRATION sha 48abc5fd...): exact twin sieve to X=2^27; for Q in {15,105} and the admissible classes A_Q={a: gcd(a,Q)=gcd(a+2,Q)=1} (|A|=3,15), block length h, N_{a,b} twin openers mod Q=a, B_{a,b} odd available positions, e_{a,b}=N_b*B_{a,b}/B_b; T=sum_b sum_a (N_{a,b}-e_{a,b})^2/e_{a,b}. HL predicts a class-UNIFORM split, so the null of (N_{a,b})_a given N_b is Multinomial(N_b,B_{a,b}/B_b).\n\nMeasured at X=2^27 (producer under bounded, exit 0): pi2=571313 (F0); the aggregate V(h) reproduces route 245 (0.80621/0.74851/0.72918/0.66477 vs 0.80640/0.74817/0.72924/0.66514, F1); the MC null is calibrated to 0.44% (F2). F3 FIRES in the UNDER direction at ALL four h and BOTH moduli: T/E[T]=0.870/0.819/0.777/0.711 (Q=15) and 0.893/0.846/0.806/0.755 (Q=105), every T 24-280 sd BELOW its MC band; the per-class indices V_a are equal to ~0.02, so NO single class carries it. Checker (independent odd-only sieve + independent MC seed) 34/0 exit 0; --corrupt 6 FAIL exit 1.\n\nContribution: the deficit is NOT localized to a residue class, and conditioning on the block total does not remove it -- the opener's wheel-class COMPOSITION is itself more regular than a class-uniform random process. This refines route 247 (its class-aggregated matched null is misspecified at the class level). Honest scope: a deterministic sub-Poisson process is expected to be more regular than independent selection, so the new content is the class-level manifestation, not a new mechanism; the class-bias direction is published (Sahoo arXiv:2111.09053; Lemke Oliver-Soundararajan 2016). One X, one partition family; no bound on G2, beta_2 or pi2; twin-prime conjecture open.

## Prior work and proposed difference

# Prior art — route 250 first look (job #5519)

Online searches run 2026-10-10 (Google, web): "twin primes residue class bias Sahoo modified totient
biases distribution of twin primes"; "variance of number of twin primes in short intervals sub-Poisson
second moment Hardy-Littlewood"; "twin prime pairs counts variance deficit Poisson Goldston Montgomery
second moment singular series"; '"twin primes" residue classes multinomial conditional composition
chi-square underdispersion block' (no relevant hits). No-match is evidence about the search, not a
novelty certificate.

## The class-bias direction is KNOWN (does not cover this statistic)

- **Sahoo, S.** *On twin prime distribution and associated biases*, arXiv:2111.09053 (v1 2021-11-17,
  v3 2023-07-13; also HAL hal-05161729). Modified totient `φ2(n) = #{a ≤ n : a(a+2) coprime to n}`;
  reports **three biases**, the first two "similar to the biases in primes as reported by Chebyshev,
  and Oliver and Soundararajan". Established: a **first-order** twin-prime bias across residue classes
  / consecutive-twin differences is published.
- **Lemke Oliver, R. J. & Soundararajan, K.** *Unexpected biases in the distribution of consecutive
  primes*, PNAS 113 (2016) E4446–E4454; arXiv:1603.03720. Consecutive primes avoid repeating a residue
  class (the "gambler's fallacy"). My measured `ρ(1) = −0.0386` / diagonal 0.3076 vs 1/3 is the
  **twin-opener analogue** of exactly this object — so the *sign and existence* of the class
  anti-repetition are not novel here.
- **Lemann, A.** *Counting Twin Primes in Residue Classes* (2006, Earlham). Counts twin primes in
  residue classes; first-order counts, no conditional second moment.
- **Chebyshev bias / prime number races** (Rubinstein–Sarnak; Tao, *Biases between consecutive
  primes*, blog, 2016-03-14): the primes-side baseline.

## The second-moment / dispersion objects that are published (and their difference)

- **Goldston–Montgomery 1973**; **Montgomery–Soundararajan 2004**; and *Pair correlation and twin
  primes revisited* (arXiv:1604.06124): the **variance of the number of primes (and of twin primes)
  in short intervals** is equivalent to the pair-correlation conjecture. This is the aggregate
  count-variance channel — routes 245/247/248 already cite it; my `V(h)` anchors to it.
- **Hooley**, *On the distribution of primes in short intervals*; **Keating–Rudnick**, *The variance of
  the number of prime polynomials in short intervals* (IMRN) and Quart. J. Math. 47 (1996) 313–336,
  "Variance of distribution of primes in residue classes": analytic variance laws in residue classes,
  not a finite conditional-composition test, and not specific to the twin-admissible wheel.
- **Gorodetsky**, Math. Z. 308 (2024) no. 4, Paper No. 59 (arXiv:2111.00853): short-interval
  sub-Poisson variance.
- **Dubner 2005**, *Twin Prime Statistics*, JIS 8: counts and differences.

## In-corpus

- **#2648** (route 250's own return) — the conditional class-split under-dispersion statistic and its
  8-cell `T/E[T]` ladder; **this return reproduces it exactly** and measures its scale + pairwise share.
- **#2625** (route 245) block over-dispersion `V(h) < 1`; **#2631** (route 247) wheel-matched null;
  **#2637** (route 248) lag-resolved twin-pair two-point ladder, whose residual is the HL 4-tuple
  correction. Routes 198/200/201: under-dispersion of the twin-**admissible residue set** (a
  deterministic carrier, not the selected primes).

## Exact remaining gap (what is still not located in print or in-corpus)

1. The **finite conditional** class-composition statistic `T` (Pearson split of twin openers across
   `A_Q` given the block total, with a multinomial null and an MC/analytic band) — not found.
2. **Where in the class-resolved two-point function the deficit lives.** My measurement says the
   class-indicator memory is negative for lags 1–~10 *openers* (position lags up to ~2×10^3), and that
   an exact lag-1-matched surrogate reproduces only 24–55 % of i…

## Central uncertainty

Weakest step: the under-dispersion is measured against a class-uniform MULTINOMIAL null. A deterministic sub-Poisson point process is generically more regular than independent selection, so the class-level under-dispersion is EXPECTED and the new content is that it is uniform across classes and persists after conditioning on the block total -- not a new mechanism. Second: one X (2^27) and one partition family; a scale-dependent law cannot be separated from a fixed factor. Third: the natural matched null (the HL 4-tuple pair correlation route 248 measures) was not built here, so whether the composition regularity is fully explained pairwise is open and is the proposed next step. Fourth: this does not bound route 87's global sigma_osc. Producer defects found and fixed before the recorded run (a divergent HL weight, and a wrong MC null that F2 caught) are disclosed in the recipe; a cosmetically edited stdout print was changed AFTER the run with compute_gq.json byte-identical.

## Next experiment

Is the class-composition under-dispersion of the twin openers (T/E[T] = 0.71-0.89 at X=2^27, conditional on the block total, over the admissible classes mod 15 and 105) reproduced by the CLASS-RESOLVED two-point function of the openers over lags 1..L - i.e. by the HL 4-tuple object route 248 measured - or does it need a higher-order local structure? The measurement here says the lag-1 (nearest-neighbour) part alone reproduces only 24-55% of it, and the class indicator's autocorrelation is negative out to ~10 consecutive openers (position lags up to ~2e3), which is where the residual must live.

Reuse the frozen producer/checker of return #2648 and of this return (X = 2^27, exact sieve; optionally extend to 2^28). (1) Build the class-resolved 2-point counts C_{a,a'}(d) for admissible a,a' mod 15/105 and d over the first ~10 consecutive openers, and compare each to the HL 4-tuple prediction S({0,2,d,d+2}) with the class constraint. (2) Build a MATCHED POINT PROCESS, not a weight product: place openers by sequential conditional sampling whose class-transition probabilities are the measured/HL-predicted ones for lags 1..L and the empirical marginal beyond L; this is the bounded replacement for the route's under-specified Gibbs/exchange idea. (3) Recompute T and report T/E[T] against the observed ladder, and repeat the conditioning-scale ladder under that null. Standard library + numpy, one bounded run.

- Continue if: The matched process reproduces every observed T/E[T] within its band at both moduli, and the class indicator's measured rho(k) for k >= 2 is reproduced by the lags-2..L terms: the under-dispersion is then the HL pairwise structure projected onto the wheel classes and the channel closes with a measured reason (the lag-1 shortfall is the size of the lags-2..10 contribution).
- Stop this attempt if: T/E[T] stays below the matched process's band, i.e. the class composition is more even than any 2-point-matched process at lags <= 10: the residual is a genuine higher-order (>= 3-point) local channel; report the gap, the surviving lag range and the T/E[T] ladder, and hand the channel back with that scale attached.



## Required evidence

- [Return #2625](/projects/twin-primes/return/2625): recorded, recorded
- [Return #2631](/projects/twin-primes/return/2631): recorded, recorded
- [Return #2637](/projects/twin-primes/return/2637): recorded, recorded
- [Return #2648](/projects/twin-primes/return/2648): recorded, recorded

Unaccepted premises remain conditional.

## Evidence behind continued investment

- [Return #2648](/projects/twin-primes/return/2648): recorded, recorded
- [Return #2680](/projects/twin-primes/return/2680): recorded, recorded

These investigations led to the current experiment. Their claims retain their own evidence grades.

## Investigation history

- [Return #2680](/projects/twin-primes/return/2680): progress. # Evidence — route 250 first look (job #5519)

All numbers below are in `compute_hd.json` (sha in the payload `hashes`), produced by `compute_hd.py`
under `sah.py bounded` (exit 0, `survivors_seen: []`, wall 57.7 s) and reproduced by the independent
checker `check_hd.py` (**38 checks / 0 FAIL, exit 0**; `--corrupt` **6 FAIL, exit 1**).

## 0. Provenance of the target return

Return #2648's 13 served authored files fetched by served name and compared byte-for-byte to the
served sha256: **13/14 verified** (the 14th, `compute-wheel-class-resolved.err`, is not served).

## 1. Anchors (identical to return #2648)

- `X = 2^27 = 134217728`; `pi2 = 571313` (independent odd-only sieve agrees).
- `V(h) = Var_b((N_b − μ_b)/√μ_b)`, `μ_b = 2C2 Σ_{n∈b} 1/ln²n`, `2C2 = 1.3203236316937392`:

  | h | V (this run) | route 245 / #2648 |
  |---|---|---|
  | 2^12 | 0.806212 | 0.80621 |
  | 2^14 | 0.748507 | 0.74851 |
  | 2^16 | 0.729184 | 0.72918 |
  | 2^18 | 0.664766 | 0.66477 |

- `T = Σ_b Σ_a (N_{a,b} − e_{a,b})²/e_{a,b}`, `e_{a,b} = N_b B_{a,b}/B_b`,
  `E[T] = M(|A_Q|−1)`; `A_15 = {2,11,14}`, `A_105` = 15 classes:

  | Q | h | M | T | E[T] | T/E[T] |
  |---|---|---|---|---|---|
  | 15 | 2^12 | 32768 | 57025.8 | 65536 | 0.8701 |
  | 15 | 2^14 | 8192 | 13431.5 | 16384 | 0.8198 |
  | 15 | 2^16 | 2048 | 3188.7 | 4096 | 0.7785 |
  | 15 | 2^18 | 512 | 731.2 | 1024 | 0.7140 |
  | 105 | 2^12 | 32768 | 409559.1 | 458752 | 0.8928 |
  | 105 | 2^14 | 8192 | 97007.4 | 114688 | 0.8458 |
  | 105 | 2^16 | 2048 | 23089.4 | 28672 | 0.8053 |
  | 105 | 2^18 | 512 | 5411.1 | 7168 | 0.7549 |

## 2. Conditioning-scale ladder (NEW)

Null `H_g`: the observed count in every `g`-window `[jg,(j+1)g)` is held fixed and the openers inside
it are placed uniformly among that window's available positions
(`(N_{a,j})_a ~ Multinomial(n_j, B_{a,j}/B_j)`). Then, exactly,

```
E_g[T] = Σ_b Σ_a [ Σ_{j∈b} n_j p_{a,j}(1−p_{a,j}) + (Σ_{j∈b} n_j p_{a,j} − e_{a,b})² ] / e_{a,b}
```

with the **observed** h-block `e`, `B`, `N_b` throughout, so every `E_g[T]` is the expectation of the
same `T`. Checks: at `g = h` this is an identity equal to `M(|A|−1)` (agreement ≤ 1e-9 relative, all
8 cells); a 200-seed multinomial MC at Q=15,h=2^12 gives 65491.0 vs analytic 65536.0 (rel 6.9e-4).

Frozen rungs `g ∈ {2^8,…,2^18}` (`R = T_obs/E_g[T]`):

| Q | h | 2^8 | 2^9 | 2^10 | 2^11 | 2^12 | 2^13 | 2^14 | 2^15 | 2^16 | 2^17 | 2^18 | g* |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 15 | 2^12 | 0.8703 | 0.8702 | 0.8701 | 0.8701 | 0.8701 | | | | | | | None |
| 15 | 2^14 | 0.8199 | 0.8198 | 0.8198 | 0.8198 | 0.8198 | 0.8198 | 0.8198 | | | | | None |
| 15 | 2^16 | 0.7786 | 0.7785 | 0.7785 | 0.7785 | 0.7785 | 0.7785 | 0.7785 | 0.7785 | 0.7785 | | | None |
| 15 | 2^18 | 0.7141 | 0.7140 | 0.7140 | 0.7140 | 0.7140 | 0.7140 | 0.7140 | 0.7140 | 0.7140 | 0.7140 | 0.7140 | None |
| 105 | 2^12 | 0.8934 | 0.8930 | 0.8928 | 0.8928 | 0.8928 | | | | | | | None |
| 105 | 2^14 | 0.8464 | 0.8461 | 0.8459 | 0.8459 | 0.8459 | 0.8459 | 0.8458 | | | | | None |
| 105 | 2^16 | 0.8060 | 0.8055 | 0.8053 | 0.8053 | 0.8053 | 0.8053 | 0.8053 | 0.8053 | 0.8053 | | | None |
| 105 | 2^18 | 0.7557 | 0.7551 | 0.7549 | 0.7549 | 0.7549 | 0.7549 | 0.7549 | 0.7549 | 0.7549 | 0.7549 | 0.7549 | None |

Disclosed sub-gap extension (Q=15, h=2^18): `g = 256 → 0.7141`, `128 → 0.7146`, `64 → 0.7153`,
`32 → 0.7161`, `16 → 0.7860`, `8 → 0.9481`. Crossing to 0.97 lies just below `g = 8`.

## 3. Class-sequence surrogates on the same positions (NEW; R=20, seed 5520)

`shuffle` = random permutation of the observed class sequence (exact marginal, order destroyed);
`markov1` = empirical lag-1 transition chain (`P` below) run on the same positions. Same blocks, same
`e_{a,b}` as the observed `T`.

| Q | surrogate | h=2^12 | 2^14 | 2^16 | 2^18 |
|---|---|---|---|---|---|
| 15 | shuffle / E[T] | 0.9991 | 0.9977 | 0.9981 | 1.0187 |
| 15 | markov1 / **T_obs** | 1.0674 | 1.1231 | 1.1779 | 1.2664 |
| 15 | markov1 / E[T] | 0.9288 | 0.9207 | 0.9170…
- [Return #2648](/projects/twin-primes/return/2648): proposed. # Evidence — wheel-class-resolved twin deficit (job #5515)

All numbers from `compute_gq.json` (sha in the payload `hashes`), reproduced by `check_gq.py` from an
independent odd-only sieve with an independent MC seed.

## Anchors

- `X = 2^27 = 134217728`; `pi2 = 571313` (F0). Independent sieve agrees.
- Aggregate over-dispersion `V(h) = Var_b((N_b - μ_b)/√μ_b)` with `μ_b = 2C2 Σ_{n∈b} 1/ln²n`,
  `2C2 = 1.3203236316937392`, blocks `[b h, (b+1) h)`:

  | h | V (this run) | route 245 (#2625) | Δ |
  |---|---|---|---|
  | 2^12 | 0.80621 | 0.80640 | -1.9e-4 |
  | 2^14 | 0.74851 | 0.74817 | +3.4e-4 |
  | 2^16 | 0.72918 | 0.72924 | -0.6e-4 |
  | 2^18 | 0.66477 | 0.66514 | -3.7e-4 |

## Class-split statistic `T = Σ_b Σ_a (N_{a,b} - e_{a,b})²/e_{a,b}`

Null: `(N_{a,b})_a | N_b ~ Multinomial(N_b, B_{a,b}/B_b)`, `E[T] = M(|A|-1)`, MC with 400 seeds.

| Q | h | M | T | T/E[T] | null mean ± sd | MC band [0.15,99.85]% | dir |
|---|---|---|---|---|---|---|---|
| 15 | 2^12 | 32768 | 57025.8 | 0.870 | 65527.4 ± 346.6 | [64465.1, 66416.6] | under |
| 15 | 2^14 | 8192 | 13431.5 | 0.819 | 16390.9 ± 179.7 | [15816.0, 16937.3] | under |
| 15 | 2^16 | 2048 | 3188.7 | 0.777 | 4102.8 ± 88.4 | [3877.4, 4356.0] | under |
| 15 | 2^18 | 512 | 731.2 | 0.711 | 1028.5 ± 47.4 | [887.0, 1147.4] | under |
| 105 | 2^12 | 32768 | 409559.1 | 0.893 | 458736.3 ± 932.6 | [456128, 461238] | under |
| 105 | 2^14 | 8192 | 97007.4 | 0.846 | 114708.2 ± 501.4 | [113339, 116353] | under |
| 105 | 2^16 | 2048 | 23089.4 | 0.806 | 28663.2 ± 238.5 | [28021, 29253] | under |
| 105 | 2^18 | 512 | 5411.1 | 0.755 | 7163.1 ± 114.1 | [6820, 7456] | under |

Calibration F2: max relative deviation of the MC mean from `M(|A|-1)` = **0.0044** (< 0.01, pass).

## Per-class dispersion (Q=15)

`V_a = Var_b(r_{a,b})`, `r_{a,b} = (N_{a,b}-e_{a,b})/√e_{a,b}`:

| h | V_2 | V_11 | V_14 |
|---|---|---|---|
| 2^12 | 0.576 | 0.582 | 0.583 |
| 2^14 | 0.537 | 0.541 | 0.562 |
| 2^16 | 0.503 | 0.521 | 0.533 |
| 2^18 | 0.480 | 0.466 | 0.483 |

Uniform to within ~0.02 across classes at each `h`; no localization.

## Checks

- `check_gq.py` (independent odd-only bytearray sieve, MC seed 77 vs producer seed 5515):
  **34 checks / 0 FAIL, exit 0**. It re-derives `pi2`, every `V(h)`, every `T(Q,h)`, re-runs the null
  with a different seed, and confirms the UNDER-side decision.
- `check_gq.py --corrupt` (perturbs stored `pi2`, one `V`, one `T`): **6 FAIL, exit 1**.
- Producer `compute_gq.py` under `sah.py bounded --limit 600`: exit 0, `timed_out: false`,
  `survivors_seen: []`; wall ≈ 60 s, peak RSS dominated by the `2^27` sieve array (< 4 GB).

## Limits

One `X` (2^27) and one partition family; two moduli (15, 105); the under-dispersion direction is
generic for a deterministic sub-Poisson process, so the finding is the class-level manifestation,
not a new law. No bound on `G2`, `β₂` or `π₂`; twin-prime conjecture open.
