Navigation
FXView forex · ODB pipeline · Chatterjee ξ keeper-confirmation gate · nasimubd · autonomous loop

Iteration 1 — ξ harness build & smoke validation

This iteration built the Chatterjee ξₙ confirmation harness — the asymmetric, non-monotone dependence gate that adjudicates the 16 Spearman-cleared keepers and the 2 HOLDs — and smoke-validated it on EURUSD@5 live_tail. The full 174-cell run was launched at the end of this iteration and is now in progress.

16
candidates under ξ
125
prod cols (of 151 legal)
7,450
ξ eval points (smoke cell)
25.5s
per cell (2-core slice)
Status: harness GREEN. --mode chatterjee added to multislice_orthogonality_probe.py; clean-room asymmetric ξₙ kernel; scale-aware degeneracy gate replacing the broken range<1e-9 floor; per-cell xi_results/ + XI_AGGREGATE_VERDICT.json emitters. Smoke on EURUSD@5 live_tail: n_eval=7450, prod=125, maxXI(c→c)=0.83, maxXI_abs(prod→c)=0.95.

What this iteration did

The ξₙ estimator (and why asymmetric)

Spearman measures only monotone dependence and is symmetric. Chatterjee's ξₙ measures general dependence — ξ(X→Y) ≈ 1 iff Y is a measurable function of X — and is asymmetric, which is exactly what "is candidate A absorbed by feature B?" needs.

xi(X→Y) = 1 − n·Σ|r_{i+1} − r_i| / (2·Σ l_i(n − l_i))
  sort by X (deterministic, stable tie-break → replay-bit-exact)
  r_i = #{j: Y_j ≤ Y_(i)}   (rankdata 'max')
  l_i = #{j: Y_j ≥ Y_(i)}   (n − rankdata 'min' + 1)

Directional convention used here: a candidate is absorbed (redundant) when some shipped column p predicts it — i.e. xi(p → cand) is high (cand ≈ f(p)). xi(cand → p) is also computed and stored. Tie-breaking is a stable argsort (not Chatterjee's random break) so the run is replay-bit-exact — a no-silent-drift control (PITSLARP).

Scale-aware degeneracy gate — smoke evidence

The new gate flags a candidate-symbol degenerate when eff_bits < 1.5 (fewer than ~3 distinguishable levels) OR (|p50| < 1e-4 AND range < 1e-4) (sits within 1e-4 of constant with sub-1e-4 spread). The smoke cell shows it discriminates the degenerate HOLD from the location HOLD and from healthy features:

candidateabs_p50rangeeff_bitsiqrgate
updown_cjs3.4e-072.3e-063.663.1e-07DEGENERATE (prong B)
candle_shoelace_area0.03.4e-043.042.6e-05not degenerate — location case
lziv_complexity_signs1.1470.312.373.8e-02healthy
edge_spread_bps0.1620.813.429.1e-02healthy
Why this matters. The old absolute floor (1e-9) called nothing degenerate. The new gate catches updown_cjs's near-point-mass magnitude (~3e-7) without false-flagging candle_shoelace_area (range 3.4e-4 > 1e-4 → its problem is monotone location, adjudicated by ξ vs log_return_bar_sum, not degeneracy) or genuinely-varying features. Exactly the separation the run plan asked for.

Smoke ξ matrix — top absorbers (EURUSD@5 live_tail, single cell)

Per-candidate strongest shipped-column absorber max_p xi(p → cand). Single-cell only — the verdict is the median over 174 cells with ≥2-symbol replication; these are illustrative.

candidateabs ξ (prod→cand)median absorbertop absorber colfwd ξ (cand→prod)
mann_kendall_z0.9540.134hawkes_intensity_bar_last0.041
sevcik_fd0.9400.126hawkes_intensity_bar_last0.133
anderson_darling_a20.9300.192hawkes_intensity_bar_last0.190
pietra_hoover_durations0.9120.137hawkes_intensity_bar_last0.056
mean_cosine_turning_angle0.9090.186hawkes_intensity_bar_last0.112
spread_sign_reversal_rate0.8730.116hawkes_intensity_bar_last0.918
spectral_log_slope0.3840.048session_fine_id0.018
lziv_complexity_signs0.4100.036hawkes_intensity_bar_last0.975
candle_shoelace_area0.5280.014bid_imbalance_ewma_bar_last0.965
Methodological flag to watch in the full run. hawkes_intensity_bar_last is the strongest absorber for ~14/16 candidates on this single 90-day slice (0.83–0.95). This is almost certainly an overlapping-window smoothness inflation of ξ: at stride=1 consecutive 200-bar windows share 199/200 bars, so every rolled feature is an extremely smooth (low-frequency) series; sorting by any other slow-drift column orders it smoothly → ξ(X→Y) inflates. Note the median absorber across all 125 prod cols stays low (0.01–0.19) — only one column drives the tail. The guard is built in: the absorption verdict uses the median over 174 cells with ≥2-symbol replication, not a single slice. Iteration 2 will check whether hawkes_intensity_bar_last is a universal absorber (real) or a per-slice artifact (drops out under the median).

Data & resource policy (verified)

What's next

Generated 2026-06-06 · iteration 1 · harness commit pending (PR-from-worktree at milestone) · ξ run plan: 2026-06-06-chatterjee-xi-keeper-run-plan.md