Skip to main content

Wickra Verify — deterministically confirm or refute a claimed backtest report against its strategy and data, in ten languages

Built on Wickra Status CI CodeQL codecov GitHub release crates.io PyPI npm NuGet Maven Central Go module R-universe License: MIT OR Apache-2.0 OpenSSF Scorecard OpenSSF Best Practices Build provenance Docs Verified across 10 languages


Verify any backtest. Hand over a (strategy, data, claimed report) triple and get a deterministic verdict — confirmed or refuted — that anyone can recompute in ten languages.

▶ Live demos: the backtester compiled to WebAssembly, an equity curve building bar by bar — backtest-live.wickra.org; one StrategySpec side by side in Python, Rust, JS and Go — playground.wickra.org; all 514 indicators of the core over a real Binance feed — live.wickra.org. Zero backend, all of them.

Part of the Wickra ecosystem. Built on the same deterministic backtest engine and ten-language binding surface as wickra-backtest, wickra-proof and the rest.

wickra-verify takes a claim — a strategy spec, the candle data it was run over, and the BacktestReport someone says that run produced — and recomputes the report with the pinned wickra-backtest engine. It then compares the claimed report against the fresh one, field by field, within an explicit tolerance, and returns a verdict: matches: true if every metric agrees, or a stable, sorted list of the exact mismatches if not.

It is a free anti-fraud tool against doctored backtests — not a hosted service, not a SaaS, not a backend. A CLI plus ten language bindings, and an optional static in-browser WASM demo. Nothing you submit ever leaves your machine.

use wickra_verify_core::{verify, Claim, DatasetRef};

// A claim is the strategy, the candles it ran over, and the report someone
// says that run produced. `verify` recomputes the report and compares.
let claim = Claim {
    strategy: strategy_json,
    dataset_ref: DatasetRef::Inline { data: candles_by_symbol.clone() },
    claimed_report: claimed_report_json,
};
let verdict = verify(&claim, &candles_by_symbol)?;

// `matches` is the whole answer; `mismatches` names every field that differs.
// The same triple yields the same verdict in all ten languages, byte for byte.
assert!(!verdict.matches);
assert_eq!(verdict.mismatches[0].field, "fees_paid");

The same call from the command line, against the doctored claim shipped in examples/data (exit 2 = refuted, which is what a CI gate wants):

cargo run -p wickra-verify -- \
  --claim examples/data/claims/fudged.json \
  --data examples/data/candles

Status

0.2.1 — the current release. The core, the CLI, all ten language bindings, the byte-exact golden corpus, the property + fuzz suites, the benchmarks and one runnable example per language are built and green across Linux, macOS and Windows. Packages are not yet on the registries. Track progress in ROADMAP.md.

Documentation

Determinism is the product

  • Recompute, never trust — the verdict comes from re-running the backtest, not from comparing two supplied numbers. A fudged Sharpe, an inflated PnL, a quietly-changed parameter all surface as a concrete mismatch.
  • Explicit tolerance — floats are compared within a fixed atol + rtol·max(|a|,|b|) tolerance (the numpy.allclose rule), never bitwise, so legitimate last-ULP noise never causes a false refutal.
  • Stable, sorted mismatches — the mismatch list is ordered by field, so the verdict is byte-identical across all ten languages.
  • Canonical hashes — every verdict carries the blake3 hashes of the claimed report, the recomputed report and the full inputs, under the same canonicalization wickra-proof uses; a verdict's inputs_hash equals the proof hash of the same inputs.

Quickstart

--claim is a JSON/TOML Claim; --data a CSV or a directory of <SYMBOL>.csv files (omit --data when the claim carries its candles inline). Exit 0 = verified, 2 = refuted (CI-friendly), 1 = error; --explain renders the mismatches and forces exit 0.

The example claim inflates fees_paid, so the verdict is refuted and names the fees_paid mismatch — a fabricated number cannot pass a recomputation.

Claim format

