โ€บNavigation
Dashboard โ€บ Rotation-Orthogonal-Probe Campaign โ€บ iter 2

iter 2 โ€” A7: negative-control null calibration

BREAKS โ†’ DEFENDED โ†’ CLOSED  2026-07-10 ยท attack A7 ยท 62/62 cells ยท 1,302 shuffle draws + 4,340 shift draws ยท two estimator defects found in chatterjee_xi, fixed in both probe files, attack re-run clean ยท consecutive-clean counter reset to 0

Claim under attack (assumed true only to destroy it)

On the probe's substrate (stride-20 value-rows, recent-80k fetch), permutation nulls of REAL columns collapse the probe's statistics to โ‰ˆ0 โ€” no null draw comes near a frozen decision line, so xi_worst / breadth / rho_worst cannot be contaminated by spurious dependence. (KB ยง6: "permute a real column โ†’ ฮพ,ฯ collapse to โ‰ˆ0".)

Falsifiers (pre-declared; frozen lines quoted, never retuned)

Null constructions use REAL rows only: shuffle = hash-based deterministic permutation (argsort of sha256(key|i)); shift = np.roll by 10 deterministic offsets (preserves marginals AND autocorrelation โ€” the sharper null for the documented overlap-inflation failure mode).

ATTACK RESULT โ€” 29 breaches (all F1)

NullWorst statisticWhereLineVerdict
plain shuffle (F1)|ฮพ| = 0.2498 ยท 29 draws > 0.10agg_record_count|individual_trade_count โ€” 12 cells0.10BREAKS
circular shift (F2)ฮพ = 0.3749XRPUSDT@2500.50clean
circular shift (F3)|ฯ| = 0.6222XRPUSDT@2500.85clean

Every breach sits on the one heavy-ties integer pair (715 distinct values / 3,990 rows). A FULLY PERMUTED real column โ€” zero dependence by construction โ€” read ฮพ up to 0.25: the estimator, not the data.

Diagnostic โ€” two estimator defects isolated

Direction-split null on the worst cell (a7_diagnostic.json, 50 draws/direction):

Directionnull meannull sdReading
ฮพ(real x โ†’ permuted y)โˆ’0.00130.0105clean (โ‰ˆ theoretical ฯƒ 0.0100)
ฮพ(permuted x โ†’ real y)+0.24450.0084pure systematic bias (~24ฯƒ)
  1. Wrong tie ranks. chatterjee_xi used rank(method="average"). Chatterjee's tie-correct estimator requires max-ranks: ri = #{j: yj โ‰ค yi}, li = #{j: yj โ‰ฅ yi}. Exact worked case: for a permuted binary column (n/2 zeros, n/2 ones), average-ranks give ฮพ โ†’ 1 โˆ’ (nยทnยฒ/4)/(3nยณ/8) = 1/3 at the null; max-ranks give exactly 0.
  2. Stable tie-breaking leaks time. np.argsort(x, kind="mergesort") keeps tied-x rows in TEMPORAL order. The definition requires x-ties broken uniformly at random. With autocorrelated y (all count series here), within-tie y-ranks are adjacent โ†’ ฮฃ|ฮ”r| shrinks โ†’ ฮพ inflates. This is the +0.244 bias: it appears exactly when x is permuted (ties everywhere) and y is the real, autocorrelated series โ€” and it equally inflates ฮพ for ANY real pair with tied x and autocorrelated y.

DEFENSE (mechanism only โ€” no band touched)

- r  = rank(yo, "average")            + r  = rank(yo, "max")            # Chatterjee tie-correct
- li = rank(-yo, "average")           + li = rank(-yo, "max")
- order = argsort(x, "mergesort")     + tiebreak = (arange(n)ยท2654435761) & 0xFFFFFFFF   # Knuth hash
                                      + order = lexsort((tiebreak, x))   # scattered, deterministic, no rng

Applied in lockstep to BOTH probe files (rotation_robust_eval.py, rotating_slice_orthogonality_probe.py โ€” duplicate implementations).

Proof the defense closes the gap

CheckBefore fixAfter fix
A7 same attack, F1 worst shuffle |ฮพ|0.2498 (29 breaches)0.0365 (0 breaches) โ€” SURVIVES
A7 F2/F3 (shift ฮพ / ฯ)0.375 / 0.6220.355 / 0.622 โ€” clean
A5 substrate-validity regression (iter 1)7/7 reproduce7/7 reproduce (BAN ฮพ โ‰ฅ 0.9992 intact; PASS โ‰ค 0.412)
ยงB declaration self-testPASSPASS

Evidence (every claim above cites these)

FileWhat
a7_null_calibration_attack.pyThe attack โ€” falsifiers pre-declared in-file; SELECT-only; permutations of real rows only.
a7_results.jsonPost-fix run (0 breaches). Pre-fix run preserved in a7_stderr.log (29 breaches) + a7_stderr_postfix.log (rank-fix only: still 29 โ€” proof the tie-break defect was load-bearing).
a7_diagnostic_tie_structure.py / a7_diagnostic.jsonDirection-split null + tie profile โ€” isolates the +0.244 bias.
a7_stderr_postfix2.log ยท a5_stderr_postfix2.logFinal clean re-runs (A7 SURVIVES ยท A5 regression 7/7) under the 2 CPU / 2 GB scope.
regression_tests/test_a7_null_calibration.shPermanent regression test โ€” re-runs the attack, asserts SURVIVES.

Consequence

A real estimator defect โ€” invisible to iter 1's worked-example gate (true duplicates read ฮพโ‰ˆ1 under any tie handling) โ€” is found, mechanically explained, fixed in both probe files, and pinned by a regression test. The convergence counter resets: clean rounds 0 of 3.

Open threads

iter 2 ยท attack A7 ยท verdict BREAKS โ†’ DEFENDED โ†’ CLOSED ยท one atomic commit: iter 2: A7 negative-control null calibration โ€” BREAKSโ†’DEFENDED ยท append-only.