The Citizens Standard · The methodology
Audio overview
A guided walk through the whole framework.
Every load-bearing number ties to a script that computes it, and every empirical claim runs on real, public data. This page maps each claim to its code.
The rest of this page explains how the replication layer is built and what it did and didn't establish. But you don't have to take any of it on trust — start here.
Real CPython, compiled to WebAssembly, running the actual replication code in this tab. It fetches a package's own scripts, runs them, and checks every number against the values the paper published. Nothing is precomputed — if the code stops reproducing the paper, this page says so.
Give it a moment — some take 20+ seconds.
What a pass means. Expected values come from each package's published artifact
(all_results.txt / results/*.json) — the numbers the papers cite — not from
this run. A pass means every one of them was reproduced to a relative tolerance of 1e-6. Figures are
drawn by the code as it runs; none are stored.
Prefer to run it locally? git clone the repo, then
cd replication && python run_all.py — that covers the full suite and takes a few
minutes. Add --report for an HTML report with every figure.
The replication layer does two distinct jobs, and we label which is which so you are never left guessing whether a number is internally consistent or externally tested.
Code that reproduces a published figure straight from the framework’s own engine and spec. It proves the paper is internally consistent: the number it prints is the number the model actually yields.
A module that takes a contested claim out to real external data, or sweeps an uncertain parameter across its plausible range. It proves robustness, and in several cases it honestly qualifies the claim.
Across the paper series there are dedicated replication packages, each with a run_all that executes end to end. Everything is plain Python on public data, no API key, no private series.
One map, every package. Each names the claims it backs, the file that computes or tests them, and whether the backing is verification or a stress-test. Most packages reproduce a paper’s published figures; one is the stress-test hub that takes contested claims out to real external data.
code/run_all.py (19/19 checks)code/cs_engine.pycode/ deterministic engine (historical CSV)code/mc_engine.pycode/verify_proposition_4.py … 9.pycode/recompute_illustrations.pycode/injection_topology.pyliquidation_flow_replication/code/run_all.py (181/181 values)code/paper6_model.py (run_all)code/paper6_model.py (B2)code/equa_stress.pycode/cs_engine.pycode/verify_psi_plateau.pycode/verify_prop*.pycode/appendix_A2_debt_trajectory.pycode/phase_milestones.pysrc/compare.py, scenario_lvt_hybrid/lvt_hybrid.pycrisis_behaviour_replication/ + procyclicality/src/run_divisia_horserace.py, run_composition_horserace.pysrc/ (robustness, Test A)src/channels.py; results/inequality_results.jsonanchor_real_shocks/, procyclicality/, capture_override_baserate/transition_debt_path/, credit_displacement/, dsge_twocircuit/, structural_buyer_endgame/, mode_choice_welfare/rent_capitalization/, mpc_demand_impulse/, crowdout_split/capture_override_baserate/). For the exhaustive map, every figure in every paper down to its file, see the full claim-to-code index.The stress tests did not just confirm. In a few places they pushed back on the framework’s own first-pass claims, and the honest move is to lead with those rather than bury them. None of these sink the architecture; each one makes a specific number more truthful.
Paper 3 (Transition). The debt-to-GDP decline is real, but tested against current fiscal data the timeline leans fast. Most of the fall comes from nominal growth expanding the denominator, with the transition mode an assist rather than the main agent retiring the debt.
Paper 5 (Macro Model). Getting neutrality from displacement alone would require roughly 73 to 89 percent of new issuance to displace bank credit; the literature supports only partial displacement. So neutrality is argued on other grounds, and the package says so instead of leaning on a mechanism that cannot carry the weight.
Paper 8 (Structural Buyer). The structural buyer’s long-run ownership share is real and bounded, with a central estimate near 11 percent, but it is sensitive to holding-duration assumptions across roughly a 6 to 21 percent band. We report it as a range.
Paper 6 (Full-Reserve Banking). The model sizes the credit-supply gap full-reserve banking would remove (on the order of 3.3 percent of GDP per year). Whether less credit and less boom-bust is net-desirable is a value judgment the paper flags as open, not something the code can settle.
Paper 1 (Architecture). We went looking for an optimal split between the locked floor and the cash dividend and did not find one: welfare moves monotonically with the dividend dial, with no interior peak. So which mode a polity runs is a values choice it makes for itself, not a number we can solve for. We report the null result rather than manufacture a sweet spot.
The browser now runs every package — Paper 10 was the last holdout, and only because it needed statsmodels, which cannot be installed in a browser. It is now backed by a pure-numpy equivalent that reproduces statsmodels to machine precision. To run the suite against the real statsmodels — which remains the source of truth — clone it:
git clone https://github.com/Neo-Solon/Citizens-Standard
cd Citizens-Standard/replication
python run_all.py # full suite, pass/fail table
python run_all.py --report # + an HTML report with every figure
Each package has its own run_all and a README stating its data sources and what it checks. Swap in your own assumptions and watch the figures move; that is the point.
Rigor you can run beats rigor you have to trust. That is the whole answer to “how do I know these numbers aren’t made up” — you don’t have to know, you can check. Here is the whole suite, and the papers it backs.
Download the replication suite →Prefer the writeups first? The papers and data page has the full series, free to read, each linked to the code above. The full claim-to-code index lives in the replication folder.