DashboardThree-Axis ProbesCrypto Shared Data PoolLocked data scope (the pre-registration)

finding · findings/evolution/shared_data/pre-spec.md

Locked data scope: the pre-registration of what the probes may read

A frozen, version-controlled contract that pins down exactly which crypto data our research probes are allowed to look at — which coins, which settings, and which date windows — so that nobody can quietly cherry-pick the data that makes a result look good.

In plain English. Before running an experiment, serious scientists write down the rules in advance and lock them — that's "pre-registration." This document is that locked rule sheet for our crypto data. It says: read only these 6 coins, only at these price-sensitivity settings, only inside these 21 two-month time windows, and only by looking at the database, never changing it. Locking the rules first means a later result can't be accused of being tuned to flatter itself.

The headline numbers

v2
Current locked version (crypto-only)
6
Crypto symbols
21
Two-month time windows
441
Total data cells (21×21)
438
Cells with real data (3 empty)
~7
Independent market regimes

What is this?

Why it matters

If you let a researcher (or a tuning loop) freely choose which symbols, settings, and dates to include, you can accidentally — or deliberately — keep only the slices that happen to support your conclusion. That is "data dredging," and it makes a result look real when it isn't. Locking the scope before looking at outcomes removes that freedom. Any later verdict can cite the exact version it was computed against ("computed against shared_data pre-spec v2"), and the file's git history (its change log) is the permanent, tamper-evident record of what the rules were at each point in time.

What changed from v1 to v2 (2026-05-30)

The scope was deliberately narrowed. Each change below has a documented reason — nothing was dropped on a whim.

ChangeWhy (in plain words)
Forex removed — the EURUSD foreign-exchange data (at the 5 dbps setting) is goneAn operator directive narrowed the study to crypto only "for now." The forex findings weren't thrown away — they're archived in forex-availability-probe.md and a reintroduction plan sits in scope-expansion-options.md.
2020 dropped — the three 2020 time windows (slice22/23/24) were removedBitcoin and Ethereum bars only begin on 2021-01-01 in our database, so 2020 windows were empty or patchy. Window count fell from 24 → 21.
LTCUSDT @ 100 dbps droppedEmpirically broken: only 26 bars total exist in the database for that one combination — far too few to measure anything (re-confirmed 2026-05-30).
Threshold "tiers" addedThe 750 setting is marked spearman_only (too few bars in a 2-month window for the heavier metrics); 100/250/500 are marked full. See the pool's robustness map.
Fetch step removedThe old file-copying script fetch_multi_slice.py was never actually run and has been deleted. The probe now reads slices live from the database.

A note on jargon used above

How it works: the data substrate

"Substrate" just means the underlying raw material the probes stand on. In v2 it is purely crypto, read straight from the production database.

SettingValueWhat it means
ClickHouse hostbigblack (via Tailscale)The remote server holding the data, reached over the team's private network.
Databaseopendeviationbar_cacheThe specific database name.
Tableopen_deviation_barsThe specific table of price bars.
Access moderead-only SELECTThe probe may only look, never add, edit, or delete.
Ordering keyclose_time_usRows are ordered by each bar's close time, in UTC microseconds (exchange/venue time).
Forex (fxview_cache.forex_bars) was "Substrate 2" in v1 — removed in v2. It can be switched back on later via scope-expansion-options.md.

The six symbols and their settings

Each cell of the study is one combination of (symbol, threshold setting, time window). Below is which thresholds each coin is studied at. "Bar-layer first bar" is the real earliest date with bars (2021-01-01 for all defaults — note this differs from the trade-level start date listed in symbols.toml).

SymbolThresholds (dbps)First barCovers all 21 windows?
BTCUSDT100, 250, 500, 7502021-01-01yes — BTC@750 ends 2026-01-20, so the newest window (slice01) is slightly cut short
ETHUSDT100, 2502021-01-01mostly — ETH@100 ends 2025-06-17, so windows 01/02/03 are empty
BNBUSDT100, 250, 500, 7502021-01-01yes
LTCUSDT250, 500, 7502021-01-01yes — LTC@100 dropped (only 26 bars)
ADAUSDT100, 250, 500, 7502021-01-01yes
XRPUSDT100, 250, 500, 7502021-01-01yes

The 21 time windows (2021 onward)

