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
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".)
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).
| Null | Worst statistic | Where | Line | Verdict |
|---|---|---|---|---|
| plain shuffle (F1) | |ฮพ| = 0.2498 ยท 29 draws > 0.10 | agg_record_count|individual_trade_count โ 12 cells | 0.10 | BREAKS |
| circular shift (F2) | ฮพ = 0.3749 | XRPUSDT@250 | 0.50 | clean |
| circular shift (F3) | |ฯ| = 0.6222 | XRPUSDT@250 | 0.85 | clean |
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.
Direction-split null on the worst cell (a7_diagnostic.json, 50 draws/direction):
| Direction | null mean | null sd | Reading |
|---|---|---|---|
| ฮพ(real x โ permuted y) | โ0.0013 | 0.0105 | clean (โ theoretical ฯ 0.0100) |
| ฮพ(permuted x โ real y) | +0.2445 | 0.0084 | pure systematic bias (~24ฯ) |
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.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.- 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).
| Check | Before fix | After fix |
|---|---|---|
| A7 same attack, F1 worst shuffle |ฮพ| | 0.2498 (29 breaches) | 0.0365 (0 breaches) โ SURVIVES |
| A7 F2/F3 (shift ฮพ / ฯ) | 0.375 / 0.622 | 0.355 / 0.622 โ clean |
| A5 substrate-validity regression (iter 1) | 7/7 reproduce | 7/7 reproduce (BAN ฮพ โฅ 0.9992 intact; PASS โค 0.412) |
| ยงB declaration self-test | PASS | PASS |
| File | What |
|---|---|
| a7_null_calibration_attack.py | The attack โ falsifiers pre-declared in-file; SELECT-only; permutations of real rows only. |
| a7_results.json | Post-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.json | Direction-split null + tie profile โ isolates the +0.244 bias. |
| a7_stderr_postfix2.log ยท a5_stderr_postfix2.log | Final clean re-runs (A7 SURVIVES ยท A5 regression 7/7) under the 2 CPU / 2 GB scope. |
| regression_tests/test_a7_null_calibration.sh | Permanent regression test โ re-runs the attack, asserts SURVIVES. |
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.
iter 2 ยท attack A7 ยท verdict BREAKS โ DEFENDED โ CLOSED ยท one atomic commit:
iter 2: A7 negative-control null calibration โ BREAKSโDEFENDED ยท append-only.