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.
high price). Even nonlinear models trained on shipped features fail to reproduce Lยฒ-norm across time periods (out-of-sample Rยฒ is negative).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.
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.
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.
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.
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.
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.
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ยฒ).
Lยฒ rising sharply โ reduce position size / go neutral (transition uncertainty). Lยฒ collapsing โ re-engage with whatever direction emerged. Unusual: this predicts uncertainty, not direction.
~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).
| N samples | 99,901 |
| min / max | 0.722 / 14.682 |
| mean | 2.108 |
| median | 1.866 |
| std dev | 1.242 |
| IQR | 0.567 |
| skewness | +4.156 (very heavy right tail) |
| kurtosis | +22.71 (~7ร normal) |
| p1 / p99 | 0.92 / 8.09 |
| [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.
high price. Well below the 0.95 BAN threshold and the 0.85 WATCH threshold.| high | โ0.3611 |
| close | โ0.3610 |
| vwap | โ0.3610 |
| open | โ0.3610 |
| low | โ0.3609 |
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:
| Test | In-sample Rยฒ | Out-of-sample Rยฒ (chronological) |
|---|---|---|
| Linear OLS on 28 shipped features | 0.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 | |
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.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.
| # | Parameter | Value | Classification |
|---|---|---|---|
| 1 | Embedding dim m | 3 | TUNABLE per-feature โ |
| 2 | Time delay ฯ | 1 | TUNABLE per-feature โ |
| 3 | Max homology dim | 1 | TUNABLE per-feature โ |
| 4 | Window size N | 100 bars | CONVENTIONABLE |
| 5 | Standardization | z-score per window | CONVENTIONABLE |
| 6 | Landscape num_steps | 200 | CONVENTIONABLE |
| 7 | p-norm order | 2 | CONVENTIONABLE |
Small-spike validation: BTCUSDT vs ETHUSDT, 10K bars each, KS 2-sample test. Three KS readings gave three different stories:
| Test | KS statistic | Verdict |
|---|---|---|
| KS on RAW Lยฒ-norm values | 0.8219 | would FAIL |
| KS on per-asset quintile encoding | 0.0000 | mathematically vacuous (always 0) |
| KS on POOLED quintile encoding (proper) | 0.7192 | FAIL naively |
L3-7.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.
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.
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.
Replace closed list with open taxonomy + families.md registry.
Add linear + nonlinear Rยฒ as Axis 1 sub-test (c).
Add chronological out-of-sample Rยฒ as Axis 1 sub-test (d).
Mandate POOLED quintile encoding.
Require time-matched sampling, not bar-count-matched.
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.
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.
Where the idea came from, tracked through the commit history of the parent audit folder.
29ebc6f3
2026-05-08
0826258c
2026-05-09
53858517
2026-05-12
1b176bd7
2026-05-12
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.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.