Each window is exactly 2 calendar months, in UTC, non-overlapping, and listed newest-first. The regime column is a coarse label for what the market was doing — useful for checking whether a result holds across very different market conditions ("regime-stratified robustness"). The three 2020 windows are crossed out because there were no usable BTC/ETH bars that far back.

SliceWindow (UTC)Market context (BTC-centric)
slice012026-01-01 → 2026-02-282026 H1 — current state
slice022025-10-01 → 2025-11-302025 Q4
slice032025-07-01 → 2025-08-312025 H2 mid
slice042025-04-01 → 2025-05-312025 Q2
slice052025-01-01 → 2025-02-282025 H1 start
slice062024-10-01 → 2024-11-302024 Q4
slice072024-07-01 → 2024-08-312024 H2 mid
slice082024-04-01 → 2024-05-312024 Q2 — post all-time-high
slice092024-01-01 → 2024-02-292024 H1 — ETF era
slice102023-10-01 → 2023-11-302023 Q4 recovery
slice112023-07-01 → 2023-08-312023 H2 mid
slice122023-04-01 → 2023-05-312023 Q2 mid
slice132023-01-01 → 2023-02-282023 H1 — post-FTX
slice142022-10-01 → 2022-11-302022 Q4 — FTX collapse
slice152022-07-01 → 2022-08-312022 H2 — 3AC aftermath
slice162022-04-01 → 2022-05-312022 Q2 — LUNA collapse
slice172022-01-01 → 2022-02-282022 H1 — top turning bear
slice182021-10-01 → 2021-11-302021 all-time-high region
slice192021-07-01 → 2021-08-312021 mid-bull
slice202021-04-01 → 2021-05-312021 mid-bull
slice212021-01-01 → 2021-02-282021 early-bull
slice222020-10-01 → 2020-11-30EXCLUDED — 2020, no BTC/ETH bars
slice232020-07-01 → 2020-08-31EXCLUDED — 2020, no BTC/ETH bars
slice242020-04-01 → 2020-05-31EXCLUDED — 2020, no BTC/ETH bars
Why "~7 regimes," not 21 samples. Neighbouring windows from the same market era move together, so they aren't truly independent. The windows group into about seven distinct "regime epochs": bull_2021 (slices 18–21) · bear_2022 (slice 17) · stress_2022 (slices 14–16) · recovery_2023 (slices 10–13) · bull_2024 (slices 06–09) · range_2025 (slices 02–05) · current_2026 (slice 01). Treat the data as ~7 independent regime samples, not 21 — otherwise you'd overstate how much evidence you have.

The rules the probe must obey (invariants)

An "invariant" is a rule that must hold true every single time. These are baked into the probe code so the locked scope is actually enforced, not just promised.

RuleHow it's enforced
read_only — only look-ups (SELECT) ever touch the databaseThe probe issues SELECT only — never INSERT / ALTER / DELETE / DROP / OPTIMIZE (i.e. nothing that could change the data).
boundary_inclusion — every query stays inside its windowEach query hard-codes close_time_us >= start AND close_time_us <= end.
min_year — 2020 windows are excludedA MIN_YEAR = 2021 filter is applied to the schedule.
cpu_budget — keep it to a single CPU core by defaultThe math libraries are pinned to 1 thread (OPENBLAS/OMP/MKL/NUMEXPR/NUMBA_NUM_THREADS=1), overridable if needed.
floor_guard — too-small cells are skipped or flaggedCells with fewer than 200 bars are skipped entirely; fewer than 1000 are flagged meets_floor_1000=false and left out of the heavier aggregation.
numeric_only — text columns can't corrupt the mathEverything is coerced to numbers, then any column that's more than 80% empty is dropped.

How you change the scope (versioning rules)

Proving which rules were used: the hash check

When this file is committed to git, the exact content produces a unique fingerprint (a "content hash") that becomes the canonical identifier for that version. So any past result that says "computed on shared_data v1" can be re-verified by going back to the commit that first added v1 and comparing the fingerprint:

git log --diff-filter=A findings/evolution/shared_data/pre-spec.md
# Find the commit that first added v1; compare the file's hash

The same fingerprint is also recorded per-cell, so each cell of data carries proof of which version of the rules produced it.

Bottom line. This file is the frozen, version-controlled contract that says exactly which crypto data the probes may read — 6 symbols, four threshold settings, 21 two-month windows (438 of 441 cells populated), read-only from ClickHouse — so that every downstream result is anchored to rules that were locked in advance and can be re-verified by its version hash.