Navigation

← Audits

Orthogonal features for BTCUSD — candidate set with two-sided provenance

HALTED2026-05-08

A catalogue of 64 published "complexity" measurements that could become new columns of Bitcoin bar data — each tied to a specific paper and a specific open-source implementation, and each checked against what the project already ships — followed by four measurement runs on real exchange data that kept three of them (Petrosian, Katz, dispersion entropy), shelved several on a house rule against tunable knobs, and left 41 of 65 candidates untested.

Why it carries this status

Lifecycle, not result. This says where the audit sits in its process — never whether what it found was good.

**Status:** **Phase 1 evidence complete with G9 adversarial audit applied.** 9 covered / 55 not-covered (incl. 1 source-blocked) = 64 candidates. Methodology completeness items (firecrawl, exa, crucible plugin, HTML+SVG presentation) deferred to subsequent shifts per operator direction.
findings/evolution/audits/2026-05-08-orthogonal-features-btcusd/verdict.md

2026-08-17. Derived from folder evidence; the adversarial challenge pass CORRECTED the first reading. Quote verified verbatim at verdict.md:4. But it proves only that PHASE 1 evidence closed, not that the audit is terminal — and the quote's own tail ('Methodology completeness items ... deferred to subsequent shifts') concedes carry-over. The status contradicts the folder's own CLAUDE.md header (line 4): 'PHASE 1 EVIDENCE COMPLETE (post-G9 + post-call) — FRAMEWORK.md AWAITING TERRY'S ACCURACY REVIE

Blocked on Terry — the folder issues an explicit stop-order pending his accuracy review of FRAMEWORK.md: "Do not initiate per-candidate Level-0-through-Level-8 analysis until Terry confirms the framework." Phase 1 evidence closed; the per-candidate analysis it exists to enable has never started.

The verdict

The audit's own conclusion, reproduced in full from the source below. Not a summary — this is the document, rendered. Links inside it that point at unpublished files are shown as plain text rather than as links that would 404 here.

verdict.md — orthogonal features for BTCUSD (Phase 1, post-G9)

Date: 2026-05-09 Status: Phase 1 evidence complete with G9 adversarial audit applied. 9 covered / 55 not-covered (incl. 1 source-blocked) = 64 candidates. Methodology completeness items (firecrawl, exa, crucible plugin, HTML+SVG presentation) deferred to subsequent shifts per operator direction.


Top-line summary

The deliverable's exit-criterion content requirements are met:

  • Candidate list: 64 candidates with two-sided provenance (arXiv/DOI + FOSS commit SHA where applicable)
  • Coverage classification: 4-source novelty check + adversarial pair on Audit Verdicts + G9 adversarial audit on the deliverable itself
  • "Why not already covered": per-row evidence with file:line / audit-folder / list reference

Reproducible from this folder:

  • RESEARCH-DIGEST.md — canonical 64-row table
  • VERIFICATION-VERDICT.md — citation + FOSS verification with both Layer-1 (14 modern papers) and Layer-2 (21 foundational papers) explicit
  • BASELINE-RULED-OUT.md — Phase-1 baseline (existing schema + ruled-out audits + settled positives + doctrine)
  • DUPLICATE-ELIMINATION.md — parallel-session reconciliation (4 papers transferred to other sessions, 0 candidates dropped)
  • This verdict.md — G9 audit results

Challenged and held — G9 audit (id=758/759 policy)

Two Explore agents were dispatched: one Defender (confirm deliverable claims), one Attacker (find flaws). Five attacker findings + one defender NOT-CONFIRMED claim were surfaced. All findings were independently re-verified by direct file reads before any deliverable change was applied. One attacker finding was rejected on verification.

Challenge A1 — #1 Shannon Entropy was misclassified as covered (HIGH severity)

Attacker claim: The cited evidence — shannon_entropy_signs_bar in 2026-04-27-cost-realistic-cadence-harness/CH_COLUMN_SAFETY_MANIFEST.md:134 — is from a forex audit (fxview_cache.forex_bars), not the crypto schema. Per Terry's id=209 ("opendev-py = crypto only"), forex is out-of-scope.

Independent verification:

  • CH_COLUMN_SAFETY_MANIFEST.md line 1 verbatim: # ClickHouse Column Safety Manifest — fxview_cache.forex_bars (explicit forex schema)
  • 2026-04-27-cost-realistic-cadence-harness/CLAUDE.md confirms forex iter-21b harness audit
  • grep "shannon" opendeviationbar-py/python/opendeviationbar/clickhouse/schema.sqlNO MATCH (no shannon column in crypto schema)
  • grep "shannon" crates/opendeviationbar-core/src/types.rsNO MATCH

Disposition: ACCEPTED. Row #1 reclassified from covered to not-covered.

Why this matters: The previous adversarial pair on Audit Verdicts (run earlier in this session) had classified #1 as covered. That pair's output was wrong on this candidate. G9 caught the cross-asset scope error.

Challenge A2 — Coverage math ambiguity (MEDIUM severity)

Attacker claim: Status line "10 covered / 54 not-covered / 1 source-blocked" sums to 65, but only 64 candidates exist.

Independent verification: The math is ambiguous, not strictly wrong. #64 is BOTH not-covered AND source-blocked (the source-blocked is a sub-flag of not-covered, not a separate bucket). However, the wording reads as three buckets summing to 65.

Disposition: ACCEPTED — wording clarified. Status line now reads "9 covered + 55 not-covered = 64 total, where 1 of the not-covered is source-blocked (#64)."

Challenge A3 — Foundational verification claim incompleteness (MEDIUM severity)

Attacker claim: RESEARCH-DIGEST claims "21 of 21 foundational papers got verified DOIs" but VERIFICATION-VERDICT only shows 14 entries.

Independent verification: The 14 entries in VERIFICATION-VERDICT.md were Layer-1 (deep-research bibliography), not Layer-2 (foundational anchors). The 21 foundational paper resolutions WERE performed (OpenAlex batch run on 2026-05-09) but the resolution table was not committed to the audit folder.

Disposition: ACCEPTED — gap closed. Added a new subsection to VERIFICATION-VERDICT.md: "Layer-2 foundational paper resolution (OpenAlex API, 2026-05-09)" with the full 21-row resolution table, year-validation, and OA-URL status per row.

Challenge A4 — Year-mismatch count understated (LOW severity)

Attacker claim: RESEARCH-DIGEST claims "1 year-mismatch caught + corrected" but VERIFICATION-VERDICT defects table shows 3 year corrections.

