Most backtesting tools make it cheap to try many configurations. That is the problem, not the feature — greedy selection over enough variants produces all-green equity curves on pure noise, reliably, and the resulting Sharpe looks fine right up until it meets out-of-sample data.
falsify inverts the incentive. Running a strategy is easy. Running one without recording the attempt is impossible.
How it works
It measures forward outcomes from signal events rather than simulating execution, which keeps fill and latency assumptions out of the result entirely. One artifact sits at the centre: the event table, one row per signal event, with every conditioning feature frozen at the signal bar and every outcome measured forward from it — unstopped, untargeted, in ATR units.
Because measurement is separated from trade construction, exit geometry cannot confound a question about drift. Stops and targets are applied later, on top of the table, as a separate and clearly labelled step. A negative result then means no drift, rather than the ambiguous no drift, or the wrong stop.
Trial logs are append-only and pre-registrations are frozen before the data is looked at. In this project specifically, every filter that looked strong in exploration has so far flipped sign in confirmation — which is the entire reason the discipline is the product.
The method around it
falsify is the harness for a wider approach: propose a plausible market mechanism, measure it against a random-walk null, and only implement what survives. Structural measurements constrain what is even worth attempting — variance ratios place XAUUSD and NQ in mean reversion at intraday horizons, and XAUUSD's round-trip cost is roughly twenty-one times EURUSD's, which rules out whole strategy families before a line is written.
Viewer
It ships with a standalone viewer built on DuckDB-WASM and TradingView Lightweight Charts, so a signal set can be inspected without spinning up a notebook.