ProveCommands
`poisson-prove report`
Writes a report folder you can keep or share. Two runs give the comparison diff prints, with a
heatmap of the change in every condition; one run gives its survival report, how soon and how
often each outcome happened. The folder holds report.md, heatmap.svg and receipt.html, a
one-page record of what was compared and how. A comparison is also saved into the store.
poisson-prove report --helpOutput82 lines
usage: poisson-prove report [-h] [--event NAME] [--method {fisher_bh,mcnemar_bh,logrank_bh}] [--q Q] [--methods {all}] [--permutations N] [--seed N] [--by KEY] [--max-group-mde FRACTION] [--depth N] --x AXIS [--y AXIS] [--fix KEY=VALUE] [--horizon T] [--theme {dark,light}] [--top-n N] [--forest {auto,always,never}] [--out DIR] [--title TEXT] [--force] [--paired DECL] [--json] [--store PATH] [--plain] [--debug] [RUN ...]
Write a report folder: two runs give the comparison with its heatmap, one run givesits survival report. The folder holds report.md, heatmap.svg and receipt.html. Acomparison is also saved into the store, under .poisson/artifacts/.
positional arguments: RUN A B for a comparison, one RUN for a survival report (default: previous and latest)
options: -h, --help show this help message and exit --event NAME an outcome that counts as the event; repeatable (default: the failures and successes the runs declare, else every outcome present but the most frequent) --method {fisher_bh,mcnemar_bh,logrank_bh} the per-condition test: fisher_bh treats the two runs as separate samples, mcnemar_bh pairs them on their shared seeds, logrank_bh is time to the event (default: mcnemar_bh for runs paired at sweep time, else fisher_bh) --q Q the level of the per-condition flags (false discovery rate) and of the verdict (family-wise) (default: 0.05) --methods {all} add the method comparison table (default: one method; two runs only) --x AXIS required: the config key on the x axis (omitted: lists the axes and events the runs carry; no default) --y AXIS the config key on the y axis (default: none) --fix KEY=VALUE pin a config key to one value; repeatable (default: nothing pinned) --horizon T truncate a survival report at this time (default: the run's own horizon) --theme {dark,light} the report's colours (default: dark) --top-n N worst conditions listed (default: 10) --forest {auto,always,never} single-axis panels as a forest plot: auto, always or never (default: auto) --out DIR the folder to write (default: ./prove-report-A-vs-B, or ./prove-report-RUN) --title TEXT the report's title (default: the runs and the events) --force write into a folder that is not empty --paired DECL a paired-replay declaration whose sweep (A, B) is; folds its sections into the report and writes its files beside it (default: none; two runs only) --json print the comparison and the files written as one JSON document instead of text --store PATH the store folder (default: $POISSON_PROVE_STORE when set, else ./prove-runs) --plain print plain text, as a pipe gets it, on a terminal too (default: pretty on a terminal, plain otherwise) --debug also print the traceback of an unexpected failure
the omnibus over the whole family: --permutations N within-cell permutations behind the omnibus (default: 4000) --seed N the permutation seed (default: 0)
the fault lines under the omnibus: --by KEY the grouping for the fault lines: an axis both runs declare, task_family/task_id/task, or grid (default: resolved in a stated order and named either way) --max-group-mde FRACTION the largest group-level minimum detectable effect you accept (default: 0.200, the constant sweep's --max-mde uses) --depth N levels the procedure tests: 2 stops at the fault lines, 3 adds the cells under each rejecting group (default: 3); the bound is computed from this and the grouping's shape, never from what rejected
examples: poisson-prove report previous latest --x tool_fail_rate --y task_id poisson-prove report latest --x tool_fail_rate --event violatedOptions
Section titled “Options”RUN ...isA Bfor a comparison, one run for its survival report; with none,previousandlatest.--x AXISis required: the axis across the heatmap.--y AXISis the axis down it. Every other axis of the runs must be pinned to one value with--fix KEY=VALUE(repeatable), so each cell of the heatmap is one condition; the refusal names the axis left free.--event NAME,--method,--q Qand--methods allarediff’s: the events, the per-condition test, the false discovery rate of the flags, and the other two methods’ table.--permutations N,--seed N,--by KEY,--max-group-mde FRACTIONand--depth Nset the layered report as they do fordiff(the group-level limit defaults to 0.200, the constant--max-mdeofsweepuses): see The layered report.--horizon Tcuts a survival report at timeT, in the run’st_unit; by default, the run’s own horizon.--themedraws the heatmapdark(the default) orlight;--top-n Nis how many of the worst conditions the report lists (10);--forestdraws a single-axis panel as a forest plot:auto,alwaysornever.--out DIRis the folder to write,./prove-report-A-vs-Bby default (the runs’ names, in lower case with dashes);--title TEXTreplaces the report’s title;--forcewrites into a folder that is not empty.--paired DECLfolds a paired-replay declaration’s sections into a comparison of its two arms and writes its files beside the report; seepaired.--jsonprints the comparison and the files written as one JSON document.--store PATHis the store folder;--plainprints plain text on a terminal too;--debugadds the traceback of an unexpected failure.
Examples
Section titled “Examples”The comparison of the example’s two runs, with the task across and the tool failure rate down:
poisson-prove report --x task_id --y tool_fail_rateOutput8 lines
ok wrote prove-report-mock-agent-2026-10-26-a-vs-mock-agent-2026-10-26-b (3 files) wrote prove-report-mock-agent-2026-10-26-a-vs-mock-agent-2026-10-26-b/report.md wrote prove-report-mock-agent-2026-10-26-a-vs-mock-agent-2026-10-26-b/heatmap.svg wrote prove-report-mock-agent-2026-10-26-a-vs-mock-agent-2026-10-26-b/receipt.html saved comparison ……
next: poisson-prove uiOne run’s survival report on the forbidden fallback, in a folder named for it:
poisson-prove report latest --x task_id --y tool_fail_rate --event violated --out one-runOutput7 lines
ok wrote one-run (3 files) wrote one-run/report.md wrote one-run/heatmap.svg wrote one-run/receipt.html…
next: poisson-prove uiThe same survival report as JSON, for a script, written to its own folder:
poisson-prove report latest --x task_id --y tool_fail_rate --event violated --out one-run-json --jsonOutput9 lines
{ "schema": "poisson-prove.report/1", "verdict": "ok", "out": "one-run-json", "wrote": ["one-run-json/report.md", "one-run-json/heatmap.svg", "one-run-json/receipt.html"], "run_name": "mock-agent 2026-10-26 b", "events": ["violated"] …}With two axes and only --x named, --fix pins the other to one value:
poisson-prove report --x task_id --fix tool_fail_rate=0.55 draws the three tasks at the hardest
tool failure rate.
Without --x, the refusal lists the axes and events the runs carry, and its next line places
every axis:
poisson-prove report # exits 1Output2 lines
error: report requires --x AXIS, which was not given. … next: poisson-prove report --x task_id --y tool_fail_rateA run in which every episode errored has nothing to report: report names it, suggests
inspect of its commonest error with --limit 3, and writes nothing.
Exit codes
Section titled “Exit codes”0: the folder was written.1: refused, and nothing was written: no--x, an axis left free, a folder that is not empty without--force, or any refusal ofdiff.2: the command line is wrong.3: an unexpected failure;--debugprints its traceback.130: interrupted with Ctrl-C.
What it writes
Section titled “What it writes”The report folder: report.md, heatmap.svg and receipt.html, and with --paired the paired
replay’s files beside them. A comparison of two runs is also saved into the store, under
.poisson/artifacts/comparison/, with its charts, and a dashboard the store already has is
refreshed; a survival report of one run saves nothing.