# wavelab ledger

A public, append-only, hash-chained record of what 88 pre-registered trading strategies said
about BTCUSDT on the 4-hour chart, bar by bar, each paired with a random control, and how every
one of them turned out.

## Closed

This record was closed openly on 2026-10-17. Its intake stopped that day: the bar of
2026-10-17 16:00 UTC was refused (seq 21703) and the closure was declared in the record itself
(incident at seq 21704). The plans already open kept resolving and were published until the last
outcome (seq 25144). The CLOSED incident (seq 26760) was then written with its counts, anchored
in Bitcoin and published, and the final segment ends at seq 26944. Nothing will be appended.

Its successor is **wavelab-ledger-v2**, whose genesis row is
`e6f0146f31307793428e2e0f8e20c9d06fdd08917972f68cef1a4aa4897e643d`.

The data here stays public and verifiable, as it was: clone it and run the verifier (version
1.0.0) as shown in [Verify it](#verify-it). It must print `PASSED`, with warnings that the
operator closed the record early and that no bar has been promised since the closure.

## What it is for

It measures, and nothing more. The operator's stated prior, sealed in the pre-registration before
the first signal, is that **none of these strategies has an edge**. The ledger exists so that
whether that prior is wrong can be settled by anyone, from public data, without trusting the
operator.

It is not a signal service, and nothing in it is a recommendation to trade.

## How it is built

- **Pre-registered.** Before the first bar, the genesis ceremony sealed the 88 strategies (the
  whole source of the modules they live in, their parameters, and the numpy and TA-Lib versions
  they run under), the exit geometry (a stop at 1.5 ATR, a target at 2R,
  and a close at 48 bars), the cost model, the random-control algorithm, the two endpoints, the
  sample size and the stopping rule. Nothing about how a trade is scored can change without a new
  pre-registration in the chain.
- **Promised before it is known.** Each 4h bar is announced while it is still open, with the
  roster of strategies that must answer for it. At the close, every strategy on that roster gets
  a row: a plan, a watch, a no-trade or an abstention with its reason. A promise that goes
  undelivered stays visible as a shortfall.
- **Controlled.** Every plan is paired with a control that enters at the same bar and price with
  the same risk and reward. The control's side is a coin flip drawn from the bar's sealed promise,
  the strategy, its direction and the close, none of which anyone could vary once the bar had
  closed. A pair measures whether choosing the side beat a coin. It does not remove the market's
  drift for a strategy that is almost always on one side, so each strategy's share of longs is
  reported, and one more than three-quarters on one side gets no verdict.
- **Judged by sealed rules, in a sealed order.** The PRIMARY question is the family's: pooled
  over every strategy's independent episodes (positions that never overlap), did the 88 choose
  sides better than a coin? It is decided once, over the episodes entered before the three-year
  deadline and once all of their outcomes are written, by whether the lower bound of a one-sided
  95% cluster bootstrap over 8-day blocks is above zero. Later plans are never pooled in. It is a single test,
  so it carries no multiplicity correction. The SECONDARY question is each strategy's, on its
  first 30 independent episodes, by a Student t bound at one-sided 0.05/88. That test is
  underpowered by construction: it needs about 1.13 R per episode, more than any strategy in this
  roster has produced, so a strategy it does not flag is not shown to have no edge. The rules,
  their critical values and their measured power are in the pre-registration; the verifier
  implements both.
- **Scored from public data.** Outcomes are computed from Binance's public daily kline archive,
  and each resolution cites the archive files it used and their published checksums.
- **Sealed every half hour.** A head row seals everything written since the previous one, and
  the rows it covers are published here as one new file. Heads are never more than an hour apart,
  counting the genesis as the first; a late one is preceded by an incident that says so.
- **Anchored in Bitcoin.** Each head's hash is timestamped through OpenTimestamps, which needs no
  account: the proof is checked against Bitcoin's own block headers. Anchoring takes a few hours
  after a head is sealed. The proofs are in the chain themselves, so even a rewritten history here
  could not move a head that was already anchored.

## Layout

```
segments/YYYY/MM/DD/<first seq>-<last seq>.ndjson
```

Each line holds one row: `{"seq": …, "row_hash": …, "body": …}`. The `row_hash` is the SHA-256
of the `body`, and each body names the hash of the row before it. The body of each row is its
full content in a canonical line format.

Files are only ever added. You can check that no published segment was ever changed or removed:

```bash
git log --diff-filter=MDR --name-only -- segments      # must print nothing
```

That check reads the history you cloned, so by itself it cannot see a rewrite that happened
before you cloned it. Two things close that gap. The server that publishes this repository
refuses force-pushes and deletions on `main` (`receive.denyNonFastForwards`,
`receive.denyDeletes`); that is a promise of the operator's, who runs the server. What does not
depend on trusting the operator is that every head is timestamped in Bitcoin, so a rewritten chain
would have to produce a hash that was already in a block; that covers each head once it is
anchored, a few hours after it is sealed, and the verifier tells you which is the latest anchored
head. Clone with full history (no `--depth`, which this server does not offer anyway): the
verifier warns when it cannot read it.

## Where it lives

The operator's own host publishes it, read-only:

- `https://wavelab.dr-techsolutions.com/git/wavelab-ledger.git`, to clone;
- `https://wavelab.dr-techsolutions.com/files/wavelab-ledger/`, the same files to browse;
- `https://wavelab.dr-techsolutions.com/ledger`, a page that reads it.

Keeping your own clone is the strongest thing a reader can do: a later rewrite of anything you
hold would no longer match it, whoever hosts the copy then.

## Verify it

```bash
git clone https://wavelab.dr-techsolutions.com/git/wavelab-ledger.git
git clone https://wavelab.dr-techsolutions.com/git/wavelab-verify.git
python3 wavelab-verify/verify.py wavelab-ledger
```

The verifier uses only the standard library and shares no code with the operator. It recomputes
the chain, every plan's stop, target and cost, every control's coin flip and every outcome from
the exchange's archive, and it reports each disagreement. See
[wavelab-verify](https://wavelab.dr-techsolutions.com/files/wavelab-verify/README.md) for what it checks and what
it does not.

## Licence

The data is published under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/). Operated by
DR Markets.
