Verify a report without taking our word for it.
At launch, Probant locks a test plan and computes its fingerprint: the SHA‑256 of its content, written in one canonical way. Recompute it: if a single character of the plan had changed since, the fingerprint wouldn’t match.
The fingerprint covers the test’s rules, set before the first visitor.
The sealed plan contains everything that decides the verdict, and nothing that happens afterward.
- The hypothesis
- The metrics and their roles: primary, secondary, guardrails with their limits, capping of extreme values
- The minimum target effect, the risk and power, and the number of checkpoints
- The planned sample size per variant, the total, and the planned duration, with the traffic declared to calculate them
- The split between variants, with the fingerprint of each variant’s changes
- The targeting: area, traffic share, holdout, pages, devices, audience, schedule
Results, the verdict, and the decision come after sealing: the fingerprint doesn’t cover them, and they’re checked against it. The report flags every deviation from the plan (a change after launch, a stop outside a checkpoint, an extension), and the client report counts, for each test, the quality criteria it meets.
One content, one way to write it.
The plan is written as canonical JSON: keys sorted by character code at every level, no spaces or line breaks, strings and numbers written the way JSON.stringify writes them, and missing fields omitted. The fingerprint is the SHA‑256 of this text in UTF-8, in hexadecimal.
Example: {"metrics":[{"role":"primary","key":"commande"}],"hypothesis":"Livrée jeudi","plan":{"mde":0.05,"looks":3}} is written as
{"hypothesis":"Livrée jeudi","metrics":[{"key":"commande","role":"primary"}],"plan":{"looks":3,"mde":0.05}}and its fingerprint is 2b9082a9379c3dddf14b71f62c5ffeb8dc96bc26e64b080791337b79150ef7c1.
Recompute a sealed plan’s fingerprint.
In the report, under a test, “What was sealed” shows the canonical form and a button to copy it. Compute its SHA‑256 with the tool of your choice, then compare it with the fingerprint shown, character by character.
macOS
pbpaste | shasum -a 256
Linux
xclip -selection clipboard -o | sha256sum
Windows (PowerShell)
$t = Get-Clipboard -Raw [Convert]::ToHexString([Security.Cryptography.SHA256]::HashData([Text.Encoding]::UTF8.GetBytes($t))).ToLower()
Or here, in your browser.
To try it: the sealed plan of the demo store’s “Free shipping progress bar” test, whose fingerprint is 6b98415912596ed972d1076b4520ba76f957fa180060ddd899cd85518f77933d.
{"allocation":[{"changes":"4f53cda18c2baa0c","key":"a","name":"Original","weight":1},{"changes":"0d9a08f73a38dae2","key":"b","name":"Progress bar","weight":1}],"declared":{"baseline":{"kind":"mean","mean":24.58,"sd":58.28126285522647},"dailyVisitors":3272},"hypothesis":"If the cart shows how much is left to qualify for free shipping, customers will add an item rather than pay for shipping, and revenue per visitor will go up.","metrics":[{"aggregation":"visitor","capPercentile":null,"direction":null,"eventName":"commande","key":"ca","kind":"mean","limit":null,"name":"Revenue per visitor","role":"primary"},{"aggregation":"visitor","capPercentile":null,"direction":null,"eventName":"marge","key":"marge","kind":"mean","limit":null,"name":"Margin per visitor","role":"secondary"},{"aggregation":"visitor","capPercentile":null,"direction":null,"eventName":"commande","key":"conversion","kind":"proportion","limit":null,"name":"Conversion rate","role":"secondary"},{"aggregation":"visitor","capPercentile":null,"direction":"increase-is-bad","eventName":"retour","key":"retours","kind":"proportion","limit":2500,"name":"Return rate","role":"guardrail"},{"aggregation":"visitor","capPercentile":null,"direction":"increase-is-bad","eventName":"lcp","key":"lcp","kind":"mean","limit":400,"name":"Mobile speed (LCP)","role":"guardrail"}],"periods":[{"end":"2026-11-02","key":"saisie-2026-10-30-maison-lune-private-sale","label":"Maison Lune private sale","source":"manual","start":"2026-10-30"}],"plan":{"alpha":0.05,"armSizes":null,"looks":3,"mde":0.05520567661771653,"perArm":29450,"plannedDays":18,"power":0.8,"totalVisitors":58900},"targeting":{"endsAt":null,"holdoutShare":0.05,"rules":{"urlPattern":"/panier"},"startsAt":null,"trafficShare":1,"zone":"Cart"},"version":1}The method is published, with its sources.
95% confidence intervals, sample ratio mismatch check, O’Brien-Fleming boundaries, winner’s curse, false positive risk: each calculation cites its source and is checked against reference values on the engine page.
Decision quality is counted test by test: what each one taught (a gain, a detected loss, or a “no effect” whose interval excludes the effect targeted in the plan), plus seven good-practice criteria, each counted separately, with no overall score. Under ten tests, a share is shown as a count of tests; beyond that, it comes with its Wilson interval.
The method, point by point.
Conclusive Or not yet…
Create your workspace, or explore the demo first with data from a fictional store.
- Open demo, no sign-up
- Free to start, no overage charges
- Database and compute in Amsterdam, with Scaleway