A claim is the assertion to be checked — "this strategy on this data produced this report":

  • strategy — the embedded wickra-backtest StrategySpec (indicators, entry/exit rules, sizing, costs, risk).
  • dataset_ref — where the candles come from: inline (embedded per symbol, fully self-contained) or files (named symbols resolved out of band).
  • claimed_report — the BacktestReport the claimant asserts this run produced. Untrusted: verification recomputes and compares, so a doctored claimed_report cannot pass.

Full schema in docs/CLAIM_FORMAT.md.

Verdict and tolerance

verify returns a Verdict:

  • matches — true iff every compared field agrees within tolerance.
  • mismatches — a field-sorted list of {field, claimed, actual, delta}.
  • claimed_report_hash / actual_report_hash / inputs_hash — 64-hex blake3 digests over the canonical forms.
  • engine_version — the wickra-backtest version the verdict was reached under.

Two floats count as equal when |a − b| ≤ atol + rtol·max(|a|,|b|), with tight defaults (atol = 1e-9, rtol = 1e-6) that absorb last-bit float noise and nothing more. See docs/VERDICT.md.

Canonicalization and hashing

The hashes are only as trustworthy as the serialization they run over, so canonicalization is byte-for-byte the contract wickra-proof uses (see crates/wickra-verify-core/src/canon.rs): keys sorted by code point, no structural whitespace, floats quantized to 1e-8 with trailing zeros trimmed and whole values collapsed to integers, no NaN/±inf. blake3 over that canonical string yields each 64-hex hash. A verdict's inputs_hash therefore equals the wickra-proof hash of the same inputs — the two products share one determinism moat. See docs/CANONICALIZATION.md.

Anti-fraud use in CI

Because a refuted claim exits 2, verification drops straight into a pipeline:

# Fails the job (exit 2) if the committed report does not match a fresh run.
wickra-verify --claim claim.json --data candles/

Wire this into a strategy repo's CI and a doctored claimed_report can never be merged — the recomputation is the gate. Recipes in docs/Cookbook.md.

Use in any language

The core is a JSON-over-C-ABI data API (Verifier::command) exposed natively in Rust, Python, Node.js and WASM, and over the C ABI hub in C, C++, C#, Go, Java and R. Every binding drives the same verify / explain / canonicalize / version commands and returns the core's canonical response verbatim; the cross-language golden tests assert byte-for-byte equality. One runnable example per language lives under examples/; per-binding quickstarts are in each bindings/<lang>/README.md.

Language Binding Package
Rust wickra-verify-core (native) crates.io
Python PyO3 (native) PyPI
Node.js napi (native) npm
WASM wasm-bindgen (native) npm
C / C++ C ABI header + library
C# C ABI (P/Invoke) NuGet
Go C ABI (cgo) Go module
Java C ABI (FFM/Panama) Maven
R C ABI (.Call) R-universe

Project layout

crates/wickra-verify-core          the library: claim + compare + canonicalize + verify
crates/wickra-verify-cli    reference CLI (verify), binary `wickra-verify`
crates/verify-bench         Criterion benchmarks
bindings/{c,python,node,wasm,go,csharp,java,r}   ten-language surface
golden/                     fixed claims -> expected verdicts (byte-exact)
examples/                   runnable per-language demos + static web demo
fuzz/                       cargo-fuzz targets (claim parse, compare, canonicalize, verify)

Building everything from source

cargo build --workspace
cargo test --workspace --all-features

