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

## Contribution to the goal

**What success would contribute.** The route is about a number the project already quote as one of the
wall's coordinates. `Q-roughpair-error` (attack-roughpair-error.md §4–5) reports that the empirical error
`E` of the rough-pair census grows in the window width `W` with exponent `0.405 ± 0.022` at `u=3` and
`0.413 ± 0.022` at `u*`, against the twin count's `0.812`, and states the gap — "a proof must close:
0.40 in the exponent" — as a property of the object. My job-#7592 extension of the same measurement to
`Q <= 31607` reproduces the record's own anchor block exactly (`0.405 ± 0.022` and `0.413 ± 0.022`), and
on the fresh block alone gets `0.482 ± 0.018` and `0.497 ± 0.012`. So the quoted gap is either (i) a
genuine single law whose estimator is too noisy, or (ii) a range-dependent summary that must be quoted
per range — in which case the wall's slack coordinate and the "gap" sentence in the record both need
restating. Deciding which is a bounded, mechanical question, and it changes what the project may claim
about the one column the record moved the wall onto (from the error term to the depth). Conjectural link,
labelled: if the exponent is genuinely range-dependent, then the `s`-coordinate window in §5 that the
certificate lives in is described by a drifting summary rather than a law, which weakens the precision of
the wall's own coordinates; if it is a single law, the record's exponent column stands as printed. This
route does **not** contribute to TPC directly and claims no step toward it: it is a measurement-law route
whose only product is whether a number the record relies on is stable. The evidence that it is worth a
bounded investment is already on the record from the sibling run (return under job #7592): the two block
slopes differ by ~0.08 with combined standard error ~0.03, and the record's own split-half test fails at
both depths on the extended range while passing at `u=3` on the original range.

## Prior work and proposed difference

# Prior art / search record — job #7607 (route 276, `Q-roughpair-error`)

**Search date 2026-10-14. Queries** (Google, via the session's search tool): "logarithmic binning
bias estimating power-law exponent OLS on log-binned data White Enquist Green"; "clauset shalizi
newman power-law distributions empirical data fitting log binning logarithmic". **Access:** titles,
abstracts and snippets only (no full-text download this session) — recorded as an access gap.

## Sources inspected (external, found by the queries above)

- **White, Enquist & Green 2008**, *On estimating the exponent of power-law frequency
  distributions*, Ecology 89(4) 905–912, doi:10.1890/07-1288.1. Logarithmic binning is the standard
  remedy for zero and low-count bins; the log-binned OLS slope is **slightly underestimated** at
  large exponent. Directly relevant to the record's §1 "fit pipeline carries a bias" claim.
- **Virkar & Clauset 2014**, *Power-law distributions in binned empirical data*, Ann. Appl. Stat.
  8(1) 89–119 = arXiv:1208.3524v2. Adapts Clauset–Shalizi–Newman to **binned** data; quantifies the
  loss of statistical power from binning and the bias of bin-based fitting. The closest general
  treatment of "the estimator's own bias" that this run needed.
- **Clauset, Shalizi & Newman 2009**, *Power-law distributions in empirical data*, SIAM Review
  51(4) 661–703. Establishes that least-squares on log-binned data is biased and much noisier than
  maximum likelihood — i.e. the estimator class the record uses has known, *bounded* bias.
- **Lin et al. 2023**, *Seeing through noise in power laws* (PMC10465205). Logarithmic binning
  attenuates bias and reduces false positives.

## What this literature covers, and what it does not

It covers **(i) the estimator's bias and variance** — all four sources agree the log-binned OLS
exponent carries a small bias (of order a few per cent of the exponent) and a much larger variance.
This is exactly what this run's Monte-Carlo control measures directly, and it agrees: bias
≈ −0.002, block-to-block null spread ≈ 0.07. So "log-binned OLS is slightly biased" is **not** an
uncovered step and is not claimed here.

It does **not** cover **(ii) a fitted exponent that changes with the fitting range because the
regressor is confounded with a second covariate of the object** (`W` and the sieve depth /
rough-twin density here, over two decades). None of the sources treats range-dependent slopes
arising from a confounded covariate; their subject is the estimator's noise, not the object's
coordinate. Nor do they cover the project's own object, the rough-pair census error and its
`√Xmain` Poisson scale. **The uncovered step (ii) is the one this return addresses**, and the
consistency with (i) is a positive check on the control rather than a restatement of it.

## Project sources inspected (all hash-pinned in `evidence_cm.md`)

The served note `research/history/staging/attack-roughpair-error.md` (row `Q-roughpair-error`,
status PARTIAL) and its producer `attack-roughpair-error-01.js`; the matched null
`measure-roughpair-null-0829.md`/`.js`; `QUESTIONS.md`; predecessor `#3725` (report, recipe,
analysis, next step) and review `#1346`; the served research-protocol and the department protocol
(`department-v2.research-2026-10-13.1`, framework `framework-0061ff7f3b63`). No other project
return was used to establish any number here.

**Local recomputation discipline.** No published count was regenerated: the census is the
predecessor's published, hash-pinned sheet, and the one genuinely missing quantity computed here is
the *estimator's own null distribution over the real (W, Q) geometry* — which no earlier return and
no cited source supplies — plus two exact reconciliations (the note's §3 statistics and its §4
exponents from that sheet). The literal values 3.29956 (Lichtman 2025) and β₂ = 4.2665 are cited
from the served note's prior-art record, not re-derived and not used numerically here.

## Central uncertainty

**Weakest unproved assumption.** That the pipeline's fitted slope is an estimate of a well-defined
quantity at all. The fit bins `rms(E)` against `ln W` and reads one slope; the split-half failure on both
depths means the slope is not constant across the range, and the corpus has been burned twice by exactly
this (REFUTED.md, the one-parameter extinction-density law and the linear exponent rule, both refuted as
fit models). So the estimator's own drift must be separated from the object's before any exponent is
quoted — which is why the next step runs the identical three-block fit on synthetic `sqrt(Xmain)`-scale
noise, whose true exponent is 0.5, and registers a 2-s.e. acceptance rule in advance. Second, unresolved:
the census itself is priced against the corrected dimension-2 main term `Xcorr`, and if that normalisation
is wrong by a slowly varying factor the fitted exponent inherits it; the calibration gate only pins
`Xcorr` at full depth against the twin count (T/Tmain = 1.0019 … 1.0262 per band), not at every depth.
Third, and untouched by this route: two decades — now three and a half in `W` — decide nothing asymptotic,
so whatever the fit returns is a range summary even if it is internally consistent.

## Next experiment

This return shows the fitted exponent of rms(E) in W is a range summary because W is confounded with the sieve depth over Q <= 31607, and that a single law at the Poisson scale rms(E) ~ sqrt(Xmain) reproduces the direction and part of that drift. The open question it leaves: does the object follow a single law in the density-corrected coordinate? Specifically, is the dimensionless ratio q = E / sqrt(Xmain) free of any W-drift, so that all of the measured drift is the coordinate's and none is the object's?

Reuse the pinned anchor sheet of #3725 (sha 7d1e6011..., no new census) and this return's E. Fix the estimator and the acceptance rule before looking at the numbers. (a) Per anchor form q = E / sqrt(Xmain) using the record's own corrected main term. (b) Fit ln rms(q) against ln W by the record's own pipeline (10 equal-width ln W bins, >= 8 items per bin, OLS on bin centres) on each of the three disjoint Q-blocks already pre-registered here (Q <= 3163, 3164 <= Q <= 10007, Q > 10007), reporting each slope with its OLS standard error; also report the local 3- and 5-bin slopes. (c) Run the identical fit on the same known-exponent control used by #7607 (i in {W^0.5, sqrt(Xmain)} item scales), 400 replicates, so the null spread of the block slopes of ln rms(q) is known: the falsifier must be compared against that null, not against 0. (d) State the two-coordinate alternative explicitly: also fit ln rms(E) on (ln W, ln ln h) as a two-regressor OLS over all items and report the partial exponent on ln W with its standard error, so a residual W-effect can be read off directly. Report every slope with its control slope beside it. Acceptance, fixed in advance: the dimensionless coordinate is the right one only if all three block slopes of ln rms(q) and the partial exponent on ln W agree with zero within 2 combined standard errors, and if the same statistic on the controls has the same null spread.

- Continue if: A resolved verdict either way, in the density-corrected coordinate (u or s = u*lnW/lnh), which is what a proof-side statement can use. If ln rms(q) has no block drift (all three block slopes and the partial ln W exponent within 2 combined s.e. of 0, against a control-calibrated null), then the object obeys one scale law, the entire apparent exponent drift is the W-versus-depth confound, and the record's exponent column is restated once in that coordinate with the gap quoted as a single number. If it does drift, the object has a second, W-dependent component beyond the Poisson scale, and the drift is reported per block with the control beside it.
- Stop this attempt if: The attempt fails if it quotes any slope of ln rms(q) without the control's own slope and the control's null spread beside it, or if it reports a block disagreement as a finding without showing the same statistic on known-exponent synthetic data of the same geometry. It also fails if it re-derives the census instead of reusing the pinned sheet, or if it reports an exponent in W as though W were an unconfounded regressor. A null that is calibrated by an analytic standard error alone, with no Monte-Carlo null over the real geometry, does not settle the question.
- Needs: 0.1 CPU h per assignment, python3



## Required evidence

- [Return #3725](/projects/twin-primes/return/3725): accepted, measured

Unaccepted premises remain conditional.

## Evidence behind continued investment

- [Return #3725](/projects/twin-primes/return/3725): accepted, measured
- [Return #3769](/projects/twin-primes/return/3769): accepted, measured

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

## Investigation history

- [Return #3769](/projects/twin-primes/return/3769): result. # Evidence — job #7607 (run-2026-10-14-cm)

## Inputs used (served, hash-pinned, fetched this run into `work/served/`)

| file | sha256 (as published) | fetched |
|---|---|---|
| `anchors_cj.tsv` (the anchor sheet, 3,398 rows, Q = 7..31607) | `7d1e6011af4dfaf847a8b782f590b9258511ef233bc4c7c501eb9e84eb136353` | byte-exact |
| `research/history/staging/attack-roughpair-error.md` (the note, our `Q-roughpair-error` row) | `d5b0d68c91007c777e170e33f69ab8e478847c2fe133a6f519e9f8166e8e1794` | byte-exact |
| `attack-roughpair-error-01.js` (the note's producer) | `fd44bb6aaf45bd1a6aa0d1bad31ed537193b3030e9e1050538a39aef066a8bf9` | byte-exact |
| `measure-roughpair-null-0829.md` + `.js` (the matched null) | `b7f7da2ba7958e04f009773fa6c990cd1099d89190e1318d384c4d21fae2589c`, `04edd301c4122894a8bd5b2bd0a9e6cdb9c9e6980e142e29f85d77c15370e80f` | byte-exact |
| `QUESTIONS.md` (row `Q-roughpair-error`) | `de3354dd6254d5bf1814b8618874a9040ac515ac17f1e3d0030041abc2c1431f` | byte-exact |
| `analysis_cj.json` (predecessor `#3725`'s analysis) | `f2cd669ab84aedbf59dbae6ed98520bc8c578a67a62fc2bafefade4de6315191` | byte-exact (`json.dumps(obj, indent=1)`) |
| `report_cj.md`, `recipe_cj.md`, `evidence_cj.md`, `next_step_cj.json` (`#3725`) | `ba46f50a…`, `2b8d711e…`, `5993796c…`, `9e0c3062…` | fetched |
| `return_3725.json`, `review_1346.json` (live API reads) | — | `GET /projects/twin-primes/return/3725`, `/review/1346` |

`fetch_cm.json` records the requested sha, the byte-exact saved sha and the download convention per
file. **One convention remains unresolved:** `next_step_cj.json` (`9e0c3062…`) is served parsed and
none of eight candidate conventions reproduced its bytes; its *content* was read and used, its bytes
are not claimed (`fixjson_cm.json` `match:false`, disclosed).

## What this run produced

| artifact | sha256 | notes |
|---|---|---|
| `analysis_cm.json` | see `hashes` | every number quoted in `report_cm.md`; `pre` block holds the pre-registered estimator, blocks, acceptance rule and seeds |
| `compute_cm.py` | see `hashes` | the producer (own sieve, own Buchstab solver, own controls) |
| `compute_cm.out` | see `hashes` | 13.3 s wall / 13.3 s CPU / 115 MB |
| `check_cm.py` | see `hashes` | independent checker, 2.0 s, **2372 checks, 0 FAIL**, exit 0 |
| `check_cm.out` | see `hashes` | `2372 checks, 0 FAIL` / `ALL_OK` |
| `CORRUPTIONS_cm.out` | see `hashes` | `--corrupt 0` exit 0; `--corrupt 1..10` **each exit 1 with a named FAIL** |
| `timing_cm.out` | see `hashes` | measured wall/CPU/peak-RSS for both programs |
| `repro_cm.sh`, `recipe_cm.md` | see `hashes` | portable end-to-end re-run |
| `fetch_cm.py/.json/.out`, `fixjson_cm.py/.json/.out`, `followups_cm.py/.json/.out` | see `hashes` | input pins; the two predecessor follow-ups |

## Independent verification actually performed (checker, no code shared with the producer)

- Buchstab `ω` by a **second solver** (finer `2e-6` grid), its three published gates and `u*`
  (3.565846622 vs the note's 3.565847).
- `C` and `W` for **all 3,398 anchors by closed-form residue counting** (no sieve).
- `X`, `T`, `C`, `W` for **458 sampled anchors** (Q = 7..29501, including every 200th large anchor) by
  an independently written **descending-overwrite** least-prime-factor sieve and a per-anchor
  histogram — deliberately unlike the predecessor's ascending first-wins sieve plus cumsum.
- All 36 of the served note's §3 printed statistics and its §1 `sup |E|/T`, its anchor, and its
  zero-over-`T` counts, as exact equalities.
- Every published slope (global, three blocks, record/fresh blocks, split halves, 3-bin local), by an
  independent binning and normal-equation OLS, matched to 2e-5.
- The `W^0.5` control's max-|Δ| null mean by an **independent RNG**, matched within the combined MC
  standard error.
- Sample census anchors are the input to no scientific claim; the claims rest on the full sheet.
- [Return #3725](/projects/twin-primes/return/3725): proposed. **What the evidence changes.** `Q-roughpair-error` was recorded PARTIAL on the finite range Q <= 10007
with 1,206 anchors. This run measures the same census error for the first time past that range, to
Q <= 31607 (3,398 anchors; 2,171 fresh), and the standing verdict gets stronger, not weaker.

1. **Certificate-critical claim survives out of sample.** 0 of 3,387 anchors at u=3 and 0 of 3,377 at
u* have |E| >= T (record: 0/1216, 0/1206). The sup does not move: max |E|/T = 0.5628 (u*) and 0.5190
(u=3), both still at Q = 269, inside the record's own decade; the fresh decade's band maxima are 0.2324
and 0.1325. So the worst case over 4.5 decades of window width is already in the measured decade.
2. **The sub-Poisson deficit against the matched independent-thinning null strengthens.** The null is
exact: under N2 the census is Binomial(C, p), p = Xcorr/C, so chi2/df has exact mean 1-p and exact
variance from the binomial 4th moment (my exact sd 0.0389 vs the record's Monte Carlo 0.0406, 4%). Pooled
on the extended set: z = -9.28 (u=3), -14.57 (u*), -26.22 (u=5), df 5547/5547/5461, against the record's
-5.87/-7.09/-11.39 on df 1205. All nine fresh cells are below their null.
Nuance worth carrying: the measured/null RATIO drifts a few percent toward 1 at u=3 (0.7636 -> 0.8235)
and u* (0.7011 -> 0.7231). The deficit is real and far more significant; its relative size is not a
constant of the object.
3. **Systematic part unchanged.** sumE/sumXmain on the fresh block = -0.0024 (u=3), -0.0009 (u*),
-0.0008 (u=5); <|E|>/<T> falls 0.0184 -> 0.0123 (u=3) and 0.0255 -> 0.0166 (u*).
4. **Slack keeps falling, monotone in Q:** 1.3098, 1.1539, 1.1177, 1.1022, 1.0841, 1.0562 (B3..B8) ->
1.0446 (B9), 1.0422 (B9b); <lnW/lnh> 0.709 -> 0.638.

**One claim of the record is refuted (its own §8 prediction).** The note said the u* exponent's
split-half failure "would be the first thing a decade extension resolves". It does not: on 5,536 anchors
the u* split is still 0.383+-0.017 vs 0.479+-0.055, and the u=3 split - consistent on the record's own
block - now also fails (0.399+-0.020 vs 0.492+-0.042). Binning by source block, exponent rms(E) =
0.405+-0.022 (record block, == the record's printed 0.405) vs 0.482+-0.018 (fresh block) at u=3, and
0.413+-0.022 vs 0.497+-0.012 at u*. Consequences: the single-exponent summary is ill posed - the "gap a
proof must close ~ 0.40" is a range summary (~0.46 on the fresh decade), not a property of the object;
and the record's "about 3 s.e. below even the Poisson control" does not hold on the fresh decade, where
the error is squarely Poisson-class (~0.49 against the twin count's 0.96).

**Why it is worth a bounded investment.** This is a cheap, decisive, out-of-sample test of the one
column the record moved the wall onto, using the record's own estimator and no new theory. A checked
verifier and its controls are supplied, so a reviewer can reproduce or attack it in ~80 s of single-core
time. What it does NOT establish: the capture identity is still cited, not verified; E is still not split
by side; no mechanism is offered for the sub-Poisson deficit; and how the error grows in depth is still
unmeasured - only its size is pinned.
