nullbench
Pre-register decisions. Score them against chance.
Lab / alpha — local seals under M1; not a global notary.
Product gate: without a green M1 gate, do not claim absolute「可稽核」or「永不 backfill」.
See docs/MATURITY.md.
nullbench is a null-first decision evaluation lab: freeze choices before outcomes, settle against equal-cost chance portfolios, keep an append-only ledger with semantic seals, and report descriptive percentiles plus sequential diagnostics.
It is not a lottery predictor. Negative expected-value domains are welcome as methodology stress tests.
Maturity (M0 → M4)
| Level | Meaning |
|---|---|
| M0 | Lab CLI / demo / PyPI alpha — shipping |
| M1 | Sealed ExperimentSpec + pin hashes + settle verify + claim lint + adversarial IC-01…08 — must-pass |
| M2 | PRD + Threat Model + Public API + Claim Policy frozen |
| M3 | OIDC trusted publish / SBOM / plugin allowlist |
| M4 | Remote sealed study / vault |
nullbench maturity
nullbench maturity --check-m1 # pytest -m m1
Install
pip install nullbench
# from source (needed for maturity --check-m1 tests)
pip install -e ".[dev]"
Python 3.11+.
60-second start
nullbench doctor
nullbench demo --name try1
nullbench report --study try1 --open
nullbench next --study try1
nullbench maturity --check-m1
Golden path
nullbench init my-study -d demo649
nullbench strategy add random --study my-study --tickets 5 --seed 1
nullbench freeze --study my-study --latest
nullbench settle --study my-study
nullbench report --study my-study --open
What M1 seals (local)
| Seal | Purpose |
|---|---|
experiment_hash |
Spec cannot silently change after freeze |
content_hash |
Tickets + seals bound |
history_hash / outcome_hash |
Draw history / known outcome pinned |
| Tip + semantic audit | Forged payouts fail even if chain re-linked |
| Claim lint | Report text scanned for promotional language |
Residual risk: an adversary who rewrites all seals consistently still wins until M4. Documented in docs/THREAT_MODEL.md.
Commands
| Command | Purpose |
|---|---|
maturity |
Ladder + optional M1 gate |
doctor |
Env + chain + semantic |
next / periods |
Coach / navigation |
demo / init / strategy / freeze / settle / report |
Core loop |
formal |
α-spending 26/52 (before freeze) |
ingest / coverage |
Taiwan data / OR-Tools extra |
domains -v / strategies -v |
Discovery (plugins need NULLBENCH_TRUST_PLUGINS=1) |
Docs
- MATURITY.md · INTEGRITY.md
- PRD.md · THREAT_MODEL.md · CLAIM_POLICY.md (M2 drafts)
- ARCHITECTURE.md · PRODUCT.md · CHANGELOG.md
Ethics
Pure simulation. No betting integration. Do not market predicted numbers.
License
MIT
Metadata
Release files for nullbench 0.6.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| nullbench-0.6.0.tar.gz | 60.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| nullbench-0.6.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 121.2 kB
Release files / nullbench-0.6.0.tar.gz
| Download URL | nullbench-0.6.0.tar.gz |
|---|---|
| Size | 60.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
76e8f485fec10ba95c23a570e1d6f5160ed32c7967243437ea06d18f843714a6
|
|
BLAKE2b-256 checksum How to use checksums |
f6fe4428c100fd8102e8364899bf00c64a3df33fa612fb8ab20d891040093879
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.9
|
Release files / nullbench-0.6.0-py3-none-any.whl
| Download URL | nullbench-0.6.0-py3-none-any.whl |
|---|---|
| Size | 60.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6c2151b6280e6dd9d835964105d99638f37131886a3b95e5957f74046f4c5101
|
|
BLAKE2b-256 checksum How to use checksums |
b33ae8c2e05b1d74f885de509bb8bddd990566f128b3eb85a2bc09b707f0fbf7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.9
|