Trading Bot HQModels & runsTestsResearch

Hypothesis Accounting Reconciliation — 2026-07-25

Why this exists

The experiment ledger (bot/runs/experiments.db, scans table) has counted scan hypotheses only since it was created on 2026-07-23. Several preregistrations (execution-level tests, not Edge Lab scans) also declared and spent hypotheses against the Research Program §3 budget ("2,000 hypotheses, project lifetime, tracked cumulatively in the experiment ledger") — but those counts lived only in prereg prose and CLAUDE.md status entries, never as ledger rows. The two bookkeeping systems drifted apart. The drift was first visible on 2026-07-25: streak_follow_btc_v1 (registered 2026-07-24) declared "cumulative 133 → 137 of 2,000," but the very next scan (universality-solusdt) continued the ledger's running total from 133, not 137 — a 4-count gap. This document traces the full drift from the beginning, not just that one gap, and fixes it.

Rule going forward (adopted here, see bottom): every future prereg's registered hypotheses get a ledger row at registration time, kind-equivalent tag split = 'research (execution prereg)', so the ledger is the single source of truth. No more parallel prose counts.

Method

  1. Read every file in bot/preregistrations/*.md, grepped for "hypothes", and read the surrounding sections in full to extract each file's declared hypothesis count (if any) and any claimed cumulative.
  2. Read every row of bot/runs/experiments.dbscans table in id order.
  3. Established that zero existing ledger rows correspond to a prereg execution test — every existing row (ids 2–17) is an Edge Lab layer-3 scan config (displacement-event-scan, b4-fit, level-reaction, h4-ignition, rhythm, session-structure, upstreak-eth, three universality-*, two streak-regime-*). This confirms the task's premise directly: the ledger is scan-only.
  4. Rebuilt the true chronological sequence of all hypothesis-spending events (scans and prereg-registered execution hypothesis sets) using each prereg's own "Date registered" line and each ledger row's date column, using internal cross-references between documents to order same-day events (e.g. expansion-v2-costfix explicitly cites the Donchian run's H1 result as already-measured, so Donchian precedes it same day; disp_follow_btc_v1 cites 2026-07-23-displacement-event-scan.md as its evidence basis, so the scan precedes it same day).

Per-document findings (every hypothesis-declaring prereg)

File Date registered Declared hypotheses In ledger before this reconciliation?
2026-07-14-dual-thrust-dryrun.md 2026-07-14 0 — predates the hypothesis-counting convention entirely. Uses a single informal prose "Hypothesis:" sentence describing the strategy concept, no falsifiable H1/H2/... sub-hypotheses, no budget language (2,000 budget did not exist yet). N/A
2026-07-14-london-breakout-dryrun.md 2026-07-14 0 — same as above. N/A
2026-07-21-donchian-external-dryrun.md 2026-07-21 1. Has an explicit named, falsifiable, tested sub-hypothesis: "## The declared hypothesis... H1 — the stop floor improves NET expectancy while reducing GROSS," with a stated prediction and a filled result section ("H1 (stop floor) — CONFIRMED, and more strongly than predicted"). No explicit "logged against budget N" line (that convention starts the same day, in expansion-v2-costfix.md) — conservative/higher reading counts it as 1 since it unambiguously meets the "registered, falsifiable, tested" bar. No — never in ledger.
2026-07-21-expansion-pullback-dryrun.md (v1) 2026-07-21 0 — zero "hypothes" hits in the file. Tests the spec via the same generic 4-criterion pass/fail bar as the two 07-14 dry runs, with no named H1/H2 sub-hypothesis decomposition. Matches the task's own note that early dry runs "may predate the budget and declare none." N/A
2026-07-21-expansion-v2-costfix.md 2026-07-21 3 (H1 floor cuts drag, H2 tail was rollover not strategy, H3 hole was self-inflicted). Explicit "## Registered hypotheses" header. No — never in ledger.
2026-07-21-fable-mentor-internal-xauusd.md 2026-07-21 (result filed 2026-07-22) 3 (H1 gross positive, H2 drag < 0.30R, H3 tail control). Explicit "## Registered hypotheses" header. No — never in ledger.
2026-07-22-mentor-btc-v1.md 2026-07-22 6. File states explicitly: "Research-split scan; hypotheses logged against the §3 budget: 6 (H1–H4 + null + stability read)" — and separately flags its own gap: "Experiment-ledger row to be written with the result (ledger table pending — recorded here and in Helm #33 until it lands)." It never landed. No — never in ledger (the file itself says so).
2026-07-22-fable-mentor-internal-btc.md 2026-07-22 4. File states explicitly: "Hypotheses logged vs project budget: 4." (H1 replication, H2 drag law, H3 tail control, H4 information-not-geometry). No — never in ledger.
2026-07-23-disp-follow-btc-v1.md 2026-07-23 4. File states explicitly: "Hypotheses logged: 4 (cumulative 44 of 2,000)." The "44" is the ledger's own scan-only running total at that moment (40, after ids 2–6) plus this file's own 4 — i.e. even the prereg's self-reported cumulative was just reading the (already scan-only, already-missing-17) ledger number, not an independent full count. No — never in ledger.
2026-07-23-disp-follow-btc-v1-validation.md 2026-07-23 0 hypotheses against the 2,000 research budget. This is a Validation-split look (burns 1 of the separate 10-look Validation budget per Research Program §3), not a research hypothesis — it uses numbered "pass/fail criteria," never "Registered hypotheses" H1/H2 framing, and Research Program governs Validation looks on a wholly separate ledger (looks-remaining counter), not the hypothesis budget. Correctly excluded here. N/A (different budget)
2026-07-24-streak-follow-btc-v1.md 2026-07-24 4. File states explicitly: "## Registered hypotheses (4; cumulative 133 → 137 of 2,000)" — again reading its "133" straight off the ledger's scan-only total (id 12, upstreak-eth) and adding its own 4. This is the row that never landed, causing the 4-count drift Richard flagged during the universality sweep: the next ledger scan (universality-solusdt, id 13) continued from 133, not 137. No — never in ledger. Root cause of the noticed discrepancy.
2026-07-25-streak-follow-eth-REFUSED.md 2026-07-25 0. File states explicitly: "Zero hypotheses spent; zero runs." Refused pre-registration under the TEMPLATE kill rule (ex-ante cost arithmetic below break-even) — logged as a result (Research Findings E5), not a hypothesis spend. N/A (correctly zero)

Total prereg-execution hypotheses that never reached the ledger: 1 + 3 + 3 + 6 + 4 + 4 + 4 = 25.

The true chronological sequence (scans + prereg executions, merged)

This table is the authoritative cumulative count. Ledger id is shown for scan rows (unchanged, pre-existing); backfilled prereg rows are new ledger ids 18–24 (added below) shown as such.

# Date Event Kind Hyp. True cumulative
1 2026-07-21 2026-07-21-donchian-external-dryrun.md prereg execution 1 1
2 2026-07-21 2026-07-21-expansion-v2-costfix.md prereg execution 3 4
3 2026-07-21/22 2026-07-21-fable-mentor-internal-xauusd.md prereg execution 3 7
4 2026-07-22 2026-07-22-mentor-btc-v1.md prereg execution 6 13
5 2026-07-22 2026-07-22-fable-mentor-internal-btc.md prereg execution 4 17
6 2026-07-23 displacement-event-scan (ledger ids 2–6, 5×6) scan 30 47
7 2026-07-23 2026-07-23-disp-follow-btc-v1.md prereg execution 4 51
8 2026-07-23 b4-fit-mentor-stops-vs-r7-levels (ledger id 7) scan 1 52
9 2026-07-23 level-reaction (ledger id 8) scan 16 68
10 2026-07-24 h4-ignition (ledger id 9) scan 20 88
11 2026-07-24 rhythm (ledger id 10) scan 16 104
12 2026-07-24 session-structure (ledger id 11) scan 24 128
13 2026-07-24 upstreak-eth (ledger id 12) scan 16 144
14 2026-07-24 2026-07-24-streak-follow-btc-v1.md prereg execution 4 148
15 2026-07-25 universality-solusdt (ledger id 13) scan 22 170
16 2026-07-25 universality-bnbusdt (ledger id 14) scan 22 192
17 2026-07-25 universality-xrpusdt (ledger id 15) scan 22 214
18 2026-07-25 streak-regime-btcusd (ledger id 16) scan 12 226
19 2026-07-25 streak-regime-ethusdt (ledger id 17) scan 12 238

(disp-follow-btc-v1-validation.md and streak-follow-eth-REFUSED.md are omitted from this table — the first spends a Validation look, not a research hypothesis; the second spends nothing, by design.)

Where ledger and prose diverged, and why

The correct current total

Budget remaining: 2,000 − 238 = 1,762.

Backfill performed

Seven new rows were added to bot/runs/experiments.dbscans, one per prereg whose hypotheses were registered but never logged, using split = 'research (execution prereg)', conditions = 0, and a short verdict quoted/summarized from each prereg's own Result section. No existing row (ids 2–17) was modified, deleted, or renumbered.

New ledger id Date Config (prereg filename) Hypotheses Verdict (short)
18 2026-07-21 2026-07-21-donchian-external-dryrun.md 1 H1 CONFIRMED (stop floor cut drag 12/12 arms); overall FAIL (net −0.151R) — no signal to protect.
19 2026-07-21 2026-07-21-expansion-v2-costfix.md 3 GBPUSD FAIL (net −0.472R); H1 CONFIRMED (drag law, 24/24 arms), H2 REFUTED (Christmas-Eve wide-spread tail), H3 CONFIRMED (+2.03R vs v1).
20 2026-07-21/22 2026-07-21-fable-mentor-internal-xauusd.md 3 XAUUSD FAIL on criteria 1&4 but ALL 3 HELD: gross +0.1002R vs coin-flip −0.1306R.
21 2026-07-22 2026-07-22-mentor-btc-v1.md 6 Research-split FAIL; H1 REFUTED decisively (gross ≤ random null), H2 REFUTED, H3 HELD, H4 by-construction only.
22 2026-07-22 2026-07-22-fable-mentor-internal-btc.md 4 FAIL — gold signal INVERTS on BTC (gross −0.0706R vs coin-flip +0.0526R); H1/H4 REFUTED, H2/H3 HELD.
23 2026-07-23 2026-07-23-disp-follow-btc-v1.md 4 ALL 4 HELD, bar MET — first candidate with positive net(Vantage) +0.280R, n=282, 3.15× drag.
24 2026-07-24 2026-07-24-streak-follow-btc-v1.md 4 H1–H3 HELD, bar MET (n=487); H4 drag law missed tolerance (~46% over prediction).

Post-backfill verification:

sqlite> select sum(hypotheses) from scans;
238
sqlite> select count(*) from scans;
23   -- 16 original + 7 backfilled

Important caveat on the cumulative_hypotheses column: existing rows (ids 2–17) keep their original stored values (16, 22, 28, …, 223) unchanged, and those are scan-only running totals — not the true budget total, and not comparable across the backfill boundary. The 7 new rows (ids 18, 19, 20, 21, 22, 23, 24) store the true reconstructed cumulative at their point in the chronological sequence (1, 4, 7, 13, 17, 51, 148 respectively — see the chronological table above for the full merged sequence with every scan interleaved). The table in this document, not any single SQL query against the raw cumulative_hypotheses column, is the authoritative record of the running total. A future reader who wants "the total spent as of date X" should either consult this document's chronological table or run sum(hypotheses) where date <= X, never max(cumulative_hypotheses).

Going-forward rule (adopted, effective immediately)

Every future prereg's registered hypotheses get a ledger row at registration time:

This makes the ledger the single source of truth — no prereg needs to (or should) compute and quote its own "cumulative N of 2,000" in prose ever again; it should read that number from the ledger after its row is inserted, and the row should be inserted at registration, before the run executes, exactly like a scan row is inserted at declaration time.

Scope notes / things intentionally NOT touched