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.
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.bot/runs/experiments.db → scans table in id order.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.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).| 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.
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.)
mentor-btc-v1 (6) + fable-mentor-internal-btc
(4) — i.e. whoever seeded the ledger on 2026-07-23 carried forward only the two most
recent prereg executions and dropped the three from 2026-07-21 (Donchian,
expansion-v2-costfix, fable-mentor-internal-xauusd = 7 hypotheses) entirely.disp-follow-btc-v1, streak-follow-btc-v1) computed its own "cumulative"
by reading the ledger's current (already-wrong, scan-only) total and adding its own
count in prose — but never wrote that sum back as a ledger row. The next scan run
then read the ledger's stored total directly (correctly, for scans) and continued
from there, silently dropping the prereg's hypotheses a second time.mentor-btc-v1.md flagged its own gap explicitly at registration: "Experiment-ledger
row to be written with the result (ledger table pending — recorded here and in Helm
#33 until it lands)." It never landed — this reconciliation is that backfill,
17 days late in ledger time (same-day in project time).streak-follow-btc-v1's 4 hypotheses, which the
ledger dropped in exactly the pattern above. It is real, it was one instance of a
five-instance pattern, and it is now fixed for all five.max(cumulative_hypotheses) before this reconciliation: 223
(scan-only running total, id 17).sum(hypotheses) before this reconciliation: 213 (five fewer scan
rows' worth of double-counting is not present — 213 vs 223 differ because the stored
cumulative column started from the wrong base of 10, not because of duplicate rows;
213 + 10 = 223 confirms internal consistency of the scan-only chain).select sum(hypotheses) from scans on the ledger now
returns 238 directly (see Backfill section below) — no external arithmetic is
needed to get the right number from the database from this point forward.Budget remaining: 2,000 − 238 = 1,762.
Seven new rows were added to bot/runs/experiments.db → scans, 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).
Every future prereg's registered hypotheses get a ledger row at registration time:
date = the prereg's "Date registered."config = the prereg's filename (e.g. 2026-07-26-some-new-test.md).split = 'research (execution prereg)' (or 'validation (execution prereg)' if it's
a Validation-split look — though Validation looks are governed by the separate 10-look
budget, not the 2,000-hypothesis budget, and should still get a row for full
traceability, with hypotheses = 0 against this budget if the file declares none
against it).conditions = 0 (no parameter grid dimension applies to an execution prereg the way
it does to a scan).hypotheses = N, taken from the prereg's own "Registered hypotheses" count at
registration time — before the result is known.cumulative_hypotheses = the true running total (sum(hypotheses) over all rows with
date <= this row's date, in true chronological order — i.e. just query the ledger,
it is now self-consistent going forward from this reconciliation).verdict = filled in once the result lands (short summary), same as scan rows.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.
registry.db was not read or modified — out of scope per task instruction.scans row (ids 2–17) was modified or deleted.disp-follow-btc-v1-validation.md and streak-follow-eth-REFUSED.md were
deliberately excluded from the hypothesis backfill (0 hypotheses against the 2,000
budget each, for the reasons given above) — this is a substantive finding of the
reconciliation, not an omission.