Repository navigation
Releases: BetterToBest/compassionism-simulation
Release list
v5.6.0
Released as v5.6.0 (Oct 2026): today's safety net in both runs. The release figures come from a new 500-seed study (engine commit 5bf5bcc) in which both runs, with and without Compassionism, have today's safety net: SNAP (with its work rule for adults aged 18 to 64 with no child under 14, Public Law 119-21), the earned income tax credit and the refundable Child Tax Credit, paid on last year's income. "No program" now means today's US policy, and each change is what Compassionism adds to it. Plain-words report for Duke: dev/reports/v5-34-v56-release.md.
- Compassionism's measured gain moved little: by under one point for adults in every environment and horizon, and by 0.7 to 1.7 points for children; no result changed sign. The Stress Test is where the gain shrinks on every measure (by 0.2 to 0.8 points).
- SNAP's work rule adds almost nothing (at most 0.07 points on the gain); nearly all of the move is the safety net itself.
- SNAP's income limit is no longer read as a tax on all earnings (
SNET.slope): the safety net's marginal rate is the slope of the benefit schedule, not its cliff. - The attribution runs and the US-data check are still v5.3's, with no safety net; the pages say so.
- Each switch is off by default in the engine, and with all three off every figure of v5.5 is reproduced exactly (
guard_test.js,snap_rule_check.js). merge_panel.pyandbacking_chart.pynow keep the run's switches in the merged files' reproduce command.- v5.5.0's notes are in CHANGELOG.md.
v5.5.0
Released as v5.5.0 (Oct 2026): the 500-seed health and sensitivity study on its own page. A new page, study.html, shows the results of the paid 500-seed study (three health systems, three economies, with and without Compassionism) and its sensitivity analysis. No engine line changes and no figure of the v5.4 release changes; the simulation page and findings explorer show the same figures. Plain-words report for Duke: dev/reports/v5-30-s137-results.md.
- Basket poverty under today's system, single payer, and single payer with a private layer, with and without Compassionism, in Reference, Adverse and Stress, with 95% intervals, and the other measures beside it.
- Government's costs in a separate table, with the safety net's outlays labelled as not financed in the model.
- Single payer's range under the Yale preprint's central, cautious and high-cost cases, labelled as depending on a preprint that is not peer reviewed.
- The price channel: the rise in "too little wealth" with Compassionism comes through the model's price response (with prices held flat it falls).
- What the results depend on: Morris screening and the follow-up Sobol run, with the share of the spread each input explains.
- Every number on the page comes from
data/studies/s137.json, written bydev/tools/study_data.pyfromdev/runs/s137/anddev/runs/s137b/;dev/tools/check_figures.jscompares each one with the data. Each table downloads as CSV or JSON. - v5.4.1's notes are in CHANGELOG.md.
v5.4.1
Released as v5.4.1 (Oct 2026): how to read the wealth result. Words only. No figure, row or engine line changes from v5.4, and the panels and release data are v5.4's. Plain-words report for Duke: dev/reports/v5-24-wealth-measure-reading.md; decision: dev/DECISIONS.md, session 1c.
- Why the 20-year wealth gap grew in Reference (+11.0 points against v5.3's +5.5). The v5.4 report and notes now name the cause: mostly the 10% lower pay on return to work. Without that cut the gap is +6.6, with a 20% cut +15.7, and the new PTH and PTF rules move it by less than 0.3 (readings
cut0,cut20,pthbold,ptfs25indev/runs/release-panel.json). - "How to read this measure" (release page, under the Savings result, id
rel-wealth-frame). The note gives Duke Johnson's framing: with the basics guaranteed and work more optional, people need a savings reserve less, and the gain shows in how people live more than in dollars. It cites outside evidence that a guaranteed minimum lowers emergency saving (Hubbard, Skinner and Zeldes, 1995). It states that the model does not include this: the spending share is the same in both runs, no well-being is measured, and the gap comes from prices against unprotected savings and from lower pay after job loss. The verdict line is unchanged. - v5.4's notes are in CHANGELOG.md.
v5.4
Released as v5.4 (Oct 2026): labour and markets. One pull request into main (merging is the release). Plain-words report for Duke: dev/reports/v5-23-v54-release.md; the design note is dev/reports/v5-21-v54-design.md.
- Job loss and re-employment (
EMPL): Current Population Survey flows and spell lengths, unemployment insurance in both runs, a 10% pay cut on return, automation through job loss, 700 occupations. - PTH's balance sheet (
PTHB): homes, mortgage debt, members' and community equity, with an enforced yearly identity; equity growth capped at inflation + 2%; members leave at 6.2% a year. - PTF by sector (
PTFS): food and utilities at the Hub's epsilons, other sectors no cut (swept); members leave at 3.2% a year. - Risk measures (
RISK, reporting only): drawdown, recovery time, re-entry into poverty. - Figures (Reference, 20 years): adult-years below the cost of living 49.2% → 19.6% (−29.6; v5.3: −28.3); too little wealth +11.0 points (v5.3: +5.5), +0.8 at 40 years. Job loss changes the no-programme run too, so compare within a release. The cause of the larger 20-year wealth gap in Reference is not yet isolated.
- Provenance: 500 seeds, engine fe88599 clean, run in 33 pieces (
dev/tools/v54_jobs.sh, merged withdev/tools/merge_parts.py; pieces in BetterToBest/compassionism-sim-results,v54-fe88599/). - v5.3.1's notes are in CHANGELOG.md.
v5.3.1
Released as v5.3.1 (Oct 2026): v5.3's figures, re-released at the complete commit. No figure, page or engine change from v5.3. The release workflow tagged v5.3 at the first commit inside the pull request that set the version, which came before the v5.3 release data was built, so the v5.3 tag and its reproduction archive hold an intermediate tree (v5.3's 500-seed panels with v5.2's release file; REPRODUCE.md without the explore fingerprints). The live page was never affected: main carries the complete release. Tags are never moved, so this version re-releases the same figures, and its tag and archive hold the complete tree.
- The release workflow now tags the commit on
main's own line that first sets a version (git log --first-parent): for a release merged from a pull request, the merge commit, whose tree is the release as published. - The release data says the figures are v5.3's, shown in v5.3.1 (
shownIn), as v5.2's were shown in v5.2.2. - v5.3's notes, with its results, are in CHANGELOG.md.
v5.3
Released as v5.3 (Oct 2026): households and children. One pull request into main (merging is the release). The plain-words reports for Duke are dev/reports/v5-20-restudy.md (the restudy) and dev/reports/v5-19-attribution.md (what each part does), with one report per step (v5-13 to v5-18); every decision is in dev/DECISIONS.md (Sessions 38-39); Duke's answers are d165-d173 on the project dashboard.
What changed for the figures. The adults now live in households with their children, each household starts with the wealth the Federal Reserve's survey shows for its kind of household, people spend less in a year their income is short, and BU buy the Hub's full list. These change the no-programme run as well as the programme, so v5.3's figures are not comparable with earlier releases': compare within a release (the findings explorer keeps each release apart). v5.2's main row, run on the v5.3 engine, is shown beside the main result as a reading and reproduces v5.2's published figures.
What changed in the model
- One engine copy (B1, d166):
harness.jsreads the engine out ofindex.html;port_engine.pyis retired. - Accounting identities as enforced checks (B2,
ACCT): money, Acre Equity, BU, the Source's books and the households' pooling are checked every year of every run; two mistakes found and corrected (PTH_APPR_CONSERVE,SURP_CUT_MARKUP, on in every v5.3 row). - Households and children (B3,
HOUSEHOLDS; d167, d168, d170, d172): Census CPS 2023 composition, MIT family budgets with childcare, a child allowance of a quarter of the adult BU, pooling, decisions taken together, child poverty and household measures. - What BU can buy (B3f,
BU_SCOPE 'hub', d173): the Hub's full list (transport, and childcare for families). - Children's lives and estates (B4, B5; with ageing, a reading): births by the mother's age, children growing up and leaving home, grown children taking places at 25, estates to the partner, else the children (d169).
- Household income shocks (B6, Shore 2010) and the extractive drain measured from payments (EDC; the earlier engine's figure is now labelled a design-target proxy).
- Four calibrations (B7): starting wealth from the 2022 SCF by household type, income-graded spending (BLS CE 2024), earnings by age (BLS CPS, a reading with ageing), the advancement rule read as FBS50.
- The main result (decided by a rule recorded before any restudy run): households and children, pooling, the child allowance at a quarter, the Hub's BU list, survey wealth, graded spending, Shore's shocks and the two corrections. Each choice is undone in turn as a reading.
What changed in the reporting and on the pages
- A fourth headline card: children below the cost of living; a "Families and children" section; "What each part does" now shows what each part adds (the attribution study, B9); a "Run by run" table (how often the programme does better on the same draws, plan item A5); the households' US-data check; the v5.3 readings grouped on the findings explorer; a note that v5.3's figures are not comparable with earlier releases.
- The walk-through video is off the page and out of the README until the simulation is settled (Duke, Oct 7).
What changed in the checks
unit: 197 tests (171 at v5.2.2): the accounting suite, the household suites (composition, budgets, pooling, children's lives, estates, shocks, calibrations, reporting) and the v5.3 panel's shape.domtest: the panel checks accept v5.3's rows; the backing check allows the essentials-demand inflation left at a = 1; the figure check covers the fourth card and each release's own words.dev/runs/engine-lineage.jsonrecords, for each engine change, the proof that the published panels keep their fingerprints.
Results (500 paired seeds, 20 years, main row against no programme)
| Reference | Adverse | Stress Test | |
|---|---|---|---|
| Adult-years below the cost of living | 45.1% → 16.7% | 72.1% → 33.7% | 72.1% → 56.6% |
| Child-years below the cost of living | 72.6% → 29.4% | 91.3% → 51.2% | 91.3% → 76.5% |
| Adult-years below 30 days of basic living (BLEI) | 25.4% → 10.4% | 32.1% → 18.6% | 32.1% → 37.6% |
| Adults with too little wealth at the end | 30.5% → 36.0% | 48.8% → 89.4% | 48.8% → 86.3% |
| Programme inflation a year | 47.9% | 61.5% | 28.5% |
| Cost per adult a year | $31,366 | $29,567 | $12,177 |
The programme lowers income poverty in every run, most of all for children; with the Hub's full BU list few BU expire into project work, so less new output backs the Source's payout, prices rise faster and more adults end with too little wealth than with no programme, in all three environments. With BU buying only food, housing and medical care (a reading), Reference would be 14 points better than no programme on wealth.
At 40 years the Reference wealth result turns in the programme's favour (27.3% → 18.4% of adults with too little wealth; children below the cost of living 62.2% → 22.5%); in Adverse and Stress the model's price rule runs away (89% and 43% a year) and nearly everyone ends with too little wealth with the programme, while income poverty stays lower than with no programme. The full panels, every reading and the attribution are in data/releases/v5.3.json and on the findings explorer.
v5.2.2
Released as v5.2.2 (Oct 2026): audit fixes, no figure changes. One pull request into main (merging is the release). Three outside audits of v5.2.1 (GPT, Grok, Muse; read Oct 6, 2026) found no engine or figure error; this patch fixes the words and couplings they found and adds the documents a stranger needs to replicate the model. The engine (harness.js's release engine and the page's copy) is unchanged and every 500-seed results file is byte-identical to v5.2; the release data file gains derived figures only. The plain-words report for Duke is dev/reports/v5-12-audit-fixes-v5-2-2.md; the round's decisions are in dev/DECISIONS.md (Session 37).
What changed (corrections)
- "Eight runs in ten" (Muse F1). The 10th to 90th percentile band of the price level holds eight runs in ten; the page, the earlier-engine page, README and two internal notes said nine. The page now builds the words from the percentile pair it prints, and the page test derives the expected words from the two numbers it finds (it used to assert the wrong words).
- The replication page's Known Limitations (Muse F2). Eight items still described the model before a later fix (the automation-risk sampler, uniform until v4.3; random-number coupling, fixed in v4.3; the v4.4 headline figures; the wealth update's wage units, fixed in v4.3; conversion without a treasury, settled by the release engine; the PTF cap; per-adult history, settled in v5.2; one-at-a-time sensitivity). Each now states what is true and what remains.
dev/tools/check_stale_claims.js(domtest) fails if any of ten retired claims comes back to a public page. - The wealth line comes from the code (Muse F3).
node harness.js constantswritesdev/runs/constants.json; the release data, the cards' meanings, the US-data table and the page's target table read the $25,000 line fromCFG.POVERTY_LINE; Phase 14 confirms they agree. - Net wealth (Muse note). "Too little wealth" counts net wealth, what someone owns minus what they owe; the cards and the replication page's key concepts said savings. Every release file in the version switcher carries the corrected words (their numbers are unchanged).
- README points to the findings explorer for current results (it pointed to the replication page's Performance Comparison, which holds the earlier engine's figures) and to the new specifications.
What was added
- Paired effects (GPT §21): the replication page now says that every change and its 95% interval are computed on the per-run paired difference. The panels do not store per-run values, so the share of runs in which the programme does better waits for v5.3, which stores them.
- What the Gini estimates (GPT §20): stated on the replication page; the uncorrected Gini of the 500 adults themselves is in the release file as a derived figure beside each published Gini (
derived.giniFinite; 144 catalogue entries). - The Phi step (GPT §18, diagnostic only):
dev/tools/phi_check.jsanddev/reports/v5-11-phi-step.md. At the 70% quality line the conversion rate jumps ×1.62 but what a participant keeps per BU only ×1.27 (Reference), and 0.6% of participant-years sit within 1% of the line (1.4% in the Stress Test). The Hub describes Phi as a tier you qualify for; the threshold stays, its place labelled a modelling assumption. - A specification a stranger can replicate from (GPT §35-36; Grok):
MODEL_SPEC.md(the release model only),TESTBED_SPEC.md(every switch with its status and decision),REPRODUCE.md(the command, file and fingerprint behind every published table;dev/tools/panel_hash.py),ODD.md(the ODD protocol, Grimm et al. 2020, with each parameter's basis). - For outside reviewers:
CITATION.cff; the release workflow attaches a reproduction archive (engine, data, specifications, Node version,package-lock.json, now committed) to each tagged release; threegood first issueissues for open calibration items (#7, #8, #9). - Not in this release (Duke's choice, ledger d171): the CoMSES submission package waits until after v5.3, so it carries households and children.
What changed in the checks
domtest: 125 checks (124 at v5.2.1): the stale-claims check is new; the price-range check derives its words from the percentile pair; Phase 14's meanings check also confirms no amount is typed into a card's meaning and the release file's lines equal the harness's CFG.dev/tools/set_version.pyanddev/tools/check_versions.jscoverCITATION.cff.
Not changed
Every figure, the engine, the main row, the readings, the walk-through video (held until the next model round, d151) and the earlier-engine page's engine.
v5.2.1
Released as v5.2.1 (Oct 2026): the visual suite, presentation only. One pull request into main (merging is the release). Every figure is unchanged from v5.2: the engine (harness.js, the page's ported release engine) is untouched, the two 500-seed panels are byte-identical, and the new check below proves each figure on the pages equals them. Ledger steps s90-s94; decisions d156-d160 (Oct 6), with the round's own decisions in dev/DECISIONS.md (Session 36). The plain-words report for Duke is dev/reports/v5-10-visual-suite.md.
What changed
- One data file per release (decision d156).
dev/tools/release_data.pywritesdata/releases/v5.2.json(the two panels unchanged, the backing-share sweep, the US-data check, a catalogue of headline figures with label, value, unit, environment, horizon, basis and a plain meaning, and the explorer's tables and texts, every number a pointer into the file),data/manifest.json(the list of releases) and the headline numbers into the pages' text, so they show without JavaScript and to search engines. The recipe for the next release isdev/ADDING-A-RELEASE.md. - Extra fields read from the same runs (
dev/tools/explore_export.js;harness.jsunchanged): each year's 10th, 50th and 90th percentile across the 500 runs, savings deciles at Year 7 and the last year, and the 500 adults of run (seed) 1, with and without the programme. The tool checks itself: its yearly means equal the published year-by-year path in every environment and horizon (500 seeds), and the adults' flags add up to the engine's own yearly shares. Files:data/releases/v5.2/. - Earlier releases in the version switcher: v5.0, v5.0.1 and v5.1 were regenerated from their tags (500 seeds, every environment and horizon) and reproduce their published panels exactly (
dev/runs/v521-backfill-check.txt), so they are listed as earlier releases. - The findings explorer (
findings.html, decision d157): three layers (headline cards; a guided read of each result with a chart, "how to read this" and "what it does not show"; every table with CSV and JSON downloads), a version switcher, a sticky section navigation with scroll-spy, and the release, environment, horizon and section in the address. - The simulation page (decision d158): the walk-through and introduction stay at the top; below them, a sticky mini-navigation and one control strip (environment, 20 or 40 years, with or without Compassionism) drive eight guided sections: the answer in ten seconds, meet the adults (one run's 500 adults with a year scrubber and each adult's life path), how poverty moves over time (with the spread across the runs), who gains, what each part does, what it costs and who pays, how sure we are, and run it yourself. The page's own results text, the Hub-target table, the year-by-year charts, the other readings and the downloads are kept, in expanders.
- The replication page: what is being replicated, how to reproduce it and what the tool includes come first; the current findings are a five-line summary with a link to the explorer; the version history is a timeline of collapsed panels with the v5 releases added. The v5.2 tables moved to the explorer; every old anchor stays on the page and leads there. The earlier engine's headline strip (the v4.4 large-N study), which sat at the top under a v5.2 heading, moved into the version history with an honest label (decision recorded).
- Shared components for the compare page:
site/charts.js(hand-written SVG; no new dependency),site/findings.js,site/findings.css; colours checked for colour-blind readers in light and dark; every chart has a text description, a table view and keyboard access; reduced motion is respected.
What changed in the checks
domtest: 124 checks. New Phase 14 (dev/tools/check_figures.js): the manifest and the release files agree; the current release carries the 500-seed panels unchanged; every pointer in every release file leads to a number; the explore files match the published path; every number on the three pages, as served and as rendered (the simulation page in all six views, the explorer for every release), equals the data; no percentage, dollar figure or price level is typed into the new sections; every anchor of v5.2 still exists;release_data.py --checkis clean. The Phase 13 checks that read the replication page's tables and backing-share chart now read the explorer's.dev/tools/set_version.pyanddev/tools/check_versions.jscoverfindings.htmland thesite/files' cache keys.
Not changed
The figures, the engine, the main row, the readings, the walk-through video (its shots show the v5.2 layout; ledger d151 keeps it until the next model round) and the earlier-engine page.
v5.2
Released as v5.2 (Oct 2026): the model round. One pull request into main (merging is the release). The plain-words report for Duke is dev/reports/v5-9-round-v5-2.md; every decision, with the alternatives and the reason, is in dev/DECISIONS.md (Session 35). Duke's answers and decisions for the round (Oct 3, 2026) are at the top of dev/background/ledger-export.md.
What did not change. The main row is the v5.1 release row: nothing the Source pays out is assumed backed by new output, the BU is indexed by the Hub's 5% rule, savings earn no interest, the adults do not age, and the no-programme run is the yardstick. Every new mechanism is a switch, off in the main row, and appears as a labelled reading beside it, compared with no programme under the same switch where the switch is not design-specific. With every switch off the output is bit-identical to v5.1 (--v51; full-output diff of text and JSON, 12 seeds, Reference, Adverse and Stress at 20 years and Reference at 40), checked after each step. No constant was tuned to reach a target. Whether any reading should join the main row was decided at the regeneration (dev/DECISIONS.md, step 9): none does in this release, because the round's rule is that each new mechanism first appears as a reading beside the main row.
What changed in the model (each one a switch and a labelled reading)
- Savings that keep up with prices (step 3;
SAVE, row optionsv). Savings earn the year's price rise plus 0.97% a year (the 2003-2025 mean real yield on 10-year TIPS,sources/tips_real_rate.py), in the programme run and the no-programme run alike. Who pays the interest is not modelled (the model has no bank), and the page says so with its size. - The BU indexed every year (step 3; row option
ci; Duke's answer d147). The Hub's 5% rule stays the main reading. - Adults who age, retire and are replaced (step 4;
AGE, row optionag; decision A). Starting ages from the Census population aged 25-66 (Vintage 2024); deaths from the 2022 US period life table (NCHS; the SSA's own table could not be downloaded from the build environment); a new 25-year-old replaces each death; retirement at 67 on the average Social Security retired-worker benefit, moved with prices. Retirees keep the BU for life, stop ESP work at 67 and can still convert through creative work (decision A); readings without conversion after 67, without any design-specific rule, and with the benefit formula on the adult's own wage. Ageing draws from its own random stream, so the eight draws per adult-year are untouched. - The no-programme run against US data (step 5;
LATENT, row optionlt). Four readings that change a known choice behind a gap with US data, each in both runs and with no new random draw: starting savings from the Federal Reserve's 2022 Survey of Consumer Finances linked to wages (Gaussian copula, 0.3585), automation risk linked to wages (−0.53, the normal-score correlation across Frey and Osborne's occupations; the −0.65 quoted since v4.20 is the plain correlation,sources/fo_risk_wage.py), wages spread as in the survey, and wages centred on the survey's median ($54,698); and all four together. - A middle backing reading (step 6; row option
aK; decision B). New output backs the Source's net payout up to a share of the year's earned income: 12% a year (the Kenya cash-transfer study's two-year rollout, Egger et al. 2022), with a band from 8% (all of the US's underused labour, BLS U-6, 2025) to 16% (Kenya's peak year). The study's limits are named beside it; the headline stays at the cautious end. - Idle workers in normal years (step 6; row option
ml: {nt}). The spending layer reaches idle labour outside recessions: U-6 above its lowest annual level (1.1% of wages), multiplier 0.6 (Ramey and Zubairy 2018); upper bound all of U-6 (8%). - Robustness readings (step 7; decision C). Landlords raising rents when BU pay rent (
HCAP, row optionhc: $0.50 per BU dollar on rent for BU tenants, Collinson and Ganong 2018; $1.41 for every renter outside PTH, Susin 2002); unearned rates in the Collectives' review (REVIEW, row optionrv: 5%, 10% or 20% of conversions above 1×, audits catching half, a design parameter not specified by the Hub, or none; own random stream); the launch gift paid over the run (now read under Source financing too); and two other ways to pay, marked "not specified by the Hub": a progressive income tax (the 2025 federal schedule's shape, scaled each year to raise the cost) and a land-value tax (falling on savings, since the model has no land), each with the Source paying any shortfall and the share it covers reported.
What changed in the reporting
- The Hub's targets, more measures (step 2). The table reads Year 7 and the last year: the share below the US official poverty line ($16,749 for one person, 2025, moved with prices; the Hub's "about 12%" start is the official rate), the same line on resources closer to the Supplemental Poverty Measure, a BLEI figure (both readings), the model's own measures, and three Ginis (income, income counting price cuts, wealth with debts as zero, each against its own Hub number), plus wealth with debts kept for the US comparison. Every Gini carries the small-sample correction n/(n − 1); a reading within 0.002 of a target line is labelled as on the line. A table with every line fixed in dollars sits on the replication page.
- The US-data table (step 5): the no-programme run against Census poverty and income figures (2025), the SCF 2022 and poverty spells in the PSID (Stevens 1994), with each gap and its likely cause.
- Year by year (step 8): the share below the cost of living, median savings in today's dollars and what a month of the median wage and of the BU buys, each year, for no programme, the main row, H1 and the middle reading; and what a month still buys wherever a price rise is quoted.
- The backing-share chart marks the three middle readings at the share of the payout each actually backs.
What changed on the page
- Three year-by-year charts on the front door (inline SVG, no new dependency; their numbers in a table beside them).
- Decision D: the v4.22 engine (settings, presets, charts, the seed-42 run) moved to
earlier-engine.html, linked from the front door as "Explore the earlier engine". Both pages are single files with the same script and styles (dev/tools/sync_earlier.py); thev4.22tag is unchanged. - The front door and the earlier-engine page do not scroll sideways at 390 px; the replication page's wide tables now scroll inside their own box.
- The walk-through has two new chapters ("Year by year" and "Readings beside the main result") and new shots for the US-data table and the earlier engine's page.
What changed in the checks
unit: 171 tests (146 at v5.1).v52UnitSuite(25) covers each mechanism: switch off equals the release row on every key, the mechanism moves results the expected way, and no mechanism adds a random draw to the main stream. The feature-matrix test adds ageing, the US-data readings, housing capture and the review, and checks that only ageing rows draw from the demographic stream and only review rows from the review stream.domtest: 113 checks (112 at v5.1). Phases 1-9 now test the earlier engine on its own page; new checks cover the Hub-target table, the "on the line" rule for every Gini, the CSV columns, decision D (the link, the back link, the shared script) and the year-by-year charts.dev/tools/check_versions.jsanddev/tools/set_version.pycoverearlier-engine.html;node dev/tools/sync_earlier.py --checkconfirms the two pages share their script.
Results (500 paired seeds, main row against no programme)
The main row is unchanged from v5.1. In all six panels every figure of the main row and of the readings v5.1 already showed is identical, except the Ginis, which now carry the small-sample correction (×500/499); the backing-share sweep is identical too. Main row against no programme (share of adult-years below the cost of living; share with too little wealth at the end; share of adult-years below 30 days of basic living, the BLEI paper's definition; the programme's inflation a year; cost per adult a year):
| Environment, years | Below the cost of living | Too little wealth | Below 30 days (BLEI) | Inflation | Cost |
|---|---|---|---|---|---|
| Reference, 20 | 22.0% vs 55.2% | 35.7% vs 52.0% | 18.7% vs 46.7% | 34.9% | $29,618 |
| Adverse, 20 | 42.1% vs 78.2% | 87.1% vs 82.6% | 33.1% vs 60.0% | 45.5% | $27,677 |
| Stress Test, 20 | 65.6% vs 78.2% | 90.6% vs 82.6% | 54.9% vs 60.0% | 23.8% | $10,494 |
| Reference, 40 | 15.3% vs 47.4% | 15.3% vs 44.2% | 14.8% vs 46.6% | 30.4% | $32,274 |
| Adverse, 40 | 62.1% vs 86.7% | 97.9% vs 94.5% | 51.7% vs 75.1% | 65.4% | $27,013 |
| Stress Test, 40 | 79.3% vs 86.7% | 98.8% vs 94.5% | 72.3% vs 75.1% | 36.4% | $10,685 |
Against the Hub's targets (step 2), main row against no programme. Below the US official poverty line at Year 7: 2.8% vs 3.0% (Reference), 4.6% vs 5.9% (Adverse), 6.3% vs 5.9% (Stress Test); at year 20: 0.7% vs 1.6%, 24.1% vs 48.9%, 40.5% vs 48.9%; at year 40: 0.2% vs 0.6%, 73.3% vs 78.9%, 77.8% vs 78.9%. Only Reference reaches the Hub's "under 2%" on this measure, and the model's adults (working-age earners living alone) start far below the US's 10.2%. Below 30 days of basic living at Year 7: 21.4%, 25.8% and 46.4% (no programme 47.9%, 54.4%, 54.4%). The income Gini at Year 7 is 0.307, 0.315 and 0.299 (no programme about 0.28; the Hub's 0.25 to 0.30, from 0.48), and counting price cuts 0.256, 0.258 and 0.276; the wealth Gini at Year 7 is 0.558, 0.593 and 0.702 (no programme 0.727 to 0.763; the BLEI paper's 0.25). Two readings sit on a target line and are labelled so: the Adverse income Gini counting price cuts at year 20 (0.2500) and the Stress Test income Gini at Year 7 (0.2986).
**The new readings (change in the share wit...
v5.1
Released as v5.1 (Oct 3, 2026): the mechanics release from the external audit pass. Delivered as a pull request into main (merging is the release); it follows v5.0.1 (the text, version-label and test fixes from the same audit), which is a separate pull request. The plain-words report for Duke is dev/reports/v5-8-audit-fixes-and-v5-1.md; every decision is in dev/DECISIONS.md (Session 34).
What changed in the model
V5-02: the framework BLEI gate reads this year's BU. runYear called the gate that decides the wage-growth bonus before writing this year's a._fwBUm, so from year 1 it read last year's value (73% of framework agent-years differ in the release rows). Fixed behind a switch (GATE_CURRENT; row option gc; on in REL_V5 and in every row of the release panel, including the two former readings, so each comparison differs only by the named change). Off: full-output diffs against v5.0 identical (12 seeds, three environments at 20 years and Reference at 40; JSON byte-identical). On: the hoisted value equals the engine's later assignment in about 4.9 million framework agent-years, 0 mismatches. At 500 seeds it lowers the design-neutral BLEI poverty reading by 0.9, 1.8 and 0.3 points over 20 years (Reference, Adverse, Stress Test) and 0.7, 2.0 and 0.2 over 40; every other headline figure moves by 0.1 point or less.
| Environment, years | Design-neutral reading before | after |
|---|---|---|
| Reference, 20 years | 22.1% | 21.2% (−0.9 points) |
| Adverse, 20 years | 40.3% | 38.5% (−1.8 points) |
| Stress Test, 20 years | 56.9% | 56.6% (−0.3 points) |
| Reference, 40 years | 17.1% | 16.4% (−0.7 points) |
| Adverse, 40 years | 63.1% | 61.1% (−2.0 points) |
| Stress Test, 40 years | 75.1% | 74.9% (−0.2 points) |
What changed in the reporting
- Price level (F3). The exported panels carry the mean, the median over seeds (
pLevEndMed) and the 10th and 90th percentiles; the keypLev20is gone from the export (the engine keeps it internally). The front door gives the typical run and its range, and above 1,000 times today's says the price rule runs away, a limit of the model and not a forecast; the replication page carries the exact figures. - The Hub's targets (E1). Gini (
giniD,giniX) and extreme poverty (epPY) are in the panel rows; the front door and the replication page set the Hub's Year 7 targets (poverty under 2%, Gini 0.25 to 0.30; Integrated Implementation Roadmap) beside the results, with the caveats that change how they read. No poverty measure comes near 2%; the model's no-programme Gini is already below the Hub's 0.48 start. One reading, the Adverse Environment's Gini counting price cuts at 20 years (0.2495), is on the 0.25 line and is labelled so; the small-sample correction is still not applied (see "Gini small-sample bias" above). - Provenance manifest (E5, V5-08). Each panel's
_meta.manifest: commit, clean-tree flag, SHA-256 ofharness.js, of the page's ported engine and ofindex.htmlwith the panels blanked, and the Node version.domtestchecks that the engine hash equals the page's, that the panels come from one clean commit, and (where the commit is present) thatharness.jsat it hashes to the recorded value. - The backing-share curve (E2). One static chart on the replication page: the change in wealth poverty against no programme and the programme's inflation, at 0, 0.25, 0.5, 0.75 and 1 of the Source's payout backed by new output, 500 paired seeds per environment. The end points are the release and H1 rows exactly. Finding: in the Adverse and Stress environments the curve bends at the right end because the model indexes the BU to prices only above 5% a year (the Hub's Inflation Surge Protocol) and outside inflation is 2%: fully backed, the BU is never indexed and loses real value. With the BU indexed every year the fully backed Adverse Environment gives wealth poverty 31.8% (52.5% as modelled) and cost-of-living poverty 33.0% (48.9%);
dev/tools/cola_check.js. So H1 is held back by that rule there; the page says so. - Front door: deep links (
?env=adv&years=40, E4), CSV and JSON download of the view with the version, command and manifest (E3), and the optimistic-end sentence points to the chart.
What changed in the checks
- Parity (V5-04). The page-versus-harness check now runs the no-programme baseline and all eleven readings (154 measures each) in three environments at 20 and 40 years, and compares every top-level name the two share (170: 85 values, 85 functions). Allow-listed differences, each with its reason and required to still be present:
CFG(two display-only poverty-line keys),TIERS(colours and classes), and three functions found beyond the audit's count, none of which enters the release run (getTier,drawAutomationRisk,incomeBasketMetrics). Shown to fail on three deliberate breaks of a page copy. - Feature matrix (V5-05).
matrixUnitSuite: the framework model alone, then with project hiring, ESP payroll, the other framework modules, the price module, price and labour, and every module together (the twelve release rows): deterministic, finite, the BU, ESP and testbed identities hold, exactly 8 random draws per agent-year with no module changing the count, no dependence between rows, no switch left changed. Shown to fail on three injected faults. - Counts that cannot drift (E6). The numbers of
unittests (146) anddomtestchecks (112) quoted in README.md and CONTRIBUTING.md are checked by the tests themselves;--write-countsrefreshes them.
How the figures were made
All from commit 6c68ad9 with a clean tree, Node v22, one process per environment and horizon, paired seeds 1-500: node harness.js testbed 500 release ENV --json=dev/runs/release-panel-ENV.json and the same with --years=40 (release-panel-40-ENV.json), logs dev/runs/v51-release-500-ENV.txt and v51-release40-500-ENV.txt, merged by python3 dev/tools/merge_panel.py (and 40) and written to the replication page by python3 dev/tools/release_figs.py. The backing-share runs: node harness.js testbed 500 backing ENV --json=dev/runs/backing-share-ENV.json (commit b0bcc0d), merged by python3 dev/tools/backing_chart.py. The indexing check: node dev/tools/cola_check.js adv and st. The walk-through was rebuilt with python3 walkthrough/make_walkthrough.py (it reads its figures from the page, so the narration was regenerated).