Independent verification: The "1 year-mismatch" claim refers to the Layer-2 OpenAlex foundational batch (Di Matteo 2003 → 2004 correction). The 3 year corrections in VERIFICATION-VERDICT defects (Gemini #2, #9, #10) are Layer-1 deep-research-paper defects — a separate batch of work.

The attacker conflated Layer-1 and Layer-2.

Disposition: REJECTED on independent verification. The "1 year-mismatch" claim is technically correct for the Layer-2 batch. No change applied.

Challenge A5 — Coverage totals inconsistency (MEDIUM severity)

Disposition: Resolved by Challenge A2's wording fix.

Defender NOT-CONFIRMED #8 — Adversarial pair on Audit Verdicts findings not in committed evidence

Defender concern: Methodology Step 6 of RESEARCH-DIGEST claims an adversarial pair on Audit Verdicts produced 1 confirmed hit + 10 over-attributions, but verdict.md was a placeholder, so the per-claim findings weren't documented.

Disposition: ACCEPTED — partially. This verdict.md (which you are now reading) documents both the prior adversarial pair's outcome AND the current G9 audit. The 10 over-attributions from the prior pair are summarized below:

The prior adversarial pair on Audit Verdicts (earlier in this session) caught 11 attacker claims, of which 1 was real (originally classified as #1 Shannon Entropy covered — now overturned by G9) and 10 were over-attributions:

  • #2 ApEn (research mention only, not tested in 12-trigger ORTHOEX)
  • #3 SampEn (research mention only)
  • #9 Spectral Entropy (Wiener-entropy conflation, mathematically distinct)
  • #21 OPN (plain ordinal-patterns conflation)
  • #22 Hurst R/S (DFA conflation; later moved to covered via the Hurst crate evidence)
  • #45 Higuchi FD (proposed but not in 12-trigger ORTHOEX)
  • #49 Takens embedding (methodology mention)
  • #50 Bivariate Shannon TE (research mention in meta-labeling note)
  • #52 Multivariate TE (research mention in R16)
  • #57 TE BTC-equities (methodologically related to K5 OFI lag, not the same method)

These 10 over-attributions were rejected via direct file reads at the time and remain rejected after G9 review.


Net effect on the deliverable

MetricPre-G9Post-G9
Candidates classified covered109
Candidates classified not-covered5455 (1 of which is source-blocked: #64)
Total candidates6464
Methodology evidence completenessStrong (4-source novelty + adversarial pair)Stronger (+ G9 + 21-paper foundational table + this verdict)
Identified flaws (after applied fixes)5 unaddressed0 unaddressed (1 attacker over-claim rejected on independent verification)

The reclassification of #1 Shannon Entropy adds 1 candidate to the orthogonal pool — a net positive for the deliverable's substantive content.


Held — what survived G9 unchanged

  • 64-candidate list scope (Gemini DR + Claude DR consolidation)
  • 53 candidates with FOSS commit SHA, validated by git ls-remote (spot-checks confirmed antropy@dfbe688, OPyN@0c1de30, mfbm@f7b683c)
  • 4-source novelty check methodology (Production Manifest, Ban List, Audit Verdicts, Evolutionary Ledger — all properly closed with structural reads)
  • Coverage attribution for the remaining 9 covered candidates (#4, #13, #16, #18, #20, #22, #23, #28, #38)
  • Layer-1 citation verification (14 modern papers + 7 defects caught and corrected)
  • Layer-2 citation verification (21 foundational papers with OpenAlex DOIs, now committed to VERIFICATION-VERDICT.md)
  • SWH/GitHub search outcome (2 new FOSS implementations found: #21 OPN, #41 mvBm; 10 confirmed no-public-implementation)
  • DUPLICATE-ELIMINATION reconciliation against parallel sessions
  • Honest scoping of orthogonality confidence (HIGH on novelty, NOT MEASURED on empirical orthogonality — Phase 2 work)

Methodology lessons recorded

  1. Agent outputs require independent verification before deliverable changes. Both adversarial pairs in this session (the earlier one on Audit Verdicts, and this G9 pair) produced over-attributions: the earlier one classified #1 Shannon as covered (wrong); this G9 attacker over-claimed on year-mismatch count. Verifying agent claims against source files caught both errors before commit.
  1. Cross-asset scope errors are easy to miss. The forex/crypto schema distinction is project-internal context (Terry's id=209). The original adversarial pair didn't catch the forex-side CH_COLUMN_SAFETY_MANIFEST.md provenance for #1; G9 caught it on direct re-reading. Future audits should explicitly check schema scope per coverage attribution.
  1. Documentation must match committed evidence. Methodology claims in the canonical digest must reference committed-file citations, not session-conversation context. This was the gap behind Challenge A3 — the foundational paper resolutions existed in chat output but weren't in the audit folder until G9 surfaced the gap.

Outstanding work (deferred — out of scope for current closure)

These items strengthen the deliverable per Terry's broader mandates but are NOT blocking the exit criterion:

ItemMandateStatus
Firecrawl pass on 34 papersid=429 SOTA tool listPaused — bigblack cannot reach littleblack via Tailscale; deferred to laptop run if needed
exa completeness checkid=429 SOTA tool listDeferred per operator direction
crucible plugin invocation (literal, not just functional equivalent)id=429Deferred
HTML+SVG presentation in style of site-map.htmlmsg 2026-05-06 08:08Deferred
License audit on GPL-3.0 / NO-license / NOASSERTION FOSS dependenciesPractical for Phase 2 implementationDeferred
Plugin-added column check in python/opendeviationbar/plugins/Coverage hole flagged earlierDeferred
Cao 2013 (#29-31) / Vignat-Bercher 2003 (#12) / Puoti 2025 (#17) supplementary citation resolutionPer-candidate citation tighteningDeferred per operator direction
Phase 2 — empirical orthogonality validation (Spearman ρ probe + h_norm + MI + predictive-power tests on bigblack BTCUSD data)Terry's KB&L "spike them empirically" mandateSeparate scope of work — NOT Phase 1

Recommended next step

Commit the G9 audit results (this verdict.md + the 3 already-applied edits in RESEARCH-DIGEST.md and VERIFICATION-VERDICT.md) as a single follow-up commit on the findings/orthogonal-features-btcusd branch.

After that, the deliverable is at a defensible stopping point for Phase 1. Operator decides next: continue with Path B items above, push branch + open PR for Terry's review, or pause.



Post-call methodology shift (2026-05-12)

After this verdict was first written, Terry's call (2026-05-12) clarified that the orthogonality test he applies is a 3-axis framework (ORTHOGONAL × PARAMETERLESS × AGNOSTIC) per his msg 428 rubric — not just the binary coverage-novelty check used in Phase 1. The original Phase 1 deliverable (PR #493) procedurally met the exit criterion's text requirements but did not engage with the deeper statistical orthogonality structure Terry expects.

In response, FRAMEWORK.md was authored as an 8-level per-candidate analysis structure addressing all 24 of Terry's standing instructions. The framework is AI-drafted and AWAITING Terry's accuracy review per his call directive ("You will send me a list of questions. I will tell you if those questions are accurate or not"). It must not be applied to candidates until Terry confirms.

Once approved, per-candidate FRAMEWORK.md application outputs will land in candidates/ and replace this verdict's "Held" + "Outstanding work" sections with concrete per-candidate KEPT/DROPPED/DEFERRED verdicts. That output is the input to Phase 2.


Phase 2 — Empirical spike (2026-05-27, COMPLETE — revised 2026-05-29)

Status: Spike folder spike_2026-05-27/5 of 5 candidates COMPLETE + cross-candidate matrix run COMPLETE + strict-manifest verification COMPLETE. Final slate after cluster resolution + parameterless audit: 2 PROMOTE (Petrosian #43, Katz #44), 1 DEFERRED (SVD Entropy #10), 2 DROP (Hjorth Mobility #14, Hjorth Complexity #15). The 5×5 cross-candidate matrix run revealed a previously-undetected 3-way Hjorth-Katz sibling cluster (Mobility ↔ Complexity ρ −0.991 median; Mobility ↔ Katz +0.821 median, +0.927 max; Complexity ↔ Katz −0.819 median, −0.921 max). Under operator-direction-2026-05-27 empirical-evidence-first tiebreaker applied across the 3-way cluster, Katz wins on all three measurements (lowest max \|ρ\| 0.63, lowest max R² 0.20, lowest LOO R² 0.70 of the three). Authored under operator-authorized gate relaxation (same precedent as candidate #65 persistence-landscape pilot); the AI-drafted FRAMEWORK.md remains AWAITING Terry's accuracy review, but the Phase 2 work proceeds per operator direction in the meantime, with explicit attribution of which checks are Terry-mandated vs operator-extended.

Two preliminary verdicts from 2026-05-27 were REVISED before column promotion:

  1. Hjorth sibling pair (#14 ↔ #15) preliminary verdict was REVERSED by the cross-candidate matrix — the pair turned out to be part of a 3-way cluster with Katz, so Katz wins under the same empirical-evidence-first tiebreaker; both Hjorth candidates drop, Katz promotes. See spike_2026-05-27/CROSS_CANDIDATE_FINDINGS.md for the matrix evidence.
  1. SVD Entropy (#10) preliminary PROMOTE was REVISED to DEFERRED on 2026-05-29 after operator-direction-3 pushback exposed that the prior "Axis-2 parameterless by analogy to PE" justification does not survive the empirical codebase audit. The candidate has 3 formula parameters (order=3, delay=1, normalize=False) that are real per-feature knobs — PE's m=3 itself is empirically a hardcoded magic number, not a project-wide constant by any reasonable reading of Terry's _q1000 precedent (which has typed units, naming-convention suffix on dozens of features, test enforcement, and migration infrastructure). Renaming the magic numbers to a constants file would be cosmetic without applying them as a genuine family-wide convention, and we have only evaluated TWO Bandt-Pompe-family features so far (PE + SVD) — too small a sample to justify the family-wide commitment. DEFERRED keeps the candidate alive in the pipeline; revisit once ≥ 4-5 more entropy-family candidates have been evaluated so the family-convention decision can be made well-informed. The candidate's empirical orthogonality (208/208 PASS, LOO R² 0.45 independent of cluster) is documented but not acted on yet. See candidates/10-bar-svd-entropy.md for the full deferral rationale + trigger conditions for revisit.

Pre-column-promotion verification (2026-05-29) — operator's "what else to verify before promoting columns?" question triggered Check A (strict-manifest verification). Result: 53/53 manifest features were present in the spike's 100-column comparison set (no membership gap); the verdict max-|ρ| numbers hold under strict Terry-mandate re-interpretation; per-bar-set effective coverage corrected from misleading "20–55" framing to "median 20, max 55." See spike_2026-05-27/CHECK_A_RESULTS.md for the full check.

Methodology — what is Terry-mandated, what is operator-extended

Full attribution in spike_2026-05-27/PROVENANCE.md. Summary:

CheckSourceVerified?
3-axis structure (orthogonal × parameterless × agnostic)Terry's evolution.jsonl:28 headline (entry PATTERNS-3AXIS-COLUMN-AUDIT-V1-2026-04-30, [id=428] origin)✅ Terry-mandated
Axis 1 thresholds (BAN > 0.95, WATCH 0.85–0.95, h_norm < 0.05)Terry's CH_FEATURE_BANLIST.md:5,80 @ d74f75e1✅ Terry-mandated
Axis 1 fast-Spearman (df.rank().corr(method='pearson'))Terry's CH_FEATURE_BANLIST.md:127-131✅ Terry-mandated
Axis 2 method = inspection (uniform constant vs per-feature tuning)Terry's evolution.jsonl:28✅ Terry-mandated
Axis 3 method = provenance (CH-published via upstream)Terry's evolution.jsonl:28✅ Terry-mandated — but inapplicable to pre-ship candidates
Empirical agnostic substitute (per-symbol PASS-rate consistency)Operator-authored, this spike⚠ Operator extension — used because Terry's provenance check requires the feature to be CH-published already
Combinatorial R² check (multiple linear regression of candidate ~ comparison features)Operator-authored, this spike⚠ Operator extension — added because univariate Spearman misses linear-combination redundancy
Lookback window LOOKBACK_COUNT = 200python/opendeviationbar/constants.py:16 (project-wide)✅ Attributed by operator to Terry's precedent
Candidate-by-candidate progress
#CandidateStatusVerdictFile
14bar_hjorth_mobility✅ DONEDROPPED — passes standalone (208/208 PASS) but is part of the 3-way Hjorth-Katz cluster. Highest LOO R² of all 5 candidates (0.86); max \ρ\0.69, max R² 0.35 vs existing CH features (large-N). Parameterless by direct inspection.candidates/14-bar-hjorth-mobility.md
15bar_hjorth_complexity✅ DONEDROPPED (REVERSED from preliminary PROMOTE) — passes standalone (208/208 PASS) but also part of the 3-way Hjorth-Katz cluster. LOO R² 0.81; max \ρ\0.67, max R² 0.31. Parameterless by direct inspection.candidates/15-bar-hjorth-complexity.md
43bar_petrosian_fd✅ DONEPROMOTE — 208/208 PASS standalone. Independent of the Hjorth-Katz cluster (LOO R² 0.45 = 55% unique). Max \ρ\0.70, max R² 0.43. Parameterless — zero formula knobs.candidates/43-bar-petrosian-fd.md
44bar_katz_fd✅ DONEPROMOTE — 3-way cluster winner — 208/208 PASS standalone. Lowest max \ρ\0.63, max R² 0.20, LOO R² 0.70 of the cluster. Parameterless — zero formula knobs.candidates/44-bar-katz-fd.md
10bar_svd_entropyDEFERRED 2026-05-29 (REVISED from preliminary PROMOTE)Empirically strong: 208/208 PASS standalone, independent of cluster (LOO R² 0.45), max \ρ\0.74. Held in pipeline pending entropy-family convention review — the candidate has 3 formula parameters (order=3, delay=1, normalize=False) whose prior "Axis-2 PASS by analogy to PE" justification does not survive the codebase audit (PE's m=3 is a hardcoded magic number, not a project-wide constant; 2 features is too small a sample to commit to a family-wide convention). NOT dropped — revisit once ≥ 4-5 more entropy-family candidates have been evaluated.candidates/10-bar-svd-entropy.md

Final slate (revised 2026-05-29): 2 PROMOTE (#43 Petrosian, #44 Katz), 1 DEFERRED (#10 SVD Entropy), 2 DROP (#14 Mobility, #15 Complexity).

Verdict taxonomy used in this audit
  • PROMOTE: all 3 axes PASS by Terry's strict reading; ready for feature_manifest.toml landing in the column-promotion PR
  • DEFERRED: empirically orthogonal but with a structural ambiguity (e.g., per-feature parameters where convention status is currently under-evidenced); kept alive in pipeline; revisit when the structural question can be resolved with better evidence
  • DROP: either failed empirical orthogonality, OR passes empirically but is redundant against a stronger sibling (cluster resolution)
Spike scope (2026-05-27)
  • Substrate: opendeviationbar_cache.open_deviation_bars on bigblack, read-only SELECT only, no FINAL modifier (crypto convention)
  • Slices: 10 of 24 (slice01, 03, 05, 07, 09, 12, 14, 17, 20, 21) covering 8 distinct market regimes from 2021 H1 through 2026 H1 (COVID recovery → 2021 bull → 2022 top-turn → FTX collapse → 2023 recovery → 2024 ETF era → 2025 → current)
  • Symbols: 6 crypto (BTCUSDT, ETHUSDT, BNBUSDT, LTCUSDT, ADAUSDT, XRPUSDT)
  • Threshold combos: 21 unique (symbol, threshold) pairs after dropping LTC@100 (broken in CH — only 31 bars)
  • Known empty cells: ETHUSDT@100 in slice01 and slice03 — auto-skipped (verified 2026-05-26)
  • Total expected bar-set evaluations per candidate: 208 (210 − 2 known-empty)
  • Comparison set: 100 columns from live CH (117 total minus 17 unambiguous non-features: keys, metadata, trade-IDs, gap flags, boolean flags). Per-bar-set effective comparison set 20–55 columns after >80% NaN drop, varying by symbol (spread/quote plugin columns are often all-NULL on alt symbols).
  • Compute footprint per candidate: ~10 min wall-clock across all 10 slices, ~6.6 GB peak RAM, 1–2 CPU cores
Forward work after this batch
  • Generalize the probe into a parameterized library function accepting (name, fn, kwargs) tuples — so future audits register a new candidate with a single-line entry rather than a code edit.
  • Promote the generalized probe to findings/evolution/shared_data/probes/ for team-wide reuse — orthogonality testing across the team starts from this scaffold instead of re-deriving Terry's pattern from the patterns-repo audit folder.
What is NOT in scope of this Phase 2
  • Edge-magnitude backtest (TAMRS-stack metric quantification per FRAMEWORK.md Level 4) — deferred to a separate downstream phase
  • Forex side — explicitly out of scope per Terry's id=209 (opendeviationbar-py is crypto-only)
  • Mutual-Information / non-linear redundancy check — Hjorth Mobility's combinatorial R² PASS makes this unnecessary for the first candidate; revisit per-candidate if a future candidate passes R² but seems suspicious of non-linear redundancy
  • Cross-asset KS test on pooled-quintile-encoded raw candidate values — operator chose not to re-query CH; existing per-symbol PASS-rate evidence is operationally stronger for the question that matters (does the feature work as orthogonal across assets)

Challenged and held — Phase-2 G9 adversarial audit (2026-05-27)

Two Explore agents were dispatched before the Phase-2 PR was opened, mirroring the Phase-1 G9 audit pattern (id=758/759 policy). One Attacker (find flaws), one Defender (independently confirm claims). Both ran read-only against the same deliverable scope: verdict.md Phase-2 section + the 5 candidate verdict files in candidates/ + the entire spike_2026-05-27/ folder.

Defender result — 11 of 11 claims CONFIRMED
ClaimVerification
Terry provenance citations at commit d74f75e1 (CH_FEATURE_BANLIST.md:5,80,127-131)✅ Verbatim text matches at the cited lines and commit
3-axis structure attribution to terry@eonlabs.com via evolution.jsonl:28✅ Confirmed traceable through the evolution ledger
Empirical values internal consistency across files (Mobility 0.69, Katz 0.63, LOO R² 0.86/0.81/0.70/0.45/0.45)✅ All values identical across verdict.md, CROSS_CANDIDATE_FINDINGS.md, and each of the 5 candidate files
Spike code matches verdict claims (antropy.katz_fd(x), svd_entropy(x, order=3, delay=1, normalize=False), LOOKBACK_COUNT=200)✅ Verified in run_candidate_slice.py and orthogonality_probe_full_ch.py
Scope arithmetic — 10 slices × 21 (symbol, threshold) combos = 210 minus 2 known-empty = 208✅ Confirmed against findings/evolution/shared_data/pre-spec.md
Chatterjee gap honest disclosure✅ Smoke code implements basic ξn per the 2021 paper; gap section accurately describes the tie-correction limitation
Cluster-resolution arithmetic (Katz wins on all 3: max \ρ\0.63, max R² 0.20, LOO R² 0.70)✅ Internally consistent; Katz unambiguous winner
Axis-3 substitute caveat in every PROMOTE file✅ All 3 PROMOTE files label Axis-3 method as "operator empirical substitute"
Axis-1 combinatorial R² labeled as operator extension✅ All 5 candidate files contain the operator-extension caveat
Read-only constraint (no DDL/DML in probe code)✅ All SQL is SELECT only
No AI attribution in any verdict file✅ Zero matches across the 5 verdict files for the per-user-global-policy keyword set

Defender summary: "All 11 claims CONFIRMED. No logical gaps identified. The deliverable's empirical claims are well-supported by cited evidence, numerical values are internally consistent across all documents, code implements the stated methodology exactly, and all operator extensions are explicitly labeled as such. The spike is defensible on both methodological and empirical grounds."

Attacker result — 7 findings, 0 severe

Total: 0 CRITICAL, 1 HIGH, 4 MEDIUM, 2 LOW. Attacker's own bottom-line: "All findings are correctable via edit without changing any empirical verdict."

Each finding was independently re-verified against the cited source before disposition was decided.

#SeverityFindingDispositionFix applied
1MEDIUM (originally MIS-LABELED CRITICAL in attacker's header)Katz LOO R² is exactly 0.696 in CROSS_CANDIDATE_FINDINGS.md but rounded to 0.70 in candidate/44 and verdict.md; the 0.11 margin claim vs Complexity rests on 0.696→0.70 roundingACCEPTED — precision disclosureCROSS_CANDIDATE_FINDINGS.md now explicitly notes the rounded "0.70" cite vs measured 0.696. Tiebreaker conclusion unchanged.
2HIGH (placement, not factual)SVD Entropy Axis-2 by-analogy caveat is in Level-3 body text but NOT in the top-line PROMOTE banner; if Terry rejects the analogy, the slate silently drops from 3 PROMOTE to 2 PROMOTE + 1 CONDITIONALACCEPTED — top-line caveat surfacingcandidate/10-bar-svd-entropy.md now has the AXIS-2 CONDITIONAL CAVEAT banner at the top, immediately under the ✅ STATUS line, naming the conditional-revert path explicitly.
3MEDIUM"8 distinct market regimes" claim in verdict.md scope section is correct against pre-spec.md annotations but unsourced inlineHELD as-isPre-spec.md is the source; the 8-regime count derives from the slice IDs themselves (slice03/12/17 = calm; slice20/21 = bull; slice14 = stress; etc.). This is documentary precision rather than empirical risk.
4MEDIUMResults JSONL files referenced by relative path in verdict files do not exist on the laptop (the PR origin) — they live on bigblack onlyACCEPTED — explicit disclosure addedCROSS_CANDIDATE_FINDINGS.md now has a "Note on results-file location" section explaining the JSONL files are bigblack-only and reproducibility requires re-running the probe.
5LOWFRAMEWORK.md (operator-authored, AWAITING Terry's review) may contain claims that future readers conflate with Terry mandatesHELD as-isAlready disclosed in verdict.md L165 ("AI-drafted ... AWAITING Terry's accuracy review") and in PROVENANCE.md "Non-claims" section (lines 132–142). Navigation burden, not a factual error.
6LOWChatterjee non-monotonic gap is documented in CROSS_CANDIDATE_FINDINGS.md but not cross-referenced from each candidate verdict file's Axis-1 PASS verdictACCEPTED — cross-reference addedCROSS_CANDIDATE_FINDINGS.md now has a "Methodology gap cross-reference" section explaining why the gap is contained for this audit's specific candidates.
7N/A(No 7th finding; total was 7 with two "categories with no flaws found.")
Net effect of G9
MetricPre-G9Post-G9
PROMOTE candidates33 (#43 Petrosian, #44 Katz, #10 SVD Entropy with explicit Axis-2 CONDITIONAL caveat surfaced)
DROP candidates22 (#14 Mobility, #15 Complexity)
Citation errors found0 (Defender 11/11 CONFIRMED)
Empirical errors found0 (Attacker confirmed verdicts; all findings are documentation precision)
Documentation precision gaps fixed3 (Katz LOO R² precision; SVD Axis-2 caveat surfacing; results-on-disk disclosure)
Documentation gaps held as-is2 (8-regime claim sourced via pre-spec; FRAMEWORK.md conflation already disclosed)
Empirical verdict changes0
Held — what survived G9 unchanged
  • The 3-way Hjorth-Katz sibling cluster discovery (Mobility ↔ Complexity ρ −0.991; Mobility ↔ Katz +0.821 median, +0.927 max; Complexity ↔ Katz −0.819 median, −0.921 max)
  • Katz as cluster winner on max \|ρ\| 0.63, max R² 0.20, LOO R² 0.696 (≈ 0.70)
  • Petrosian and SVD as independent of the cluster (LOO R² ≈ 0.45 each)
  • The reversal of the preliminary "Complexity PROMOTE" decision in favor of the cluster-aware "Katz PROMOTE"
  • All Terry-mandated citations at commit d74f75e1
  • Read-only CH access; 2-core CPU budget; 208/208 cell coverage
  • The operator-extended methodology labeled-as-such throughout (combinatorial R², empirical agnostic substitute, sibling-cluster tiebreaker)

Post-merge follow-up — Check A + SVD-deferral + parameterless audit (2026-05-29)

Operator's pre-column-promotion questions surfaced three additional fixes after the Phase-2 PR (#503) merged. These are documented here for the audit trail:

A. Strict-manifest verification (Check A)

Question: do we cover all the manifest features Terry's BANLIST rule should be applied against?

Method: read-only intersection of feature_manifest.toml (53 entries) against the spike's 100-column comparison set (live CH minus 17-col EXCLUDE list), plus per-bar-set effective-coverage analysis and strict-manifest max-\|ρ\| re-computation from the existing top-5 data.

Result:

  • Membership: 53/53 manifest features in the comparison set ✅ (no gap)
  • Per-bar-set effective coverage (corrected): median 20 columns, max 55 — NOT the misleading "20–55 effective" framing in the original verdict files
  • Strict max \|ρ\| = loose max \|ρ\| within rounding for all 3 candidates that PROMOTE/DEFERRED in the slate (Petrosian 0.701, Katz 0.635, SVD 0.743). Verdict numbers unchanged.
  • 29-30 of 53 manifest features never appeared in any top-5 for the 3 PROMOTE/DEFER candidates — likely systematic NaN-filter dropouts (mostly intra_* family). Not blocking; flagged as forward work (focused re-run with relaxed NaN filter on max-coverage cells).

Full evidence: spike_2026-05-27/CHECK_A_RESULTS.md.

B. SVD Entropy verdict revision (PROMOTE → DEFERRED)

Trigger: operator-direction-3 pushback (2026-05-29) on the prior "Axis-2 PASS by analogy to PE" claim.

Codebase audit findings (empirical, read-only):

  • PE's m=3 is encoded as a hardcoded magic number (literal 3 at every call site, e.g., crates/opendeviationbar-core/src/intrabar/features.rs:307); the optimized variants bake m=3 into function NAMES without a named constant linking them
  • PE's τ=1 is not even an exposed parameter — the embedding implicitly uses consecutive prices
  • Zero matches in production code for EMBEDDING|PE_ORDER|SVD_ORDER|BANDT_POMPE|ORDINAL_ORDER
  • Terry's _q1000 precedent for a true project-wide constant has typed units (FeatureValueQ1000), naming-convention suffix on dozens of features, pre-commit test enforcement, migration infrastructure (PHASE-23-A-MIGRATION), and documented policy — none of which exist for Bandt-Pompe m=3, τ=1
  • Bandt & Pompe (2002) explicitly recommend m ∈ {3, 4, 5, 6, 7}; m=3 is the minimum-useful choice, not a canonical privileged value

Disposition: REVISED preliminary PROMOTE to DEFERRED. The candidate has 3 real per-feature knobs filled in by borrowing PE's hardcoded magic numbers — this does not satisfy Terry's "uniform _q1000 = project constant" criterion under any defensible reading. Renaming the magic numbers to a constants file would be cosmetic without applying them as a genuine family-wide convention, and a sample of only TWO Bandt-Pompe-family features (PE + SVD) is too small to commit to the family-wide convention well.

Net effect: final slate 2 PROMOTE + 1 DEFERRED + 2 DROP (was 3 PROMOTE + 2 DROP).

C. Parameterless re-confirmation for the 2 PROMOTE candidates

Independent re-check confirmed Petrosian (#43) and Katz (#44) have zero per-feature parameters by direct formula inspection:

  • Petrosian FD: log10(n) / (log10(n) + log10(n / (n + 0.4 * N_sign_changes))) — the 0.4 is part of the canonical Petrosian (1995) formula, same status as π in a Fourier transform. Window = LOOKBACK_COUNT project-wide constant.
  • Katz FD: log10(n) / (log10(n) + log10(d/L))n, L, d are derived from input, not chosen. Window = LOOKBACK_COUNT project-wide constant.

Both pass Axis-2 by direct inspection with zero ambiguity. The DEFERRED status of SVD does NOT affect these two; their PROMOTE verdicts stand and they proceed to the manifest in the upcoming column-promotion PR.


Phase 2b — Entropy-family loop (2026-06-02)

Autonomous /loop (hybrid: laptop drives, bigblack computes) swept the 8 remaining Entropy-family candidates (210 cells each × 8 regime slices), then ran the cross-candidate matrix including the deferred SVD (#10) and the landed Petrosian/Katz (#43/#44) — the redundancy-vs-landed check. Full detail: spike_2026-06-02-entropy/ (CROSS_CANDIDATE_FINDINGS.md, CROSS_CANDIDATE_VS_LANDED.md, AGNOSTIC_AXIS3.md, PROMOTION_PLAN.md); per-candidate verdicts in candidates/ (01,02,03,04,05,09,11,12).

Result — 3 PROMOTE / 2 CONDITIONAL / 3 DROP:

  • 🟢 PROMOTE: bar_dispersion_entropy (#11, max |ρ| 0.66, independent), bar_svd_entropy (#10 — deferral re-opened: independent of everything incl. landed Petrosian at ρ 0.30), bar_sample_entropy (#3, template-cluster rep over ApEn).
  • 🟡 CONDITIONAL: bar_spectral_entropy (#9 — Axis-2 sf ruling), bar_shannon_entropy (#1 — Axis-1 marginal + binning).
  • 🔴 DROP: bar_approximate_entropy (#2, SampEn sibling ρ 0.965), bar_weighted_permutation_entropy (#5, PE sibling ρ 0.897), bar_fisher_shannon (#12, PE sibling ρ 0.948).
  • permutation (#4) DEMOTED vs the loop's first read: borderline-redundant with the already-landed Petrosian (ρ 0.836); SVD covers its embedding space independently.

Axis status: all 3 promotes are Axis-1 ✅ (orthogonal vs existing + landed) and Axis-3 ✅ (100% per-symbol PASS, see AGNOSTIC_AXIS3.md); they clear Axis-2 only via project-wide constants (the _q1000 route) — implementation gated behind the constants PR per PROMOTION_PLAN.md. ClickHouse untouched (read-only); promotion follows PR → review → merge → deploy → schema.


Phase 2c — Fractal / multifractal / chaos slate: Axis-2 (parameterless) HELD + corpus census (2026-06-09)

The overnight /loop fractal/chaos orthogonality spike (spike_2026-06-05-fractal-chaos/, driver + compute on bigblack odb-fractal-chaos-loop; live pages hosted-only at ~/sites/2026-06-06-crypto-fractal-multifractal-chaos-10-candidate-orthogonality-evaluation/) swept 10 fractal / multifractal / chaos / complexity candidates on Axis-1 only (orthogonality, 21 (symbol,threshold) cells × 10 regime slices). That loop explicitly scoped Axis-2 and Axis-3 out. This entry records the operator Axis-2 (parameterless) ruling for the whole slate, plus a full evaluated-vs-pending census of the candidate corpus.

> Provenance note: the fractal/chaos slate lives on branch spike/fractal-chaos-followup + bigblack (odb-fractal-chaos-loop) + the hosted dashboard; it is not yet merged to main. It is cited here as external evidence pending its integration PR. Line refs below are to spike_2026-06-05-fractal-chaos/orthogonal_candidates_v2.py (registry SSoT).

A. Axis-2 (parameterless) — all 10 FAIL → HELD

Rule (gating; SSoT docs/audits/3-AXIS-DISCIPLINE-TEMPLATE.md:47-56, restated FRAMEWORK.md:446-457): a feature passes Axis-2 only if every numeric literal either derives from first principles or is a locked/canonical/project-wide constant (Petrosian's 0.4, Katz n/L/d, dispersion c=6/m=2/d=1, Terry's _q1000). Free per-feature tunable knobs FAIL. FRAMEWORK.md already pre-lists DFA/MF-DFA scale ranges and Lyapunov embedding among the Axis-2 fails (:450-457).

Finding: every one of the 10 slate candidates carries ≥1 free per-feature knob → all 10 FAIL Axis-2 — including the 6 that cleared Axis-1. So the slate's promotion is HELD (hard gate: fail any axis → env-flag-off / deprecate, never quietly retained — :30-31, :136). The precedent kill for the same ruling is lookback_permutation_entropy + lookback_hurst (PR #448, column_comments.py:271-293, active=False).

#CandidateAxis-1Per-feature tunable knobs (Axis-2 fail evidence)
#45bar_higuchi_fdPASSkmax=10 (:58)
#25bar_mfdfa_widthPASSq-grid {±1..±5} (:127); 12 log-scales, min 8, s_max=n//4 (:120-124); detrend order=1 (:135-144)
#35bar_dh_abs_returnsPASSq {±1..±4} (:219); lag=linspace(8,n//4,12) (:216); order=1 (:222)
#34bar_dh_returnsPASSq {±1..±4} (:184); lag=linspace(8,32,12) (:183); order=1 (:186)
#36bar_dh_vol_incrementsPASSq {±1..±4} (:261); lag=linspace(8,n//4,12) (:258); order=1 (:263)
#47bar_lyapunov_rosensteinPASSemb_dim=4, lag=1, min_tsep=10, trajectory_len=20, min_neighbors=10, fit=poly (:310-311)
#24bar_generalized_hurstWATCHqvals=[2] (:79)
#46bar_correlation_dimensionWATCHemb_dim=5, lag=1, fit=poly (:291-295)
#21bar_ordinal_partition_networkWATCHordinal embedding dx=3, taux=1 (:66)
#17bar_perm_js_distance_pinknoiseWATCHordinal dx=3, taux=1, tie_precision, _PINK_REF m=3 ref dist (:91, :46-50)

The shared input window LOOKBACK_COUNT=200 (:34) is not a per-feature knob — it is the project-wide rolling window every bar feature already uses — so it does not count against Axis-2.

Registry-metadata caveat: #21 and #17 are tagged parameterless in the _REGISTRY w200 metadata (:400, :408). That tag refers to amplitude-scale invariance (ordinal methods are rank-based), not absence of embedding knobs — both still pass explicit dx=3, taux=1, so both FAIL Axis-2 in the magic-number sense.

Consequence (HELD — remediation path). None of the 10 enters the implementation loop as-is. To clear Axis-2 a knob must be either (a) derived from first principles, (b) locked as a justified feature-local convention constant (the bar_dispersion_entropy c/m/d precedent + the #513 integer-only SSoT pattern), or (c) ratified as a project-wide constant (the _q1000 route) — then Axis-2 is re-verdicted. This supersedes the earlier working assumption that the 6 Axis-1 survivors (or the redundancy-reduced 5, after the dh_abs_returns ↔ dh_vol_increments ρ≈0.96 cross-candidate duplication) were promotion-ready: they are Axis-1-clear but Axis-2-blocked.

B. Corpus census — evaluated vs pending (2026-06-09)

Reconciled against the canonical RESEARCH-DIGEST.md (64 rows) + the #65 persistence-landscape pilot = 65 total. 24 evaluated · 41 pending · 0 unmatched (arithmetic verified: union covers #1–#65, zero overlap).

Evaluated (24) — Axis-1 orthogonality run on real ClickHouse data:

  • Entropy spike (2026-06-02): #1, #2, #3, #4, #5, #9, #11, #12 (+ #10 re-opened)
  • Fractal/Hjorth spike (2026-05-27): #10, #14, #15, #43, #44
  • Fractal/multifractal/chaos slate (2026-06-05): #17, #21, #24, #25, #34, #35, #36, #45, #46, #47
  • Phase-1 pilot: #65
  • Landed in production: #43 Petrosian + #44 Katz (PR #509), #11 Dispersion (PR #515).

Pending (41) — input set for the next evaluation loop:

FamilyCandidates
Entropy / information-theory#6, #7, #8, #64
Complexity#13
Statistical-complexity / CECP#16, #18, #19, #20
Fractal / Hurst-scaling#22, #23
Multifractal (MF-DFA / A-MF-DFA / S-MF-DFA / MFCCA / mv-fBm)#26, #27, #28, #29, #30, #31, #32, #33, #37, #38, #39, #40, #41, #42
Chaos diagnostics#48, #49
Transfer-entropy#50, #51, #52, #53, #54, #55, #56, #57
Copula-entropy#58, #59, #60, #61, #62
Information-decomposition#63

Flag (#25 / #28): the slate labels its width metric bar_mfdfa_width as id #25, but digest #25 = "MF-DFA spectrum h(q)" while the spectrum width Δα is digest #28. It is bound to #25 per the explicit eval id (leaving #28 in pending). If the spike in fact measured Δα width, swap #25↔#28 when the slate merges — this does not change the 24/41 split.


Phase 2d — Axis-2 remediation: shared-knob constant promotion + next-loop plan (2026-06-09)

Follow-up to the Phase 2c HOLD: where multiple family members use the same knob at the same value, that value is a family convention (not a magic number) and can be ratified as a project-wide constant — the route that clears Axis-2 without per-feature tuning. A family-by-family scan (with an adversarial literal-same-value check) was run across the 10 failed + 41 pending candidates. Full analysis, promotable-constant list, family-usage counts, candidate loop list, and the two-stage loop plan: AXIS2-REMEDIATION-AND-LOOP-PLAN.md.

Verdict (operator decision pending):

  • Reuse existing #513 ORDINAL_M=3/ORDINAL_TAU=19 ordinal/CECP members (#21,#17,#16,#18,#19,#20,#8,#4,#5); fully clears #21/#17.
  • Promote 2 new structural-integer constants via the #513 pattern: MFDFA_DETREND_ORDER=1 (17 members) and TAKENS_EMBEDDING_TAU=1 (4 members).
  • Harmonize-then-promote (locked-convention route, not parameterless): MF-DFA q-grid + scale schedule (one operator call unblocks the ~11-member MF-DFA block).
  • Stays feature-local: higuchi kmax, gen-hurst qvals, chaos emb_dim/fit, SampEn m. Unpromotable: the TE/copula/PID slate (#50–#64) — dual-series regime, not a tunable literal.
  • Loop: Stage 0 promotes the constants (so candidates are parameterless-by-construction) → Stage 1 sweeps the 23 single-series-testable pending candidates (18 are out of scope — need a second series), with the Axis-2 gate enforced up front and a full all-10-slice cross-candidate Finish.

Phase 2e — CECP loop scoping + parameterless verification (2026-06-10)

Scoping the next orthogonality loop from the ordinal/CECP family — the candidates fully covered by the existing PR #513 ordinal-embedding constant. Three go into the loop; one is dropped by definition.

A. Parameterless verification of the loop candidates — all PASS (via #513 reuse)

Verified each loop candidate's full knob set. Correction to the working assumption: these do NOT fail Axis-2 — they PASS. Their only structural knob is the Bandt–Pompe ordinal embedding (m=3, τ=1), which is the already-ratified project-wide constant from PR #513. Post-#513, a feature whose sole knob is that embedding clears Axis-2 by reuse (no new promotion) — this is precisely the deferral that blocked SVD-entropy #10 (candidates/10-bar-svd-entropy.md), now resolved for the ordinal family.

#CandidateOnly knob(s)Axis-2
#16Statistical Complexity (MPR)ordinal m=3/τ=1 (#513); MPR normalization + uniform reference are first-principlesPASS (reuse #513)
#19CECP velocity / trajectoryordinal m=3/τ=1 (#513); velocity granularity = the project-wide rolling window (parameter-free)PASS (reuse #513 + parameter-free)
#20Binary CECP (H_bin, C_bin)ordinal word-length =m=3 (#513); binarization = sign / up-down (parameter-free)PASS (reuse #513 + parameter-free) — pending faithful Pinto-2025 build

Caveat (#20): Pinto-2025 (arXiv:2504.01974) could not be fetched at write time; the standard binary-CECP binarization is sign-of-increment (up/down), which is parameter-free. If the faithful build instead uses a tunable threshold, #20 would FAIL Axis-2 and be held — to be confirmed at authoring.

B. #18 dropped — redundant by definition (not by measurement)

#18 "CECP coordinates (PE, C)" is excluded from the loop: it is the pair (permutation entropy #4 + statistical complexity #16) — both already in the corpus — so it introduces no new computation. This is definitional redundancy (known a priori from the formula), distinct from empirical sibling-redundancy (e.g. dh_abs ↔ dh_vol ρ≈0.96), which is only found via cross-candidate testing. Full per-candidate record: candidates/18-cecp-coordinates.md.

C. Loop scope + cross-candidate testing

Loop = #16, #19, #20 — Axis-1 orthogonality sweep on the existing probe (21 (symbol,threshold) cells × 10 slices). The Finish step runs cross-candidate testing across all 10 slices to catch empirical siblings among them and against the landed panel — and the prior fractal/chaos Finish (which covered only 5 of 10 slices) should be completed to the same standard.


Phase 2f — CECP loop results + adversarial verdict review (2026-06-10)

The 3-candidate CECP orthogonality loop ran on bigblack (spike_2026-06-10-cecp-statistical-complexity, 2-core / 2 GB / spare-only / read-only ClickHouse, 210 cells = 21 (symbol,threshold) × 10 slices, all parameterless via PR#513 reuse). Per-candidate records: candidates/16-statistical-complexity.md, candidates/19-cecp-velocity.md, candidates/20-binary-cecp.md.

Results
#CandidateAxis-1max‖ρ‖ vsDisposition
#19bar_cecp_velocityPASS (210/210)0.666 / PetrosianGO — 3/3 axes, queued for implementation
#16bar_statistical_complexityBAN (5 BAN/65 WATCH/140 PASS)0.969 / PetrosianDROP — near-rename of landed Petrosian FD
#20bar_binary_cecpWATCH (9 WATCH/201 PASS)0.937 / KatzHELD — borderline-redundant with Katz
Adversarial review (5-agent workflow + independent compute) — what the verdicts can be trusted on
  • Measurement machinery is clean (the decisive in-scope check): trailing window (no look-ahead), per-cell independent fetch (no cross-slice leakage), candidate index-aligned to the panel, Spearman pairwise-complete; all three verdicts reproduce bit-for-bit from raw JSONL. No verdict-flipping bug. The orthogonality verdicts are correctly computed.
  • BAN/WATCH are genuinestat_complexity ↔ Petrosian (0.969) and binary ↔ Katz (0.937) are real monotone ties (both reparametrise path-irregularity / sign-run structure); they survive the de-overlap control. This validates that the probe catches real redundancy.
  • velocity is genuinely orthogonal — an apparent ξ≈0.65 nonlinear redundancy was an overlap artifact (199/200 rolling-window overlap); de-overlapped, it collapses. Two self-corrections recorded for honesty: (a) that ξ scare was mine and was wrong; (b) the follow-on "noise-dominated 80/20" framing was also overstated — under variance composition velocity is ~30%-of-variance structured (weak-but-real), and the IID return-shuffle null is mis-specified.
  • The "informativeness gate" recommendation is out of rubric scope — signal/predictiveness is not a promotion axis; it is decided downstream (ML / cost-realism), as for Petrosian/Katz/dispersion. It is not a blocker for velocity. The cross-candidate LOO R² 0.969 worst cell is vs the un-promoted siblings → moot for the production panel.
velocity 3-axis scorecard → GO
AxisVerdictBasis
1 OrthogonalPASSmax‖ρ‖ 0.666, 210/210; machinery clean + bit-exact; genuinely orthogonal incl. nonlinear
2 ParameterlessPASS-with-caveatnumeric literals are only ORDINAL_M=3/ORDINAL_TAU=1 (#513) + LOOKBACK_COUNT=200; the 50/50 within-window split is a locked feature-local convention (free degree of freedom in split-ratio / #segments / within-vs-cross-window), defensible like dispersion c/m/d
3 AgnosticPASS100% per-symbol (6/6) + per-regime (10/10), ‖ρ‖ ≤ 0.67

Axis-2 caveat (honest): the 50/50 split is knob-like — a locked feature-local convention, not a first-principles or project-wide constant. Same Axis-2 category as bar_dispersion_entropy's c/m/d (PASS-with-caveat, promoted pending ratification), so it does not block GO — but ratify it, or switch the construction to Suriano 2025's canonical cross-window trajectory velocity (which removes the split → unconditional Axis-2).

bar_cecp_velocity is approved for implementation by the established 3-axis standard (Axis-2 PASS-with-caveat, as for dispersion).

Probe-hygiene findings (non-blocking, for future loops)
  • The h_norm liveness gate is inert for continuous features (pd.qcut → ≈1.0 always) and has a fail-open bug (compute_h_norm returns None on <1000 non-NaN values → silently skips the gate on the ~19 smallest cells). Harmless this run (ρ-driven); make it fail-closed and stop citing h_norm as corroboration.
  • The gate is in-sample linear and never fired (max 0.29 vs 0.85) and is blind to monotone-nonlinear redundancy — Spearman is the sole workhorse. Document as a coverage gap or replace with a rank/nonlinear measure on de-overlapped strides.
  • Peak RSS hit ~93% of the 2 GB cap (1912–1915 MB) — add headroom before scaling candidate count.

Cross-references

source: findings/evolution/audits/2026-05-08-orthogonal-features-btcusd/verdict.md

Still owed 11

What it claims, and what backs each claim 21

Every row pairs a claim with the file it came from and the verbatim text in that file. The sources sit above the deploy root, so the quote is embedded and the path is printed as text rather than linked — a link would resolve on a laptop and 404 here.

ClaimEvidence
The catalogue holds 64 candidate features; after an adversarial re-audit, 9 are already covered by existing code and 55 are not, one of which cannot be sourced at all.
CONFIRMED
64 candidates; 9 covered, 55 not-covered, 1 source-blocked (n=64)
**Status:** **PHASE 1 EVIDENCE COMPLETE (post-G9)** — Coverage column populated: **9 covered + 55 not-covered = 64 total**, where 1 of the not-covered is source-blocked (#64).
findings/evolution/audits/2026-05-08-orthogonal-features-btcusd/RESEARCH-DIGEST.md
The adversarial (G9) pass overturned one coverage call: Shannon entropy had been marked "already covered" on the strength of a column that lives in the forex schema, not the crypto one.
CONFIRMED
1 candidate reclassified (covered 10 → 9; not-covered 54 → 55)
**Disposition**: **ACCEPTED**. Row #1 reclassified from covered to not-covered.
findings/evolution/audits/2026-05-08-orthogonal-features-btcusd/verdict.md
Not every attacker finding was accepted — one was rejected after the audit re-read the sources itself.
CONFIRMED
5 attacker findings + 1 defender concern; 1 rejected
**Disposition**: **REJECTED on independent verification**. The "1 year-mismatch" claim is technically correct for the Layer-2 batch. No change applied.
findings/evolution/audits/2026-05-08-orthogonal-features-btcusd/verdict.md
Every foundational paper behind the catalogue resolved to a real DOI, and one publication year in the source bibliography was wrong and was corrected.
CONFIRMED
21/21 foundational DOIs; 14 modern papers with 7 defects corrected; 35 papers total across both layers
**Net Layer-2 resolution: 21 of 21 foundational papers got verified DOIs. 1 year-mismatch caught + corrected (Di Matteo 2003 → 2004). 4 of 21 have direct OA URLs (Pincus, Wu 2013, Schreiber, Faes).**
findings/evolution/audits/2026-05-08-orthogonal-features-btcusd/VERIFICATION-VERDICT.md
Most candidates have an existing open-source implementation, but the two files that report the count disagree with each other.
OPEN
VERIFICATION-VERDICT.md: 51 FOSS / 13 reimplement (n=64). RESEARCH-DIGEST.md: 53 FOSS / 10 reimplement / 1 source-blocked (n=64). Unreconciled.
**51/64 features have FOSS implementations; 13 require reimplementation** (see `RESEARCH-DIGEST.md` Bucket column).
findings/evolution/audits/2026-05-08-orthogonal-features-btcusd/VERIFICATION-VERDICT.md
Two of the implementation repositories cited by the source research no longer exist.
CONFIRMED
2 dead repos of 15 checked
- **Dead repos**: `lcphy/Information-Flow` and `jakeyeung/PyIF` both return 404. KSG-TE alternatives (IDTxl, copent) used instead.
findings/evolution/audits/2026-05-08-orthogonal-features-btcusd/VERIFICATION-VERDICT.md
One candidate is unusable because the paper it was supposed to come from does not exist at the cited identifier.
CONFIRMED
1 of 64 source-blocked
- **Feature #64 (Adaptive entropy coefficient) is blocked**: Gemini's `arXiv:2601.10143` resolves to the wrong paper. Candidate cannot be implemented until the correct source is found.
findings/evolution/audits/2026-05-08-orthogonal-features-btcusd/VERIFICATION-VERDICT.md
Thirteen candidates depend on copyleft-licensed code, which is fine for research but would constrain any closed-source distribution; one dependency has no licence at all.
CONFIRMED
15 repos audited: 11 permissive, 3 GPL-3.0 (touching 13 of 64 candidates), 2 NOASSERTION, 1 with no LICENSE file
### GPL-3.0-touching candidates (13 of 64)
findings/evolution/audits/2026-05-08-orthogonal-features-btcusd/LICENSE-AUDIT.md
The first measurement run on real exchange data tested five candidates over 208 symbol/threshold/period cells each and ended with two promoted, one shelved and two dropped.
MEASURED
208/208 cells PASS per candidate (10 regime slices × 21 symbol-threshold pairs − 2 empty); max |ρ| Katz 0.63, Petrosian 0.70, SVD 0.74; leave-one-out R² 0.86 / 0.81 / 0.70 / 0.45 / 0.45
**Final slate (revised 2026-05-29): 2 PROMOTE (#43 Petrosian, #44 Katz), 1 DEFERRED (#10 SVD Entropy), 2 DROP (#14 Mobility, #15 Complexity).**
findings/evolution/audits/2026-05-08-orthogonal-features-btcusd/verdict.md
Two of the five candidates were dropped not because they failed but because a cross-candidate matrix revealed they were near-duplicates of a third — a result that reversed an earlier preliminary verdict.
MEASURED
Mobility↔Complexity ρ −0.991 median; Mobility↔Katz +0.821 median / +0.927 max; Complexity↔Katz −0.819 median / −0.921 max
The 5×5 cross-candidate matrix run revealed a previously-undetected 3-way Hjorth-Katz sibling cluster (Mobility ↔ Complexity ρ −0.991 median; Mobility ↔ Katz +0.821 median, +0.927 max; Complexity ↔ Katz −0.819 median, −0.921 max).
findings/evolution/audits/2026-05-08-orthogonal-features-btcusd/verdict.md
SVD entropy was held back after a code audit showed the justification for its three settings rested on another feature's hard-coded number rather than an established project-wide convention.
CONFIRMED
3 formula parameters (order=3, delay=1, normalize=False); 0 matches in production code for EMBEDDING|PE_ORDER|SVD_ORDER|BANDT_POMPE|ORDINAL_ORDER
- PE's `m=3` is encoded as a hardcoded magic number (literal `3` at every call site, e.g., `crates/opendeviationbar-core/src/intrabar/features.rs:307`); the optimized variants bake `m=3` into function NAMES without a named constant linking them
findings/evolution/audits/2026-05-08-orthogonal-features-btcusd/verdict.md
A pre-promotion check confirmed the comparison set covered every feature it was supposed to, and corrected a misleading coverage figure in the earlier write-ups.
CONFIRMED
53/53 manifest features present; per-bar-set effective coverage median 20 columns, max 55 (corrected from "20–55"); strict max |ρ| Petrosian 0.701, Katz 0.635, SVD 0.743
- **Membership**: 53/53 manifest features in the comparison set ✅ (no gap)
findings/evolution/audits/2026-05-08-orthogonal-features-btcusd/verdict.md
The entropy-family run's headline slate was overturned by its own hardening re-run: only dispersion entropy survived as a clean promotion.
CONFIRMED
207 cells per candidate; dispersion combinatorial R² median 0.437 / max 0.767 / 0 cells ≥0.85; permutation↔Petrosian max ρ 0.972 with 4 BAN cells and 14 cells reconstructable from the shipped schema
**Survivors to promote (HARDENED, 2026-06-03):** **dispersion (#11) — sole clean promote.** spectral / shannon / SVD — **CONDITIONAL** (Axis-1-clean-or-marginal, Axis-2 convention-gated / thin tail). **permutation (#2) + SampEn (#3) — DROPPED**
findings/evolution/audits/2026-05-08-orthogonal-features-btcusd/spike_2026-06-02-entropy/PROMOTION_PLAN.md
The audit hub's own summary of the entropy run still lists the pre-hardening slate, contradicting the hardened verdict filed in the same folder three weeks earlier.
REFUTED
verdict.md Phase 2b: 3 PROMOTE / 2 CONDITIONAL / 3 DROP. CHALLENGED_AND_HELD_v2.md (2026-06-03): 1 PROMOTE / 3 CONDITIONAL / 2 DROP.
- 🟢 **PROMOTE:** `bar_dispersion_entropy` (#11, max |ρ| 0.66, independent), `bar_svd_entropy` (#10 — **deferral re-opened**: independent of everything incl. landed Petrosian at ρ 0.30), `bar_sample_entropy` (#3, template-cluster rep over ApEn).
findings/evolution/audits/2026-05-08-orthogonal-features-btcusd/verdict.md
The whole fractal/multifractal/chaos batch was blocked on the project's no-tunable-knobs rule, including the six that had already passed the redundancy test.
CONFIRMED
10 of 10 candidates fail; 6 of them had passed the redundancy axis
**Finding:** every one of the 10 slate candidates carries ≥1 free per-feature knob → **all 10 FAIL Axis-2** — including the 6 that cleared Axis-1.
findings/evolution/audits/2026-05-08-orthogonal-features-btcusd/verdict.md
Roughly a third of the catalogue has actually been measured; the rest is queued.
CONFIRMED
24 evaluated, 41 pending, 0 unmatched (n=65)
Reconciled against the canonical [`RESEARCH-DIGEST.md`](./RESEARCH-DIGEST.md) (64 rows) + the #65 persistence-landscape pilot = **65 total**. **24 evaluated · 41 pending · 0 unmatched** (arithmetic verified: union covers #1–#65, zero overlap).
findings/evolution/audits/2026-05-08-orthogonal-features-btcusd/verdict.md
Three of the catalogued features actually reached production code.
CONFIRMED
3 of 65 candidates shipped
- **Landed in production:** #43 Petrosian + #44 Katz (PR #509), #11 Dispersion (PR #515).
findings/evolution/audits/2026-05-08-orthogonal-features-btcusd/verdict.md
A remediation plan exists for the knob problem — reuse one existing constant and ratify two new ones — but it needs an operator ruling that has not been given.
ASSERTED
Existing ORDINAL_M/ORDINAL_TAU covers 9 family members; proposed MFDFA_DETREND_ORDER covers 17; TAKENS_EMBEDDING_TAU covers 4; 23 of 41 pending candidates are single-series testable
**Status:** **ANALYSIS COMPLETE — operator decision pending** on 2 new project-wide constants + 2 harmonization conventions.
findings/evolution/audits/2026-05-08-orthogonal-features-btcusd/AXIS2-REMEDIATION-AND-LOOP-PLAN.md
A later three-candidate run approved one new feature and rejected two as near-renames of features already shipped.
MEASURED
210 cells; velocity max ‖ρ‖ 0.666 (210/210 PASS) → GO; statistical complexity 0.969 vs Petrosian → DROP; binary CECP 0.937 vs Katz → HELD
| #16 | `bar_statistical_complexity` | **BAN** (5 BAN/65 WATCH/140 PASS) | 0.969 / Petrosian | **DROP** — near-rename of landed Petrosian FD |
findings/evolution/audits/2026-05-08-orthogonal-features-btcusd/verdict.md
The measurement harness itself has known defects: one of its gates never fires for continuous features and silently skips small cells, and another gate never fired at all.
CONFIRMED
~19 smallest cells skip the gate; R² gate max 0.29 against a 0.85 threshold (never fired); peak RSS 1912–1915 MB against a 2 GB cap (~93%)
- The `h_norm` liveness gate is **inert** for continuous features (`pd.qcut` → ≈1.0 always) and has a **fail-open** bug (`compute_h_norm` returns `None` on <1000 non-NaN values → silently skips the gate on the ~19 smallest cells).
findings/evolution/audits/2026-05-08-orthogonal-features-btcusd/verdict.md
The per-candidate analysis framework that governs this work has never been reviewed by the person it was written for, and the rule says it must be before it is applied.
ASSERTED
10 of 64 candidates already have framework files, written under operator-authorised gate relaxation
Per Terry's 2026-05-12 call directive, [`FRAMEWORK.md`](./FRAMEWORK.md) (the per-candidate analysis structure) **MUST be reviewed by Terry for accuracy BEFORE being applied to any candidate**.
findings/evolution/audits/2026-05-08-orthogonal-features-btcusd/CLAUDE.md

The audit folder 51 markdown files

Source of record: findings/evolution/audits/2026-05-08-orthogonal-features-btcusd/ — not published, so these are listed rather than linked.

FileRole
AXIS2-REMEDIATION-AND-LOOP-PLAN.mdShared-knob analysis and the promote-constants-then-test loop plan; operator decision pending.
BASELINE-RULED-OUT.mdPhase-1 baseline: existing ClickHouse schema columns, the patterns-repo graveyard of killed families, settled positives and doctrine.
CLAUDE.mdAudit hub — scope, filtering method, file index, status line naming the Terry review gate.
DUPLICATE-ELIMINATION.mdReconciliation against two parallel research sessions: 4 papers transferred, 0 candidates dropped.
FRAMEWORK-AMENDMENTS.mdGap register from the pilot application of the framework, each gap re-statused under the 2026-05-22 policy.
FRAMEWORK.mdThe 8-level per-candidate analysis framework; adopts the upstream ban-list thresholds; still awaiting accuracy review.
LICENSE-AUDIT.mdLicence audit of 15 FOSS repos with per-candidate copyleft impact and mitigation routes.
RESEARCH-DIGEST.mdCanonical 64-row candidate table with paper anchor, FOSS commit SHA, bucket and coverage attestation.
VERIFICATION-VERDICT.mdCitation verification (14 modern + 21 foundational papers) plus SHA-pinned FOSS repo checks and defect list.
candidates/01-bar-shannon-entropy.mdCandidate #1 record — Shannon entropy; conditional after the entropy run.
candidates/02-bar-approximate-entropy.mdCandidate #2 record — approximate entropy; dropped as a sample-entropy sibling.
candidates/03-bar-sample-entropy.mdCandidate #3 record — sample entropy; dropped in the hardened re-run.
candidates/04-bar-permutation-entropy.mdCandidate #4 record — permutation entropy; demoted as redundant with shipped Petrosian FD.
candidates/05-bar-weighted-permutation-entropy.mdCandidate #5 record — weighted permutation entropy; dropped as a permutation-entropy sibling.
candidates/09-bar-spectral-entropy.mdCandidate #9 record — spectral entropy; conditional pending a ruling on its sampling-frequency parameter.
candidates/10-bar-svd-entropy.mdCandidate #10 record — SVD entropy; the deferral rationale and the conditions for revisiting it.
candidates/11-bar-dispersion-entropy.mdCandidate #11 record — dispersion entropy; the entropy family's sole clean promotion, shipped in PR #515.
candidates/12-bar-fisher-shannon.mdCandidate #12 record — Fisher-Shannon; dropped as a permutation-entropy sibling.
candidates/14-bar-hjorth-mobility.mdCandidate #14 record — Hjorth mobility; full framework write-up, dropped as a cluster member.
candidates/15-bar-hjorth-complexity.mdCandidate #15 record — Hjorth complexity; preliminary promotion reversed by the cross-candidate matrix.
candidates/16-statistical-complexity.mdCandidate #16 record — MPR statistical complexity; banned as a near-rename of Petrosian FD.
candidates/18-cecp-coordinates.mdCandidate #18 record — CECP coordinates; dropped as redundant by definition, not by measurement.
candidates/19-cecp-velocity.mdCandidate #19 record — CECP velocity; passed all three axes and was queued for implementation.
candidates/20-binary-cecp.mdCandidate #20 record — binary CECP; held as borderline-redundant with Katz FD.
candidates/43-bar-petrosian-fd.mdCandidate #43 record — Petrosian fractal dimension; promoted and shipped in PR #509.
candidates/44-bar-katz-fd.mdCandidate #44 record — Katz fractal dimension; cluster winner, shipped in PR #509.
candidates/65-persistence-landscape-l2-norm-explained-en.mdPlain-English companion to the #65 pilot record.
candidates/65-persistence-landscape-l2-norm.mdCandidate #65 record — persistence-landscape L²-norm; the pilot application of the framework.
candidates/CLAUDE.mdPer-candidate folder hub: file count, evaluation census, verdict taxonomy, how to add a file.
candidates/_template.mdCanonical per-candidate file template derived from the framework's output section.
spike_2026-05-27/CHECK_A_RESULTS.mdStrict manifest-coverage verification run before column promotion; corrects the effective-coverage figure.
spike_2026-05-27/CLAUDE.mdHub for the first empirical run (5 candidates): method, adopted-vs-extended checks, reproduction steps, results table.
spike_2026-05-27/CROSS_CANDIDATE_FINDINGS.mdThe cross-candidate matrix evidence behind the 3-way Hjorth-Katz cluster discovery.
spike_2026-05-27/PROVENANCE.mdSingle source of truth for which checks are mandated upstream and which are operator extensions.
spike_2026-06-02-entropy/AGNOSTIC_AXIS3.mdPer-symbol pass-rate evidence used as the substitute agnostic-axis test.
spike_2026-06-02-entropy/CHALLENGED_AND_HELD.mdFirst adversarial audit of the entropy promotion; raised the six gates the hardening run closed.
spike_2026-06-02-entropy/CHALLENGED_AND_HELD_v2.mdRe-audit of the hardened verdict; records the omitted-instrument blocker and the final per-candidate dispositions.
spike_2026-06-02-entropy/CLAUDE.mdHub for the entropy-family loop: 8-candidate work list, frozen test constants, file map.
spike_2026-06-02-entropy/CONSTANTS_LOOP_CONTRACT.mdContract for ratifying the shared ordinal embedding as a real project-wide constant.
spike_2026-06-02-entropy/CROSS_CANDIDATE_FINDINGS.mdEntropy-family cross-candidate matrix: leave-one-out R² and pairwise sibling clusters.
spike_2026-06-02-entropy/CROSS_CANDIDATE_VS_LANDED.mdRedundancy check of the entropy keepers against the already-shipped features; superseded by the hardened run.
spike_2026-06-02-entropy/FEATURE_IMPL_LOOP_CONTRACT.mdContract for porting dispersion entropy into the Rust core following the PR #509 playbook.
spike_2026-06-02-entropy/HARDENED_VERDICT.mdThe hardened numeric verdict: per-candidate tables G1, G2, G2b, G5b, G6 and G7 over 207 cells.
spike_2026-06-02-entropy/HARDENING_LOOP_CONTRACT.mdContract for the loop that closed those six gates, one unit per firing.
spike_2026-06-02-entropy/LOOP_CONTRACT.mdThe loop's operating contract: per-iteration procedure, pre-answered forks, stop conditions.
spike_2026-06-02-entropy/PROMOTION_PLAN.mdTwo-deliverable promotion plan (constants first, then feature ports); carries the superseded-slate banner.
spike_2026-06-02-entropy/SETUP.mdEnvironment and launch instructions for running the entropy loop on the remote host.
spike_2026-06-02-entropy/SMOKE_TEST_FINDINGS.mdRead-only smoke findings taken before the hardening loop, and their consequences for it.
spike_2026-06-05-fractal-chaos/CLAUDE.mdHub for the fractal/multifractal/chaos batch: scope, hard rules, file map.
spike_2026-06-05-fractal-chaos/SMOKE_TEST_FINDINGS.mdOne-cell smoke test that finalised the 10-candidate slate, with cost table and the two within-slate clusters.
verdict.mdRoot verdict + rolling ledger: G9 audit → Phase 2 spike → Phase 2b entropy → Phase 2c Axis-2 HOLD → 2d remediation → 2e/2f CECP.

Dashboard twin

findings/dashboard/campaigns/2026-05-08-crypto-orthogonal-feature-families/

Generated by findings/dashboard/build_audits.py from findings/evolution/audits/2026-05-08-orthogonal-features-btcusd/AUDIT_LEDGER.json — never hand-edited. Each quote was verified to occur in the file named beside it when the ledger was written.