โ€บNavigation
Dashboard โ€บ Probes โ€บ Probe Hardening Loop โ€บ iter 2

iter 2 โ€” the tie-jitter scales as nโˆ’ยฝ GROUNDED

Attack item R-1 ยท 2026-07-29 ยท harness harness/xi_tie_jitter_scaling.py ยท 400 tie-break draws per configuration

The question, and why it gates other work

ฮพ is a randomized estimator whenever X has ties โ€” the rearrangement of tied X values is drawn uniformly at random, so calling ฮพ twice on identical data returns different numbers. The research measured sd = 0.0080 at n = 2,000 with a 30.9% tie rate. The cascade's ฮพ PASS line sits at 0.50, justified in-code as "just above certified-orthogonal ceiling 0.494" โ€” so the PASS moat is 0.006 wide, and 0.0080 would be 1.33ร— that.

But 2,000 is not the cascade's n. It feeds ฮพ strided value rows: 80,000 bars, WIN=200, STRIDE=20 โ†’ 3,990. Chatterjee says the randomisation "can be ignored if n is large." Is 3,990 large enough? Research gap #992 calls this "the single most important untested question".

Prediction, written before running

Scaling 0.0080 from n=2,000 to n=3,990 at nโˆ’ยฝ gives โ‰ˆ0.0057 โ€” just under the moat with essentially no margin. That was wrong by about 2ร—, and the reason is instructive.

Result โ€” scaling is ordinary sampling error

tie_f   exponent b     Rยฒ   reading
0.100      -0.465   0.984   ordinary sampling error
0.309      -0.493   0.993   ordinary sampling error
0.500      -0.521   0.997   ordinary sampling error

The tie-break jitter is ordinary sampling error, nโˆ’ยฝ, Rยฒ 0.98โ€“0.997. Chatterjee's "ignorable if n is large" is empirically confirmed for this estimator โ€” the question is only whether 3,990 counts as large relative to the margin being adjudicated.

Why my prediction was 2ร— too high โ€” and it cross-validates the research

Jitter depends on where ฮพ sits. Near the null it is roughly twice as large as near the line:

n = 2,000, tie 0.309sdvs the research's 0.0080
near-null arm (ฮพ โ‰ˆ 0.01)0.00782reproduces it
near-line arm (ฮพ โ‰ˆ 0.49)0.00348less than half

So the research's 0.0080 was a near-null measurement, independently reproduced here to within 2%. I scaled it as though it applied at the line, which is the regime that actually decides verdicts. Correcting that halves the number.

The decisive finding โ€” exposure is per-KERNEL, not per-cell

The real-data arm settled this. Running the committed BTCUSDT bar-close fixture through the probe's own value-row construction:

fixture BTCUSDT-bars-close-sample-10k.csv: 10000 closes -> 490 value rows (WIN=200, STRIDE=20)
  tie_f=0.000  xi=0.1890  sd=0.00000  spread=0.00000   <-- continuous kernel: ZERO jitter
  tie_f=0.308  xi=0.1846  sd=0.01151  spread=0.07712

A continuous derived series has no X-ties, so ฮพ is exactly deterministic โ€” zero jitter, not small jitter. The 30.9% tie rate lives in the raw close series; a rolling-window statistic over it is continuous. So the exposure is not a property of the cell at all. It is a property of the kernel.

Which kernels are exposed? Ones whose output lands on a lattice. A kernel returning a rate over a WIN=200 window can take at most 201 values, so across 3,990 value rows its tie fraction is โ‰ˆ0.95 by construction. categorical_recurrence_rate_close_ties is exactly such a kernel โ€” and it is exactly the candidate sitting at 0.4992. That arm was added after the fixture result, because nothing swept beforehand reached that tie fraction:

      n  levels   tie_f   xi_mean        sd    spread  sd/moat  sd/margin
   2000     201   0.899    0.4931   0.00648   0.04185     1.08        8.1
   3990     201   0.950    0.4921   0.00436   0.02691     0.73        5.4
   8000     201   0.975    0.4841   0.00339   0.02098     0.56        4.2

Verdict โ€” the moat survives, the margin does not

QuestionAnswer
Is the jitter under the 0.006 moat at n = 3,990? yes โ€” 0.00171โ€“0.00295 for continuous-ish kernels (0.28โ€“0.49ร— moat), and 0.00436 (0.73ร— moat) in the realistic worst case of a rate-valued kernel. The moat is ~1.4 ฯƒ wide.
Is the 0.0008 reported margin resolvable? no โ€” that margin is 0.18 ฯƒ of the jitter (5.4ร— smaller than one sd). A re-run with a different seed can flip it either way.

So categorical_recurrence_rate_close_ties's 0.4992-vs-0.50 verdict is seed noise, confirmed at the cascade's own n and with the tie structure its own kernel produces. But the band placement itself is not in danger from jitter.

What this does to R-2

R-2 (de-randomise by averaging over rearrangements) is still required, and now narrowly scoped: it matters only for lattice-valued kernels adjudicated near a line. Continuous kernels need nothing โ€” their jitter is identically zero. That is a much cheaper fix than "average everything", and it is the scope R-2 should adopt.

"Alternatively, one can consider taking the average of ฮพโ‚™ over all possible increasing rearrangements of the Xแตข's."
โ€” arXiv:1909.10140, remark (8)

Limits of this iteration, stated plainly

Evidence: harness/xi_tie_jitter_scaling_evidence.json (39 configurations). Reproduce: VIRTUAL_ENV="" uv run --python 3.13 --no-project --with numpy --with pandas python3 harness/xi_tie_jitter_scaling.py