Each binding builds with its own toolchain; see bindings/<lang>/README.md. The C-ABI consumers (C/C++, C#, Go, Java, R) need the C ABI library first: cargo build --release -p wickra-verify-c.

Testing

Run the suites with the commands in Building everything from source.

  • wickra-verify-core — unit tests for canonicalization (key ordering, float quantization, whitespace), the verify/round-trip path, tamper detection, and the engine-version pin. The golden fixtures in golden/ are the anchor: the same (spec, data) pair must fold to the same canonical bytes and the same blake3 hash here as in every binding.
  • Every binding asserts the same golden bytes. That is the whole cross-language claim, so it is checked the same way in each one rather than approximated per language: Python with pytest, Node with node --test, WASM with wasm-bindgen-test, C and C++ through ctest, C# with dotnet test, Go with go test, Java with JUnit, and R with the shipped tests/smoke.R plus the repository-level tests/run_tests.R.
  • fuzz/ — libfuzzer targets over the JSON boundary, run as a time-boxed smoke in CI. The goal is catching a regression in the harness, not discovering novel bugs; long campaigns belong on dedicated infrastructure.
  • Repository checks — scripts/check_version_sync.py, check_license_copies.py and check_readme_links.py run in CI and assert what the repository ships rather than what it computes.

Requirements

Rust 1.86 (workspace) / 1.88 (Node binding). Per-binding toolchains: Python 3.9+, Node.js 22+, .NET 8, JDK 22+, Go 1.23+, R ≥ 4.1, and a C11/C++14 compiler with CMake for the C example.

Benchmarks

Criterion benchmarks for verify, compare and canonicalize live in crates/verify-bench; numbers and methodology are in BENCHMARKS.md.

Ecosystem

Part of the Wickra family — each one a data-driven core with a CLI and the same ten-language binding surface:

  • wickra — main library (Rust core + Python / Node.js / WASM bindings + a C ABI for C / C++ / C# / Go / Java / R)
  • wickra-playground — a polyglot strategy playground: one StrategySpec live side by side in Python, Rust, JS and Go, entirely in the browser
  • wickra-exchange — unified market-data + execution across ten crypto exchanges
  • wickra-backtest — event-driven backtester over the Wickra core
  • wickra-terminal — the trading terminal: a TUI and a browser renderer over the stack
  • wickra-screener — parallel multi-symbol screening over 495 streaming indicators
  • wickra-radar — perp-universe alert radar: OI delta, funding flip, book imbalance, liquidation clusters, OI/price divergence
  • wickra-copilot — local market copilot grounded in real order-book, liquidation and funding microstructure
  • wickra-shazam — match an asset's current microstructure fingerprint against its entire history
  • wickra-benchmark — reproducible, golden-verified benchmark suite — recompute any (strategy, dataset, report) in ten languages and confirm it byte-for-byte
  • wickra-strategy-ci — Jest for trading strategies: golden-pin the report, catch regressions in CI, property-test against fuzzed data
  • wickra-verify — confirm or refute a claimed backtest report against its strategy and data, in ten languages
  • wickra-proof — Proof-of-Backtest: deterministic (spec, data) → report + blake3 hash, recomputable byte-for-byte in ten languages
  • wickra-zk — prove a backtest zero-knowledge — on-chain-verifiable performance without revealing the data or the strategy
  • wickra-impact — the backtester that knows you would have moved the market: agent-based fills on the real historical L2 order book
  • wickra-darwin — evolutionary strategy search at millions of backtests per second, mutating and crossing JSON specs across the 495-indicator space
  • wickra-gym — a Gymnasium-compatible, microstructure-aware backtest environment with O(1) steps for deterministic RL rollouts
  • wickra-feature-store — OHLCV and microstructure streams into ML-ready feature matrices over 495 O(1) streaming indicators
  • wickra-genome — a vector database of the whole market: every asset a 495-dim live vector, for similarity search, clustering and anomaly detection
  • wickra-timemachine — scrub the whole market like a video — every symbol, full order book, rewound to any moment via deterministic re-fold
  • wickra-synth — deterministic synthetic market microstructure: OHLCV, order book, trades and funding from a single seed
  • wickra-compile — compile a strategy spec into a standalone deployable: a WASM module, a self-contained binary, or a no_std artifact
  • wickra-embed — allocation-free, no_std streaming indicators for bare-metal and HFT, byte-for-byte identical to the core
  • wickra-pico — the O(1) indicator core running bare-metal on a $5 Raspberry Pi Pico — the LED blinks on the EMA cross

Docs at docs.wickra.org; the marketing site and in-browser demo at wickra.org.

Contributing

See CONTRIBUTING.md and the Code of Conduct. Every change runs the full CI matrix (all ten languages × three OSes) plus CodeQL, Scorecard and zizmor.

Security

Report vulnerabilities per SECURITY.md. The threat model is in THREAT_MODEL.md.

License

Licensed under either of

at your option. Use it, fork it, modify it, redistribute it — commercially or not — file issues, send pull requests; all welcome.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Disclaimer

wickra-verify is research and engineering tooling, not financial advice. A verdict attests only that a claimed report is (or is not) the deterministic result of a given strategy over given data — it makes no claim about the quality, profitability or future performance of any strategy, nor about whether the data itself is genuine. Trading carries risk; you are responsible for your own decisions. wickra-verify is free software you run yourself: no hosted service, no data collection, no warranty.


GitHub stars GitHub forks GitHub issues

Built on Wickra. If it saved you time, the cheapest way to say thanks is to ⭐ the repo.

wickra-verify star history

Metadata

Release files for wickra-verify 0.2.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for wickra-verify 0.2.1
File Size Uploaded Provenance Actions
wickra_verify-0.2.1.tar.gz 74.0 kB Without provenance Details for wickra_verify-0.2.1.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for wickra-verify 0.2.1
File Actions
wickra_verify-0.2.1-cp39-abi3-win_arm64.whl CPython 3.9 abi3 Windows ARM64 Details for wickra_verify-0.2.1-cp39-abi3-win_arm64.whl
wickra_verify-0.2.1-cp39-abi3-win_amd64.whl CPython 3.9 abi3 Windows x86-64 Details for wickra_verify-0.2.1-cp39-abi3-win_amd64.whl
wickra_verify-0.2.1-cp39-abi3-musllinux_1_2_x86_64.whl CPython 3.9 abi3 Linux musl 1.2+ x86-64 Details for wickra_verify-0.2.1-cp39-abi3-musllinux_1_2_x86_64.whl
wickra_verify-0.2.1-cp39-abi3-musllinux_1_2_aarch64.whl CPython 3.9 abi3 Linux musl 1.2+ ARM64 Details for wickra_verify-0.2.1-cp39-abi3-musllinux_1_2_aarch64.whl
wickra_verify-0.2.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.9 abi3 Linux glibc 2.17+ x86-64 Details for wickra_verify-0.2.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
wickra_verify-0.2.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.9 abi3 Linux glibc 2.17+ ARM64 Details for wickra_verify-0.2.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
wickra_verify-0.2.1-cp39-abi3-macosx_11_0_arm64.whl CPython 3.9 abi3 macOS 11.0+ ARM64 Details for wickra_verify-0.2.1-cp39-abi3-macosx_11_0_arm64.whl
wickra_verify-0.2.1-cp39-abi3-macosx_10_12_x86_64.whl CPython 3.9 abi3 macOS 10.12+ x86-64 Details for wickra_verify-0.2.1-cp39-abi3-macosx_10_12_x86_64.whl

Total release size: 6.2 MB

Release files / wickra_verify-0.2.1.tar.gz

Download URL wickra_verify-0.2.1.tar.gz
Size 74.0 kB
Tags Source
SHA-256 checksum
How to use checksums
a4f7da729187b62a4259d5b1e570e5ce2ef5619bc292edbbda026645b0b43dfd
BLAKE2b-256 checksum
How to use checksums
f62af808c81b4d592e5377f5a15e8276ca276a3ef5720d6954d25a07e9b126ba
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / wickra_verify-0.2.1-cp39-abi3-win_arm64.whl

Download URL wickra_verify-0.2.1-cp39-abi3-win_arm64.whl
Size 591.0 kB
Tags CPython 3.9 Windows ARM64 abi3
SHA-256 checksum
How to use checksums
e518e6abeafdfd8897dc3b6eb61647409df4e4cfe021cd483a26efedab2d8f0e
BLAKE2b-256 checksum
How to use checksums
467138db911d47a34d6d49ed5856808f597859d8fac71bd97f7b93723fb08da8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / wickra_verify-0.2.1-cp39-abi3-win_amd64.whl

Download URL wickra_verify-0.2.1-cp39-abi3-win_amd64.whl
Size 681.7 kB
Tags CPython 3.9 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
8f54cb16e610d01c29eb0f15a7676ce6cc7ea2a01b72e3a7ed54f06fb6c5acb8
BLAKE2b-256 checksum
How to use checksums
f871f2cf82425a5e53b43e29c2a45504911130cd7308105692904162d27cf80f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / wickra_verify-0.2.1-cp39-abi3-musllinux_1_2_x86_64.whl

Download URL wickra_verify-0.2.1-cp39-abi3-musllinux_1_2_x86_64.whl
Size 1.0 MB
Tags CPython 3.9 Linux musl 1.2+ x86-64 abi3
SHA-256 checksum
How to use checksums
46706c4189d13afb576e355826ecd490ba31fbc426d808d88c0482a29c8ce24f
BLAKE2b-256 checksum
How to use checksums
547d0f346086392d8bc0c97dda095f234fd315a7ad6ecc1d7714e76be0bd3cd8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / wickra_verify-0.2.1-cp39-abi3-musllinux_1_2_aarch64.whl

Download URL wickra_verify-0.2.1-cp39-abi3-musllinux_1_2_aarch64.whl
Size 889.1 kB
Tags CPython 3.9 Linux musl 1.2+ ARM64 abi3
SHA-256 checksum
How to use checksums
dbfa0a2f054bd2341400fb260aad18e8b08ede8a325540a6d107dc104340bc7d
BLAKE2b-256 checksum
How to use checksums
480b983e5ed29a7948d778a474cc0831975d22e685f1a6fcf1e3589848c22925
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / wickra_verify-0.2.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL wickra_verify-0.2.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 800.5 kB
Tags CPython 3.9 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
00fa5ba7b109fc0b2e4d94b188d3f3d6255047e59e92d2ddb4a02c8fce6b36d4
BLAKE2b-256 checksum
How to use checksums
0712e913a995167fe586165283c2e19e593cf42c885fbfdd4e7fb668416afab6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / wickra_verify-0.2.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL wickra_verify-0.2.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 712.2 kB
Tags CPython 3.9 Linux glibc 2.17+ ARM64 abi3
SHA-256 checksum
How to use checksums
de0a04428924439a0bedc25cf5ee5f375153c186bafec49c62e0082cb9d3b63e
BLAKE2b-256 checksum
How to use checksums
82c2a442fdc5bf8100589517ec9bb7f28c43abd61897b4720566c019f0391c64
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / wickra_verify-0.2.1-cp39-abi3-macosx_11_0_arm64.whl

Download URL wickra_verify-0.2.1-cp39-abi3-macosx_11_0_arm64.whl
Size 650.9 kB
Tags CPython 3.9 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
1ea180f76227fdcd79e92ca3e61d05e31d804b7f1aa14fb9944e9579dd019172
BLAKE2b-256 checksum
How to use checksums
a43ab0d4cbbf003dab5274d6c60319f7a468955f4afe35ee613fba915b3540e2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / wickra_verify-0.2.1-cp39-abi3-macosx_10_12_x86_64.whl

Download URL wickra_verify-0.2.1-cp39-abi3-macosx_10_12_x86_64.whl
Size 766.3 kB
Tags CPython 3.9 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
eb48c45e84fdb0b4b0037654056d2fe17b16c2f45d5519f7a95586444cab5bdc
BLAKE2b-256 checksum
How to use checksums
96da10ae7c1b9700cc7905adc0854c87a10b1e213ff1cda316285d37c47541fc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Security for wickra-verify 0.2.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page