โ€บNavigation
Orthogonality candidate deep dive ยท TDA family ยท #65
CANDIDATE #65 PILOT APPLICATION 2026-05-19 AXIS 1 PASS AXIS 2 FAIL AXIS 3 INCONCLUSIVE NET CONDITIONAL

Persistence Landscape Lยฒ-norm

First per-candidate analysis produced under FRAMEWORK.md. Authored as an experimental pilot application by Nasim (the framework's draft author) on 2026-05-19 to stress-test FRAMEWORK.md before Terry's accuracy review. Pre-Framework Gate relaxed for this experiment only. The 22 framework gaps surfaced during this pass are catalogued in FRAMEWORK-AMENDMENTS.md.

TL;DR โ€” three sentences
  1. The candidate carries genuinely new information. No single shipped feature explains more than 13% of its variance (max |Spearman ฯ| = 0.36 vs high price). Even nonlinear models trained on shipped features fail to reproduce Lยฒ-norm across time periods (out-of-sample Rยฒ is negative).
  2. It fails the parameterless test strictly (3 tunable knobs: m, ฯ„, max_dim) but has a defined escape path: adopt a project-wide TDA-family parameter convention.
  3. The cross-asset (agnostic) test was inconclusive due to two known sample-design confounds โ€” needs a re-test with time-matched samples or within-regime KS to disambiguate "asset-specific" from "regime-conditional in mismatched regimes."

What does this feature do?

In one sentence: It measures how much "topological structure" โ€” loops, holes, persistent shapes โ€” exists in the trajectory of the last 100 BTC price moves, distilled into one number.

The analogy: Imagine the last 100 price moves as a path through 3D space. Now slowly flood that space with water and watch which "islands" of the path merge, which "loops" form around dry patches, and which loops collapse as the water rises. The Lยฒ-norm summarizes how much persistent topological structure existed across all water levels โ€” a richly-looping path scores high, a smooth-curve or featureless-cloud path scores low.

What HIGH vs LOW means: HIGH = market is topologically rich โ€” buyers and sellers fighting, prices revisiting the same regions repeatedly. The signature of indecision and regime transition. LOW = market is in a "decided" state, either smoothly trending or genuinely noisy โ€” both have collapsed topology, no persistent loops.

Why are we testing this?

The hunt

Finding orthogonal features

Eon Labs is hunting for features that carry information the 30 shipped CH columns don't already carry. Redundant features waste compute and add noise; orthogonal ones add edge.

The conjecture

Topology vs scalar moments

Shipped features measure scalar moments of within-bar trade activity. Persistence Landscape measures the SHAPE of the multi-bar trajectory. Mechanistically different categories of information.

The literature

5-20 bar lead claim

2025 paper "Topological ML for Financial Crisis Detection" (DOI 10.3390/computers14100408) showed this measure spikes 5-20 bars BEFORE major regime transitions on equity indices, validated on 2008, 2020, and 2022 crashes.

The pilot application

Stress-test FRAMEWORK.md

Beyond the candidate itself, this run is the first end-to-end application of FRAMEWORK.md. Every gap that surfaces is logged in FRAMEWORK-AMENDMENTS.md as input to the next iteration before Terry's review.

The edge hypothesis (Level 4)

Phenomenon

Regime transitions in BTC at hours-to-days timescale. During a transition, buyers and sellers fight, prices revisit the same levels, the next direction hasn't crystallized.

Mechanism

Stable regimes produce simple geometry (curve or blob โ€” few loops, LOW Lยฒ). Transitions cause the price-trajectory to revisit state-space regions, creating persistent loops in the Takens-embedded cloud (HIGH Lยฒ).

Tradeable rule

Lยฒ rising sharply โ†’ reduce position size / go neutral (transition uncertainty). Lยฒ collapsing โ†’ re-engage with whatever direction emerged. Unusual: this predicts uncertainty, not direction.

Edge magnitude

~50-200 bps avoided drawdown per major transition. ~5-15 events/year in BTC. Cost-realism check: BTC round-trip spread is ~500 bps. Marginal at low end, clear win at high end. Hinges on false-positive rate (untested).

Empirical evidence โ€” compute facts

Sample
100,000 bars
BTCUSDT @ 250 dbps ยท 2024-02-28 to 2026-05-15
Windows computed
99,901
100-bar rolling, m=3 ฯ„=1
Per-window cost
16.2 ms
bigblack, single core
Total runtime
27.1 min
peak RSS ~100 MB
CPU compliance
โ‰ค100%
strict, BLAS threading disabled
Price range
$49K โ†’ $126K
multi-regime, full bull cycle
Degenerate windows
29 / 99,901
0.03% โ€” handled gracefully
FOSS dep
MIT
persim @ f2918f4843a5

Level 2 โ€” statistical character

Summary statistics

N samples99,901
min / max0.722 / 14.682
mean2.108
median1.866
std dev1.242
IQR0.567
skewness+4.156 (very heavy right tail)
kurtosis+22.71 (~7ร— normal)
p1 / p990.92 / 8.09

Distribution shape (10 equal-width bins)

[0.72-2.12]66,514 67%
[2.12-3.51]26,554 27%
[3.51-4.91]2,388 2.4%
[4.91-6.31]2,020 2.0%
[6.31-7.70]1,340 1.3%
[7.70-9.10]530 0.5%
[9.10-10.49]388 0.4%
[10.49-11.89]60 rare
[11.89-13.29]10 rare
[13.29-14.68]97 extreme

Three-mode structure: 67% calm, 27% moderate, 6% transition+extreme. Heavy-right-tail signature of a regime-transition detector exactly as Level 0 hypothesized.

Axis 1 โ€” ORTHOGONAL โœ“ PASS

SUB-TEST (a) MONOVARIATE SPEARMAN
|ฯ| = 0.361
max correlation against any of 30 shipped CH columns, vs high price. Well below the 0.95 BAN threshold and the 0.85 WATCH threshold.
Top 5 partners (all price-level):
highโˆ’0.3611
closeโˆ’0.3610
vwapโˆ’0.3610
openโˆ’0.3610
lowโˆ’0.3609
SUB-TEST (b) h_norm STRUCTURAL
h_norm = 1.0000
Maximum possible value. Quintile fractions: [0.2, 0.2, 0.2, 0.2, 0.2] โ€” perfect uniformity. No mass collapse, no information concentration.
FRAMEWORK EXTENSION L3-4 + L3-5

Sub-tests (c) and (d) โ€” combinatorial reproducibility + chronological OOS

Monovariate ฯ doesn't catch whether a combination of shipped features can reproduce the candidate, nor whether the relationship holds across time. Extended tests added during this pilot application:

TestIn-sample RยฒOut-of-sample Rยฒ (chronological)
Linear OLS on 28 shipped features0.106โˆ’0.190
Gradient Boosting (200 trees, depth 4)0.538โˆ’0.266
Max single-feature MI (model-free)0.745 vs high ยท top 5 price columns 0.70-0.75
The headline finding: Both Rยฒ tests go NEGATIVE on chronological out-of-sample. High mutual information (0.745) says shipped features share substantial nonlinear info with Lยฒ-norm at any snapshot. Yet no fixed model trained on past data can predict Lยฒ-norm on future data. This is the empirical signature of a regime-conditional feature โ€” its relationship with shipped features changes shape across regimes. Negative OOS Rยฒ isn't failure; it's evidence that scalar shipped features cannot reproduce Lยฒ-norm by any fixed mapping.
โ†’ Methodological note: the FIRST run of this test was contaminated by timestamp leakage (Rยฒ = 0.847 driven 72% by source_end_ts). The corrected version (timestamps excluded, chronological train-test split instead of random) produced the honest numbers above. See layman explainer ยง7 for the full leakage story.

Axis 2 โ€” PARAMETERLESS โœ— FAIL (with escape)

7 free parameters total; 3 truly TUNABLE per-feature. Under Terry's msg-428 rubric this is a strict FAIL. Escape path: if the project adopts a TDA-family convention {m=3, ฯ„=1, max_dim=1} applied uniformly across all TDA candidates (#65-#69), the 3 tunables become project-wide constants (CONVENTIONABLE) โ†’ FAIL flips to PASS.

#ParameterValueClassification
1Embedding dim m3TUNABLE per-feature โš 
2Time delay ฯ„1TUNABLE per-feature โš 
3Max homology dim1TUNABLE per-feature โš 
4Window size N100 barsCONVENTIONABLE
5Standardizationz-score per windowCONVENTIONABLE
6Landscape num_steps200CONVENTIONABLE
7p-norm order2CONVENTIONABLE

Axis 3 โ€” AGNOSTIC โš  INCONCLUSIVE

Small-spike validation: BTCUSDT vs ETHUSDT, 10K bars each, KS 2-sample test. Three KS readings gave three different stories:

TestKS statisticVerdict
KS on RAW Lยฒ-norm values0.8219would FAIL
KS on per-asset quintile encoding0.0000mathematically vacuous (always 0)
KS on POOLED quintile encoding (proper)0.7192FAIL naively
โš  Why the FAIL is INCONCLUSIVE, not actionable
  1. Time-window mismatch: "Last 10K bars" of BTC at 250 dbps = ~3 months; of ETH at 250 dbps = ~1 month (ETH bars produce faster due to higher vol). We're comparing different calendar periods. โ†’ Framework gap L3-7.
  2. Regime mismatch: BTC's last 9,901 windows happen to be in an unusually high-Lยฒ regime (median 4.40 vs full-sample median 1.87 โ€” 2.4ร— elevated). ETH's last 9,901 windows are in a calm regime (median 1.69). โ†’ Framework gap L3-8.

The KS=0.72 is consistent with BOTH "feature is BTC-specific" AND "feature correctly detects regime + assets in different regimes." Can't distinguish without time-matched samples or within-regime KS.

โš  Critical framework gap L3-6 surfaced

FRAMEWORK.md says "KS on quintile-encoded values" without specifying per-asset vs pooled. Per-asset encoding is mathematically vacuous โ€” always returns KS=0 because each asset's quintile distribution is forced uniform [0.2, 0.2, 0.2, 0.2, 0.2] by construction. POOLED encoding is the meaningful test. The next FRAMEWORK.md iteration must mandate POOLED.

22 framework gaps surfaced during this pilot application

Every gap has a concrete proposed fix in FRAMEWORK-AMENDMENTS.md. The 5 most impactful are highlighted below; the other 17 are catalogued in that file.

HIGH ยท L0-1

Family list closed at 5 (missing TDA)

Replace closed list with open taxonomy + families.md registry.

HIGH ยท L3-4

Axis 1 only tests monovariate, not combinatorial

Add linear + nonlinear Rยฒ as Axis 1 sub-test (c).

HIGH ยท L3-5

Axis 1 doesn't capture non-stationarity

Add chronological out-of-sample Rยฒ as Axis 1 sub-test (d).

HIGH ยท L3-6

Axis 3 quintile-KS is ambiguous (trivial under per-asset reading)

Mandate POOLED quintile encoding.

HIGH ยท L3-7

"Last N bars" covers different time periods across assets

Require time-matched sampling, not bar-count-matched.

+ 17 more gaps

L0-2 through CC-1

License posture, license at Pre-Level, multi-stage formula, window shape, function-valued outputs, hard vs soft window minima, BLAS threading disclosure, REGIME-WFA-001 feature-translation, etc.

Telemetry artifacts (JSONL)

Spike events recorded as a JSONL trace. CPU compliance evidence at every poll point, axis verdicts as structured records.

{"event":"spike_start","ts":"2026-05-19T01:50:00Z","candidate":"persistence_landscape_l2","asset":"BTCUSDT","threshold_dbps":250,"sample_bars":100000,"runner":"nasimubd@bigblack","blas_threads":1}
{"event":"data_pull","ts":"2026-05-19T01:50:01Z","rows":100000,"cols":31,"duration_ms":620,"clickhouse_query":"SELECT close_time_us, close, ... FROM opendeviationbar_cache.open_deviation_bars FINAL WHERE symbol='BTCUSDT' AND threshold_decimal_bps=250 ORDER BY close_time_us DESC LIMIT 100000"}
{"event":"cpu_check","ts":"2026-05-19T01:50:15Z","elapsed_s":15,"cpu_pct":96.4,"within_cap":true}
{"event":"cpu_check","ts":"2026-05-19T01:50:54Z","elapsed_s":54,"cpu_pct":99.0,"within_cap":true}
{"event":"progress","ts":"2026-05-19T01:52:41Z","windows_done":10000,"total":99901,"rate_win_per_s":62}
{"event":"progress","ts":"2026-05-19T01:54:55Z","windows_done":20000,"total":99901,"rate_win_per_s":68}
{"event":"checkpoint_written","ts":"2026-05-19T01:54:55Z","path":"~/scratch/odb-spike-65/l2_checkpoint.parquet","bytes":399163}
{"event":"cpu_check","ts":"2026-05-19T02:01:03Z","elapsed_s":663,"cpu_pct":99.7,"within_cap":true}
{"event":"progress","ts":"2026-05-19T02:05:00Z","windows_done":50000,"total":99901,"rate_win_per_s":71}
{"event":"progress","ts":"2026-05-19T02:12:30Z","windows_done":90000,"total":99901,"rate_win_per_s":63}
{"event":"compute_done","ts":"2026-05-19T02:17:18Z","total_windows":99901,"duration_s":1623.8,"l2_min":0.722,"l2_max":14.682,"l2_mean":2.108,"l2_median":1.866}
{"event":"axis1_subtest_a","ts":"2026-05-19T02:17:30Z","spearman_max_abs":0.3611,"partner":"high","threshold_ban":0.95,"threshold_watch":0.85,"verdict":"PASS"}
{"event":"axis1_subtest_b","ts":"2026-05-19T02:17:31Z","h_norm":1.0000,"quintile_fractions":[0.2,0.2,0.2,0.2,0.2],"threshold":0.05,"verdict":"PASS"}
{"event":"axis1_subtest_c","ts":"2026-05-19T02:17:34Z","method":"linear_ols","in_sample_r2":0.106,"oos_r2_chronological":-0.190,"verdict":"PASS (mostly orthogonal)"}
{"event":"axis1_subtest_c_gbm","ts":"2026-05-19T02:18:55Z","method":"gradient_boosting","in_sample_r2":0.538,"oos_r2_chronological":-0.266,"overfit_gap":0.804,"top_feature":"high","top_importance":0.184}
{"event":"axis1_mutual_information","ts":"2026-05-19T02:20:00Z","method":"ksg_knn","max_mi":0.745,"partner":"high"}
{"event":"axis2","ts":"2026-05-19T02:20:05Z","total_params":7,"tunable_per_feature":3,"conventionable":4,"verdict":"FAIL","escape_path":"TDA-family parameter convention {m=3, tau=1, max_dim=1}"}
{"event":"axis3_spike_start","ts":"2026-05-19T01:49:00Z","comparison_asset":"ETHUSDT","sample_size":10000}
{"event":"axis3_ks_raw","ts":"2026-05-19T02:42:14Z","ks_statistic":0.8219,"p_value":0}
{"event":"axis3_ks_per_asset_quintile","ts":"2026-05-19T02:42:15Z","ks_statistic":0.0000,"note":"mathematically vacuous","framework_gap":"L3-6"}
{"event":"axis3_ks_pooled_quintile","ts":"2026-05-19T02:42:16Z","ks_statistic":0.7192,"verdict":"INCONCLUSIVE","confounds":["time_window_mismatch","regime_mismatch"],"framework_gaps":["L3-7","L3-8"]}
{"event":"combined_verdict","ts":"2026-05-19T02:43:00Z","axis1":"PASS","axis2":"FAIL","axis3":"INCONCLUSIVE","net":"CONDITIONAL"}
{"event":"framework_gaps_logged","ts":"2026-05-19T02:50:00Z","count":22,"severity":{"high":11,"medium":8,"low":3},"recorded_in":"FRAMEWORK-AMENDMENTS.md"}
{"event":"spike_end","ts":"2026-05-19T02:43:00Z","total_duration_min":53,"cpu_max_pct":99.7,"cpu_cap":100,"cap_violated":false,"files_written":["candidate_aligned.parquet","ethusdt_aligned.parquet"],"files_path":"~/scratch/odb-spike-65/"}

Source artifacts: ~/scratch/odb-spike-65/{spike.py, run.log, candidate_aligned.parquet, ethusdt_aligned.parquet, axis3_spike.py, axis3_results.log}. The parquet files are too large to commit (~20 MB combined) but the JSONL above captures the key telemetry events.

Provenance โ€” git commit chain

Where the idea came from, tracked through the commit history of the parent audit folder.

29ebc6f3 2026-05-08
feat(findings): Phase 1 audit โ€” 64 candidate orthogonal features for BTCUSD
Original PR #493. Established the 5-family audit scope (entropy / fractal / chaos / TE / copula). #65 not yet conceived.
0826258c 2026-05-09
fix(findings): G9 adversarial audit โ€” reclassify #1 Shannon Entropy + close evidence gaps
Adversarial-pair review caught a crypto-vs-forex scope error. Methodology lesson recorded.
53858517 2026-05-12
docs(findings): license audit โ€” 15 FOSS deps verified via GitHub API + compatibility analysis
LICENSE-AUDIT.md added. 13/64 candidates touch GPL-3.0 deps; remaining 51 are MIT/BSD/Apache.
1b176bd7 2026-05-12
docs(findings): 8-level per-candidate framework + audit-folder hub integration
FRAMEWORK.md authored by Nasim (AI-assisted) per Terry's 2026-05-12 call directive. Pre-Framework Gate established: do not apply to candidates until Terry's accuracy review.
UNCOMMITTED ยท PILOT APPLICATION 2026-05-19
(pending) feat(candidates): #65 Persistence Landscape Lยฒ-norm โ€” first pilot application entry
Three new files in the audit folder (uncommitted): candidates/65-persistence-landscape-l2-norm.md ยท candidates/65-persistence-landscape-l2-norm-explained-en.md ยท FRAMEWORK-AMENDMENTS.md. Pre-Framework Gate relaxed for this experimental pass by Nasim. 22 framework gaps surfaced.

Hub-and-spoke navigation

This page is a spoke. The audit folder's CLAUDE.md is the hub. Every audit follows the same pattern.

findings/
โ”œโ”€โ”€ CLAUDE.md                                                โ† top hub (findings index)
โ””โ”€โ”€ evolution/
    โ””โ”€โ”€ audits/
        โ”œโ”€โ”€ CLAUDE.md                                        โ† audit index hub
        โ””โ”€โ”€ 2026-05-08-orthogonal-features-btcusd/
            โ”œโ”€โ”€ CLAUDE.md                                    โ† audit hub (this audit)
            โ”œโ”€โ”€ RESEARCH-DIGEST.md                           โ† canonical 64-row table
            โ”œโ”€โ”€ FRAMEWORK.md                                 โ† analysis framework (your draft)
            โ”œโ”€โ”€ FRAMEWORK-AMENDMENTS.md                      โ† 22 gaps + fixes (NEW, this pilot application)
            โ”œโ”€โ”€ VERIFICATION-VERDICT.md
            โ”œโ”€โ”€ LICENSE-AUDIT.md
            โ”œโ”€โ”€ DUPLICATE-ELIMINATION.md
            โ”œโ”€โ”€ BASELINE-RULED-OUT.md
            โ”œโ”€โ”€ verdict.md
            โ””โ”€โ”€ candidates/
                โ”œโ”€โ”€ CLAUDE.md                                โ† subfolder hub
                โ”œโ”€โ”€ _template.md                             โ† canonical per-candidate template
                โ”œโ”€โ”€ 65-persistence-landscape-l2-norm.md      โ† THE CANDIDATE FILE (this page's source)
                โ””โ”€โ”€ 65-persistence-landscape-l2-norm-explained-en.md โ† long-form layman

Self-scaffolding: The dashboard's auto-nav rail (left side) was generated by scripts/build-nav.py, which walks the filesystem and writes the rail HTML between <!-- AUTO-NAV-START --> and <!-- AUTO-NAV-END --> markers on every page. Re-running it is idempotent. The site-map.html is also generated.

Cross-references