Reproducibility
Seeds everywhere
Every demo and every executed cell on this site fixes its RNG seed. SimulationConfig.seed and InferenceConfig.seed thread a single generator through observation noise and the particle filter respectively, so a given configuration produces the same observations, the same particle trajectories, and the same posterior every time. Rerun any page’s code with the seeds shown and you will get the numbers printed on the page.
Tests
The default suite — uv run pytest — covers the forward model’s physical invariants, the particle filter (convergence, resampling variants, the evidence-vs-direct-computation identity, weight-collapse handling), the noise model, the public API surface, and every animator; two long-running acceptance scans are excluded by default (uv run pytest -m slow runs them). See tests/ for the current inventory; the README deliberately does not quote a test count, because hardcoded counts go stale.
CI
Two workflows run on GitHub Actions:
ci.ymlruns tests and lint on every push tomainand on every pull request.site.ymlre-renders and redeploys this site on every push tomain, so every executed-cell figure you see is regenerated from source at deploy time. The demo GIFs, the density PNG, and the echolocation range-study PNG are the exceptions: they are pre-rendered, committed assets, reproducible on your machine via theuv run demo-*commands (the range-study PNG viauv run scripts/scan_echolocation_range.py --seed-block 300, the certification block the published figure used; see the echolocation page).
Locked dependencies
uv.lock is committed; CI enforces it (--locked in ci.yml, --frozen in the site build). The environment that rendered this page is the environment the lockfile describes, down to the patch version.