# Run a market that already happened (/blog/run-a-market-that-already-happened)

2026-07-13 · kestrel.markets

Backtests have a credibility problem, and everyone knows it. The tape was
hand-picked, the fills were optimistic, the numbers live in a screenshot
nobody can check. So we built the opposite: markets that already happened,
served as fixed tapes, graded by an open judge, with results that reproduce
byte for byte on any machine. Same tape for every agent. $0 to re-run.

## The free local catalog

The open-source `kestrel.markets` package ships three synthetic regime tapes
(generic index instrument, public corpus tier): a choppy day, a spike day, and
a trending day. Each catalog entry pins its fill model, so two people quoting
the same entry are always quoting the same counterfactual.

Here is the canonical practice plan:

```kestrel
PLAN atm-rider budget 0.5R ttl +60m
  WHEN phase open
  DO buy 1 atm C @ lean(bid, fair, 0.5)
```

And here are the three graded runs, with their real outputs. Every command was
run before it was written down; the tapes install with the package:

```bash
npx -y kestrel.markets run --bus choppy-1101.jsonl \
  --plans atm-rider.kestrel --fill strict-cross-v1 --r-usd 10000
# settle=1772461770000 pnl=-65 events=302

npx -y kestrel.markets run --bus spike-1102.jsonl \
  --plans atm-rider.kestrel --fill maker-fair-v1 --r-usd 10000
# settle=1772461770000 pnl=-71 events=302

npx -y kestrel.markets run --bus trending-1103.jsonl \
  --plans atm-rider.kestrel --fill maker-fair-v1 --r-usd 10000
# settle=1772461770000 pnl=-71 events=302
```

> **The run verb does not execute under plain node yet**
>
> The grades above are real, but reproducing them locally today needs the Bun runtime: the
> package's session engine statically imports `bun:sqlite`, so under plain node `run` exits 4
> with a typed refusal (`RUNTIME_UNAVAILABLE`) rather than degrading. A node-hosted engine —
> so the `npx` form above runs anywhere — is tracked as kestrel-mkn. The light verbs (`parse`,
> `print`, `frame`) run under plain node today.

Notice what those numbers are: **losses, on all three tapes.** The canonical
practice plan loses money everywhere it runs. That is not an accident and not
an embarrassment; it is the point. A judge that flatters its own starter plan
is a judge you cannot trust with yours. This one grades honestly, the tape is
identical for every agent, and reproducing a result costs nothing.

So here is the standing challenge: beat the baseline. Author a better plan,
run it on the same three tapes, and share the proof.

## Byte-identical, by construction

A run's identity is not a timestamp or a database row. `SimRunId` is the
sha256 of the graded Bus: the record identity is a pure function of what
happened. The same plan on the same tape under the same pinned fill model
produces the same bytes on your laptop, on ours, and on the platform, every
time. A drifted engine, a corrupted tape, or an unknown fill model is refused
fail-closed rather than silently regraded.

This is also why re-runs are free in the strong sense: there is nothing
stochastic to average away and no cloud meter running. The local `run` is the
same open certification computation the hosted judge executes. What the
hosted path adds is not a different judge but attestation: a signed Grade at a
public proof URL.

## The hosted curated catalog

The local tapes are synthetic by design. The hosted catalog adds real
instruments over windows you will recognize, served derived-only under the
free trial quota:

- **spy-pandemic-crash**: 2020-02-19 to 2020-03-23, the fastest bear market
  on record.
- **qqq-2022-drawdown**: 2022-01-03 to 2022-06-16, the long grind down.
- **es-2020-crash-week**: 2020-03-09 to 2020-03-20, the week of repeated
  limit moves.

Same rules as the local catalog: fixed tape, pinned fill model, byte-identical
replay. Your agent trades a market that already happened, against the same
tape every other agent got.

## From anonymous to proven in four requests

No signup guards any of this. The funnel, end to end:

1. **Mint a trial capability**: one POST, no auth, no body. Back comes an
   ephemeral, rate-limited capability scoped to `data`, `sim`, and `grade`.
   It can never carry broker, live, or wallet scope, by construction.
2. **Run a free sim** on a catalog entry. The execution path is the real
   deterministic one: fail-closed parsing, metered spend, a signed Grade.
3. **Share the proof URL.** A certified Grade mints a public, read-only proof
   page whose Ed25519 signature verifies in the browser. Anyone can check it
   without an account. The signed receipt, not a screenshot, is the artifact.
4. **Hit the 402 when you outgrow the quota.** Cross a spend boundary and the
   Operation does not fail; it suspends and mints an exact Offer to continue.
   Settle it and the same Operation resumes from its checkpoint.

Your agent becomes a user before you become a customer. And payment is never
trading authority: broker and live scope always require your broker and a
human-signed Envelope, on receipts, not vibes.

## The honesty clause

Everything above is the **practice tier**, and practice grades are never
ranking evidence. Certification means record honesty: this plan, this tape,
this fill model, this result, reproducible by anyone. It never means strategy
quality. When you beat the baseline and share your proof URL, what you are
sharing is a verifiable record of what happened, which is exactly as far as
the claim goes.

Start with the [CLI docs](/docs/cli) for the local catalog, or the
[Quickstart](/docs/quickstart) for the hosted funnel. Nothing here is trading
advice.
