Chapter 01 — The method

Eight checks.
One verdict.

Everything the harness does, in order, with the boundary of each check stated next to it. Nothing here is described as more than it is.

Run it in ten seconds

No setup, no database, no API keys. The certifier is a script in the repository, and the demo file is a CSV with 600 real prediction rows.

npx tsx scripts/certify-model.ts examples/vendor-model-sample.csv --configurations 20
The file claims an accuracy of 78.00%.
That claim is NOT used for scoring below.

  directional accuracy : 69.33%  (416/600)
  baselines beaten     : 5/5        <- looks great!

  earliest → latest  : 80.00% → 55.83%
  [FAIL] consistent out of sample

  VERDICT: OVERFIT
  The model looked promising in-sample and did not hold up out of sample:
  accuracy fell from 80.0% on the earliest fold to 55.8% on the latest.
  Tuning against this data will make it worse, not better.

It beat every baseline and still failed. That is the whole point: a screen that stops at the headline accuracy would have passed it.

You are buying the tool that proves the number, not a predictive edge.

The eight checks

Each check below is either a verdict gate or a stated library function. The difference matters, and it is written on every line.

08/08

Select a check to read exactly what it does — and where its boundary is. Nothing here is described as more than it is.

Accuracy is recomputed from raw predictions. Any claimed-accuracy column in the file is ignored entirely.

If the file says 92% and the predictions say otherwise, the predictions win. This is the check the whole harness is built around.

The model is compared against baselines computed from the data supplied — not against a number someone wrote down.

A bare CSV runs 2 baselines: always-bullish and no-change. All 5 defined baselines need price history. If the history isn’t supplied, the other three simply don’t run — they are never faked.

Accuracy is measured fold by fold, earliest to latest, so decay shows up instead of hiding inside one average.

This is period stability: how the model holds up across time periods. Purged walk-forward exists as a tested library function, but it is not a DIRECTION verdict gate. The distinction is stated here because buyers should not have to discover it later.

Trying many configurations and reporting the best one is corrected for — the more you tried, the harder it is to pass.

Bonferroni correction is applied to the number of configurations tried. That count is supplied with the run, so it is only as honest as the input — the harness does not pretend to know what it wasn’t told.

Every accuracy figure carries a Wilson interval, so a small sample can’t dress up as certainty.

A 70% on 40 predictions and a 70% on 4,000 predictions are not the same claim, and the output doesn’t let them look like one. For the demo file: 416 of 600 is 69.33%, with a 95% interval of 65.5–72.9%.

Checks for leakage — information in the test data that the model shouldn’t have had when it made the prediction.

A model that “predicts” with tomorrow’s information fails here, however good its headline number looks.

When a candidates file is supplied, the harness estimates the probability that the chosen model only looks best because many were tried.

For a single model with no candidates file, PBO is null — and never a gate. It answers one question: among everything you tried, how likely is this winner a fluke?

Checks whether the model’s stated confidence matches how often it is actually right.

A model that says 90% and is right 60% of the time is miscalibrated — useful to know before its probabilities drive position size.

What decay
looks like

In the verified demo, the sample model starts at 80.00% and ends at 55.83%. The overall 69.33% hides the story. The folds tell it.

One average can flatter a model; a sequence cannot.

Fall across folds  −24.17 pts

Only the earliest fold, latest fold, and overall figure are shown — exactly the numbers the demo returns. No intermediate folds are invented.

Decay illustration
Illustration Decay, drawn as an idea — the numbers are in the chart above, not in this image.
Input
Predictions as a CSV. Any claimed-accuracy column is ignored.
Output
Recomputed accuracy, Wilson interval, verdict and an exit code — exit 1 means fail.
Targets
The /certify page certifies DIRECTION only. All four targets — DIRECTION, PRICE, RANKING, CALIBRATION — run from the CLI.
Database
None required for the certifier.
Walk-forward
Period stability across folds. Purged walk-forward is a tested library function, not a verdict gate.
PBO
Needs a candidates file. Null for single models, and never a gate.
Platform
73 pages · 102 routes · 50 Prisma models · ~172,000 lines in src · 452 commits.
Runtime
Node 22 required — Node 24 breaks the Prisma install.

What it does not do.

01

It does not pick models.

It judges a claim you already made. Nothing in the harness chooses a strategy, a universe, or a horizon.

02

It does not execute trades.

The platform is paper trading only. There is no live broker execution, and no licensed market-data feed is included.

03

It does not guarantee the future.

A pass is a statement about the data supplied — not a promise that the model will work on new data, or that it will make money.

04

It does not clean your data.

Predictions go in as a CSV. If the rows are wrong, the verdict describes the rows, not reality.

The number on the page is the number the tool returns.

Start with a question