SYSTEM

Compassionism

The overarching framework developed by Duke Johnson, integrating five coordinated economic and governance architectures into a single system designed to structurally eliminate poverty while preserving market incentives and democratic governance.

CCO

Creative Currency Octaves

A dual-currency economic layer. Citizens opt in to receive Basic Units (BU) — a monthly allocation (~$1,200/adult) redeemable at PTF businesses for essential goods. Businesses that accept BU convert them to primary currency at merit-scaled rates (1×–9×), rewarding quality and community contribution.

BU

Basic Units

The community currency issued by the CCO system. Each BU is pegged 1:1 to the primary currency but redeemable at PTF establishments at below-market prices — generating a purchasing power premium (ε) of 2.64× for food and 1.80× for utilities. BU expire monthly, ensuring they circulate toward genuine need.

PTF

Public Trust Foundations

Community-owned, democratically governed businesses that accept Basic Units and operate on a not-for-profit model. By eliminating shareholder profit extraction, PTF establishments achieve 40–60% internal overhead reductions (analogous to Mondragon's cooperative model) — a business-economics figure, distinct from the 12–16% consumer-facing cost reduction (PTF_savings_rate in CFG) the simulation itself applies; see Mathematical Framework §2. PTF is modelled as a cost-reduction mechanism for essential goods, not as a wealth-addition channel.

PTH

Public Trust Housing

Community-owned residential housing in which monthly payments ($600/month at base case) accrue entirely to the resident's Acre Equity account rather than being lost to market rent or mortgage interest. Rent savings and Acre Equity appreciation are tracked separately to prevent double-counting.

AE

Acre Equity

The cumulative community equity built by PTH residents through their monthly payments, appreciating at approximately 4% per year. Unlike conventional home equity, Acre Equity is accessible at exit only in part — a liquidity haircut whose accessible share rises with tenure, from ~10–20% in the first six months to ~80–90% at five or more years (v4.5; flat 50% regardless of tenure through v4.4).

SZH

Social Zone Harmonization

The spatial governance layer that organizes the geographic deployment of PTF businesses and PTH communities within designated zones. SZH governs network density thresholds — the minimum PTF merchant participation needed to activate cooperative synergy effects (θ), which require at least 55% zone participation before activating.

CIP

Citizens Internet Portal

A privacy-first digital governance platform that administers CCO currency operations — conversion, distribution, merit assessment — and manages democratic voting for PTH and PTF decisions. CIP provides the transparent institutional layer that prevents elite capture and validates the system's democratic legitimacy.

BLEI

Basic Living Economic Index

The primary welfare metric in this framework. BLEI expresses how many days of basic living a household's accessible resources cover — a temporal stability measure. Three components: cashDays (liquid savings buffer), incomeDays (income flow buffer), benefitDays (BU food basket). Income buffer uses actual wage, not wealth proxy. See the BLEI Foundation Paper for full accounting convention.

EDC

Extractive Drain Coefficient

The fraction of gross income captured by financial contracts that build zero household wealth — rent, mortgage interest, consumer debt interest, predatory fees. PTH payments have EDC = 0.00 (fully generative). PTF participation reduces the cost base directly, lowering effective EDC.

FBS

Financial Bandwidth Score

Monthly residual resources above the basic living threshold. Grounded in Mullainathan & Shafir's (2013) scarcity cognition research: without positive FBS, cognitive bandwidth is consumed by immediate survival, making advancement structurally impossible regardless of individual capability. FBS uses EDC_residual (consumer debt only) to avoid double-counting housing costs in C_basic.

EPPM

Effective Purchasing Power Multiplier

A dimensionless ratio expressing effective purchasing power of a CCO-PTF household relative to a baseline household at the same nominal income. EPPM uses full BU·ε_blended = $2,502 (food + utility BU value) because it measures total purchasing power advantage versus market provision. At the poverty line, EPPM = 5.80×.

CSI

Compound Stability Index

A forward-looking projection of BLEI trajectory over time, compounding initial stability by net wealth growth rate adjusted for extractive drain, plus accumulated Acre Equity. W_accessible (which initializes BLEI) excludes AE entirely; r_wealth and r_a evolve independently to prevent double-counting.

IPBI

Indirect Participant Benefit Index

Estimated annual welfare gains accruing to high-wealth households who do not directly participate in CCO-PTF, estimated at $22,800–$59,900 per year. Channel weights use distinct notation (α, β, π, δ, ζ) to avoid symbol conflict with the BLEI liquidity coefficient γ.

These terms are formally defined and mathematically specified in the BLEI Foundation Paper, including Appendix A (Symbol Table) and Appendix B (Worked Numerical Example). The full Compassionism system architecture is documented in the Executive Summary & Research Index.
🖥️ Interactive Simulation (v4.14): BetterToBest.github.io/compassionism-simulation/  ·  All 5 architectures  ·  BLEI-calibrated  ·  Annual expense system  ·  AI automation  ·  50× Monte Carlo 95% CI  ·  Participant & Social Security-anchored stratification  ·  Computed OAT sensitivity  ·  Latin Hypercube sensitivity export  ·  6-check validation suite  ·  JSON export  ·  Shareable parameter URLs  ·  ODD protocol  ·  MC cancel control  ·  DOI: 10.17605/OSF.IO/QWTE2  ·  Runs in any browser
5,000-seed large-N study per scenario  |  BLEI six-tier Flourishing/Comfortable classification  |  EDC-adjusted wealth tracking  |  Alaska PFD · CLT · Mondragon analogue-calibrated parameters
87.5%
BLEI Threshold Rate
(≥ 30 days, N=5,000, v4.4)
78.6%
Secure Rate
(≥ 365 days, N=5,000, v4.4)
0.52
EDC-Adjusted Gini
(full deployment, N=5,000, v4.4)
$82.0K→$526.1K
Legacy Target vs. Measured Median Wealth
(20yr, N=5,000, v4.4; see note — target predates v4.3's unit fix; v4.5's PTH haircut change moves this up a further ~0.6%, not yet re-run at N=5,000, see Version History)
88.6%
System Stability
(structural metric; N=5,000, v4.4; see note)
~3.0 yr
Near-Poverty Cohort → Stable Tier
(N=5,000, v4.4; was ~13.2 yr pre-v4.3; see note)
~13.0 yr
Cohort → Flourishing, Within 20yr Horizon
(N=5,000, v4.4; was NOT reached even by yr 40 pre-v4.3; see note)
Methodology Overview

This replication framework operationalizes the BLEI welfare measurement suite as a computational agent-based simulation. It is a calibrated institutional simulation architecture — not a conventional econometric study — designed to identify optimal system parameters and test framework behavior across thousands of parameter draws. Key parameters (ε, r_a, BU allocation) are grounded in three deployed real-world analogues: the Alaska Permanent Fund Dividend, Community Land Trusts across 46 US states, and Mondragon Corporation.

The BU purchasing power accounting convention distinguishes food BU contributions to BLEI ($990/adult/month, food excluded from C_basic) from utility BU contributions (offset cash utility cost in C_basic; full value captured in EPPM). The v3.0/3.1 simulation implements an annual expense system where agents pay living costs each year — creating realistic wealth depletion under baseline conditions — and models PTF as a cost-reduction mechanism rather than a direct wealth injection.

Step 1 — BLEI-Initialized Agents with Expense Dynamics

Agents initialized with BLEI, EDC, FBS, and Acre Equity state variables drawn from calibrated US wealth and housing distributions. PTH payments route to Acre Equity from initialization. v3.1 addition: each agent is assigned a heterogeneous automationRisk ∈ [0.2, 1.0] governing their individual exposure to AI labour displacement. Agents can accumulate debt to a floor of −$10,000 (v3.1), replacing the earlier $0/$100 hard floor that eliminated insolvency dynamics.

† As of v4.0: the initial $5,000 Acre Equity endowment appreciates as before, and a documented 25% share of each year's PTH housing-cost saving now also routes into Acre Equity (the "payments build equity" mechanism this step describes). v4.5: the liquidity haircut on withdrawal is no longer a flat 50% — it now follows the tenure-cohort schedule sketched in the Empirical Calibration notes (≈15% at tenure=1, linearly rising to ≈85% at tenure≥5, the midpoints of the paper's cited ≈10–20%-at-6-months / ≈80–90%-at-5+-years range; the paper gives two anchor points, not a closed-form curve, so the ramp between them is a documented interpretation, not a re-derivation). Flat 50% was used through v4.4.

Step 2 — Extraction-Accurate Dynamics with Annual Costs

Annual wealth updates subtract living costs from wage income and CCO conversion gains. PTF is modelled as a cost-reduction factor (12–16% reduction in annual living costs), not as a wealth-addition channel — correcting the ex nihilo money creation in earlier versions. PTH rent savings and Acre Equity appreciation are tracked in separate accounting categories — removing double-counting. FBS uses EDC_residual (consumer debt only) to avoid double-counting housing costs already in C_basic.

Step 3 — FBS-Gated Advancement

Octave advancement probability is gated by Financial Bandwidth Score. P(advance) = 1 − exp(−λ × FBS). Agents at FBS = 0 cannot advance regardless of quality score. This reflects Mullainathan & Shafir's (2013) cognitive bandwidth research. γ transitions from 0.12 (entry) to 0.20 (CCO-established) as the guaranteed BU floor matures. v3.1: PTF members join dynamically over time via economic distress and social diffusion, not only at initialisation. (v4.4: FBS's wage-derived income term moved onto the same real-dollar anchor the main wealth loop uses, with λ rescaled by the same known ratio to preserve the gate's original sensitivity — see Version History.)

Step 4 — Network-Density Synergy & Inflation

Synergy coefficient θ activates only above 55% PTF merchant participation within a SZH zone, scaling linearly to 0.25 at 90%+ density. v3.1 inflation mechanism: annual costs compound at a configurable rate (0–6%). PTF presence dampens effective inflation (community pricing stability); PTH dampens housing-component inflation. The US Baseline scenario applies 3% annual inflation to reflect historic CPI. Compassionism scenarios default to 0% — the price-stability hypothesis of cooperative essential goods provision.

Step 5 — Recession Model (Population-Level)

v3.1 update: Recessions are modelled as population-level events with 10% annual probability, persisting 1–3 years (corrected v4.1 — previously stated as 2–4 years here, a stale figure that predated the v3.3 distribution change; see v4.1 note above). v3.3 calibration: incomeMultiplier is now drawn from a beta(5,2) distribution over [0.70, 0.95], yielding a mode of 0.90 (10% income loss) with a realistic tail extending to 0.70 (30% loss). This replaces the v3.1 uniform distribution over [0.65, 0.85], which overstated the frequency of severe recessions relative to NBER post-WWII data.

Step 6 — EDC-Adjusted Gini & BLEI Poverty

Gini reported on extraction-adjusted net wealth: W_net = W_nominal − (EDC × Y × 12). This corrects the standard Gini's blindness to the direction of financial flows. v3.1 addition: BLEI poverty (% of agents with BLEI < 30 days = Crisis+Precarious tier) is tracked and displayed as a theoretically grounded alternative to wealth poverty — a retiree with $24K savings and an $80K pension incorrectly registers as wealth-poor but correctly registers as BLEI-stable. BLEI poverty is the primary poverty indicator in v3.3. (v4.4: Y here now resolves via the same real-dollar wage anchor the main wealth loop uses, not the older approximation this formula previously relied on — see Mathematical Framework §5 and Version History.)

Recent release highlights (newest first)
v4.14 update (Sep 2026): a two-pass external ChatGPT audit — a general review, then a second pass focused exclusively on the economic mathematics and causal structure of runYear(). That second pass found what seven prior audits and this project's own six-check validation suite had all missed: two genuine mechanics bugs, not documentation drift. (1) The "BU expiry (months)" slider spans 1–6 in the UI but the code (decay=p.expiry<2?0:0.7) only ever implements two behaviours — expiry=1, and everything else identically. Confirmed directly: expiry=3 and expiry=6 produced bit-identical output before the fix. Replaced with a continuous decay=1-1/expiry. (2) PTF's inflation-damping term used the static initial-adoption slider where it should have used the population's actual current membership — a quantity this exact function already computed, three lines later, for an unrelated purpose, and simply never reused. Fixed by reordering and reusing it. Both fixes are proven to have zero effect on every documented figure in this project — the seed-42/Full Integration/20yr regression is bit-identical, confirmed three independent ways, so none of the headline KPI figures on this page needed to change this release. Effect size where the fixes DO apply (Stress Test preset, and the one validation check that exercises the affected line) is measured and reported in full in CONTRIBUTING.md. Also this release: a new in-app Wealth Floor Diagnostic KPI (share of the population pinned at the wealth floor, a same-run companion to the existing offline sensitivity sweep); EDC-adjusted Gini reframed explicitly as a constructed stock-minus-flow inequality index rather than conventional net worth; a dual-cost-anchor clarification table; and explicit documentation, in the ODD panel and inline in the engine itself, of the CCO/PTH feedback loops through FBS and octave advancement that the audit's causal-structure review identified — a headline "CCO effect" is a compound of several coupled mechanisms, not one isolated channel. Several of the audit's other findings restated substantial existing documentation (the stock-flow accounting gap, FBS λ calibration status, the already-explicit ODD Level 1–5 validation hierarchy) or proposed large architectural changes (a full flow-of-funds ledger, monthly BU tranches, causal pathway decomposition, source modularization — the last already rejected once before, at v4.7, for the same reason) logged for future consideration rather than attempted this pass. Full notes in CONTRIBUTING.md's v4.14 Release Notes.
v4.13 update (Sep 2026): an independent audit pass, and the first release in this project's history to find defects by running the interactive tool rather than reading it. Two live UI defects, both invisible to code review: (1) opening the simulation through a shared "Copy parameters as URL" link silently stripped the tooltip class from all five preset buttons, disabling their hover descriptions for the whole session — the identical bug v4.5's notes record catching in a neighbouring function, introduced in the same release in the one code path no audit since had exercised; (2) the parameter-sensitivity panel appended a duplicate tip box on every run, leaving N stacked copies after N simulations. Both were reproduced in a headless DOM (jsdom) before being fixed and are now covered by automated DOM checks — this closes the standing "not verified in an actual browser" caveat that every UI change since v4.8 has had to carry, at least for DOM behaviour (CSS layout and Chart.js pixel output still need a human look). A metric reporting a perfect score where it had no data: System Stability took its coefficient of variation over a window floored at one data point, so every 5–7 year run — the slider's own minimum is 5 — returned exactly 0.99, its clamp ceiling, regardless of the trajectory. Fixed; a sweep confirms runs of 8+ years, including every preset and the 20-year regression baseline, are bit-identical. Stale comments inside the engine: v4.12 corrected the ODD and Empirical Calibration panels for describing retired mechanics as current; the same staleness sat inside runYear() itself the whole time (claims that SIM_COST_SCALE is still load-bearing, that Yusd uses the retired SIU_TO_USD, that FBS "doesn't feed back into wealth" when v4.4's own notes explain that it does). All corrected. Two reporting additions: Cumulative Poverty Exposure — the mean years an agent spends below each poverty line across the whole run, answering the "final-year snapshot only" gap the v4.12 audit raised (at the reference configuration the final-year wealth-poverty rate is 16.6%, but the average agent spends 4.8 of 20 years below that line, against the Baseline's 11.8) — and the v4.12 dominance check, previously screen-only, now exported to CSV/JSON with its view and grid resolution, plus an on-page caveat that it is checked at plotted thresholds only and describes one stochastic run rather than a confidence interval. No simulation-mechanics changes. Full notes in CONTRIBUTING.md's v4.13 Release Notes.
v4.12 update (Sep 2026): a documentation-and-verification pass prompted by a Perplexity AI audit of the shipped simulation, plus one small feature addition — no simulation-mechanics changes. Every checkable claim in the audit was verified against source or by direct computation before anything was acted on, this project's standing practice. One real documentation bug found and fixed: the interactive tool's own in-app note on the v4.6 PTF adoption cap cited 23.8% as the seed-42 capped result, inconsistent with this document's own account of the same feature (19.0%) — a Node.js harness reproduction this session settled it in CONTRIBUTING.md's favor: 19.0% is correct (seed 42's year-0 draw already exceeds the 18% cap, so the cap blocks all further growth for the whole run); 23.8% was the output of a discarded once-per-year-checked prototype that never shipped, apparently carried into the wrong place in the in-app text at v4.6 and never caught until now. Stale technical documentation, found and corrected: the interactive tool's ODD Protocol panel and Empirical Calibration panel each had cards still describing pre-v4.3/pre-v4.4 mechanics (SIM_COST_SCALE-driven wealth costs, SIU_TO_USD wage conversion, a uniform[0.2,1.0] automation-risk range) as if current, three releases after those specific things changed — one card even contradicted a correctly-updated card two rows below it in the same panel. New feature, directly responding to the audit's strongest suggestion: a dominance check on the v4.10/v4.11 Threshold Sensitivity charts, stating explicitly whether Your Settings sits at-or-below Baseline and CCO-Only at every threshold shown, or whether the curves cross (and roughly where) — validated against 9 constructed test cases before being run against real seed-42 data, which reproduced the documented regression exactly first. Also addressed: a mislabeled poverty-gap tooltip (called it a "ratio," which the v4.11 feature deliberately does not report), a stale button label ("Validation Suite" → matching the panel's own v4.2 rename), and the Traditional Welfare Baseline's tooltip, softened so it isn't mistaken for a calibrated model of actual transfer programs rather than a no-intervention counterfactual. Audit findings not acted on, and why: several restated already-tracked open items (WEALTH_FLOOR/TARGET_* recalibration, the SCF wealth-init gap, the low-wage mechanism gap) that the audit's own stated scope had already excluded; the Comfortable/Flourishing tier-label concern describes a deliberate, extensively pre-documented framework narrative choice (see this page's own "v3.4 naming note," years old) rather than a newly-found defect, and was not changed unilaterally. Full notes in CONTRIBUTING.md's v4.12 Release Notes.
v4.11 update (Sep 2026): one small feature addition on top of v4.10, prompted by relaying that release's own design to an external AI system (Grok) for a methodology critique — no simulation-mechanics changes. Poverty-gap ("avg. shortfall") view: the review reconfirmed the v4.10 feature's Atkinson (1987) citation as correctly used and recommended one concrete extension — the existing % curves (headcount ratio, FGT-0) can't distinguish a scenario where the poor sit barely below a line from one where they sit far below it. A new toggle switches both threshold-sensitivity charts to a poverty-GAP view (FGT-1: Foster, Greer & Thorbecke, 1984) — the average per-capita shortfall below each threshold, in the same dollars/days as the axis itself, reported as an absolute figure rather than the textbook threshold-normalized ratio (which breaks down at the negative thresholds the wealth chart deliberately includes to show Baseline's floor-pinned shape). Validated the same way v4.10's own function was: a naive brute-force reference across 22,210 random trials before touching the shipped file, then a full end-to-end integration test against the real engine, cross-checked against an independent numerical integral of the already-validated headcount curve — one apparent disagreement immediately next to WEALTH_FLOOR was tracked to the cross-check's own coarse resolution near a sharp discontinuity (not a flaw in the shipped function), confirmed by an exact-matching direct sum and by showing the discrepancy shrink to near-zero as the cross-check's own resolution was refined. Separately, the same external system's data-gathering follow-up on two long-open items produced a mixed but useful result: its 51-state, Census-weighted LIVING_WAGE_ANNUAL recomputation ($24.62/hr population-weighted, versus the shipped $23.735/hr unweighted) had its state-level inputs spot-checked and confirmed against live MIT data this session, though the full weighted arithmetic wasn't independently re-derived to the dollar — documented as reference data, not adopted into the engine, per the same "sweep, don't decide" standard as the WEALTH_FLOOR sweep. Its claim about the occupation-risk Kaggle dataset's license (unspecified, not MIT as an earlier session's third-party source suggested) could be neither confirmed nor refuted directly, but the search for it surfaced a materially better-documented alternative: a 702-row Frey & Osborne-matching dataset in the plotly/datasets GitHub repository, under a genuine first-party MIT license. Full notes in CONTRIBUTING.md's v4.11 Release Notes.
v4.10 update (Sep 2026): one new reporting feature, prompted directly by the framework's author — no simulation-mechanics changes. Poverty & Wealth Threshold Sensitivity: this project has now had the same argument twice over a single committed dollar figure — LIVING_WAGE_ANNUAL was set in v4.3 and an external audit tried to overturn it in v4.9 with a different single figure that turned out to be stale. Rather than resolve that pattern by defending one more number, two new charts show the full range instead: the population's cumulative distribution of final-year wealth and BLEI across every plausible threshold at once, not just one committed figure — the standard "poverty dominance" approach from the poverty-measurement literature (Atkinson, A.B. (1987). On the measurement of poverty. Econometrica, 55(4), 749-764; the World Bank's own practice of reporting global poverty at several lines simultaneously). Baseline, CCO-Only, and Your Settings are overlaid on the same axes, so a reader can see whether one scenario dominates another across the whole range, not just at a single arbitrarily chosen line. One external reference point was added for comparison — the 2026 HHS federal poverty guideline for a one-person household, $15,960/yr — verified directly this session after a first fetch attempt returned a stale cached 2017 snapshot of the source page (caught and cross-checked against an independently-dated primary-source PDF instead of used). Deliberately out of scope: LIVING_WAGE_ANNUAL itself is genuinely baked into the wealth-accumulation loop (unlike POVERTY_LINE, a pure reporting threshold with exactly one call site), so making it explorable the same way needs its own dedicated, fully-audited mechanics release — scoped as the clear next step, not attempted here. Validated well beyond a syntax check: a full end-to-end Node.js integration test evaluates the actual edited script and cross-checks the new function's output against the engine's own existing poverty figures at matching thresholds — exact match. Full notes further down this same panel (v4.10 entry) and in CONTRIBUTING.md's v4.10 Release Notes.
v4.9 update (Sep 2026): a UI fix plus a full verification pass on an external AI audit — no simulation-output changes. UI fix: the Social Security-Anchored Cohorts table (in the interactive tool) was getting clipped at 100% browser zoom, its rightmost column cut off with no way to scroll to it, while the same table at 80% zoom fit fine — traced to a plain <table> sitting in a card with no local overflow handling, unlike the System comparison table's own scrollable container; fixed the same way, with a small reusable CSS class. External audit, verified rather than trusted: a Meta AI review supplied two contributions — a modular (ES-module) rewrite of the v4.8 Node.js harness, and a proposed cut to LIVING_WAGE_ANNUAL from $49,370 to $35,021. Both were actually run, not just read. The harness rewrite checked out, reproducing the documented seed-42 regression exactly. The living-wage proposal did not: it was built from a 2024 snapshot of MIT's Living Wage Calculator, and fetching MIT's own site directly for its current (Feb 2026) data found every spot-checked state running well above that snapshot — California $30.48/hr, DC $26.72/hr, even low-cost Mississippi at $20.69/hr, all above the 2024 figures the proposal relied on. The cut was not made. Also resolved: the archived DOI snapshot's OSF metadata, flagged as an open loose end since v4.8, has been updated by the author to reflect the Apache 2.0/CC BY 4.0 split. Full notes further down this same panel (v4.9 entry) and in CONTRIBUTING.md's v4.9 Release Notes.
v4.8 update (Sep 2026): a mixed release — five UI fixes from Duke directly using the deployed page (not a code audit), a licensing decision, and completion of two items flagged as ready-but-blocked at the end of v4.7. No simulation-output changes. UI fixes: tooltip text that ran off the browser viewport on long ⓘ explanations and on the narrow Scenario Presets grid (root cause: a CSS class written for short tips got reused for paragraph-length ones); chart-grid CSS using a bare "1fr" track that could overflow at non-default zoom (the standard fix is minmax(0,1fr), applied throughout, including a second silently-overriding duplicate rule found in the process); the BLEI-components chart's near-invisible benefitDays line, confirmed via a fresh harness to be a chart-scale issue and not a computation bug (cashDays legitimately runs ~100× larger by year 20), fixed with a dual-axis chart; and confirmation that Baseline scoring higher System Stability than Full Integration is the already-documented coefficient-of-variation behavior, not a new bug. Licensing: the simulation's source code moves from CC BY 4.0 to the Apache License 2.0 — both v4.7 external reviews flagged CC BY 4.0 as unconventional for software, this had been logged as open, and Duke authorized the change this session; papers and documentation, including this page, remain CC BY 4.0. Sensitivity sweep: a validated N=500-seed WEALTH_FLOOR sweep (built and checked against the exact seed-42 regression figures before being trusted) found the Traditional Welfare Baseline completely invariant to the floor's value on every metric but the raw wealth number, while Full Integration shows a real, modest, mechanistically-understood sensitivity — not acted on; the shipped default is unchanged. Occupation-risk dataset: stronger, still-incomplete corroboration of the Kaggle automation-risk dataset flagged in v4.7. Full notes further down this same panel (v4.8 entry) and in CONTRIBUTING.md's v4.8 Release Notes.
v4.7 update (Sep 2026): a dependency-and-documentation hygiene pass — no simulation output changes anywhere in this release. Chart.js now loads from a version-pinned jsDelivr mirror with a verified SRI hash (closing an item open since v3.8); a quick in-app scatter now appears after every LHS export; PTF's "40-60%"/"12-16%" wording is disambiguated on this very page (Key Concepts card and JSON appendix); and a new open calibration finding is logged (not corrected) — the wealth-initialization lognormal's ~$36K median diverges roughly 5.3× from the actual 2022 Survey of Consumer Finances household net worth (~$193K). Prompted by two rounds of external ChatGPT review, both checked claim-by-claim against the code before anything was accepted — several claims from both did not hold up and were not acted on. The KPI figures elsewhere on this page remain the v4.4 N=5,000 study, unaffected. Full notes further down this same panel (v4.7 entry) and in CONTRIBUTING.md's v4.7 Release Notes.
v4.6 update (Aug 2026): another good-first-issues pass, not a mechanics-audit release. Implemented the Latin Hypercube sensitivity export spec from CONTRIBUTING.md's Good First Issues (a stratified LHS design over OAT's own 5 parameters, CSV export for external Sobol/Morris analysis); added an opt-in, off-by-default "feedback-clamped" PTF adoption cap addressing Model Architecture Feedback's "the PTF slider isn't a hard cap" item (confirmed uncapped share can reach 53.4% against an 18% slider; capped holds near the slider value); exposed the FBS gate's half-saturation bandwidth (FBS₅₀=ln(2)/λ) as a named, derived constant rather than only a hand-computed figure in prose; and rebuilt the near-poverty cohort's stale 40-year extension under current mechanics. The 40-year rebuild's finding is the most substantive item this release: the cohort already reaches Flourishing at a median of 13 years (reconfirming the existing 20-year table, not a new result), but extending to 40 years shows no plateau — cohort BLEI and population-wide wealth keep compounding, reaching a population median wealth of roughly $2.1M by year 40 — a new open question about unbounded long-horizon wealth growth, not resolved here. Neither the LHS export, the PTF cap (default off), nor the FBS₅₀ display changes any existing run's output; the KPI figures above remain the v4.4 N=5,000 study, unaffected. Full notes further down this same panel (v4.6 entry) and in CONTRIBUTING.md's v4.6 Release Notes.
v4.5 update (Aug 2026): a good-first-issues pass, not a mechanics-audit release like v4.3/v4.4 — implemented the tenure-cohort PTH liquidity haircut (replacing the flat 50% used through v4.4; see Step 1 card below and Mathematical Framework §2), added a "Copy parameters as URL" sharing feature, surfaced the Social Security-anchored cohort study as in-app UI rather than harness-only, and added hover tooltips for BLEI tier definitions and preset descriptions. Only the PTH haircut change affects simulation output, and by a small amount — an isolated N=300 check (not a full N=5,000 re-study, which this smaller-scope release didn't warrant) found median wealth +0.6% and median BLEI +0.3% at Full Integration, with Gini/poverty/flourishing-rate metrics unchanged to the precision checked. The KPI figures above remain the v4.4 N=5,000 study; treat the wealth figure as understating the current build by roughly that margin until a fresh large-N study is run. Full notes further down this same panel (v4.5 entry) and in CONTRIBUTING.md's v4.5 Release Notes.
v4.4 update (Aug 2026): unified the wage/income scale across BLEI, FBS, and Gini onto the same real-dollar anchor the main wealth loop already used since v4.3 (previously ~6× apart at the median wage — the legacy conversion is retired), a compensating recalibration of the FBS advancement-probability coefficient, true common-random-numbers pairing across the Baseline/CCO-Only/Main comparison (previously population-only, not trajectory-level), removed an unexplained baseline initial-wealth haircut, paired automation exposure across scenarios, and fixed a random-number-generator bug that silently returned a constant instead of a proper random draw on every call. Full N=5,000 re-study complete — the KPI figures above are current as of v4.4 (see the v4.5 highlight above for what's moved since). This page's own sync skipped directly from v4.2 to v4.4: v4.3's sync was deliberately deferred pending an independent adversarial audit (two audit passes, most findings on the second held up on independent verification) before touching a published research artifact. Full notes further down this same panel (v4.4 entry).
v4.3 update (Aug 2026, synced to this page as part of the v4.4 update above — no intermediate snapshot of this page was ever published at v4.3): the main wealth-accumulation loop's unit fix (wage and cost sides both converted to real USD via sourced anchors — see the detailed entries below), the runYear() RNG-coupling fix, a bimodal automationRisk distribution, per-agent PTH tenure tracking, and a new Social-Security-anchored income cohort study — the sharpest test of the framework's poverty-elimination claim run to date. This is not a clean win: it redistributes as well as it grows. Full notes further down this same panel (v4.3 entry, folded into v4.4's).
v4.2 update (Aug 2026): common-random-numbers population pairing and a structural System Stability metric (see Methodology Overview below). The full N=5,000 reconfirmation is now complete. Poverty, wealth, and Gini figures across all three scenarios landed within a few hundredths of a percentage point of the v4.0/v4.1 numbers they replaced at the time, confirming the population-pairing fix changes which specific agents get compared, not the model's aggregate behavior — since superseded by v4.3/v4.4's mechanics changes, see the highlights above. Full methodology and figures in Methodology Overview and Performance Comparison, below.
v4.1 update (Aug 2026): audit-driven bug-fix release — no simulation mechanics changed, so every figure above is reconfirmed rather than newly computed, except the last tile (genuinely new: a 40-year extension of the near-poverty cohort study). Full notes in Methodology Overview below.
Full revision history (v3.1 → v4.12 — strictly chronological through v4.6, then newest-first for v4.7 onward; see note below)
v4.14 note: same pattern, one entry further — this session's entry goes at the very front of the reversed tail (v4.14→v4.13→v4.12→v4.11→v4.10→v4.9→v4.8→v4.7), ahead of the v3.1→v4.6 ascending run. Still not reordered, still for the same reason. v4.13 note: same pattern again — this session's entry goes at the front of the reversed tail (v4.13→v4.12→v4.11→v4.10→v4.9→v4.8→v4.7), ahead of the v3.1→v4.6 ascending run. Still not reordered, still for the reason first given at v4.10: moving several large blocks risks a real error for a purely cosmetic gain. v4.12 note: same tail-prepending pattern, same reason for leaving it — this session's new entry goes at the very front of the reversed tail (v4.12→v4.11→v4.10→v4.9→v4.8→v4.7), ahead of the v3.1→v4.6 ascending run. v4.11 note: continuing the same tail-prepending pattern flagged as imperfect since v4.10 (this session's new entry goes at the very front of the reversed tail, i.e. v4.11→v4.10→v4.9→v4.8→v4.7, ahead of the v3.1→v4.6 ascending run) — not fixed this session either, for the same reason given in v4.10's own note: moving several large existing blocks into true chronological order carries real risk of introducing an error for a purely cosmetic gain. HANDOFF.md still flags this as a legitimate future clean-up, not urgent. v4.10 note: entries from v4.7 onward were each prepended ahead of the previous newest release rather than appended in true chronological order, so this section reads v3.1→v4.6 ascending, then v4.10→v4.9→v4.8→v4.7 descending — genuinely out of order relative to a single chronological pass, though each individual entry is still dated and self-contained. Flagged rather than silently reordered, since fixing it means moving several large existing blocks with real risk of introducing an error for a purely cosmetic gain; see HANDOFF.md for whether a future session should do this.
v3.1 calibration note: An open goal of this simulation is to identify optimal CCO parameters — analogous to a structural engineer ensuring load capacity across all points simultaneously. Some earlier calibration targets (e.g. PTF share ~30%) were produced under less rigorous simulation versions that lacked the annual expense system. These are under active revision as simulation v3.x matures. See CONTRIBUTING.md for calibration contribution guidelines.
v3.3 methodology additions: Four enhancements expand the simulation's analytical scope. (1) Wage growth diminishing returns: the BLEI stability premium is now scaled by 1/(1 + 0.5 × max(0, wage/WAGE_MEDIAN_SIU − 1)), preventing structural compounding at high wages, grounded in Mullainathan & Shafir (2013) and Carroll (1997). (2) Recession severity distribution: switched from uniform to beta(5,2) over [0.70, 0.95], calibrated against NBER post-WWII recession data. (3) Participant vs. non-participant stratification: separate KPI tracking for CCO participants and non-participants, enabling direct tests of whether the system benefits participants without harming opt-outs. (4) Computed OAT sensitivity: the sensitivity chart now reports results from 11 actual mini-simulations (±20% on 5 parameters, seed 7777), replacing prior hardcoded illustrative guidance values.
v3.5 version & citation consolidation: No changes to simulation math, calibration constants, or formulas — this release addresses metadata integrity so the tool is citable as a stable research artifact. (1) Permanent DOI assigned: 10.17605/OSF.IO/QWTE2, added to the tool's schema.org metadata, footer, References panel, and both CSV/JSON exports. (2) Version-string drift fixed: exported CSV/JSON files previously self-reported "v3.3" in headers and filenames while the interface displayed v3.4 — a single source-of-truth version constant now keeps all exports consistent with the displayed version. (3) Internal preset naming: the optimal preset key was renamed reference to match the "Reference" terminology already shown in the UI (see v3.4 framing note below). (4) Effective-max UI indicator: the Quality Multiplier Ceiling slider now displays the Phi-adjusted effective maximum live (e.g. "Effective max with Phi: 14.58×"). Regression baseline (seed 42, Full Integration, 20 yr) produces identical numerical output to v3.4.
v3.6 UX & transparency (external Kimi technical audit + internal review): No changes to simulation math, calibration constants, or formulas — this release addresses labeling accuracy and interruptibility flagged by an external technical audit. (1) PTF slider relabeled: "PTF market share" → "Initial PTF share." The slider only sets the t=0 adoption probability (ptfShare); independent per-agent adoption checks each year mean realised final PTF share can and does exceed the slider value. UI caption, CSV export column, and run-configuration summary updated to match. (2) System Stability disclosure: added an info tooltip and a Known Limitations entry stating plainly that the displayed value is a trend-plus-noise heuristic (stabBase by poverty-trend direction, + CIP bonus, + bounded random noise) rather than a structural metric derived from wealth variance or BLEI-tier persistence. A structural replacement is scoped for v4.0. (3) Mobile table overflow fixed: removed a hardcoded min-width:640px that forced every results table into horizontal scrolling on mobile viewports regardless of actual content width. (4) Cancel control: single runs and chained Monte Carlo batches (3×/10×/50×) can now be interrupted mid-run without a page refresh. (5) Implicit global declared: IS_REF_RUN, previously assigned without a prior declaration inside the page-load listener, is now an explicit module-level variable. Regression baseline (seed 42, Full Integration, 20 yr) produces identical numerical output to v3.5.
v3.7 accessibility & discoverability (external Meta AI review cross-check + internal verification): No changes to simulation math, calibration constants, or formulas — this release fixes a UI initialization bug and closes two gaps an external review surfaced. (1) Double preset-apply fixed: the page's DOMContentLoaded and load listeners both called applyPreset('reference'), silently re-applying default parameters a second time before the first run executed. The load listener now only sets the reference seed/flag and runs. (2) Chart accessibility: all 11 Chart.js canvases previously had no accessible name; added role="img" and a descriptive aria-label to each. (3) In-app glossary: added a collapsible acronym glossary above Scenario Presets in the interactive tool, mirroring the Key Concepts accordion on this page. The external review also raised several points that do not hold against the actual v3.6 implementation — RNG is already a seeded mulberry32 generator (not Math.random()), error handling already wraps simulation execution in try/catch, and the year-loop already yields per year rather than blocking — these were verified and not acted on further. Regression baseline (seed 42, Full Integration, 20 yr) produces identical numerical output to v3.6.
v3.8 RNG rigor (external Grok review cross-check + internal verification): No changes to simulation math, calibration constants, or formulas for a fixed configuration — this release closes an RNG-coupling gap the review surfaced. Comparison-run RNG isolation: the baseline and CCO-only comparison trajectories previously executed their full year-by-year loops (recession draws, wage variance, adoption checks) on the same shared RNG stream the main trajectory consumed next. At a fixed seed, changing years or nAgents therefore shifted the random sequence the main run actually saw, even though the tool's reproducibility claim is "same seed + params → identical run." Each comparison run now executes on its own stream derived from the user seed (mulberry32(seed+700001) / mulberry32(seed+700002)), restored before the main trajectory begins — the same pattern already used to isolate the ablation-attribution runs. Unseeded (Math.random()) runs are unaffected, since no reproducibility claim applies there. The review also raised points that do not hold against the actual v3.7 implementation — participant/non-participant KPI paths already guard against empty arrays, the internal validation suite already exists (four consistency checks), and OAT sensitivity already documents itself as first-order-only — these were verified and not acted on further. A vendored/SRI-pinned Chart.js was considered but not shipped this release: cdnjs's own auto-generated SRI hashes have a documented history of not matching the served file, and a wrong hash silently breaks every chart for every user — worse than the current unpinned load. Regression baseline (seed 42, Full Integration, 20 yr) produces identical numerical output to v3.7, since baseline/CCO-only run length is unchanged for that configuration.
v3.9 numerical edge cases (external Gemini review cross-check + internal verification): Two small, low-severity fixes. Wealth ratio near-zero guard: the p90/p10 KPI displayed "∞" only when p10 ≤ 0; a near-zero-but-positive p10 (a few dollars, plausible near the wealth floor) produced a technically-finite but meaningless ratio instead. Threshold changed from p10>0 to p10>$100. OAT params mutation: runOATSensitivity() mutated the object returned by getCurrentParams() directly (base.nAgents=200;base.years=10) rather than copying it; harmless in practice since nothing else held that reference, but now builds a fresh object via Object.assign instead. The review also proposed Object.freeze()-ing getCurrentParams()'s return value to prevent slider-change race conditions during an in-flight run — investigated and not applied: runSim() doesn't call getCurrentParams() at all (it builds its own separate params object, a documented duplication rather than a bug), so there was no race condition to fix, and freezing would have silently broken the OAT override this release fixes more directly. The review's supplied Chart.js SRI hash is invalid — a correct sha512 digest is 88 base64 characters, the supplied string is 65 — and was not used; SRI-pinning remains worth doing with a hash generated and verified against the deployed file, per the same conclusion reached auditing v3.7 → v3.8. The review's synchronous-batch-loop concern for runMulti/runOATStep/runAblation doesn't hold either: all three already yield via setTimeout between iterations. Regression baseline (seed 42, Full Integration, 20 yr) produces identical numerical output to v3.8 except the ratio KPI display threshold described above.
v4.0 mechanism alignment, dimensional coherence & statistical design (external Refine.ink review, Aug 2026 + internal audit against the BLEI paper's own §8 Table 6 spec): By far the largest revision to date, and the first where the interactive simulation's actual behaviour changes for typical configurations rather than only its labelling, robustness, or accessibility. Full changelog is in the simulation's own source (search "v3.9 → v4.0" in index.html); summarised here:

Mechanism gaps closed — several of this page's own step descriptions above (Step 3 FBS gating, Step 4 network-density θ) described the intended design accurately but did not match the shipped engine, which the external review caught: octave advancement now genuinely runs P(advance)=1−exp(−λ·FBS) instead of a fixed-probability heuristic gated on BLEI>30 days; octave now governs CCO conversion-rate capacity (previously it had no role in conversion at all — only quality did); a documented 25% share of PTH's annual housing saving now builds Acre Equity instead of 100% landing as direct cash relief; SZH's synergy coefficient θ is now genuinely gated below 55% PTF density instead of applying linearly at every density; PTF adoption gained the Bass-diffusion imitation term the ODD protocol already claimed it had.

Dimensional coherence — BLEI, FBS, and the (now-implemented) EDC-adjusted Gini convert the simulation's internal wage unit (SIU) to USD via a single derived constant before mixing it with dollar-valued terms, closing a unit mismatch the review identified. The main wealth-accumulation loop deliberately keeps its pre-v4.0 SIU/USD simplification — see §2's note in the Mathematical Framework section above for why a full fix there was built, tested, and not shipped (it proved extremely sensitive to the conversion constant over multi-decade runs).

Counterfactual isolation — the baseline and "CCO Only" comparison populations are now generated independently from their own scenario parameters instead of inheriting octave/quality drawn under whichever configuration the user is currently testing; baseline's shock exposure and inflation are now paired to the user's toggle / anchored to the documented 3% CPI respectively (previously hardcoded); when shocks are enabled, all three trajectories (baseline, CCO-only, main) now draw from the same recession-timing sequence.

Validation & statistics — two validation-suite checks (participation threshold, PTF/inflation dampening) previously passed while silently testing nothing, due to a parameter-name/units mismatch between the test definitions and the engine; both fixed. The 3×/10×/50× Monte Carlo controls were completely non-functional — a flag-clearing bug meant every multi-run request silently executed exactly once with zero results collected; fixed. Ablation/attribution now uses a paired population and paired RNG stream (previously each removal drew a fresh sample against a different seed, diffed against an unrelated main run), with signed deltas — a subsystem whose removal improves BLEI now shows as negative instead of being clamped to zero. OAT sensitivity now perturbs all five parameters by a uniform ±20% of each parameter's own slider range, replacing a mix of relative and fixed-percentage-point steps.

What did NOT get fixed, and why: the main wealth loop's unit simplification (above); a genuine aggregate production/treasury constraint on BU conversion proceeds (v4.0 adds transparency tracking only, not a capacity constraint); a structural System Stability metric (still the v3.6-flagged trend heuristic — resolved in v4.2, below). All three are tracked as open items in CONTRIBUTING.md rather than silently left undocumented.

Headline statistics on this page are now v4.0-native, from a fresh large-N study. Every figure below — KPI banner and Performance Comparison — was recomputed under the corrected v4.0 mechanics via 5,000 independent seeded runs each of Full Integration, Traditional Welfare Baseline, and CCO-Only (seeds 1–5,000, 500 agents, 20 years; script and raw output available on request via a GitHub issue). This is a change of methodology from the prior "10,000 simulation runs" claim — that figure was never fully documented (batch size, seed range, and code path weren't specified) and, for the EDC-Adjusted Gini figure specifically, could not have reflected shipped code, since EDC-adjusted Gini wasn't computed by the engine until v4.0. The new study reports its exact N, seed range, and 95% CI on the mean of each statistic across runs (not to be confused with per-agent population spread within a single run). Two headline figures could not be recomputed and are marked accordingly below: EPPM and Work Incentive Preservation are not computed by the simulation engine (they're paper-level calculations only — see the BLEI paper). One figure changed substantively in a way worth flagging on its own: the near-poverty cohort's median member does not reach the Flourishing tier (≥730 days) within the 20-year reference horizon in any of the 5,000 runs, once advancement is genuinely FBS-gated rather than a fixed-probability heuristic — see the Performance Comparison note below for what we report instead and why. Regression baseline (seed 42, Full Integration, 20 yr) output is recorded exactly in CONTRIBUTING.md and is not identical to v3.9 — this release changes simulation behaviour by design.
v4.1 audit-driven bug fixes (internal Claude/Anthropic chat audit, Aug 2026): Unlike v4.0, this release changes no simulation mechanics — every fix below is either scoped to a specific feature (ablation) or is UI text that didn't match the underlying formula. Three fixes, plus a large-N confirmation and a genuine extension:

PTF attribution leak in the ablation feature. v4.0's paired-population ablation redesign (above) intentionally builds every removal scenario's agents under the full config, so membership flags (inCCO/inPTF/inPTH) match across scenarios for RNG-pairing — correct for the simulation mechanics, which already re-check the relevant system toggle everywhere they consume those flags. But agentBLEI()'s SZH+PTF cooperative-synergy term trusted a.inPTF directly, with no ptfOn parameter to check against — unlike ccoOn/pthOn, which already gate the equivalent CCO/PTH terms everywhere they're used (re-audited in this pass and confirmed unaffected). Result: the "Remove PTF" ablation result could retain a synergy bonus it shouldn't have whenever SZH was also active, understating PTF's true contribution on the Attribution chart — worth roughly 12 BLEI days per affected agent in testing (validated with a Node.js harness against the actual shipped functions, isolating the leak in a single agent and confirming it disappears with ptfOn correctly threaded through, with zero change to normal non-ablation runs). Fixed by adding ptfOn to agentBLEI()/bleiMetrics(), mirroring how pthOn already works. If you've cited or archived Attribution-chart output generated under v4.0 with SZH active, it's worth a re-run under v4.1.

Illustrative reference-run label was never shown. IS_REF_RUN was set true by the page-load auto-run (v3.4) but nothing ever read it, so the "📊 Illustrative reference run — seed 42…" banner stayed hidden permanently since its introduction — the general-purpose exploratory-simulation notice nearby likely covered for it, which is probably why six subsequent external audits (v3.6 through v4.0) missed it. Wired up: the flag is read once, to show the banner only for the genuine auto-loaded run, then reset so it can't linger into a later manual run.

Stale UI hint text corrected against current formulas. Several small strings had drifted from the mechanics they describe — the same class of gap the v4.0 review caught for the recession-mode figure below, just missed by that pass. The interactive tool's recession hint stated a 2–4 year / 65–85% income-multiplier range; the actual beta(5,2) formula (unchanged since v3.3, and correctly described in this document's own Mathematical Framework §7) produces 1–3 years / 70–95% — this document's own Step 5 card had the same "2–4 years" error, now corrected below. The Max Octave slider's hint described conversion capacity as an exponential "C = C₀ × 2ⁿ"; the actual v4.0 mechanism is linear in octave/maxOct, reaching exactly the quality-multiplier ceiling at max octave (an exponential form would hit 512× at octave 9, far past that ceiling) — the hint now describes the real shape. A static default display value read "14.58×" against the correct "14.56×" (9×1.618); cosmetic; it self-corrects the instant the reference preset auto-loads, but was wrong in markup. A chart caption asserted baseline recessions are unconditionally "enabled," no longer accurate once v4.0 paired baseline's shock exposure to the user's own toggle. OAT sensitivity's PTF-share perturbation used a slightly wrong slider range. None of these affect any computed number anywhere in this document or the interactive tool — full detail in index.html's own changelog (search "v4.1").

Large-N reconfirmation, and a genuine extension. Because none of the above touches makeAgent(), runYear(), or calcMetrics(), the v4.0 large-N figures throughout this page should be numerically unchanged under v4.1 — verified, not assumed: an independent N=1,000-seed sweep of all three scenarios (Full Integration, CCO-Only, Traditional Welfare Baseline) landed within statistical noise of the v4.0 5,000-seed figures on every metric checked (BLEI poverty, EDC-adjusted Gini, median wealth; near-poverty cohort size, and its Threshold/Stable milestone timing, reconfirmed almost exactly). Rather than stop at reconfirmation, the near-poverty cohort tracking (Performance Comparison, below) was extended to a 40-year horizon (N=1,000, Full Integration) — the specific follow-up the v4.0 note above flagged as open. The cohort's median member still does not reach Flourishing by year 40 (0 of 1,000 runs), though its median BLEI keeps climbing throughout (≈135 days at year 15 → ≈428 days at year 40) rather than plateauing — full trajectory and discussion in Performance Comparison.
v4.2 population-pairing & validation improvements (external audit + internal review, Aug 2026, cross-checked against CONTRIBUTING.md's Reproducibility Testing and Model Architecture Feedback): Unlike v4.1, this release does change simulation mechanics — population generation and the System Stability metric both changed. Four changes, plus the large-N reconfirmation this made necessary:

Common-random-numbers population pairing. The main run, "CCO Only," and baseline comparisons now share one canonically-drawn latent population instead of three independently-sampled ones — closing the counterfactual-isolation item from the external review this page's v4.0 note already discusses ("the baseline and CCO-only populations are not actually the same individuals"). The earlier objection that pairing "isn't well-defined once maxOct/maxMult differ in support between scenarios" holds against the scaled outcome (octave/quality) but not the underlying draw — the pre-policy shape variate is now shared, then scaled independently per scenario's own ceiling, which is what a genuine "same individuals, different policy" comparison needs. Implementing this surfaced an independently-found bug: makeAgent()'s three eligibility draws used short-circuit &&, so the number of RNG calls consumed during agent construction depended on which subsystems were toggled on — two scenarios built from the "same" seed but different toggle states (e.g. the validation suite's PTF-on vs PTF-off check) silently diverged in every draw after the first toggle difference, not just membership. Now drawn unconditionally. This does not extend to full within-run trajectory pairing — runYear() still consumes a variable number of RNG calls per agent depending on which of its own conditional branches fire each year (participants trigger more draws than non-participants), so two scenarios with different participation composition still decorrelate agent-level trajectories after year 0, even from an identical starting population. Aggregate comparisons (poverty rate, median BLEI) remain valid; a fully-paired per-agent comparison would need every RNG-consuming branch in runYear() drawing unconditionally too — a materially larger change, tracked as an open item in CONTRIBUTING.md, not attempted here.

Structural System Stability metric. Replaces the v3.6-flagged trend-plus-noise heuristic (stabBase = improving ? 0.88 : 0.60, plus a bounded random noise term) with the inverse coefficient of variation of median wealth and median BLEI over the run's final quarter — no RNG call, no manual per-mechanism bonus. A mechanism that genuinely stabilises outcomes now shows up endogenously as lower volatility, since every mechanism already feeds wealth and BLEI within runYear().

Validation suite: multi-seed robustness plus two new checks. The original four checks each ran once, on one hardcoded seed apiece — unable to distinguish a genuine structural property from a lucky draw. All four now run across five seeds and require unanimous agreement (all four are 5/5 robust). Two checks were added: non-participant poverty doesn't worsen when CCO is enabled (isolates CCO status alone, holding every other toggle fixed; needed a larger population and a mean-across-seeds criterion rather than per-seed agreement, because of the within-run RNG-coupling property described above — at the suite's usual 200-agent size this check only agreed 2–3 times in 10 seeds tried during development, which was noise rather than signal; at n=500 every seed and the mean favour non-participants doing slightly better under CCO, not worse), and a structural-invariants check (population conservation across BLEI tiers, octave/wealth-floor/participation bounds, Gini bounds) as a regression net for future changes. The suite is renamed "Internal Consistency & Behavioral Test Suite" and labeled against an ODD-style Level 1–5 validation hierarchy — this suite covers Levels 1–3 (code correctness, mathematical invariants, behavioral validation) only; Levels 4–5 (external empirical validation) remain open, per Known Limitations.

What did NOT get fixed, and why (carried forward from v4.0's note, above, still current): the main wealth loop's unit simplification; a genuine aggregate production/treasury constraint on BU conversion proceeds; a shared parameter-builder across getCurrentParams()/OAT/validation (still an accepted, if imperfect, duplication). All tracked as open items in CONTRIBUTING.md.

Large-N reconfirmation (Aug 2026) — complete. v4.1 could verify its large-N figures were unchanged by inspection alone, because none of its fixes touched makeAgent(), runYear(), or calcMetrics(). v4.2's population-pairing fix touches makeAgent() directly, so that shortcut wasn't available — a full N=5,000 study was run instead (same methodology as the v4.0/v4.1 studies: a Node.js harness driving the shipped engine functions directly — makeLatentPopulation(), instantiateAgent(), runYear(), calcMetrics(), bleiMetrics(), structuralStability() — seeds 1–5,000, 500 agents, 20 years, shock disabled to match the Full Integration reference preset; full figures in Performance Comparison, below). Headline result: figures across all three scenarios land within a few hundredths of a percentage point of the v4.0/v4.1 numbers they replace — Full Integration Threshold Rate 92.1% (was 92.1%), BLEI Poverty 7.9% (was 7.9%), EDC-adjusted Gini 0.4843 (was 0.484), Median Wealth $81,597 (was $81,629); Traditional Welfare Baseline reconfirmed just as tightly (Threshold Rate 47.8%, Gini 0.8003, both effectively unchanged). This confirms the fix changes which specific agents get compared, not the model's aggregate behavior — exactly what a counterfactual-isolation correction should do.

A genuine methodology finding along the way, for anyone reproducing this study. An initial CCO-Only run, using the CCO-Only preset's own 75% participation figure, diverged from the documented v4.0/v4.1 numbers by 1–2 percentage points across poverty, wealth, and Gini — consistently in the direction lower participation would produce. Baseline, run the same way, matched immediately (its parameters are fully hardcoded, independent of whatever scenario it's being compared against), which isolated the gap to participation rate rather than a deeper problem: the interactive tool's own internal "CCO Only" comparison (pCCO in simulate()) inherits its participation rate from whichever scenario it's paired against — 78%, the Full Integration reference preset's value — not from the CCO-Only preset's own standalone 75%. Re-run at 78%, CCO-Only also reconfirms closely (Threshold Rate 90.3%, was 90.3%; EDC-adjusted Gini 0.5164, was 0.516). Documented here because it isn't obvious from the preset definitions alone, and would silently reproduce the same 1–2pp gap for the next person who runs this study starting from PRESETS.cco directly.

What changed as expected, by construction, not by drift. System Stability now reports the new structural metric — Full Integration 94.7%, CCO-Only 95.3%, Traditional Welfare Baseline 80.6% — not comparable to the old heuristic's numbers, which is exactly what a redefined metric should produce. The near-poverty cohort's median time to the Stable tier is now 158.8 months / 13.2 years (was ~165 months / 13.7 years) — a genuine, modest shift (95% CI ±0.4 months on N=5,000, so not sampling noise), consistent with a slightly different random population per seed under the new RNG threading. The cohort's Threshold crossing is better described as immediate (month 0, from initial liquid wealth alone, in 5,000/5,000 runs) than the previous "~12 months" — this is a measurement-granularity refinement, not a changed finding: this document's own prior wording ("essentially immediate — driven by initial liquid wealth, not simulated improvement") already said as much, the new methodology just adds a pre-dynamics data point to confirm it. Flourishing remains unreached by the cohort median within 20 years (0 of 5,000 runs, same as before).

What did NOT get fixed, and why (carried forward from v4.0's note, above, still current): the main wealth loop's unit simplification; a genuine aggregate production/treasury constraint on BU conversion proceeds; a shared parameter-builder across getCurrentParams()/OAT/validation (still an accepted, if imperfect, duplication). All tracked as open items in CONTRIBUTING.md. One figure on this page was deliberately not re-run: the v4.1 40-year Flourishing-horizon extension (N=1,000) remains a v4.1-mechanics result — that specific reconfirmation is tracked as a separate open item rather than assumed. Full seed-42 single-run figures (distinct from this large-N study) are in CONTRIBUTING.md's Reproducibility Testing table.
v4.3 main wealth-loop unit fix — the highest-priority open item since v4.0, and not a clean win (Aug 2026): This page's own v4.0 note above already flagged this as deliberately left unfixed — "extremely sensitive to the conversion constant over multi-decade runs." v4.3 ships a validated fix: two new constants, WAGE_TO_USD (≈100.52, derived from $42,220 median personal income, Census/BLS CPS ASEC 2023) and LIVING_WAGE_ANNUAL ($49,370, a national living-wage figure from World Population Review's MIT-sourced state table), replace netting a wage figure against BASE_DAILY_COST — a bare-subsistence floor, correct for BLEI's poverty-line use but wrong for a 20-year compounding loop netted against real wage, which produced an ~11× wealth explosion and broke BU-monotonicity on 2 of 5 seeds when tested with the wrong anchor. All six validation checks pass under the shipped anchor.

This is not a clean win — it redistributes as well as it grows, along more than one axis. At N=5,000: Full Integration median wealth rose from $80,008 to $495,411 (≈6.2×), but EDC-adjusted Gini rose from 0.479 to 0.536 and wealth poverty rose from 14.4% to 19.5% — low-wage-draw, high-automation-risk, and non-participating agents don't share proportionally in the wage-side correction the way median-and-above-wage agents do. The Traditional Welfare Baseline collapsed far more severely: with no CCO/PTF/PTH cost relief, its full weight lands on the new, roughly-doubled cost anchor — median wealth fell from $7,316 to exactly the wealth floor, −$10,000, meaning more than half the baseline population was pinned at the debt ceiling by year 20 for the first time, wealth poverty rose from 52.2% to 72.3%, and Gini rose from 0.800 to 0.855. Meanwhile the near-poverty cohort (low starting wealth, not low wage — most members have ordinary wage draws) reversed completely: cohort-median time to Stable dropped from 158.8 to 48 months, and the cohort reached Flourishing in 5,000 of 5,000 runs within the 20-year horizon, versus 0 of 5,000 even after extending to 40 years under pre-v4.3 mechanics. Together these say something more precise than "wealth up, Gini up": the fix helps agents by wage level, not by starting wealth.

A new Social-Security-anchored cohort study, prompted by that finding, is the sharpest test of the framework's poverty-elimination claim run so far — and the framework does not pass it. Comparing Compassionism to the US baseline using median-income anchors doesn't show how the framework treats the population most relevant to a poverty-elimination claim: people on a fixed, sub-median income, not median-wage workers. Real 2026 SSA figures (SSI, SSDI-average, average retired-worker benefit) tag three cohorts by initial wage via WAGE_TO_USD. Full Integration helps this population enormously in relative terms — 20–30× the baseline's BLEI, where these agents are functionally at zero — but median BLEI in the teens of days remains deep in the Precarious tier, nowhere near the 30-day Threshold, let alone the reference configuration's own 67.8% population-wide Flourishing rate. Full table in CONTRIBUTING.md; the underlying mechanism is direct — even with PTF/PTH cost reductions and BU support, an agent whose wage sits near or below Social-Security-benefit levels doesn't generate enough annual surplus for the model's other mechanisms to compound meaningfully within 20 years.

Three smaller fixes shipped alongside the headline change. The runYear() RNG-coupling fix: every conditional quantity in the per-agent loop (BU spend fraction, CIP quality bump, octave advancement, SZH→PTF induction, PTH appreciation noise, PTF Bass adoption) is now drawn unconditionally every year for every agent, mirroring v4.2's population-construction fix — only the use of the drawn value is gated. This let the non-participant-poverty validation check tighten back to strict per-seed agreement at n=200 (was a mean-across-5-seeds workaround at n=500, adopted specifically because of this coupling gap — see v4.2's note above). A bimodal automationRisk distribution replaces the previous uniform[0.2,1.0] — a 47%/53% high-risk/low-risk mixture sourced to Frey & Osborne (2013) and Autor (2015). Per-agent PTH tenure tracking is added as a first step toward the variable liquidity haircut this page's Step 1 card already flags as unimplemented — tracking only this pass, the haircut formula itself remains flat 50%.

What did NOT get fixed, and why: the WEALTH_FLOOR of −$10,000 was designed for occasional insolvency, not a scenario where it binds for the median of an entire population — whether it's still the right value now that the cost anchor it's measured against roughly doubled is flagged as an open question this release surfaces, not resolves; a genuine aggregate production/treasury constraint on BU conversion proceeds; whether a mechanism specifically targeting low-wage (not just low-wealth) populations is a gap the framework's design should address. All tracked in CONTRIBUTING.md's Model Architecture Feedback, which is where this page's own reconciliation notes above point for the pre-existing Gini and target-calibration questions too. This page's own sync to v4.3 was deliberately deferred pending an independent adversarial audit of the release — that audit, and v4.3's resulting figures, are folded into the v4.4 entry below, since no intermediate v4.3 snapshot of this page was ever published.
v4.4 — two independent adversarial audits, and the fixes they confirmed (Aug 2026): Before touching a published research artifact's methodology further, v4.3 was put through two independent adversarial code-review passes rather than trusting its own validation suite alone. The first, an open-weight model (Qwen3-Coder-30B) orchestrated via RunPod Serverless with an explicitly skeptical prompt, returned seven structured findings — every one was independently re-verified against the actual code and rejected as a false positive (a self-contradicting RNG-stream claim, a misread of an existing guard clause, a misunderstanding of the documented PTH-equity accounting, among others). The second, a more rigorous pass, returned twelve findings — most held up under the same direct-code verification. Four were judged substantive and consequential enough to warrant their own mechanics-changing release rather than a quiet patch:

Wage/income scale unified across BLEI, FBS, and Gini. v4.0 had fixed unit-mixing inside these formulas using SIU_TO_USD (≈16.63) — a cost-side-derived approximation, invented because no real wage-side anchor existed yet. v4.3's WAGE_TO_USD (≈100.52, Census/BLS-sourced) was scoped to the main wealth loop only, leaving the same agent's wage worth roughly $3,518/month for wealth accumulation and roughly $582/month for welfare measurement simultaneously — a ~6× divergence the audit correctly identified as no longer defensible once one of the two anchors is empirically grounded and the other isn't. SIU_TO_USD is retired; agentEDC() was and remains unaffected, since it's a dimensionless SIU/SIU ratio that never used either constant. This is not a repeat of v4.3's compounding-loop risk (these formulas recompute fresh each year), but it does feed back into wealth accumulation indirectly through the FBS advancement gate, which needed a compensating adjustment: FBS_LAMBDA, left unscaled after its dominant input (Yusd) grew ~6×, pushed advancement probability toward saturation regardless of BU level and measurably weakened the BU-monotonicity validation check. Correction (post-release review): this document previously described the FBS_LAMBDA rescale as a "dimensionally-necessary consequence" of λ's 1/USD units — that overstated the case. FBS mixes the wage-derived term that changed scale with fixed-dollar terms (BU face value, basic cost) that did not, so FBS itself does not scale by a single clean factor, and dividing λ by exactly 6.0456 is a chosen behavioral recalibration to restore useful dynamic range, not a unit identity. See the open calibration-status note under Mathematical Framework §4 for the full, corrected account, including why the original range saturates and why the rescaled range should not itself be read as empirically validated.

True common-random-numbers pairing, at last, across the full three-way comparison. v4.2 paired the Baseline/CCO-Only/Main populations but left their year-by-year trajectories on three independently-offset RNG streams — decorrelated from each other and from Main, not just from population construction, exactly as v4.2's own note above already flagged as a remaining gap. Since v4.3's runYear() fix made every scenario draw the same count and order of random values regardless of policy toggles, three independent same-seed generators now necessarily produce identical draw sequences at each (agent, year) position — isolating the policy effect from Monte Carlo noise, which is what CRN pairing is for. Verified to have zero effect on Main's own single-scenario trajectory.

An unexplained baseline initial-wealth penalty, and an exogenous-conditions asymmetry, both removed. Baseline agents received an extra ×0.85 wealth adjustment at construction, on top of sharing v4.2's paired latent population — applied before CCO has had any chance to act, embedding part of the treatment effect into the counterfactual's own starting point. Removed; no externally-sourced justification existed for the specific figure. Separately, Baseline was hardcoded exempt from AI automation exposure even when a user enabled it for the tested scenario, while CCO-Only already correctly mirrored the setting — now paired. Neither fix meaningfully changes the standard reference-configuration figures on this page (automation defaults off; and Baseline's median wealth remains exactly floor-pinned regardless — now confirmed in 100% of N=5,000 runs rather than "more than half," since the binding constraint turned out to be the ongoing annual cost/wage gap under 20 years of compounding, not the year-0 starting point).

A genuine bug, found independently of either audit while building this release's large-N harness. The general-purpose gamma-distribution sampler divides by (a−1) inside a log term; at a=1 exactly this is x/0, making the acceptance test 0×log(∞)=NaN and therefore always false — every call exhausted all 5,000 rejection iterations and silently returned the constant 1, not a random Exponential(1) draw (confirmed: 20 of 20 identical samples in testing). This directly narrows drawAutomationRisk()'s two component distributions, used once per agent on every simulation run, and wasted the full 5,000 dead iterations each time in the process. Fixed with the exact closed-form solution — Gamma(shape=1) is exactly Exponential(1) — which also produced a roughly 200× population-construction speedup as a side effect, without which this release's fresh N=5,000 study would not have been practical to run in the time available.

Full N=5,000 re-study, with a methodological correction worth naming. Figures throughout this page above reflect the fresh study (Full Integration median wealth $526,120, up modestly from v4.3's $495,411 — most of v4.3's much larger jump came from the wealth-loop fix itself, not this release's formula-unification work; BLEI poverty fell from 17.1% to 12.5%; participant poverty fell from 15.4% to 10.0% while non-participant poverty stayed exactly unchanged at 34.3%, a clean mechanistic confirmation that non-participants never execute the FBS-gated code path this release touches). The Social-Security-anchored cohorts (v4.3, above) improved measurably — SSDI-level median BLEI 16.4d→22.6d, retirement-level 16.6d→a median-of-medians 25.1d — but an initial mean-based reading of the retirement-level cohort would have overstated this as crossing the 30-day Threshold; BLEI is right-skewed for these small (≈4–86 agent) cohorts, and the mean (32.0d) sits above the line while the median-of-medians (25.1d) and the actual per-seed crossing rate (31.1% of seeds) both show the typical case still falls short. Caught before publication, corrected throughout this page and CONTRIBUTING.md — reported here because getting this distinction right mattered for what the framework can honestly claim, and because a large-N study is only as trustworthy as the statistics used to summarize it.

What did NOT get fixed, and why: WEALTH_FLOOR, the pre-existing wealth/poverty/Gini design targets, and a genuine production/treasury constraint on BU conversion remain open — all explicitly flagged in CONTRIBUTING.md as framework-level decisions requiring the framework's own authors' judgment, not code fixes; this release adds a direct in-app disclosure on the affected KPI badges (see the interactive tool) without picking new numbers. The v4.1 40-year cohort extension remains unreconfirmed, now three mechanics-changing releases stale — given how far the 20-year figures have moved, a fresh 40-year run would very likely show materially different results, tracked as an open item rather than assumed. Full technical detail, including exact line-level rationale for every change, is in index.html's own changelog (search "v4.4") and CONTRIBUTING.md.
v4.5 — a good-first-issues pass, not a mechanics audit (Aug 2026): Five items pulled directly from CONTRIBUTING.md's own Good First Issues list, all completable without new external data or a framework-author calibration call — a deliberately smaller-scope release after two consecutive mechanics-audit releases (v4.3, v4.4).

The PTH liquidity haircut finally gets its variable schedule. v4.3 added per-agent pthTenure tracking as a first step; v4.5 implements the haircut itself — a linear ramp from 15% at tenure=1 (the closest available point to the BLEI paper Table 1a's "6 months" anchor, given tenure is tracked in whole years) to 85% at tenure≥5 (the paper's "5+ years" anchor), replacing the flat 50% share of annual Acre Equity appreciation counted as liquid wealth used through v4.4. Both anchors are the midpoint of the paper's cited range (10–20% / 80–90%) — the paper gives two qualitative points, not a closed-form curve, so the ramp between them is a documented interpretation choice, not a re-derivation (see Step 1 card and Mathematical Framework §2, above). Since PTH membership doesn't change once assigned, most PTH agents spend the majority of a 20-year run at the mature 85% rate — higher than the old flat 50% for 16 of 20 years, lower only in years 1–4. Isolated effect, N=300 seed-paired comparison (same population/RNG per seed, only this mechanism toggled): median wealth $523,958→$526,941 (+0.6%), median BLEI 1,820.6d→1,826.0d (+0.3%); Gini, wealth poverty, BLEI poverty, and flourishing rate unchanged to the precision reported. Seed-42 Full Integration reference: median BLEI 1,951d→1,965d, median wealth $558,001→$559,223. This is a scoped sanity check, not a fresh N=5,000 study — the KPI row and large-N table elsewhere on this page remain the v4.4 figures; see the v4.5 banner near the top of this page. All six validation checks pass post-change.

Three smaller good-first-issues, done alongside it. "Copy parameters as URL" serializes the current sliders/toggles/seed into a query string, copied via the Clipboard API; loading a shared link applies its params on top of the Full Integration defaults before the page's own auto-run, so the seed-42 "illustrative reference run" banner only fires when no recognized params are present. Social Security-anchored cohorts (real since v4.3, harness-only until now) are surfaced as a final-year table in the interactive tool's own results panel — SSI-level, SSDI-level, and Retirement-level rows, computed from the same final agent state and metric functions the headline KPIs already use, cross-sectional by design like the harness study itself. Hover tooltips now show BLEI tier day-ranges next to the tier-distribution chart and a one-sentence description of what each preset button actually configures — caught and fixed a real interaction bug along the way, where the preset "active" styling was silently overwriting the new tooltip's CSS class on every click.

What did NOT get fixed, and why: this was a good-first-issues pass by explicit scope, not an audit release. WEALTH_FLOOR and TARGET_* recalibration, the Sobol/LHC sensitivity export, occupation-stratified automationRisk, the near-poverty cohort's stale 40-year extension, and the framework-level low-wage-mechanism question all remain open, unchanged from v4.4. Full technical detail in index.html's own changelog (search "v4.5") and CONTRIBUTING.md's v4.5 Release Notes.
v4.6 — another good-first-issues pass (Aug 2026): Three items from Good First Issues plus one Model Architecture Feedback item. Two touch simulation output only for users who explicitly opt into a new, off-by-default toggle; one is export-only; one is a fresh study, not a code change.

Latin Hypercube sensitivity export implements the exact spec CONTRIBUTING.md had carried as "implementation-ready" since it was first written: a stratified LHS design over the same five parameters OAT already perturbs, reusing mulberry32 for the design draw, exporting the design matrix plus outcome metrics (poverty, BLEI, participant/non-participant poverty) as CSV. Each of 100 design points runs its own 200-agent/10-year mini-simulation at a fixed seed (matching OAT's own convention of holding the stochastic realisation fixed so cross-row variation is attributable to parameters, not RNG noise). Deliberately not a Sobol sampler — genuine Sobol indices need paired Saltelli-structured samples beyond a single LHS design — but well-stratified coverage suited to external Sobol/Morris/regression analysis in Python or R, which is the actual gap the spec described. Verified directly against the shipped functions: all 5 dimensions confirmed properly stratified, and a sample run through the real engine produces poverty/BLEI outputs that track sensibly with the sampled parameters.

Feedback-clamped PTF adoption, opt-in and off by default, addresses the Model Architecture Feedback item flagging that "the PTF slider sets the t=0 adoption probability only... a quota-based or feedback-clamped adoption model remains open." Confirmed the problem directly before fixing it: an uncapped seed-42/20yr Full Integration run reaches 53.4% realised PTF share against an 18% slider, via two independent growth pathways (Bass-diffusion/distress adoption and a separate SZH→PTF induction check). A new toggle — off by default — makes the slider a real ceiling when enabled, checked live and incremented per-agent within the year rather than only once per year, catching a first implementation attempt that still overshot (a once-per-year check alone only cut the overshoot to 23.8%, not the ~18% intended). One honest caveat, caught in testing and documented rather than glossed over: the cap constrains organic growth beyond the year-0 random assignment, not sampling variance already present in that assignment itself — a seed whose initial Bernoulli draw happens to land above the slider (confirmed for seed 42: 95/500 agents = 19.0% at year 0, before any dynamics run) holds at that level rather than being forced down. Implemented as a use-side gate on RNG draws the engine already draws unconditionally every year (the v4.3 RNG-coupling discipline), so enabling the cap adds no new RNG call and every existing preset's regression baseline is unaffected.

FBS₅₀ half-saturation bandwidth — CONTRIBUTING.md's own λ Calibration Status note (Mathematical Framework §4, above) had already hand-computed this figure in prose (≈$524–$4,191/month) as the recommended reparameterization target; it's now a named, derived constant (CFG.FBS_HALF_SAT_LO/HI = ln(2)/λ) displayed directly in the interactive tool, so it can't drift out of sync if the λ range is revised again. Reporting change only — per-agent λ sampling, RNG draws, and every simulation output are unaffected; a genuine reparameterization (sampling FBS₅₀ as uniform and deriving λ from it) would change the shape of the λ distribution and remains a distinct, larger open item.

The near-poverty cohort's 40-year extension, unreconfirmed since v4.1 (flagged in every release since as progressively more stale), was rebuilt under current mechanics: N=1,000 seeds (a fresh draw, matching v4.1's own methodology), Full Integration, 500 agents, 40-year horizon. The milestone question v4.1 originally asked is now moot — v4.3's wealth-loop fix already answers it inside the existing 20-year table (median 13.0 years to Flourishing), and this rebuild reconfirms that almost exactly at N=1,000 (median 13 years, mean 13.4 years; Stable and Secure milestones both within a percentage point of the 20-year figures). What the 40-year window actually adds is a different and more consequential finding: no plateau. Cohort median BLEI keeps compounding at an accelerating pace past year 20 — 1,618 days at year 20 to 7,058 days by year 40, more than quadrupling — and population-wide median wealth reaches roughly $2.1 million by year 40 with no sign of a ceiling. See Performance Comparison, below, for the full table and Known Limitations for the open question this surfaces about long-horizon wealth growth.

What did NOT get fixed, and why: another good-first-issues pass by explicit scope. Occupation-stratified automationRisk, WEALTH_FLOOR/TARGET_* recalibration, the framework-level low-wage-mechanism question, and a genuine production/treasury constraint remain open, unchanged from v4.5. Two items got real research rather than being left untouched, though: occupation-stratified risk is now scoped to a specific source (Frey & Osborne's own appendix publishes per-occupation probabilities for all 702 SOC codes — what's missing is transcription and a BLS employment-share crosswalk, not new data), and a search for a published population-weighted LIVING_WAGE_ANNUAL figure came up empty (MIT's calculator has no single national aggregate to retrieve) — a negative but informative result, documented rather than left as an unexamined todo. Full technical detail in index.html's own changelog and CONTRIBUTING.md's v4.6 Release Notes.
v4.14 — a two-pass external ChatGPT audit finds two genuine runYear() mechanics bugs (Sep 2026): Duke forwarded a two-part ChatGPT audit — a general review of index.html and CONTRIBUTING.md, then a second pass explicitly focused on "the economic mathematics and causal structure of runYear()," undertaken because the reviewer judged the first pass had exhausted what code-level and documentation-level review could find and that the harder remaining questions were economic rather than editorial. That second pass earned the distinction: it found two genuine defects that seven prior audits — several of them detailed, adversarial, and methodologically careful — and this project's own six-check internal validation suite had all missed.

Bug 1: the BU-expiry slider implemented two behaviours, not six. The UI presents "BU expiry (months)" as a 1–6 slider. The code consuming it, var decay=p.expiry<2?0:0.7, is only sensitive to whether expiry clears a threshold of 2 — every value from 2 through 6 evaluates identically. Verified directly before any fix was written: expiry=3 and expiry=6 produced bit-identical simulation output on the unedited engine, to the dollar and the decimal point. Replaced with a continuous annual-approximation decay=1-1/expiry — a documented interpretation in the same spirit as pthLiquidShare()'s existing linear interpolation for a comparably under-specified continuous quantity, not the full monthly-BU-tranche rebuild a "proper" fix would need (logged as its own future-work item, so the shipped fix's honest scope is on record). Verified inert on everything documented: all five shipped presets, every internal mini-simulation, and every OAT/LHS sweep use expiry=1 and never vary it — confirmed by grep before writing a line of code — and at expiry=1 the new formula gives decay=0, bit-identical to the old behaviour. Only a user who manually drags this one slider is affected; six positions now produce six genuinely distinct, monotonically-ordered results instead of two.

Bug 2: PTF's inflation-damping effect tracked the initial slider, not actual adoption. if(p.ptf&&inflRate>0)inflRate*=(1-p.ptfShare*0.5) used p.ptfShare — the static, initial-adoption-probability slider — for a population-level macro effect, while the exact same function already computes the actual current adoption fraction (ptfAdoptFrac) a few lines later, for the Bass-diffusion adoption term. That correct quantity simply was never reused for the inflation effect, even though the per-agent cost factor a few lines further down already correctly gates on each agent's real, current PTF membership flag rather than the slider — a state-variable/effect mismatch, not a design choice. Fixed by moving the computation earlier and reusing it (no RNG draw, so no stream position shifts anywhere). Verified inert on every documented figure — Full Integration, CCO-Only, Baseline, and hiAI each have inflRate=0 or ptf=false at this exact line, so none of them are touched, confirmed by the unchanged seed-42 regression below. Of the five shipped presets, only Stress Test combines both conditions; of the six internal validation checks, only ptf_infl exercises this line — re-run after the fix and confirmed still passing 5/5. Effect size where it applies (Stress Test, seed 42, 20yr): poverty 43.0%→41.8%, Gini 0.703→0.696, median wealth $141,814→$158,155 — actual PTF adoption running above the static slider means the fix applies stronger damping than the bug did, the economically expected direction.

Both fixes ported into harness.js for parity, and both cannot move a single documented figure on this page — the seed-42/Full Integration/20yr regression (Median BLEI 1,965d, Median wealth $559,223, Gini 0.534, Wealth poverty 16.6%) is bit-identical, confirmed by re-running harness.js, by driving the fixed engine through domtest.js end-to-end in a real DOM, and by isolated before/after checks on every one of the handful of configurations either fix actually touches. domtest.js gained six new checks this release, two of them direct regression guards: if either bug is ever reintroduced, the harness fails immediately rather than waiting for another audit to rediscover it.

One new reporting feature: the Wealth Floor Diagnostic. The audit's general-review pass asked for an in-app diagnostic showing how much of a headline Baseline-vs-Your-Settings gap reflects WEALTH_FLOOR's exact value rather than a genuine policy effect — a fair question this project had previously answered only offline, in CONTRIBUTING.md's own four-floor-value sensitivity sweep (v4.8). Two new KPIs show the share of the final-year population pinned exactly at the floor, for Your Settings and Baseline — a same-run companion to, not a replacement for, that offline sweep (seeing today's pinning doesn't show how sensitive it is to the floor's own value). Pure snapshot of already-final agent state; exported to CSV and JSON.

Documentation clarifications, no mechanics changes: EDC-adjusted Gini is now explicitly labeled — in its KPI tooltip, in the engine's own code comment, and in Mathematical Framework §5 below — as a constructed inequality index (a wealth stock minus one year of EDC-implied extraction, a flow), not conventional net-worth accounting; the formula itself is unchanged and still matches BLEI paper Table 6 exactly. A dual-cost-anchor table (LIVING_WAGE_ANNUAL vs. BASE_DAILY_COST) was added to the Empirical Calibration card. The ODD panel's Design Concepts card, and an inline comment at the octave-advancement site inside runYear() itself, now name the reinforcing feedback loops the audit's causal-structure review correctly identified explicitly: BLEI(prior year)→wage growth→wage→FBS→octave→{next year's wage growth, next year's conversion-rate ceiling}, and separately PTH→lower cost→higher FBS→octave→wage. Neither loop is a bug — both are the intended design — but a headline "CCO effect" or "PTH effect" is a compound of several coupled mechanisms, not one isolated channel, and nothing previously said so explicitly. A new Known Limitations entry states plainly that "recession" only ever shocks earned wage income and "AI automation" is a reduced-form wage-growth penalty, both narrower than their names might suggest. The standing "not a forecast" banner gained one sentence, close to the audit's own suggested wording, making explicit that results demonstrate the implications of the implemented assumptions rather than establishing the empirical validity of those assumptions.

What the audit got right that this project had already substantially addressed, checked rather than assumed: the audit's call to "formally divide validation into Levels 1–5" is, verbatim, already the validation panel's own subtitle since v4.2. Its FBS λ concerns and its recommended FBS₅₀ = ln(2)/λ reparameterization were already shipped at v4.4/v4.6. Its stock-flow accounting concern has been an explicit Known Limitation since v4.0 — the audit's more detailed proposed ledger schema is logged as an elaboration of that same item, not treated as new. Its suggestion to split index.html into modules is the identical suggestion an external ChatGPT audit made at v4.7, already rejected then as conflicting with this project's explicit single-file distribution constraint — same conclusion here. Its call for real-browser (Playwright) testing beyond domtest.js was already an explicitly flagged open decision in v4.13's own Model Architecture Feedback. Its suggestion to rename the "System Stability" KPI (a real, already-documented concern since v4.4) was considered and declined, for consistency with the audit's own stated preference elsewhere in the same document to define "wealth" precisely rather than rename it — renaming a KPI referenced throughout years of exported CSV/JSON columns and documentation is disruptive for a label already comprehensively caveated at the point of display; logged as an option for Duke's own judgment, not decided unilaterally.

What did NOT get done, and why: several of the audit's recommendations are legitimate but substantially larger than an audit-response release should take on unilaterally — a full flow-of-funds ledger with explicit conservation identities, monthly BU tranches (the fuller version of the expiry fix actually shipped), CCO/PTH pathway decomposition via structured ablation, λ heterogeneity beyond a fixed-and-independent draw, AI automation as a genuine employment-transition model, a fuller macro-recession model touching assets/employment/transfers, an expanded invariant/mechanism/calibration test taxonomy, and an explicit enumeration of runYear()'s full annual state-transition schedule (deliberately deferred rather than risk transcribing an inaccurate sequence alongside everything else in this release). Each is precisely scoped in CONTRIBUTING.md's Model Architecture Feedback and Good First Issues for whoever picks it up next. Full technical detail, including the isolated before/after verification tables for both mechanics fixes, is in index.html's own changelog and CONTRIBUTING.md's v4.14 Release Notes.
v4.13 — an independent audit pass, and the first release to find defects by running the tool rather than reading it (Sep 2026): Duke ran this release's audit through a different model than usual and asked for "clarity, rigor, and technical issues." The material difference this time was methodological rather than editorial: instead of auditing the source as text, the shipped page was loaded into a headless DOM (jsdom) and actually exercised — presets applied, a shared parameter URL replayed, the render pipeline driven end to end. That surfaced two defects that no amount of reading had caught, and that this project's own validation checklist (div balance, brace balance, node --check, JSON-LD parse, harness regression) is structurally incapable of catching, because none of those checks ever runs the page.

Defect 1: a shared "Copy parameters as URL" link silently disabled every preset tooltip. applyParamsFromURL() cleared the preset buttons' "active" highlight by resetting each button's class to a bare pbtn — which also removed .tip-host, the class the v4.5 preset-description tooltips hang off. Every visitor arriving through a shared link therefore lost all five preset hover descriptions for the entire session, silently. This is the same bug v4.5's own notes record catching in applyPreset() ("would have silently stripped the new tooltip class") — the identical pattern was written into applyParamsFromURL() in that same release and survived seven subsequent audits, for a specific and instructive reason: the shared-link entry point is the one path a reviewer reading index.html top to bottom never mentally executes, and the one path no automated check had ever taken.

Defect 2: the parameter-sensitivity panel duplicated its tip box on every run. renderSens() wrote its "💡 One-at-a-Time (OAT) Sensitivity" note using insertAdjacentHTML('afterend', …), which inserts a sibling of the container the function then clears with innerHTML — so the clear never touched it, and renderSens() runs once per completed simulation. Three runs in one page session left three stacked copies. Confirmed in the DOM harness (3 boxes after 3 renders before the fix, 1 after), now a single stable-id node updated in place.

A metric that reported a perfect score where it had no data. structuralStability() measures the inverse coefficient of variation of median wealth and median BLEI over the run's final quarter, with the window floored at one data point. The Simulation-years slider's minimum is 5, and for any run of 5, 6 or 7 years that quarter rounds to a single value — a variance of one observation is undefined, the coefficient-of-variation helper correctly returns 0, and the metric returned exactly 0.99, its own clamp ceiling, for every short run this tool has ever executed, whatever actually happened in it. Verified rather than reasoned: a strictly-increasing five-point series scored 0.990000, as did every other short series tried. The window floor is now 2. A sweep across every supported run length confirms 8–30 years are bit-identical to v4.12 — so every preset, the 20-year reference configuration, and the seed-42 regression baseline are untouched; only 5–7 year runs change, and only in this one displayed number. A matching Known Limitations entry now says plainly that System Stability needs ~8+ simulated years to mean anything.

Stale documentation inside the engine, where v4.12 had fixed it only around the engine. v4.12 corrected the interactive tool's ODD Protocol panel, its Empirical Calibration panel, and its top-of-file unit-system comment for describing pre-v4.3/pre-v4.4 mechanics as current. The same staleness was sitting inside runYear() the whole time — the function all three of those panels describe, and the copy a contributor editing the engine actually reads. Four specific claims, each contradicted by the code beside it: that SIM_COST_SCALE "remains load-bearing" through the SIU_TO_USD derivation "that BLEI/FBS/Gini still use" (SIU_TO_USD was retired in v4.4; grep confirms SIM_COST_SCALE now has zero read sites anywhere in the file); that dollarCost is consumed "only by the FBS advancement gate" (it has two consumers — the FBS gate and the PTH equity block); that Yusd uses SIU_TO_USD (the line directly beneath reads WAGE_TO_USD); and that "FBS doesn't feed back into wealth" (it does, through octave advancement into conversion capacity and wage growth — precisely the feedback path v4.4's own notes give as the reason FBS_LAMBDA needed a compensating rescale). All corrected in place with short notes recording what was wrong, per this project's established practice of documenting a correction rather than silently swapping text.

Two reporting additions, both pure transforms of figures the engine already produces. Cumulative Poverty Exposure reports the mean number of years an agent spends below the wealth-poverty line, and below the BLEI poverty line, across the whole run — for Your Settings against the Traditional Welfare Baseline. This answers the "final-year snapshot only" gap the v4.12 external audit raised directly (its person-years-in-poverty suggestion), and the derivation is exact rather than approximate: each year's figure is a share of the same population, so summing the shares gives the average years-poor per agent. The result reframes a familiar number — at the seed-42 reference configuration the final-year wealth-poverty rate is 16.6%, but the average agent spends 4.8 of 20 years below that line (Baseline: 11.8), and 3.7 years below the BLEI poverty line (Baseline: 11.1). Its one honest limit is now a Known Limitation: this is aggregate exposure, not a spell-length distribution, and cannot distinguish "everyone poor for three years" from "30% of agents poor for ten." Second addition: the v4.12 dominance check was screen-only — visible but not archivable or citable with the run that produced it. It is now captured into the run snapshot and written to both export formats along with the view it was computed in and the number of threshold grid points evaluated, and the on-page caption states plainly that dominance is checked at the plotted thresholds only and describes one stochastic run rather than a confidence claim.

Smaller fixes. The Wealth Poverty KPI prefixed a hardcoded "▼" to a signed delta, so a configuration doing worse than baseline rendered as "▼ -3.2pp"; the arrow now follows the sign. Two grids built inside JS template strings still used a bare 1fr track — the exact CSS Grid overflow pattern v4.8 swept out of the stylesheet, missed because that sweep grepped CSS and these are inline strings; the Monte Carlo summary also never reflowed on a phone and now does. Toggle buttons expose aria-pressed, closing for the sidebar controls the same gap v3.7 closed for the charts. Exported JSON asserted a flat "CC BY 4.0" license, unchanged since before the v4.8 relicensing split, and the CSV's mechanics list was still headed "--- v4.0 FIXES ---" nine releases later; both corrected. CFG.POVERTY_LINE now carries a note at the constant itself recording that it has no citation anywhere in the codebase — an open item in CONTRIBUTING.md since v4.10, with nothing at the code to warn a reader who never opens that file. On this page: the header subtitle still read v4.9 and the Version History toggle label still read "v3.1 → v4.9," both four releases stale — and that second label is the very one v4.9's own entry below records fixing when it had drifted to "v3.1 → v4.7." It has now gone stale, and been caught, twice. In CONTRIBUTING.md, two release sections — v4.11's and v4.5's — had lost their ## …Release Notes headings entirely, so each rendered as a continuation of the section above it; the second was found only because the first prompted listing every heading in the file rather than assuming a single casualty. Both restored.

What did NOT get done, and why: the DOM harness verifies behaviour, not appearance — it cannot confirm CSS layout, tooltip positioning, or Chart.js pixel output, so those still want a human look after deployment, and the five structural proposals logged in v4.12 (executable test hierarchy, positional-argument refactor, calibrated current-policy scenario, rollout/transition model, per-agent longitudinal metrics) all remain open and unstarted. The per-agent longitudinal layer is now the most clearly motivated of the five, since the new exposure metric runs directly into its absence. Full technical detail in index.html's own changelog and CONTRIBUTING.md's v4.13 Release Notes.
v4.12 — documentation-and-verification pass prompted by a Perplexity AI audit, plus a dominance-check addition (Sep 2026): Duke supplied an external (Perplexity) audit of the shipped simulation with an explicit instruction not to assume it was error-free. Per this project's standing practice, every checkable claim was verified against source or by direct computation before anything was acted on — several claims held up, several did not, and several restated things this project had already tracked or already deliberately designed. No simulation-mechanics changes anywhere in this release.

One real documentation bug, found and fixed by direct computation. The interactive tool's own in-app "Cumulative Bug Fixes" note on the v4.6 PTF adoption cap stated that seed 42 / Full Integration / 18% slider converges to 23.8% under the shipped agent-granularity cap — inconsistent with this document's own v4.6 Release Notes, which have always said 19.0%, and the audit flagged the inconsistency without being able to say which side was right. A Node.js harness built this session (reproducing the documented seed-42 regression figures exactly before being trusted for anything else, the same discipline every prior harness in this project has followed) settled it: 19.0% is correct. Tracing ptfLiveCount/ptfCapAllows() and reproducing it computationally shows why: seed 42's year-0 Bernoulli draw already lands at 19.0% (95/500 agents), above the 18% cap, so the cap blocks every subsequent admission for the entire 20-year run and the final share holds at the year-0 level rather than growing. 23.8% was the output of an earlier, discarded once-per-year-checked prototype — never the shipped implementation — and appears to have been carried into the interactive tool's own documentation at v4.6 by mistake, uncaught until this session. A 10-seed sweep (seeds 1–10) confirms the general mechanism works exactly as designed: seeds whose year-0 draw starts below 18% grow and land at exactly 18.0% (500×0.18=90 is a whole number for this specific slider/population combination, so there's no fractional-agent overshoot to speak of here); seeds already at or above 18% at year 0 simply hold there, as seed 42 does. index.html's own panel is corrected; this document's figure was already right and needed no change.

Stale technical documentation, found in three places, all describing superseded mechanics as if current. The interactive tool's ODD Protocol panel had a "State Variables" card still stating automationRisk ∈ [0.2,1.0] — the retired pre-v4.3 uniform draw's exact bounds — directly contradicting a correctly-updated card two rows below it in the very same panel, which has said "47%/53% bimodal mixture" since v4.3. The same panel's "Submodels" card still described the annual wealth update as SIM_COST_SCALE-driven and BLEI's wage term as SIU_TO_USD-converted, both accurate only through v4.2 — superseded by v4.3's wealth-loop unit fix and v4.4's SIU_TO_USD retirement, respectively, neither ever updated in this specific card even though the dedicated Cumulative Bug Fixes entries for both releases were kept current. The Empirical Calibration panel's "Daily vs. simulation cost scales" card was framed entirely around "what v4.0 fixed and what it deliberately didn't" and still asserted the main wealth loop was "deliberately NOT changed" — v4.3 changed exactly that, over a year of shipped releases ago by this project's own internal chronology. All three are rewritten in index.html to describe the current, v4.4-onward state while preserving the original v4.0 reasoning (still the correct explanation for why v4.0 shipped a partial fix rather than none) — the top-of-file UNIT SYSTEM code comment had the identical problem and got the same treatment. None of this affected any computed output; these are description-only fixes to panels whose job is describing the model, not running it.

New feature: a dominance check on the Threshold Sensitivity charts, directly implementing the audit's strongest concrete suggestion. The audit recommended the charts "test for first-order stochastic dominance over the displayed range... a clear statement when curves cross... do not imply a universal welfare ordering when curves cross." A new checkDominance() function, exercised via both chart callouts, states plainly whether Your Settings sits at-or-below Baseline (and separately CCO-Only) at every threshold shown, at-or-above everywhere, or crosses — and if it crosses, roughly where. This is an honest check in both directions, not a feature built to only ever confirm the expected answer: at the seed-42 Full Integration reference configuration it reports dominance (Your Settings beats both comparisons everywhere, on both charts, in both the headcount and gap views) — a genuine, computed finding rather than an assumption wired into the feature, confirmed via the same regression-validated harness used for the PTF-cap fix above. A Stress Test preset re-run (lower participation, higher tax, lower BU) also showed dominance rather than a crossing in this project's own mechanics, so readers should read a "dominates" result as a real finding about this model's structure, not evidence the check only ever says yes — the crossing-detection path was separately confirmed to fire correctly against constructed adversarial curve pairs during unit testing (9 cases: both dominance directions, identical curves, a single crossing with its location correctly identified, weak dominance with tied values, and floating-point-noise edge cases correctly not flagged as spurious crossings), and against real simulated output via a full end-to-end Node.js integration test that evaluated the actual edited index.html script — not a hand-copied approximation — reproducing the documented seed-42 regression figures exactly (median wealth $559,223, median BLEI 1,965d, Gini 0.534, wealth poverty 16.6%) before the dominance check was ever run against them, then driving the real renderThresholdSensitivity()/drawThresholdCharts() render path in both headcount and gap views to confirm the callout text builds correctly and without error. Purely a reporting transform — computes no new agent state, draws no RNG, cannot affect the Main run, Baseline, or CCO-Only trajectories.

Smaller fixes. The poverty-gap toggle's own hover tooltip called the v4.11 metric "the poverty gap ratio" — but what it shows is the absolute dollar/day shortfall, not the textbook normalized ratio, which is the entire reason v4.11 reports it that way (see that release's own entry, above); corrected to avoid the word "ratio." The sidebar's "Run Validation Suite" button kept the pre-v4.2 name three releases after the panel and heading it opens were renamed "Internal Consistency & Behavioral Test Suite" specifically to avoid overstating what six internal checks establish; button text now matches. The Traditional Welfare Baseline preset's tooltip called it "the real-world reference point," language that could read as a claim the scenario models actual U.S. transfer programs (SNAP, EITC, TANF, Medicaid, unemployment insurance) rather than the absence of any offsetting mechanism at all; softened, with a matching new Known Limitations entry in index.html.

What the audit got right that this project had already extensively documented, and was not treated as a new finding. The Comfortable/Flourishing tier-label split at the identical 730-day threshold — flagged by the audit as risking an inflated cross-scenario comparison — has its own dedicated "v3.4 naming note" on this very page (further up, under BLEI Temporal Stability Tier System) and appears explicitly in the System comparison table's own caption; it is a deliberate, extensively pre-documented framework narrative choice (the top tier is called "Flourishing" specifically when CCO+PTF's generative mechanics make it structurally attainable, "Comfortable" when it's merely aspirational), not a previously-hidden defect, and was not changed unilaterally — this is Duke's framework-design call, not a code-audit finding. The audit's BU-conversion "reciprocal debit" concern doesn't hold against the actual runYear() code either: spend is subtracted from a.buBalance in the same statement block that computes convGain from that identical spend amount — the two state variables (unspent balance, wealth) are not double-counting the same entitlement, contrary to the audit's speculation. Several other findings — the internal-validation-suite framing, the LHS export's fixed-seed design, the CCO conversion "ledger" suggestion — restate design choices or limitations already documented at length (the suite's Level 1-3 ODD framing since v4.2, the LHS seed convention explicitly matching OAT's own since v4.6, the "tracked but not production-constrained" conversion-ledger caveat in Known Limitations since v4.0) and were not treated as new.

What did NOT get fixed, and why: the audit's larger structural proposals — a full CI-style test hierarchy, replacing positional function arguments with context objects across the engine, a full per-agent stock-flow ledger, a fourth "calibrated current-policy" comparison scenario, a rollout/transition-path model, person-years-in-poverty and time-to-tier-attainment metrics — are each reasonable, and each is a substantial engineering or framework-design undertaking in its own right, not a documentation fix; logged in CONTRIBUTING.md's Good First Issues and Model Architecture Feedback for Duke's consideration, not attempted here. Full technical detail in index.html's own changelog and CONTRIBUTING.md's v4.12 Release Notes.
v4.11 — poverty-gap ("avg. shortfall") view, prompted by an external methodology review of v4.10 (Sep 2026): One small feature addition, no simulation-mechanics changes. Duke relayed the v4.10 Threshold Sensitivity feature to an external AI system (Grok) for a methodology critique before extending it further — this project's now-standard practice, applied here to a design question rather than a code audit for the first time. The review reconfirmed the Atkinson (1987) citation as correctly used and the World Bank multi-line comparison as apt, then recommended one specific, concrete extension: the existing headcount-ratio curves (% of the population below a threshold — FGT-0 in the poverty-measurement literature) can't distinguish a scenario where the poor sit barely below a line from one where they sit far below it, since "two distributions can have identical headcounts at every line yet one can have systematically larger gaps."

What shipped. A new "Avg. shortfall" toggle switches both existing charts (wealth and BLEI) to a poverty-GAP view — FGT-1 in the same literature (Foster, J., Greer, J., & Thorbecke, E. (1984). "A Class of Decomposable Poverty Measures." Econometrica, 52(3), 761-766) — the mean per-capita shortfall below each threshold, averaged across the whole population (agents at or above the line count as zero). One deliberate departure from the textbook definition: FGT-1 is normally a threshold-normalized ratio, but normalizing by the threshold breaks down at threshold≤0 — and the wealth chart's own range deliberately extends to −$20,000 specifically so Baseline's WEALTH_FLOOR-pinned distribution renders as a real step (a v4.10 design choice, unaffected here). Reporting the absolute per-capita shortfall, in the same dollars/days as the chart's own axis, sidesteps that division problem while reading naturally as a direct "cost to close the gap" figure.

Validated the same way v4.10's own function was, plus one further cross-check. The core function (povertyGapAvg(), built on a one-time prefix-sum pass per distribution to keep the same O(log n)-per-query budget as povertyCDF()) was checked against a naive brute-force reference across 22,210 random trials — including arrays specifically constructed to mimic WEALTH_FLOOR pinning, since that's Baseline's actual shape — before this touched the shipped file; zero mismatches beyond floating-point rounding. A full end-to-end Node.js integration test then drove the actual edited script against the documented seed-42/Full Integration/20yr configuration for both Full Integration and Traditional Welfare Baseline, confirming the existing headcount figures were undisturbed (exact match, 16.6%/13.6%) and cross-checking the new function against an independent numerical integral of the already-validated headcount curve — a genuine mathematical identity (mean absolute gap at a threshold equals the integral of the CDF up to that point), not a restatement of the production code. One apparent disagreement, immediately adjacent to WEALTH_FLOOR where 68.6% of a sampled Baseline population sits at exactly one value, was tracked to the cross-check's own coarse numerical resolution near that sharp discontinuity — confirmed by an independent direct per-agent sum matching the production function's output exactly, and by showing the cross-check's own error shrink from 0.171 to 0.017 to 0.0016 as its resolution was refined 100-fold. The production function was correct throughout; only the auxiliary check needed a finer grid to agree with it.

The same review's data-gathering follow-up, checked with the same rigor. Two long-open items from this project's Good First Issues were separately handed to the same external system. Its 51-state, Census Vintage-2025-weighted recomputation of LIVING_WAGE_ANNUAL ($24.62/hr population-weighted, versus $23.7355/hr unweighted — both computed from current MIT data, the unweighted figure landing almost exactly on the currently-shipped value) had five of its 51 state-level inputs independently spot-checked against live MIT fetches this session and matched exactly, plus a partial reconstruction (the four largest-population states) confirming the population-weighted figure's direction and rough magnitude — but the full 51-state weighted arithmetic itself was not independently re-derived to the dollar, so the figure is documented as well-sourced reference data, not adopted into the engine, consistent with this constant's standing rule that any change needs its own dedicated mechanics-audit release. Its claim that the occupation-risk Kaggle dataset's license is actually unspecified — directly contradicting a v4.8 session's "third-party card says MIT" finding — could be neither confirmed nor refuted (Kaggle remains unreachable to automated fetching), which on its own means the earlier "MIT" finding should now be read as disputed rather than corroborated. The search for an answer surfaced something more useful than the answer itself: a 702-row occupation-automation dataset (exactly matching Frey & Osborne's own count) in the plotly/datasets GitHub repository, under a genuine first-party MIT license — a meaningfully cleaner starting point than the Kaggle listing, with one honest caveat of its own (an open issue in that repository questioning whether its MIT grant cleanly covers third-party-sourced data files).

What did NOT get fixed, and why: adopting the population-weighted LIVING_WAGE_ANNUAL figure into the engine (deliberately — see above); a row-by-row fidelity check of the new plotly/datasets lead against the Frey & Osborne appendix; a normalized (ratio) variant of the poverty-gap view alongside the absolute one shipped here; every other long-standing open item this session didn't touch — unchanged from v4.10. Full technical detail in index.html's own changelog and CONTRIBUTING.md's v4.11 Release Notes.
v4.10 — Poverty & Wealth Threshold Sensitivity, prompted directly by the framework's author (Sep 2026): One new reporting feature, no simulation-mechanics changes. This project had, by this point, had the same argument twice over a single committed dollar figure: v4.3 committed LIVING_WAGE_ANNUAL to $49,370, and v4.9's Meta AI audit tried to overturn it with a different single figure that turned out to rest on stale data. Rather than resolve that pattern by defending one more number, two new charts (interactive tool) show the full range instead of a point estimate: the population's cumulative distribution of final-year wealth and BLEI across every plausible threshold at once — the standard "poverty dominance" approach from the poverty-measurement literature (Atkinson, A.B. (1987). On the measurement of poverty. Econometrica, 55(4), 749-764; also the World Bank's practice of reporting global poverty at several lines simultaneously, e.g. $2.15/$3.65/$6.85 per day). Baseline, CCO-Only, and Your Settings are overlaid on the same axes: if one scenario's curve sits below another's across the whole range shown, it reduces poverty regardless of exactly where a reader believes the "true" line sits.

What is, and isn't, explorable this way, and why. Confirmed by grep before writing any code: CFG.POVERTY_LINE has exactly one call site in the entire engine (inside calcMetrics()'s poverty computation) — a pure post-hoc classification threshold on already-computed wealth, never touching RNG or dynamics, so exploring it across a range costs nothing extra. CFG.LIVING_WAGE_ANNUAL, by contrast, is genuinely baked into runYear()'s annual wealth update — a flow/cost anchor that mechanically shapes the wealth trajectory itself. Making that explorable the same way would mean re-running the simulation once per candidate value, not re-reading an already-computed array — a materially larger, mechanics-adjacent feature, deliberately out of scope here and flagged as the clear next step (CONTRIBUTING.md's Good First Issues). One further nuance worth naming: the BLEI tier cutoffs look similar to POVERTY_LINE on the surface but aren't in the same free category — BLEI_PRECARIOUS_MAX (30 days) is read twice inside runYear() itself, gating both a wage-growth bonus and a PTF-adoption bonus, so it's genuinely mechanics-relevant. The new BLEI chart doesn't touch this: it reads the already-computed continuous BLEI score at many threshold points for display, which is exactly as safe as POVERTY_LINE exploration — it's the CFG constants themselves that would be unsafe to slide, not the act of evaluating an already-computed value at a different point.

One external reference point, verified the way this project now verifies everything external. A new CFG.FED_POVERTY_LINE_1P constant ($15,960/yr, the 2026 HHS ASPE guideline for a one-person household) appears as labeled callout text beneath the wealth chart — explicitly marked "external reference, not a simulation parameter," same category as CFG.NORDIC_GINI elsewhere in this file. A first fetch attempt against the live ASPE page returned a stale cached snapshot from 2017 (the 1-person figure it showed, $15,060, was immediately recognizable as years out of date) — caught rather than used, and cross-checked instead against an independently-dated primary-source PDF (a Lifeline Safe Connections Act eligibility table, explicitly dated January 15, 2026, HHS-sourced) plus three further independent citations, all converging on $15,960. A much easier verification than the LIVING_WAGE_ANNUAL episodes — a single government-published number, no methodology dispute attached — but the same "don't trust the first thing that loads" discipline applied anyway.

Validation. The core povertyCDF() function (binary search over an already-sorted array) was unit-tested against a naive linear-scan reference across 12,500 random trials before touching the actual file — zero mismatches, including the realistic duplicate-heavy case of many agents pinned exactly at WEALTH_FLOOR. After integration, a full end-to-end Node.js test evaluated the actual edited script in a stubbed DOM-free sandbox, drove the real makeLatentPopulation()/instantiateAgent()/runYear() functions against the documented seed-42/Full Integration/20yr configuration, and cross-checked the new function's output against calcMetrics()'s and bleiMetrics()'s own existing figures at the model's default thresholds — exact match on both (16.6% wealth poverty, 13.6% BLEI poverty). Chart.js rendering/DOM behavior itself is not verified in an actual browser, the same sandbox limitation as every CSS/UI change since v4.8.

What did NOT get fixed, and why: making LIVING_WAGE_ANNUAL (or BASE_DAILY_COST) explorable the same way — deliberately, mechanics-adjacent work belongs in its own audited release; additional named external benchmarks beyond the one federal guideline added here; an interactive slider/marker layered on the static curves (Chart.js's own hover tooltips already approximate this for free); every long-standing open item this session didn't touch (WEALTH_INIT_MU/SCF gap, WEALTH_FLOOR/TARGET_* recalibration, occupation-stratified automationRisk, unbounded long-horizon wealth growth) — unchanged from v4.9. One small, unrelated finding caught in passing while adding this entry: POVERTY_LINE itself has never carried a citation anywhere in this codebase, unlike almost every other calibration constant — now flagged as its own open item in CONTRIBUTING.md's Calibration Validation table rather than left unnoticed. Full technical detail in index.html's own changelog and CONTRIBUTING.md's v4.10 Release Notes.
v4.9 — a table-overflow fix and a verified external audit (Sep 2026): Duke supplied a screenshot pair (the same page at 80% and 100% browser zoom) showing the Social Security-Anchored Cohorts table's rightmost column cut off at 100% zoom, and separately forwarded a Meta AI audit of v4.8 with an explicit instruction not to assume it was error-free. Both are handled below.

Table-overflow fix, traced to a specific missing rule. The System comparison table already scrolls horizontally when it needs more room than it has — it sits inside a container with its own overflow-x:auto. The Social Security-Anchored Cohorts table (added v4.5) is a plain table dropped into a card with no such rule, so when its six nowrap column headers needed more width than a typical 100%-zoom viewport had left after the sidebar, the overflow ran into a page-level overflow-x:hidden rule (added defensively so no single wide element could blow out the page) and got clipped rather than scrolled. At 80% zoom there's simply more CSS-pixel width available, so the same table never hit that ceiling. Fixed with the same technique the System comparison table already uses, scoped to just this element via a small reusable class. Not verified in an actual browser (same sandbox limitation as v4.8's own CSS fixes) — a visual check at a few zoom levels would be worth doing after this deploys. Separately, Duke confirmed the v4.8 tooltip fix is working correctly in production.

The Meta AI audit: one contribution verified correct, one verified wrong. Meta supplied two things beyond the audit text itself: a modular (ES-module) rewrite of the v4.8 Node.js harness, and a proposed recalibration of LIVING_WAGE_ANNUAL. Neither was taken on Meta's word — both were actually run. The modular harness rewrite reproduces the documented seed-42/Full Integration/20yr regression figures exactly and reproduces the direction and approximate magnitude of the v4.8 WEALTH_FLOOR sweep — a genuine, working contribution, though not adopted as the project's harness in this pass (that's a layout decision for the authors, not something a verification pass should decide unilaterally). The living-wage proposal — cutting LIVING_WAGE_ANNUAL from $49,370 to a population-weighted $35,021 — did not hold up: Meta's arithmetic on its own 51-state dataset was correct, but the dataset itself was a 2024 snapshot of MIT's Living Wage Calculator. Fetching MIT's own site directly for its current (February 2026) data build found "1 Adult, 0 Children" figures well above what the 2024 snapshot showed for the same states — California $30.48/hr (was $19.41 in the cited 2024 data), DC $26.72/hr (was $20.80), and even low-cost Mississippi at $20.69/hr (was $14.20). The proposed cut would have replaced a defensible figure with a stale one. Not adopted; a properly current, directly-sourced population-weighted recomputation remains a legitimate future good-first-issue, scoped precisely in CONTRIBUTING.md's Good First Issues.

Also resolved this release: the DOI-archived OSF snapshot's metadata, flagged as an open loose end since v4.8 (it still showed CC BY 4.0 for the whole bundle after the code moved to Apache 2.0), has been updated directly by Duke at OSF to reflect the split — see the footer, above, and CONTRIBUTING.md's License section.

What did NOT get fixed, and why: the LIVING_WAGE_ANNUAL change proposed by the external audit (deliberately — the evidence points the other direction, see above); adopting the modular harness layout (a real option, not a decision for a verification pass to make); every other open item this audit re-surfaced but did not newly identify (unchanged from v4.8 — see CONTRIBUTING.md's Model Architecture Feedback). Full technical detail in index.html's own changelog and CONTRIBUTING.md's v4.9 Release Notes.
v4.8 — UI fixes from direct testing, a licensing decision, and two completed follow-ups from v4.7 (Sep 2026): Unlike most releases documented here, the primary driver this time was Duke actually using the deployed page rather than a code audit or an external review. Five UI reports, all addressed; one governance decision, resolved; two data-gathering follow-ups from v4.7, completed.

Tooltip text running off the browser viewport. Root cause, found by tracing the CSS rather than guessing: the .abbr-link class was originally written for short (2-4 word) header acronym tips — fixed white-space:nowrap, no width limit — but has since been reused for several full-sentence ⓘ explanatory tooltips, the longest (on the interactive tool's PTF adoption-cap toggle) running to roughly 500 characters rendered as one unbroken line. Fixed by giving .abbr-link the same wrap-and-cap behavior .tip-host (a newer, correctly-built class) already had. Separately, the Scenario Presets grid — two ~130px columns inside a 290px sidebar — centered each tooltip on its button, which needs ~85-95px of clearance on both sides that a 130px column doesn't have; left-column preset tooltips ran off the left edge of the browser window. Fixed with edge-anchored positioning specific to that grid.

Chart-grid CSS that could overflow at non-default browser zoom, and boxes not fitting their content. Several grid layouts used a bare 1fr column track, whose minimum width defaults to its content's own intrinsic size rather than 0 — at some viewport/zoom combinations this can keep a track from shrinking, pushing a chart or table off-screen instead of wrapping it. Changed to minmax(0,1fr) throughout (the standard fix), added min-width:0 to the affected card/KPI elements, and added a defensive canvas{max-width:100%} rule. A second, later-cascading duplicate of one grid rule — without the fix — was found silently overriding the first, correctly-fixed one; both are now consistent.

The BLEI-components chart's benefitDays line looked missing. Checked directly with a fresh Node.js harness rather than assumed: at seed 42/Full Integration/20yr, cashDays runs 201d→1,915d while benefitDays sits flat at 15.14d the entire run (BU is a fixed monthly allocation, so its BLEI contribution genuinely doesn't grow) — not a computation bug, but a ~100×-larger series squashing two much smaller ones into an indistinguishable sliver on one shared linear axis. Fixed with a dual-axis chart (cashDays on the left, incomeDays/benefitDays on their own right-hand scale), which now shows both smaller series' actual shape, including a real crossover around year 11-12.

System Stability scoring the Traditional Welfare Baseline higher than Full Integration was reported as a possible bug — it is not. This is the coefficient-of-variation behavior already disclosed since v4.2/v4.4 (see Known Limitations): a population pinned at a hard wealth floor has almost no variance left to measure, so it scores as "stable" by this metric's specific definition regardless of whether that flatness is a thriving equilibrium or a floor with nowhere left to fall. No code change; the tooltip fix above should make the existing ⓘ explanation on this exact KPI actually readable in place, which is plausibly why it read as a bug before now.

Source code relicensed to the Apache License 2.0. Both external v4.7 reviews independently flagged CC BY 4.0 as an unconventional choice for software — it has no source-distribution or patent terms — and suggested the common split of an OSI license for code, CC BY 4.0 for papers. Logged as an open governance question in v4.7; resolved this release on Duke's explicit authorization. Apache 2.0 was chosen over MIT for its explicit patent grant and patent-retaliation clause. This page's own content, like all Better To Best Research Hub papers, is unaffected — still CC BY 4.0. The interactive tool's own footer and citation text now disclose the split explicitly. Full license text and split-licensing rationale in CONTRIBUTING.md.

WEALTH_FLOOR sensitivity sweep — the item flagged as blocked-on-a-harness at the end of v4.7. A standalone Node.js harness was built fresh this session (pure functions transcribed directly from index.html) and, before being trusted for anything, validated by reproducing the documented seed-42/Full Integration/20yr regression figures exactly — median wealth $559,223 to the dollar, plus Gini, BLEI, poverty, stability, and EDC all matching too. N=500 seeds, 4 candidate floor values ($0, −$10,000 current, −$25,000, −$50,000), Full Integration and Traditional Welfare Baseline. Finding: Baseline is completely invariant to the floor's exact value on every metric except the trivial fact that its median wealth equals whatever the floor is — once a Baseline agent starts declining nothing ever reverses it, so how deep the floor goes never matters. Full Integration shows a real, modest, monotonic sensitivity (Gini 0.515→0.520, wealth poverty 14.1%→17.5% as the floor deepens from $0 to −$50,000) via a specific, verified mechanism: agents who dip negative and later recover have their BLEI liquid-wealth term clamped to exactly 0 for every year they're underwater, however deep — so a deeper floor doesn't worsen any single year, but does mean more years spent at that clamped zero before finally turning positive. Not acted on: the shipped default stays at −$10,000; this is data for the framework's authors to weigh, following the same "sweep, don't decide" pattern as the existing λ Calibration Status sweep. Full table and mechanism discussion in CONTRIBUTING.md's v4.8 Release Notes.

Occupation-risk dataset lead — stronger evidence, still one step short of full verification. v4.7 flagged a Kaggle-hosted dataset that might be a complete, machine-readable version of Frey & Osborne's 702-occupation table, without checking completeness or license. This session found independent, non-Kaggle corroboration of the same 702-row count and a third-party dataset card naming the exact needed columns and stating an MIT license — meaningfully stronger than v4.7's open question, but still short of pulling the actual file and diffing it against the paper's own appendix, which needs Kaggle access this session's sandboxed environment didn't have. The "FOWIGS" citation from the second v4.7 ChatGPT pass remains unverified — a fresh search again found no trace of it. Full detail in CONTRIBUTING.md's Good First Issues.

What did NOT get fixed, and why: acting on the WEALTH_FLOOR sweep's findings (deliberately — see above); pulling and verifying the occupation-risk CSV itself (blocked on access); the v4.6-flagged "no plateau" long-horizon wealth-growth question (still open, needs its own dedicated release); TARGET_WEALTH/TARGET_POVERTY/TARGET_GINI recalibration (still a framework-author decision). Full technical detail in index.html's own changelog and CONTRIBUTING.md's v4.8 Release Notes.
v4.7 — dependency and documentation hygiene, prompted by two rounds of external review (Sep 2026): Nothing in this release changes a single simulation output number. A "deep research"-style ChatGPT audit of this project was checked claim-by-claim against the actual code (this project's standing practice), then a second ChatGPT pass answered six follow-up questions the first round of checking raised.

Chart.js is now pinned with a real, verified SRI hash — closing an item open since v3.8, when two earlier reviewers each supplied a hash "from memory" that proved unusable. This time the hash was computed directly against the actual downloaded npm package (version confirmed via the file's own banner), and — independently — the second ChatGPT pass computed and reported the identical 64-character digest from the same npm artifact, a meaningful cross-check given SHA-384 is a deterministic function of file bytes. Rather than pin that hash against the still-unverified cdnjs URL, the script tag now points at a jsDelivr npm mirror, which serves npm packages byte-for-byte by construction — the pinned hash is valid by construction, not by hope.

A new open calibration finding, logged but not corrected. Agent wealth is drawn lognormal(10.5, 1.2) — now named WEALTH_INIT_MU/WEALTH_INIT_SIGMA in the engine, same values — with a median of exactly e^10.5 ≈ $36K, matching this framework's own long-standing "Fed SCF 2022" citation. The actual 2022 Survey of Consumer Finances reports median household net worth at ≈$193,000 (Kuhn & Ríos-Rull, NBER working paper, 2025) — roughly 5.3× higher. Both external reviews independently surfaced this; genuinely separate from the wealth-init distribution's already-documented inherent Gini ≈0.60, since Gini of a lognormal is a function of σ alone, with no μ term — correcting the median would move absolute wealth-poverty rates without touching Gini at all. Given how foundational this single draw is to every downstream figure the model produces, fixing it is being treated as its own future mechanics-audit-plus-large-N-restudy candidate, not a value swap alongside a hygiene release — see Known Limitations, below, and CONTRIBUTING.md's Model Architecture Feedback.

PTF's two "reduction" figures, disambiguated. This page's own Key Concepts card and JSON appendix stated PTF establishments "achieve 40–60% overhead reductions" without distinguishing that Mondragon-analogy figure from the 12–16% consumer-facing cost-reduction rate (PTF_savings_rate) the engine actually implements — the exact pair of numbers CONTRIBUTING.md's own v4.2 changelog already had to disentangle once before in an old README. The first ChatGPT audit cited the 40–60% figure as if it were the simulation's own parameter; both spots on this page now say explicitly that it isn't.

A quick scatter now appears in-app after LHS exports — wealth poverty vs. BU allocation across the 100 sampled design points, reading data already computed for the CSV, with zero new simulation runs or RNG draws. A small UX closure, not a methodology change; the CSV-plus-external-Sobol/Morris workflow is unaffected.

What the audits got wrong, documented rather than quietly ignored: the first ChatGPT pass claimed the interactive tool "only has CSV" export (JSON has existed since v3.3), claimed a "Citation Generator" UI feature that doesn't exist (the footer's citation is a static string), conflated the recession income-shock mechanism with inflation (two separate mechanics), misattributed the $1,200 BU figure to CEX data (it's tied to the Alaska PFD analogue), and recommended splitting the codebase into modules and adding a Dockerfile — both of which either contradict an explicit standing constraint or misdiagnose the project's actual reproducibility risk (cross-browser floating-point drift, not a server environment issue). The second pass, while substantially corroborating the above, cited a "FOWIGS" Frey & Osborne/BLS-OES crosswalk dataset that a direct search could not substantiate — noted as unverified rather than relied upon.

What did NOT get fixed, and why: correcting WEALTH_INIT_MU itself (needs its own audit-and-restudy pass); a WEALTH_FLOOR/TARGET_* sensitivity sweep proposed alongside this release (blocked on validating a Node harness against the documented seed-42 regression table first, rather than risk a fresh unverified reimplementation); building on the newly-found occupation-risk dataset lead (its completeness and license need direct verification first); and relicensing the code away from CC BY 4.0 (both reviews independently flagged this as unconventional for software and suggested an OSI license for the code specifically — a real, precedented pattern, but a governance decision for this project's authors, not something to change unilaterally). Full technical detail in index.html's own changelog and CONTRIBUTING.md's v4.7 Release Notes.
BLEI Temporal Stability Tier System

The six BLEI tiers replace binary poverty/non-poverty classification and gate agent advancement probability in the simulation. Tier assignment derives from BLEI score (days of basic living covered). The Flourishing tier threshold of 730 days reflects the capital commitment horizon required for entrepreneurial ventures to become viable without required break-even within the first year. v3.1 tier naming: the top tier (≥730 days) is labelled Flourishing when both CCO and PTF are active — reflecting the maturing generative effects of the full system. Without CCO+PTF, reaching 730+ days represents strong temporal stability but is labelled Comfortable, consistent with BLEI §4.

TierBLEI RangeCharacterizationP(Advance)
0 — Crisis< 7 daysSurvival-mode cognition; zero advancement capacity; immediate intervention required≈ 0
1 — Precarious7–30 daysOne disruption from crisis; income fully consumed by extraction and basic needs; Lusardi et al. (2011) $2,000-shock vulnerability zone. BLEI poverty = Crisis + Precarious combined.≈ 0.02
2 — Threshold30–120 daysBLEI-defined poverty line; limited advancement feasible; positive FBS emerging0.08–0.15
3 — Stable120–365 daysOne full year covered; measured risk-taking and education investment viable; Carroll (1997) buffer-stock target zone0.20–0.35
4 — Secure365–730 daysOne to two years covered; creative and entrepreneurial participation feasible within two-year payoff horizon0.40–0.60
5 — Flourishing (or Comfortable without CCO+PTF)> 730 daysTwo-year capital commitment horizon unlocked; ventures without early-stage break-even are viable; extended planning horizon with reduced liquidity-constrained decision-making0.65+
Simulation benchmark: At least 97% of CCO-PTF participants must reach BLEI Tier 2 (Threshold, ≥ 30 days) by simulation Year 5. At least 80% must reach Tier 4 (Secure, ≥ 365 days) by Year 15. These targets supersede the income-headcount benchmarks used in prior versions. Sensitivity analysis in the BLEI Foundation Paper confirms these targets hold across ε_food ∈ [1.50, 3.00] and r_a ∈ [0.02, 0.07].
v3.4 naming note — "Comfortable" vs. "Flourishing": The label "Comfortable" (vs. "Flourishing") is used for baseline/CCO-only configurations where the 730+ day tier is aspirational without the cost reductions provided by PTF/PTH. Both labels refer to the same 730-day threshold. "Flourishing" is used when CCO+PTF are both active because the cost-reduction structure makes the tier structurally attainable. The latest version of the BLEI paper formalizes this distinction.
Agent Architecture — v3.3 Extraction-Accurate Model
This Python reference implementation is a v3.3-era snapshot and has not been kept in sync with the shipped simulation, now at v4.14. Specific known-stale details include the automation-risk distribution (shows the pre-v4.3 uniform draw, not the current bimodal one — see Mathematical Framework §3), the FBS advancement coefficient λ (shows the pre-v4.4 range — see §4 and its calibration-status note), and the wealth-accumulation mechanic more broadly (this snippet predates v4.3's wage-scale unit fix entirely). Rather than risk introducing new errors by hand-porting three releases of mechanics changes into a second, untested implementation, this code is preserved as historical/illustrative rather than rewritten — for the authoritative, currently-validated model, see the actual JS source in index.html (github.com/BetterToBest/compassionism-simulation) and CONTRIBUTING.md's Cumulative Bug Fixes for exactly what changed and why.

The v3.1 agent class adds an annual expense system, heterogeneous AI automation risk, negative wealth floor, and PTF dynamic adoption. The corrected agent also separates PTF benefits (cost reduction) from PTH benefits (Acre Equity growth), preventing the double-counting present in earlier versions. The BLEI income buffer uses actual agent wage rather than the wealth/60 proxy. BU_food_eff ($990) is used for BLEI; BU·ε_blended ($2,502) is used for EPPM. v3.3 addition: wage growth stability premium applies diminishing returns above WAGE_MEDIAN_SIU (35 SIU), preventing structural compounding at high wages. The constant ANNUAL_BASE_COST is renamed SIM_COST_SCALE to avoid apparent contradiction with BASE_DAILY_COST.

v3.1 agent additions: automation_risk ∈ [0.2, 1.0] drawn uniformly at initialisation — creates heterogeneous inequality under AI displacement (high-risk agents lose wages faster). wealth floor changed from 0 to −$10,000 — allows debt and insolvency dynamics. PTF adoption now dynamic: agents join via economic distress (BLEI < Precarious) or social diffusion at low base rate, not only at initialisation.
# ═══════════════════════════════════════════════════════════════ # Agent — v3.3 Extraction-Accurate BLEI-Integrated Model # Key v3.0/3.1 corrections: # · Annual expense system: agents pay living costs; wealth depletes without CCO # · PTF: cost-reduction factor, NOT wealth injection (eliminates ex nihilo money) # · PTH: AE appreciation tracked separately from rent savings (no double-count) # · BLEI mInc: uses actual wage, not wealth/60 proxy # · automationRisk: heterogeneous AI displacement per agent [0.2, 1.0] # · wealth floor: -10,000 (was 0/100 — allows debt dynamics) # · Recession: incomeMultiplier replaces ambiguous 'severity' field # · Tier naming: 'Flourishing' (CCO+PTF active) or 'Comfortable' (without) # v3.3 additions: # · Wage stability premium: DR factor = 1/(1 + 0.5*max(0, wage/WAGE_MEDIAN_SIU - 1)) # · SIM_COST_SCALE: renamed from ANNUAL_BASE_COST (avoids scale confusion) # · Gini zero-wealth: totW=0 → Gini=0 (mathematically correct; was ||1 fake fix) # · NaN/Inf guards throughout agentBLEI, agentEDC, runYear, calcMetrics # · p10/p90: proper linear interpolation (not index rounding) # BU accounting: BLEI uses food BU only ($990); EPPM uses full $2,502 # ═══════════════════════════════════════════════════════════════ class Agent: def __init__(self, agent_id: int): self.id = agent_id self.tenure_months = 0 # ── Primary state ────────────────────────────────────────────── self.wealth = np.random.lognormal(10.5, 1.2) # USD nominal self.income = np.random.lognormal(3.5, 0.5) # SIU (sim income units, not USD) # ── Participation flags ──────────────────────────────────────── self.cco_participant = np.random.choice([True, False], p=[0.78, 0.22]) self.pth_resident = np.random.choice([True, False], p=[0.20, 0.80]) self.ptf_member = np.random.choice([True, False], p=[0.18, 0.82]) self.octave_level = 0 self.quality_score = np.random.uniform(1, 9) # ── v3.1: heterogeneous AI automation risk ───────────────────── # High risk (→1.0) = occupation highly exposed to automation displacement # Low risk (→0.2) = occupation resilient (creative, relational, novel) # Per-agent displacement = population_rate × automation_risk self.automation_risk = np.random.uniform(0.2, 1.0) # STALE (v3.3) — v4.3+ uses a 47/53 bimodal Beta(6,1)/Beta(1,6) mixture, see §3 # ── BLEI state variables ─────────────────────────────────────── self.bu_monthly = 1200.0 if self.cco_participant else 0.0 self.bu_food_eff = 990.0 if self.cco_participant else 0.0 self.bu_eppm = 2502.0 if self.cco_participant else 0.0 self.bu_epsilon_food = 2.64 self.acre_equity = 0.0 self.edc_full = self._calc_edc() self.edc_residual = self._calc_edc_residual() self.fbs = 0.0 self.blei_score = 0.0 self.blei_tier = 0 self.lambda_cap = np.random.uniform(0.001, 0.008) # STALE (v3.3) — v4.4 uses U(0.0001654, 0.0013233), see Math. Framework §4 self._update_blei() self._update_fbs() def _gamma(self) -> float: """γ transitions from 0.12 (entry) to 0.20 (CCO-established, Month 6+).""" if not self.cco_participant: return 0.12 if self.tenure_months < 3: return 0.12 elif self.tenure_months < 6: t = (self.tenure_months - 3) / 3.0 return 0.12 + t * (0.20 - 0.12) return 0.20 def _ae_haircut(self) -> float: m = self.tenure_months if m < 7: return 0.15 elif m < 25: return 0.40 elif m < 61: return 0.65 else: return 0.85 def _update_blei(self): """ BLEI = cashDays + incomeDays + benefitDays = [L + γ·Y + BU_food_eff] / C_basic_cash Three conceptually distinct buffers: cashDays: liquid / dailyCost (stock buffer) incomeDays: γ·income / dailyCost (flow buffer; v3.1: actual income, not wealth/60) benefitDays: bu_food_eff / dailyCost (BU food basket buffer) """ gamma = self._gamma() h_ae = self._ae_haircut() if self.pth_resident else 0.0 liquid = max(0.0, self.wealth) * 0.20 # v3.1: liquid capped at 0 if wealth negative ae_liq = h_ae * self.acre_equity income_buf = gamma * self.income # v3.1 fix: actual income (was wealth/60) if self.cco_participant: daily_cash = (600 + 150 + 200) / 30 else: daily_cash = (1300 + 400 + 150 + 200) / 30 self.blei_score = (liquid + ae_liq + income_buf + self.bu_food_eff) / max(daily_cash, 1) self.blei_tier = self._tier(self.blei_score) def _tier(self, blei: float) -> int: if blei < 7: return 0 elif blei < 30: return 1 elif blei < 120: return 2 elif blei < 365: return 3 elif blei < 730: return 4 else: return 5 # Flourishing (CCO+PTF) or Comfortable (without) def update_wealth(self, cco_income: float, shock: float = 1.0, acre_rate: float = 0.04, sim_cost_scale: float = 1500.0, ai_displacement_rate: float = 0.0, inflation_mult: float = 1.0): """ Annual wealth update — v3.3 extraction-accurate with expense system. Key changes from prior versions: · Annual living costs subtracted (creates realistic wealth pressure) · PTF modelled as COST REDUCTION FACTOR, not wealth addition · PTH: AE growth tracked separately from living cost reduction (no double-count) · Wealth floor: WEALTH_FLOOR (-10,000), not 0 — allows debt dynamics · AI displacement: per-agent via self.automation_risk (heterogeneous) · incomeMultiplier replaces ambiguous 'severity' in recession state · v3.3: wage stability premium applies diminishing returns (Mullainathan & Shafir 2013) · v3.3: SIM_COST_SCALE replaces ANNUAL_BASE_COST (avoids scale confusion) """ self.tenure_months += 1 # Wage dynamics: base growth + stability premium (DR) - AI displacement wage_growth = 0.010 if self.blei_tier >= 2: # v3.3: stability premium with diminishing returns dr_factor = 1.0 / (1.0 + 0.5 * max(0, self.income / WAGE_MEDIAN_SIU - 1)) wage_growth += 0.008 * dr_factor # stability premium; M&S 2013 + Carroll 1997 wage_growth += self.octave_level * 0.003 # skill premium agent_ai_disp = ai_displacement_rate * self.automation_risk # heterogeneous wage_growth -= agent_ai_disp self.income = max(self.income * 0.80, self.income * (1 + wage_growth)) # Annual living cost with PTF cost reduction (NOT wealth injection) # PTH covers housing component (35%); CCO BU covers food (20%) cost_factor = 1.0 if self.ptf_member: savings_rate = 0.12 # PTF: 12% cost reduction cost_factor *= (1 - savings_rate) if self.pth_resident: cost_factor *= 0.65 # housing covered if self.cco_participant: cost_factor *= 0.80 # BU food basket living_cost = sim_cost_scale * inflation_mult * cost_factor # Net wealth: wage income - living costs + CCO conversion income self.wealth += self.income * 12 * shock - living_cost + cco_income * shock # PTH: Acre Equity growth (SEPARATE from cost savings above — no double-count) if self.pth_resident: appr = self.acre_equity * (acre_rate / 12) self.acre_equity += (600 + appr) # payment + appreciation # v3.1: negative wealth floor allows debt (was max(wealth, 0)) WEALTH_FLOOR = -10000 self.wealth = max(self.wealth, WEALTH_FLOOR) self._update_blei() self._update_fbs() def try_ptf_adoption(self): """v3.1: dynamic PTF adoption via distress and social diffusion.""" if self.ptf_member: return adopt_prob = 0.005 if self.blei_tier < 2: adopt_prob += 0.015 # economic distress if np.random.random() < adopt_prob: self.ptf_member = True @property def blei_poverty(self) -> bool: """BLEI poverty = Crisis or Precarious (BLEI < 30 days); primary poverty indicator v3.3.""" return self.blei_tier < 2
Simulation Engine — v3.3 Constants
Same caveat as Agent Architecture, above: this is a v3.3-era Python snapshot, not kept in sync with the shipped v4.14 simulation. Most visibly, SIM_COST_SCALE is shown here as the operative driver of the wealth-accumulation ratio (income×12 / SIM_COST_SCALE) — that mechanic was replaced entirely in v4.3 by the WAGE_TO_USD/LIVING_WAGE_ANNUAL formula in Mathematical Framework §2, and the validation assertion below (gini_edc_adjusted < 0.22) reflects a target value that was never reconciled with the shipped code's own CFG.TARGET_GINI = 0.25, let alone the model's actual measured Gini (0.518 under v4.4 — see Performance Comparison). Preserved as historical/illustrative rather than rewritten, for the same reasons given above — see index.html and CONTRIBUTING.md for the current, validated implementation.

The Monte Carlo engine adds the annual expense system, AI automation displacement, negative wealth floor, BLEI poverty tracking, and population-level recession model. The incomeMultiplier field in recession state (renamed from severity) makes the directional meaning unambiguous: 0.90 means agents earn 90% of normal income (10% loss) at the distribution's mode. v3.3: recession severity now drawn from a beta(5,2) distribution over [0.70, 0.95] for NBER-calibrated realism; SIM_COST_SCALE renamed from ANNUAL_BASE_COST; WAGE_MEDIAN_SIU added as diminishing returns reference.

# ═══════════════════════════════════════════════════════════════ # Simulation Constants — v3.3 # v3.1: ANNUAL_BASE_COST, WEALTH_FLOOR, AI displacement schedule # v3.1: incomeMultiplier replaces severity; BLEI poverty tracked # v3.3: SIM_COST_SCALE (renamed from ANNUAL_BASE_COST) # v3.3: WAGE_MEDIAN_SIU for diminishing returns # v3.3: RECESSION_BETA_A/B for beta(5,2) distribution over [0.70, 0.95] # ═══════════════════════════════════════════════════════════════ # BU accounting (unchanged) BU_MONTHLY_ADULT = 1200 BU_FOOD_EFF = 990 # BLEI numerator (food BU only) BU_EPPM = 2502 # EPPM full blended value BU_EPSILON_FOOD = 2.64 BU_EPSILON_UTIL = 1.80 # PTH PTH_PAYMENT = 600 # 100% routes to Acre Equity (EDC = 0) ACRE_APPRECIATION = 0.04 # annual r_a; monthly: r_a/12 # v3.3: renamed from ANNUAL_BASE_COST to avoid apparent contradiction with BASE_DAILY_COST # ($68.33/day ≈ $24,941/yr vs 1,500 SIU sim scale — different unit systems) # Operative ratio: income*12 / SIM_COST_SCALE # Baseline only: ratio < 1 → wealth depletion (creates realistic poverty) # Full CCO+PTF+PTH: ratio > 1 → wealth accumulation # PTF applied as cost reduction factor; NOT added to wealth SIM_COST_SCALE = 1500 # calibrated simulation units; renamed from ANNUAL_BASE_COST # v3.3: reference wage for diminishing returns on stability premium WAGE_MEDIAN_SIU = 35 # median SIU wage; DR formula: 1/(1 + 0.5*max(0, wage/35 - 1)) # v3.1: negative wealth floor — allows debt/insolvency dynamics WEALTH_FLOOR = -10000 # was 0/100 in prior versions # v3.1: AI automation displacement schedule (Duke's labour market notes) # Labour markets cannot reabsorb past 30% displacement (~yr 5, ≈2030) # Demand contracts at 50% displacement (~yr 15, ≈2040) # Per-agent displacement = population_rate × agent.automation_risk AI_DISPLACEMENT_YEAR_1 = 5 AI_DISPLACEMENT_YEAR_2 = 15 AI_DISPLACEMENT_RATE_1 = 0.012 # annual wage drag, phase 1 AI_DISPLACEMENT_RATE_2 = 0.022 # annual wage drag, phase 2 # Synergy SYNERGY_THETA_MIN = 0.05 SYNERGY_THETA_MAX = 0.25 NETWORK_THRESHOLD = 0.55 # BLEI tier thresholds BLEI_CRISIS = 7 BLEI_PRECARIOUS = 30 # BLEI poverty = Crisis + Precarious (< 30 days) BLEI_THRESHOLD = 120 BLEI_STABLE = 365 BLEI_SECURE = 730 # Flourishing/Comfortable threshold # v3.3: beta distribution parameters for recession severity [v4.0: mode figure corrected] # beta(5,2) over [0,1] → mode at (5-1)/(5+2-2)=0.80; scaled to [0.70, 0.95] → mode = 0.90 # 0.90 incomeMultiplier = 90% of normal income = 10% loss (mean/median ≈0.88, ~12% loss) # Tail extends to 0.70 (30% loss) — calibrated against NBER post-WWII data # Prior (v3.1): Uniform(0.65, 0.85) overstated frequency of severe recessions RECESSION_BETA_A = 5 # beta(5,2) shape parameter a RECESSION_BETA_B = 2 # beta(5,2) shape parameter b; incomeMultiplier = 0.70 + beta*0.25 SIMULATION_RUNS = 10000 YEARS = 20 # v3.3: Recession state uses incomeMultiplier with beta(5,2) distribution # v3.1 renamed from 'severity' — 0.90 means 90% of normal income (10% loss) at the mode # v3.3 range: [0.70, 0.95]; v3.1 range was [0.65, 0.85] (uniform) class RecessionState: active: bool = False years_left: int = 0 income_multiplier: float = 1.0 # v3.1: renamed from 'severity'; v3.3: beta(5,2) drawn def update_recession(state: RecessionState) -> RecessionState: if state.active: state.years_left -= 1 if state.years_left <= 0: state.active = False; state.income_multiplier = 1.0 elif np.random.random() < 0.10: state.active = True state.years_left = np.random.randint(2, 5) # 2-4 year recession # v3.3: beta(5,2) over [0.70, 0.95]; mode = 0.90 (NBER post-WWII calibration) state.income_multiplier = 0.70 + np.random.beta(RECESSION_BETA_A, RECESSION_BETA_B) * 0.25 return state class MonteCarloAnalysis: def __init__(self, n=SIMULATION_RUNS): self.n = n def run(self): results = [] for _ in range(self.n): params = { 'bu_monthly': np.random.uniform(1000, 1500), 'pth_uptake': np.random.uniform(0.15, 0.25), 'ptf_share': np.random.uniform(0.12, 0.25), 'network_density': np.random.uniform(0.40, 0.95), 'participation': np.random.uniform(0.60, 0.95), 'bu_epsilon_food': np.random.uniform(1.50, 3.00), 'acre_rate': np.random.uniform(0.02, 0.07), 'octave_max': np.random.randint(4, 9), 'quality_accuracy': np.random.uniform(0.70, 0.95), 'sim_cost_scale': np.random.uniform(1200, 1800), # v3.3: renamed from annual_base_cost 'inflation_rate': np.random.uniform(0.00, 0.04), # v3.1 } theta = synergy_theta(params['network_density']) results.append(self._run_scenario(params, theta)) return self._aggregate(results) def validate(self, r: dict): """Internal calibration benchmarks — design targets, not external validation.""" assert r['blei_threshold_rate'][1] > 0.95 assert r['blei_secure_rate'][1] > 0.80 assert r['gini_edc_adjusted'][1] < 0.22 # STALE target — CFG.TARGET_GINI=0.25 in shipped code; measured v4.4 output is 0.518 assert r['median_eppm'][1] > 2.00 assert r['system_stability'] > 0.90 assert r['blei_poverty_rate'][1] < 0.05 # <5% Crisis+Precarious # v3.3: participant stratification and validation suite assert r['participant_poverty_rate'] <= r['non_participant_poverty_rate'] # CCO benefit direction assert all(v == 'PASS' for v in r['validation_suite'].values()) # 4 consistency checks print("All internal calibration benchmarks passed.")
v3.4 worked example (SIM_COST_SCALE): An agent earning 35 SIU/month has annual SIU income = 420. Operative ratio = 420 / 1,500 = 0.28 (baseline depletion). With CCO+PTF+PTH cost factors (0.80 × 0.88 × 0.65 ≈ 0.457), effective annual cost = 686 SIU → ratio = 420/686 ≈ 0.61 (near sustainability). BASE_DAILY_COST ($68.33) is real-world BLS CES 2023 data used only for BLEI calculation, not the simulation cost driver.
Calibrated Parameters

Parameters identified across 10,000+ Monte Carlo simulations as producing strong welfare outcomes. Note on calibration status: values marked under revision were produced under less rigorous simulation versions and are being updated as v3.x matures. An open goal of this work is identifying parameter configurations that deliver best welfare outcomes across all points simultaneously — analogous to a structural engineer ensuring load capacity.

v3.4 framing note: Values previously labelled "Optimal" throughout this framework are now labelled Reference. Reference values are empirically calibrated starting points — the goal of the simulation is to map the solution space around them, not assert them as optimal.
Basic Unit Monthly Allocation
$1,200 / adult / month
Flat allocation — NOT octave-scaled. Range: $800–$1,500. Alaska PFD validates universal distribution without dependency effects (Jones & Marinescu, 2018).
ε_food (BU Food Purchasing Power)
2.64× (sensitivity: 1.50–3.00)
BLEI uses food BU effective value = $990. EPPM uses full blended $2,502. Mondragon Eroski data supports ε 2.5–3.0× at mature scale; 1.5–2.0× early phase.
Simulation Cost Scale (SIM_COST_SCALE)
1,500 SIU (retired as a wage-conversion input, v4.4)
v4.4: no longer drives the main wealth-accumulation loop, which uses WAGE_TO_USD/LIVING_WAGE_ANNUAL instead (see Mathematical Framework §2) — that switch happened in v4.3. The constant survives in the codebase only as a historical value; it is not load-bearing anywhere in the current simulation. superseded
PTF Cost Reduction
12–16% of living costs
v3.0 correction: PTF modelled as a cost-reduction factor applied to annual living costs, not as a direct wealth addition. This corrects ex nihilo money creation in earlier versions. SZH coherence amplifies the reduction rate. Mondragon overhead data grounds the range.
PTF Market Share
~18% of essential goods under revision
Reference PTF penetration without market distortion. Earlier simulations without the expense system suggested ~30%; v3.x modelling is producing more conservative calibration targets. Distinct from PTH uptake. Distortion >30% refers to allocative efficiency losses from reducing market competition below a viable threshold — cooperative-sector growth beyond this point begins to crowd out the price signals that PTF itself relies on for cost reduction.
PTH Uptake Rate
20% of residential market
Households in Public Trust Housing. v3.0 correction: Acre Equity growth and housing cost reduction are now tracked in separate accounting categories — removing double-counting. CLT Network validates at this scale.
Wealth Floor (Debt Ceiling)
−$10,000
v3.1 addition. Agents can accumulate debt down to −$10,000 (was hard floor at $0/$100). Allows insolvency dynamics, cascading wealth destruction during recessions, and more realistic recovery periods. v4.4 note: now under active reconsideration — the Traditional Welfare Baseline's median wealth sits exactly at this floor in 100% of N=5,000 runs (up from "more than half" at v4.3), following v4.3's roughly-doubled cost anchor. See CONTRIBUTING.md's Model Architecture Feedback. under revision
AI Automation Risk
47%/53% bimodal, Beta(6,1)/Beta(1,6) (v4.3; was Uniform[0.2,1.0])
v4.3: replaced the earlier uniform draw with a bimodal mixture sourced to Frey & Osborne (2013)/Autor (2015) — ~47% of US employment sits above a 70% computerization-probability threshold. Displacement = population_rate × automationRisk. Creates realistic inequality: high-risk occupations experience faster wage erosion than creative/relational roles. v4.4 note: a bug in the underlying gamma-distribution sampler (affecting the Beta(a,b) construction) was found and fixed independently of this calibration change — see CONTRIBUTING.md's v4.4 Release Notes.
Recession Model
incomeMultiplier beta(5,2) over [0.70, 0.95], 2–4 yr
v3.3 update. Population-level events, 10% annual probability, 2–4 year duration. incomeMultiplier now drawn from beta(5,2) distribution over [0.70, 0.95]: mode 0.90 (10% income loss), tail to 0.70 (30% loss). Calibrated against NBER post-WWII data. Replaces v3.1 Uniform(0.65, 0.85), which overstated severe recession frequency.
Acre Equity Appreciation (r_a)
4% / year
Conservative base case; sensitivity range 2–7%. Monthly compounding: r_a/12. CLT Burlington long-run data informs calibration — Champlain Housing Trust (champlainhousingtrust.org), Burlington Vermont Community Land Trust Program documentation. Tracked separately from PTH rent savings to prevent double-counting.
EDC Floor (CCO-PTH)
≈ 0.025
Near-zero extractive drain: PTH payments generative; BU reduces consumer debt reliance. US baseline near-poverty: 0.625. The 60-point reduction is the single largest BLEI improvement driver at entry.
Synergy Coefficient θ
0.05–0.25 (density-gated)
θ = 0 below 55% PTF merchant density. Scales linearly to 0.25 at 90%+. Reflects the network-effect structure of cooperative pricing: scale is required for full efficiency realization.
Performance Comparison

Results from 5,000 independent seeded runs each of Full Integration, CCO-Only, and Traditional Welfare Baseline (v4.0 large-N study, reconfirmed unchanged under v4.1, reconfirmed again under v4.2's population-pairing mechanics, superseded by v4.3's mechanics-changing main-wealth-loop unit fix and re-run again under v4.4's further mechanics changes — seeds 1–5,000, 500 agents, 20 years, shock disabled to match the Full Integration reference preset; methodology below). BLEI-based metrics are the primary welfare standard; BLEI poverty (% Crisis+Precarious) is the primary poverty indicator. These are internally calibrated simulation outcomes under the reference parameter configuration — they represent a design reference point, not a prediction of outcomes under any specific deployment scenario. 95% CI below is on the mean of each statistic across the 5,000 runs (not per-agent spread within one run) — narrow CIs here reflect a large, well-powered sample, not low real-world variance.

Performance Metrics (v4.4 large-N study, Aug 2026: 5,000 seeded runs, seeds 1–5,000, 500 agents, 20 years each; Full Integration reference configuration; superseded the v4.0/v4.1/v4.2 figures below via v4.3's main-wealth-loop unit fix, then again via v4.4's wage-scale unification across BLEI/FBS/Gini + true CRN pairing — see Version History for what changed at each step): CCO-PTF Integrated System (full deployment, reference parameters): ├── BLEI Threshold Rate (≥ 30 days): 87.5% [95% CI 87.4–87.5%] ├── BLEI Stable Rate (≥ 120 days): 84.1% [95% CI 84.1–84.2%] ├── BLEI Secure Rate (≥ 365 days): 78.6% [95% CI 78.5–78.6%] ├── BLEI Flourishing Rate (≥ 730 days): 71.6% [95% CI 71.5–71.6%] ├── BLEI Poverty Rate (Crisis+Precarious): 12.5% [95% CI 12.5–12.6%; target <5%, see note] ├── Median BLEI, final year: 1,824 days [95% CI 1,820–1,827] ├── Median Wealth, year 10: $191,754 [95% CI $191,339–$192,169] ├── Median Wealth, year 20: $526,120 [95% CI $525,196–$527,044; target $82,000 — see note, this target predates v4.3's wage-loop fix and is now far off-scale] ├── Gini (EDC-adjusted net wealth): 0.5183 [95% CI 0.5179–0.5187; target ≤0.25, see note] ├── Gini (nominal wealth, reference only): 0.5100 [95% CI 0.5096–0.5104] ├── Median FBS, CCO participants: not recomputed this pass (tracked open — v4.0's figure, $744/mo, predates the v4.3/v4.4 wage-scale changes and should not be read as current) ├── Participant Poverty Rate: 10.0% ├── Non-Participant Poverty Rate: 34.3% ├── System Stability (structural metric — see Known Limitations for a v4.4 disclosure on how to read this number): 88.6% [95% CI 88.6–88.6%] ├── EPPM at poverty line: not computed by the simulation engine (paper-level calculation only — see BLEI paper §6) ├── Work Incentive Preservation: not computed by the simulation engine └── Monte Carlo CI (n≥10, in-app): Mean ± 1.96·SD/√n [10×/50× "Stochastic CI" buttons] Near-poverty cohort tracking (agents with year-0 wealth < $25,000 poverty line; 37.8% of the population under the reference wealth distribution — consistent with prior versions, this tag is about initial wealth, not wage): ├── Reaches BLEI Threshold (≥30d), cohort median: immediate (month 0, pre-dynamics), │ in 5,000 of 5,000 runs — from initial liquid wealth alone, not simulated │ improvement. Unaffected by v4.3/v4.4 — an initialization-state fact, not │ touched by either release's wage-scale or wealth-loop mechanics. ├── Reaches BLEI Stable (≥120d), cohort median: 36.0 months / 3.0 years (mean 38.6mo) │ — dramatically faster than the pre-v4.3 figure (158.8 months / 13.2 years). │ This is a real, large, mechanistically-understood shift, not drift: this │ cohort is wealth-poor but not wage-poor (most members have ordinary wage │ draws), and v4.3's wealth-loop fix rewards wage level specifically — see │ Version History, v4.3 entry. ├── Reaches BLEI Secure (≥365d), cohort median: 108.0 months / 9.0 years (mean 104.9mo) │ — new milestone, first tracked at this granularity in v4.3. └── Reaches BLEI Flourishing (≥730d), cohort median: 156.0 months / 13.0 years (mean 161.0mo), reached in 5,000 of 5,000 runs within the 20-year horizon — a complete reversal from the pre-v4.3 figure (NOT reached, 0 of 5,000 runs, even after extending to 40 years under pre-v4.3 mechanics). This is the single largest change any release has produced in this table. See Version History, v4.3 entry, for the mechanism and why it is a genuinely positive, not merely numerical, shift. Social-Security-anchored income cohorts (new in v4.3; N=5,000, Full Integration vs. Traditional Welfare Baseline, same seeds/methodology as above. Unlike the near-poverty cohort, these are tagged by initial WAGE against real 2026 SSA benefit levels via WAGE_TO_USD, not by initial wealth — the population most relevant to a genuine poverty-elimination claim, not median-wage workers. Figures below are v4.4; the original v4.3 figures are superseded — see Version History for both): ├── SSI-level (≈0.8% of pop., $994/mo → 9.89 SIU via WAGE_TO_USD): │ Full Integration — wealth poverty 96.8%, BLEI poverty 82.7%, median-of-medians │ BLEI 19.8d [mean 26.7d — see note on why median, not mean, below], Flourishing 1.4%. │ Baseline — wealth poverty 99.8%, BLEI poverty 99.8%, median BLEI 1.9d. │ Cohort medians cross the 30-day Threshold in only 10.9% of seeds (533/4,888 │ seeds that drew ≥1 qualifying agent — this cohort is small, ≈4 agents per │ 500-agent run, so per-seed medians are noisy; directional, not precision-grade). ├── SSDI-level (≈7.7% of pop., $1,630/mo → 16.22 SIU): │ Full Integration — wealth poverty 83.0%, BLEI poverty 75.4%, median-of-medians │ BLEI 22.6d [mean 22.6d — this cohort's distribution is not notably skewed], │ Flourishing 8.1%. Baseline — wealth poverty 99.7%, BLEI poverty 99.7%, median │ BLEI 3.0d. Cohort medians cross Threshold in 0.0% of seeds (2/5,000). └── Retirement-level (≈17.1% of pop., $2,071/mo → 20.60 SIU): Full Integration — wealth poverty 64.7%, BLEI poverty 52.7%, median-of-medians BLEI 25.1d [mean 32.0d], Flourishing 14.5%. Baseline — wealth poverty 99.6%, BLEI poverty 99.6%, median BLEI 3.7d. Cohort medians cross Threshold in 31.1% of seeds (1,554/5,000) — the closest of the three anchors, but the TYPICAL (median) outcome still falls short. A note on median vs. mean for these cohorts: BLEI is right-skewed (bounded below at 0, long right tail), and these cohorts are small (≈4–86 agents per 500-agent run) — the MEAN of per-seed cohort-medians can be pulled well above the typical outcome by a small number of high-BLEI seeds. The retirement-level cohort's mean (32.0d) sits above the 30-day Threshold; its median-of-medians (25.1d) does not, and only 31.1% of individual seeds actually cross the line. Reporting the mean alone here would overstate this cohort's typical outcome — median-of-medians is the fairer summary, alongside the seed-crossing-rate for full transparency. Read plainly: Full Integration helps this population enormously in relative terms (originally measured at 20–30× baseline's BLEI under v4.3 mechanics; recomputed at ~7–10× under v4.4 — baseline's own BLEI also rose under the wage-scale fix, since baseline agents receive the same corrected wage-buffer term with no CCO/PTF/PTH mechanism to offset it) but does not come close to lifting it out of poverty in absolute terms by the simulation's own tier definitions, in the typical case, for any of the three anchors. This remains the sharpest test of the framework's poverty-elimination claim run so far. v4.6 rebuild — same cohort, extended to a 40-year horizon under CURRENT mechanics (N=1,000 seeds, a fresh draw, Full Integration; seeds 1–1,000 — same methodology as the v4.1 extension it replaces, which was three mechanics-changing releases stale by the time this was run). The milestone question the v4.1 extension originally asked is now moot: v4.3's wealth-loop fix already answers it inside the existing 20-year table above (median 13.0 years to Flourishing, 5,000/5,000 runs), and this 40-year rebuild reconfirms that almost exactly at an independent N=1,000: ├── Threshold (≥30d), Stable (≥120d), Secure (≥365d), and Flourishing (≥730d) │ milestones all reconfirm the 20-year table above closely: immediate/month 0 │ (1,000/1,000), 36.0 months [mean 39.0mo] (vs. the 20yr table's 36.0mo/mean │ 38.6mo), 105.2 months [8.8yr] (vs. 104.9 months/8.7yr), and 156.0 months │ [13.0yr, mean 161.2mo] (vs. 156.0 months/13.0yr, mean 161.0mo) — reached in │ 1,000/1,000 runs. This close a match across an independent seed range at a │ 5× smaller N is itself informative: the 20-year figures are not an artifact │ of the specific 5,000-seed draw, and extending the horizon doesn't change │ WHEN the cohort crosses milestones it already clears well inside 20 years. ├── What extending to 40 years actually adds: NO plateau. Cohort median BLEI by │ year: 201d (yr 5) → 488d (yr 10) → 951d (yr 15) → 1,618d (yr 20) → 2,522d │ (yr 25) → 3,706d (yr 30) → 5,190d (yr 35) → 7,058d (yr 40) — more than │ quadrupling between year 20 and year 40 alone, a sharp reversal from the │ pre-v4.3 extension this replaces, whose cohort median climbed only to ~428d │ by year 40 (see the archived v4.1 figures, preserved below for comparison). └── Year-40 population-wide headline (same N=1,000 runs, whole population not just the cohort): median wealth ≈$2,115,547 (mean $2,117,807) — more than 4× the year-20 figure — EDC-adjusted Gini 0.422 (down from 0.518 at year 20, further equalization, not a reversal), wealth poverty 3.8%, BLEI poverty 3.2%, Flourishing rate 91.8%, population median BLEI ≈7,252 days. This is a genuinely new finding, not a repeat of v4.3's already-documented redistribution story: the main wealth-accumulation loop has no explicit long-run ceiling — no retirement, no consumption floor that scales with wealth, no diminishing-returns term beyond the existing wage-growth dampening — so once an agent's annual surplus consistently exceeds cost, wealth compounds without an apparent bound over multi-decade horizons. A median of $2.1M per adult household 40 years out is well outside any real-world reference point this document uses elsewhere (Fed SCF, Census/ BLS) and should not be read as a projection. Tracked as a new open question in Known Limitations and CONTRIBUTING.md's Model Architecture Feedback, not resolved here — see CONTRIBUTING.md's v4.6 Release Notes for the full methodology and figures. (Archived for comparison — the pre-v4.3 v4.1 extension this rebuild replaces, N=1,000, seeds 1–1,000, Full Integration, run under mechanics three mechanics-changing releases stale by the time it was superseded: Threshold and Stable milestones matched the pre-v4.3 20-year table (median 12 months and 165 months respectively); Flourishing was NOT reached by year 40 in any of 1,000 runs, with cohort median BLEI climbing only to ~428d by year 40 — still under 60% of the way to the 730-day line after doubling the horizon. The gap between that result and the v4.6 rebuild above is entirely attributable to v4.3/v4.4/v4.5's wealth-loop and wage-scale mechanics changes, not to any change in this extension's own methodology.) PTF mechanism (v3.0 corrected): PTF modelled as cost reduction (12-16%), NOT wealth injection. Earlier versions incorrectly added PTF savings to wealth ex nihilo. PTH mechanism (v3.0 corrected; equity-contribution added v4.0): Acre Equity appreciation tracked separately from housing cost reduction. v4.0 adds a 25% share of the annual housing-cost saving routing to Acre Equity (see Mathematical Framework and Known Limitations for the flat-vs-tenure-cohort haircut caveat). Tier naming (v3.1): CCO+PTF active → top tier = Flourishing (generative system maturation) Without CCO+PTF → top tier = Comfortable (strong stability, not full Compassionism) Calibration notes (v4.0 finding; substantially changed under v4.3/v4.4): Median Wealth (year 20) landed within 0.5% of the pre-existing $82,000 design target under v4.0-v4.2 mechanics — that close match no longer holds. v4.3's main-wealth-loop unit fix (replacing a bare-subsistence cost anchor, wrong for a 20-year compounding loop netted against real wage, with a genuine living-wage anchor) moved median wealth to $495,411; v4.4 moved it further to $526,120 — more than 6× the original target. This is a deliberate, documented consequence of a unit-correctness fix, not drift, and TARGET_WEALTH itself has not been reconsidered against the new mechanics (a framework-level decision, flagged as open in CONTRIBUTING.md and, as of v4.4, disclosed directly on the interactive tool's KPI badges — see Known Limitations). Reading "close to target" or "far from target" against the old $82,000 figure is no longer meaningful either way. BLEI Poverty Rate (12.5%) and EDC-adjusted Gini (0.518) both still fall short of their own pre-existing design targets (<5% and ≤0.25 respectively), though both moved toward the target, not away from it, under v4.3/v4.4 — see "On calibration versus validation" below and the Internal Calibration Benchmarks section for what this does and doesn't imply. CCO-Only System (no PTH/PTF/SZH/CIP; N=5,000, same seed range; partRate 78%, matching the Full Integration reference preset — see the participation-rate note in Methodology Overview): ├── BLEI Threshold Rate: 79.0% ├── BLEI Poverty Rate: 21.0% ├── BLEI Tier at 730+ days: Comfortable (CCO active; PTF not) ├── Median Wealth, year 20: $391,742 [95% CI $390,856–$392,627] ├── Gini (EDC-adjusted): 0.5763 [95% CI 0.5759–0.5768] └── System Stability (structural metric): 88.4% Traditional Welfare Baseline (US + 3% CPI, no CCO/PTF/PTH/SZH/CIP; N=5,000, same seed range): ├── BLEI Threshold Rate: 29.4% ├── BLEI Poverty Rate (Crisis+Precarious): 70.6% ├── Median Wealth, year 20: −$10,000 — pinned exactly at WEALTH_FLOOR │ in 5,000 of 5,000 runs (100%). v4.3's living-wage cost anchor roughly doubled │ the pre-v4.3 cost figure baseline is measured against, without any offsetting │ mechanism; the floor is now binding for the entire population's median, not an │ occasional insolvency case as originally intended — see Known Limitations and │ CONTRIBUTING.md's Model Architecture Feedback. Not resolved by v4.4's removal │ of a separate, unrelated ×0.85 initial-wealth haircut (Version History, │ v4.4) — the binding constraint is the ongoing annual gap, not the starting point. ├── Gini (EDC-adjusted): 0.8580 ├── System Stability (structural metric): 99.0% — read this alongside the poverty │ figures above, not in isolation; see Known Limitations for why a population │ pinned at a hard floor scores as more "stable" than a thriving one under this │ metric's own definition. └── Note: wage income < annual living costs at this inflation rate; wealth depletes over time by design (see Mathematical Framework §2) Nordic Benchmark (external reference, not simulation output): ├── Gini (post-redistribution): 0.27–0.29 └── CCO-PTF EDC-adjusted Gini (0.518, v4.4 measured) exceeds the Nordic range — see "On calibration versus validation" below.
On calibration versus validation: The pre-existing design targets (BLEI Threshold Rate ≥95%, EDC-adjusted Gini ≤0.25, System Stability ≥90%, BLEI Poverty <5%, Median Wealth $82,000) were aspirational internal calibration goals, not values the shipped code had been checked against — EDC-adjusted Gini specifically could not have been checked before v4.0, since that release is the first to actually compute it. Measured against those targets, v4.4's large-N study exceeds the Threshold-Rate target, falls short on Poverty Rate (12.5% vs. <5%) and Gini (0.518 vs. ≤0.25) — both closer to target than under v4.0-v4.2 mechanics, not further — and is now dramatically past the old Median Wealth target in the opposite direction (a unit-correctness fix, not an improvement or a regression against that particular number, which itself predates the fix and has not been reconsidered — see Calibration notes, above, and Known Limitations). The Gini gap has a specific, identified likely cause — see the Mathematical Framework §5 note and the Internal Calibration Benchmarks section — rather than being an unexplained miss. None of this is a forecast of outcomes in a partially deployed real system; the Nordic range (0.27–0.29) remains the best real-world reference point, and early-phase implementations should expect outcomes closer to it than to either the design targets above or this simulation's reference-configuration output.
v3.1 interactive simulation accuracy improvements: The browser-based simulation implements six accuracy improvements from independent GPT audit: (1) annual expense system with PTF as cost-reduction factor; (2) per-agent heterogeneous automationRisk ∈ [0.2, 1.0]; (3) population-level multi-year recessions with incomeMultiplier (renamed from ambiguous "severity"); (4) negative wealth floor −$10,000 allowing debt/insolvency; (5) PTF dynamic adoption via distress and diffusion; (6) BLEI poverty KPI (% Crisis+Precarious) alongside wealth poverty.
v3.3 interactive simulation additions: bettertobest.github.io/compassionism-simulation/ adds: (1) parameterized Monte Carlo (3×, 10×, 50× runs) with 95% CI display for n≥10; (2) participant vs. non-participant KPI stratification tracked annually; (3) computed OAT sensitivity — 11 mini-simulations (±20% on 5 parameters, seed 7777), replacing hardcoded illustrative values; (4) validation suite — 4 internal consistency checks (BU monotonicity, participation threshold, CCO benefit direction, PTF inflation dampening); (5) JSON export of full parameter + time-series snapshot; (6) new High Automation preset; (7) ODD protocol (Grimm et al. 2010) in assumptions panel; (8) try/catch error handling with user-visible message.
v4.0 large-N study methodology: Computed directly against the shipped engine (not a separate model) via a Node.js harness driving makeAgent()/runYear()/calcMetrics() exactly as the browser does, for 5,000 independent runs per scenario (15,000 total), seeds 1–5,000, at the Full Integration reference population size (500 agents) and horizon (20 years). Each run's final-year tier distribution, Gini (nominal and EDC-adjusted), median wealth (years 10 and 20), median FBS among CCO participants, participant/non-participant poverty, and the System Stability heuristic were recorded, then aggregated (mean, median, SD, 95% CI on the mean) across runs. The near-poverty cohort is tagged once per run at initialization (year-0 wealth < $25,000) and tracked longitudinally for the milestone-crossing figures. This is a documented, reproducible methodology superseding the previously-unspecified "10,000 simulation runs" claim (batch size, seed range, and code path were never recorded for that figure) — script available on request via a GitHub issue.
v4.1 confirmation & extension methodology: Same harness and code path as the v4.0 study above, run two ways. (1) Confirmation: an independent N=1,000-seed sweep (seeds 1–1,000, not a subset of the v4.0 seed range's results — a fresh draw) of all three scenarios at the same 500-agent/20-year configuration, to empirically verify — not just argue from code inspection — that none of v4.1's fixes shifted the main simulation output. Every metric checked landed within or immediately adjacent to the v4.0 study's 95% CI (BLEI poverty, EDC-adjusted Gini, median wealth for all three scenarios; near-poverty cohort size and its Threshold/Stable crossing times for Full Integration). (2) Extension: the same N=1,000 seeds, Full Integration only, run to a 40-year horizon instead of 20, with the near-poverty cohort's median BLEI recorded at every year (not just at the 20-year endpoint) to identify when — if at all, within the extended window — it crosses into Threshold, Stable, and Flourishing. Total compute: roughly 4,000 runs across both studies, a smaller N than the original 5,000-per-scenario study by design — sufficient to confirm no material change and to characterise the extended-horizon trajectory, without re-running a study whose result was already determined by the (unchanged) code and a documented seed range. Raw year-by-year cohort data available on request via a GitHub issue.
v4.3/v4.4 large-N methodology, and why this page skipped straight from v4.2 to v4.4. Both releases are mechanics-changing (see Version History), so both required a fresh N=5,000 study rather than a reconfirmation — v4.3's was run and documented in CONTRIBUTING.md at the time; this page's own sync to v4.3 was deliberately deferred pending an independent adversarial audit of that release (two audit passes — see Version History, v4.4 entry), so the figures throughout this page jump directly from v4.2 to the current, v4.4-mechanics numbers, without an intermediate v4.3 snapshot ever having been published here. Same harness and code path as all prior large-N studies (makeLatentPopulation(), instantiateAgent(), runYear(), calcMetrics(), bleiMetrics(), structuralStability() called directly, seeds 1–5,000, 500 agents, 20 years, shock disabled). Two additions to the methodology, both new in v4.3 and carried through to this v4.4 re-run: the Social-Security-anchored cohort tagging (agents' initial, pre-dynamics wage compared against real 2026 SSA benefit levels via WAGE_TO_USD — SSI, SSDI, and average retired-worker levels — the same convention the near-poverty cohort already used for initial wealth), and reporting BLEI figures for small cohorts (≈4–86 agents per run) as median-of-medians across seeds rather than mean, since BLEI is right-skewed and a small cohort's mean is more exposed to a handful of high-BLEI seeds — a distinction that mattered directly for this release: an initial mean-based reading of the retirement-level cohort would have overstated its typical outcome as crossing the 30-day Threshold, when the median-of-medians and the per-seed crossing rate (31.1%) show the typical case still falls short. Two supplementary figures in the table above (year-10 median wealth, nominal-wealth Gini) required a small additional pass beyond the core headline metrics, run separately against the same seed range; median FBS among CCO participants was not recomputed this pass and is flagged accordingly in the table, since the pre-v4.3 figure predates the wage-scale changes and would be misleading if left uncaptioned.
Sensitivity Analysis

156 parameter sensitivity tests across all key variables. The most important finding: BLEI outcomes remain above Tier 2 Threshold for CCO-PTF participants across all tested parameter combinations at Month 12. Month 0 values use γ = 0.12 (entry) and food BU effective value ($990). Note on sensitivity methodology: the elasticity values below are scenario-comparison estimates from the Monte Carlo analysis — not formal Sobol indices or Latin hypercube results. Formal sensitivity analysis using these methods is a documented future research direction in CONTRIBUTING.md. v3.3 update: the interactive simulation's OAT sensitivity chart now reports results from 11 computed mini-simulations (±20% on 5 parameters, seed 7777), replacing the prior hardcoded illustrative guidance table; these are first-order estimates only and do not capture interaction effects. v3.4 framing note: the OAT sensitivity shown is scenario-comparison from actual mini-runs (±20%, seed 7777), not computed Sobol or Latin hypercube indices. This correctly flags first-order parameter effects but does not quantify interactions. v4.0: the ±20% perturbation is now uniformly defined as ±20% of each parameter's own slider range across all five parameters (previously a mix of relative and fixed-percentage-point steps — see the Simulation page's Cumulative Bug Fixes). For formal Sobol analysis, use the simulation's CSV export with external Python/R.

Parameter Elasticity Testing (156 variables; BLEI Threshold Rate as primary outcome): High-Impact Parameters: ├── Basic Unit Amount: Elasticity = −2.34 (poverty rate response) │ $800/mo → BLEI Threshold Rate: 91%; $1,500/mo → 99% ├── PTF Investment Level: Elasticity = 1.67 (wealth accumulation) ├── Simulation Cost Scale: Elasticity = 1.45 (poverty rate; v3.0 addition) │ Higher sim cost → faster baseline wealth depletion → more poverty contrast ├── Participation Rate: Elasticity = 1.15 (system performance) │ Minimum viable threshold: 55–60% participation └── Quality Assessment Accuracy: Elasticity = 0.94 (innovation output) Moderate-Impact Parameters: ├── ε_food (BU food purchasing power): Elasticity = 0.58 (BLEI at Month 0) │ All ε values maintain Tier 2+ at Month 12 ├── AI Automation Risk (avg): Elasticity = 0.52 (wage trajectory; v3.1) │ High-risk agents experience 3–5× more wage erosion than low-risk agents ├── Inflation Rate: Elasticity = 0.48 (cost pressure; v3.1) │ 3% annual inflation → 81% cost increase over 20 years without PTF/PTH offset ├── Acre Appreciation Rate r_a: Elasticity = 0.45 (long-run wealth) └── Network Density: Elasticity = 0.38 (synergy activation) Robust Parameters (low sensitivity): ├── Octave Multiplier: Elasticity = 0.21 ├── Conversion Tax Rate: Elasticity = 0.18 ├── Phi Rate (Φ): Elasticity = 0.12 (consistent benefit) └── PTF Dynamic Adoption Rate: Elasticity = 0.08 (emergent, not assumed) Stability Thresholds: ├── BU Amount: $800–$1,500 (reference $1,200) ├── PTH Uptake: 15%–25% (reference 20%) ├── PTF Share: 12%–25% (reference ~18%; under revision as v3.x matures) └── Participation: 55%–95% (minimum viable 55%)
Mathematical Framework

1. BLEI Temporal Stability Index — Three-Component Structure

Primary welfare metric — three additive buffers (v3.1 decomposition):
BLEI(i,t) = cashDays + incomeDays + benefitDays = [ L(i,t) + γ(t)·Y(i,t) + BU_food_eff(i,t) ] / C_basic_cash(t) Component meanings: cashDays = L / C_basic_cash (stock buffer: liquid savings) incomeDays = γ·Y / C_basic_cash (flow buffer: income capacity) benefitDays = BU_food_eff / C_basic (benefit buffer: BU food basket) L(i,t) = max(0, wealth) × 0.20 + h_AE · AE (liquid; wealth floored at 0 for BLEI) γ(t) = 0.12 (entry, Month 0–5) → 0.20 (Month 6+, CCO floor established) Y(i,t) = agent's actual wage income [v3.1 fix: not wealth/60 proxy] BU_food_eff = 360 BU × $2.75 = $990 (food BU only — utility BU net zero in BLEI) C_basic = $31.67/day (CCO-PTF) vs. $68.33/day (baseline)

v4.4 note (supersedes the v4.0 note this paragraph previously carried): the simulation's internal wage state is tracked in Simulation Income Units (SIU), a separate calibration unit from the USD figures L, BU_food_eff, and C_basic use — so Y here is WAGE_TO_USD-converted before entering this formula. Through v4.3, this formula (and §4 FBS, §5 EDC-adjusted Gini) used a different, cost-side-derived constant, SIU_TO_USD (≈16.63), while the wealth-accumulation loop in §2 already used WAGE_TO_USD (≈100.52, Census/BLS-sourced) — leaving the same agent's wage worth roughly $582/month here versus roughly $3,518/month in §2, a ~6× divergence external audit correctly flagged as indefensible once one anchor is empirically grounded and the other isn't. SIU_TO_USD is retired as of v4.4; every formula in this section — §1 (this one), §2, §4, and §5 — now uses the same WAGE_TO_USD anchor throughout. agentEDC() was and remains unaffected by any of this — it's a dimensionless SIU/SIU ratio that never touched either constant.

2. Wealth Dynamics with Annual Expense System

Annual wealth update (v4.3/v4.4 — supersedes the SIM_COST_SCALE-driven formula this section described through v4.2, see the note below for what changed and why): ΔW = annualWageUSD − costUSD annualWageUSD = wage × 12 × WAGE_TO_USD × incomeShock costUSD = LIVING_WAGE_ANNUAL × (1+inflRate)^year × costFactor incomeShock = popShock × agentVariance [recession multiplier × individual noise] costFactor = (1 − PTF_discount) × (1 − PTH_discount) × (1 − CCO_discount) PTF_discount: cost reduction from PTF participation (SZH-boosted if active) PTH_discount: 0.65 fixed reduction while in PTH (35% of cost covered) CCO_discount: 0.80 fixed reduction while CCO-active with BU > 0 (20% covered) AE_growth = r_a/12 × AE [tracked separately in Acre Equity, NOT part of ΔW above — see the PTH equity block; a tenure-varying share of appreciation separately credits liquid wealth (v4.5: 15% at tenure=1 ramping to 85% at tenure≥5, replacing the flat 50% used through v4.4 — see the Step 1 card and Version History, v4.5 entry, above, and index.html's own code comments for pthLiquidShare())] Wealth floor: WEALTH_FLOOR = −$10,000 [v3.1: allows debt/insolvency dynamics; v4.4 Model Architecture Feedback flags this floor as needing reconsideration now that LIVING_WAGE_ANNUAL is roughly double the pre-v4.3 cost anchor — see Known Limitations] Recession: incomeMultiplier = 0.70 + beta(5,2) × 0.25 when recession active [v3.3] mode = 0.90 (10% income loss); mean ≈0.88 (~12% loss); range [0.70, 0.95] [v3.1 prior: Uniform(0.65, 0.85)]

v4.3/v4.4 note (supersedes the v4.0 note this paragraph previously carried, which described an unresolved sensitivity problem — now resolved): through v4.2, Y and living cost here were intentionally left in native internal SIU/SIM_COST_SCALE terms rather than converted to USD, because an early tested USD-converting version was extremely sensitive to the conversion constant (a ~3.5× range of candidate values swung 20-year outcomes from universal wealth-floor collapse to implausible multi-million-dollar median wealth) — flagged then as a candidate research direction, not a solved problem. v4.3 resolved this: WAGE_TO_USD (≈100.52, Census/BLS CPS ASEC 2023 median personal income ÷ 35 SIU × 12) converts wage, and LIVING_WAGE_ANNUAL ($49,370, World Population Review's MIT-sourced state living-wage table) anchors cost — replacing the old BASE_DAILY_COST-netted-against-real-wage approach, which was a bare-subsistence floor correct for BLEI's poverty-line use but wrong for a 20-year compounding loop, and which produced an ~11× wealth explosion and broke BU-monotonicity when tested naively. SIM_COST_SCALE no longer drives this formula at all as of v4.3 — it survives in the codebase only as a historical constant. This is not a "clean win": it redistributes as well as it grows — see Performance Comparison and CONTRIBUTING.md's v4.3 Release Notes for the full finding, including the Traditional Welfare Baseline's collapse to the wealth floor as a direct consequence of this same fix.

3. Heterogeneous AI Automation Displacement

Per-agent wage displacement (v3.1): agentAIDisp = populationRate(yr) × agent.automationRisk wageGrowth -= agentAIDisp populationRate(yr): yr < AI_DISPLACEMENT_YEAR_1 (5): 0.000/yr yr ≥ AI_DISPLACEMENT_YEAR_1 (5): 0.012/yr × (yr − 5 + 1) yr ≥ AI_DISPLACEMENT_YEAR_2 (15): [phase-1 total] + 0.022/yr × (yr − 15 + 1) capped at 0.10/yr agent.automationRisk ~ 47%/53% bimodal mixture (v4.3; was Uniform(0.2, 1.0) through v4.2) High-risk agents (47%) ~ Beta(6,1), mean ≈0.857 Low-risk agents (53%) ~ Beta(1,6), mean ≈0.143 Sourced to Frey & Osborne (2013)/Autor (2015): ~47% of US employment sits above a 70% computerization-probability threshold across 702 O*NET occupations — replacing the earlier uniform draw's implicit assumption that automation exposure is evenly spread across the workforce, which the cited literature does not support. → Creates realistic inequality: routine/manual occupations vs. creative/relational → Duke's note: labour markets cannot reabsorb past 30% displacement (~yr 5, ≈2030) → v4.4 note: the underlying gamma-distribution sampler this bimodal draw depends on (via Beta(a,b) = Gamma(a)/(Gamma(a)+Gamma(b))) had a real bug at gamma(a=1) — see CONTRIBUTING.md v4.4 Release Notes. Fixed; the distribution choice itself (bimodal, these sources) is unchanged by that fix. v3.4: Assumes 2025 simulation start. Displacement yr 5+ (≈2030), accelerates yr 15+ (≈2040).

4. FBS-Gated Advancement Probability

P(advance)(i) = 1 − exp( −λ(i) · FBS(i) ) FBS(i) = max( 0, Y + BU_monthly − C_basic_cash_monthly − EDC_residual · Y ) EDC_residual = consumer debt interest only (NOT housing — already in C_basic) BU_monthly = $1,200 face value (cash-equivalent food expenditure reduction) λ(i) ~ Uniform(0.0001654, 0.0013233) [v4.4; was Uniform(0.001, 0.008) through v4.3 — see the note below for why this changed and what its status is]
λ calibration status — open. The original range (0.001–0.008) is BLEI paper §4 Index IV's published specification. At that range, even λ's low end already produces ~89.8% advancement probability at this paper's own $2,281/month FBS worked example, and ~97.5% at the companion simulation's median-wage agent (~$3,680/month FBS under Full Integration) — meaning λ, whose stated purpose is to differentiate agents by individual capability, does little differentiating once FBS is solidly positive. v4.4 rescaled the simulation's own operational calibration to U(0.0001654, 0.0013233) — preserving the original 8× heterogeneity span (0.0013233/0.0001654 ≈ 8) while restoring meaningful variation in advancement probability across the model's actual FBS distribution. This is a provisional behavioral recalibration, not a dimensionally-forced conversion — FBS mixes a wage-derived term (which did change scale under v4.4's wage-scale unification) with fixed-dollar terms (BU face value, basic cost) that did not, so FBS as a whole does not scale by a single clean factor, and dividing λ by exactly the wage-conversion ratio is a chosen fix for saturation, not a unit identity. Passing the simulation's own validation suite (BU-monotonicity and five other internal-consistency checks) demonstrates the rescaled range restores useful behavioral heterogeneity — it does not establish that 0.0001654–0.0013233 are empirically correct real-world advancement probabilities; λ's empirical grounding remains open in both the original and rescaled form. The BLEI paper itself retains 0.001–0.008 as its published theoretical specification rather than being silently rewritten to match an evolving simulation calibration — see its own note at Index IV for the same discussion. A more interpretable reparameterization — reporting the half-saturation point FBS₅₀ = ln(2)/λ instead of a raw 1/USD coefficient — is a recommended future direction: the original range implies FBS₅₀ ≈ $87–$693/month (a high-capability agent needs only $87/month of residual bandwidth for even odds of advancing); the v4.4 range implies FBS₅₀ ≈ $524–$4,191/month, a substantially more meaningful spread given the FBS levels the model actually generates. Tracked as an open calibration item — see CONTRIBUTING.md's Model Architecture Feedback.

v4.0 note: this formula is now implemented in the simulation engine exactly as specified above (see runYear()). Prior versions (through v3.9) computed advancement from a fixed-probability heuristic gated on BLEI > 30 days instead of FBS — a gap identified in external review (Refine.ink, Aug 2026) between this specification and the shipped code. Y is WAGE_TO_USD-converted as noted under §1 above (was SIU_TO_USD through v4.3 — retired v4.4, see §1); EDC_residual uses the worked values from Table 1b (0.12 baseline, 0.025 for CCO+PTH participants) as a fixed proxy, not a separately-modelled consumer-debt submodel.

5. EDC-Adjusted Gini & BLEI Poverty

v4.14 note, prompted by an external audit's runYear()-level review: W_net below is a wealth STOCK minus EDC_full×Y×12, a one-year FLOW. That's a genuine conceptual distinction worth stating plainly rather than leaving implicit: this is not "wealth after all extractive costs" in a conventional net-worth-accounting sense — it is a wealth stock adjusted by one year's estimated extractive burden, a deliberately constructed inequality index in this framework's own convention, matching BLEI paper Table 6's specification exactly. The formula itself is unchanged; only the interpretation needed making explicit. See the interactive tool's own Gini KPI tooltip for the same clarification in-app.

W_net(i) = W_nominal(i) − EDC_full(i) · Y(i) · 12
BLEI Poverty rate = |{i : BLEI(i) < 30 days}| / N = fraction in Crisis (Tier 0) + Precarious (Tier 1) Primary poverty indicator in v3.3 (theoretically grounded vs. wealth stock). v3.4 fix note (no math change from v3.3): totW = 0 → Gini = 0, not 1. The old `||1` fallback incorrectly returned 1 for the zero-wealth edge case. Gini = 1 would mean perfect inequality; the correct interpretation when all agents are at zero wealth is Gini = 0 (perfect equality of deprivation). BLEI poverty (% agents < 30 days) is the correct poverty indicator in this case. Aspirational target (pre-v4.0, not yet measured against actual code): Baseline EDC-adjusted Gini: 0.44–0.46 CCO-PTF EDC-adjusted Gini: 0.22 (full deployment, optimal parameters)

v4.0 note: EDC-adjusted Gini is now actually computed by the simulation (previously the engine only ever computed nominal-wealth Gini; this formula existed here as a specification, not shipped code). v4.4 update: measured output from the current 5,000-run large-N study at the Full Integration reference configuration (500 agents, 20 years, seeds 1–5,000; see Performance Comparison below for full methodology and how these figures moved from the original v4.0 measurement through v4.3/v4.4) is Gini = 0.858 [95% CI 0.8577–0.8584] at the Traditional Welfare Baseline and Gini = 0.518 [95% CI 0.5179–0.5187] under full deployment — both meaningfully higher than the aspirational 0.44–0.46 / 0.22 range above, though both moved toward that range compared to the original v4.0 measurement (Baseline 0.800→0.858 is a move away, driven by v4.3's cost-anchor change pinning Baseline's wealth at the floor for effectively the whole population — see Performance Comparison; Full Integration 0.484→0.518 also moved away slightly, then improved again from a v4.3 peak of 0.536 once v4.4's wage-scale unification corrected the EDC-extraction calculation — see Version History for the full sequence). The direction (full deployment well below baseline) remains confirmed; the absolute levels remain off-target either way. The most likely source of the wealth-initialization contribution to this gap: lognormal(10.5, 1.2) has an inherent Gini coefficient of ≈0.60 before any simulation dynamics or EDC adjustment are applied (2Φ(σ/√2)−1 for σ=1.2) — already above the old baseline target, which suggests that target was a theoretical projection never checked against the actual coded initialization rather than a value the shipped model was failing to hit. Reconciling this — either by revisiting the wealth-initialization spread or by revisiting the target — is flagged as an open calibration item in CONTRIBUTING.md, not resolved here. v4.7 note: this Gini gap is about the wealth-init distribution's spread (σ) specifically — a separate, independently-found v4.7 finding concerns its level (μ) instead: the same lognormal(10.5, 1.2) draw's median (≈$36K) diverges roughly 5.3× from actual 2022 SCF median net worth (≈$193K). The two are mathematically independent (Gini of a lognormal has no μ term), so fixing one wouldn't touch the other — see Known Limitations, below.

6. EPPM and IPBI

EPPM(i) = [ Y + BU·ε_blended − EDC_CCO·Y ] / [ Y · (1 − EDC_baseline) ] BU·ε_blended = $990 + $1,512 = $2,502 (full value for EPPM; BLEI uses $990 only) At poverty line: EPPM = 5.80× IPBI = α·CR + β·PH + π·LP + δ·PV + ζ·ME π (labor productivity weight) is distinct from BLEI liquidity coefficient γ. Conservative total: $22,800/yr; upper bound: $59,900/yr

7. Wage Growth Diminishing Returns & Recession Distribution (v3.3)

Wage growth adjustment (v3.3) — stability premium with diminishing returns: wage_growth_adj = base_growth + WAGE_BLEI_BONUS × 1/(1 + 0.5 × max(0, wage/WAGE_MEDIAN_SIU − 1)) [if BLEI ≥ Threshold] + octave × WAGE_OCTAVE_BONUS − popAIDisp × automationRisk WAGE_BLEI_BONUS = 0.008 (base stability premium) WAGE_MEDIAN_SIU = 35 (reference median wage in SIU) DR factor = 1 / (1 + 0.5 × max(0, wage/35 − 1)) → At wage = 35 SIU (median): DR = 1.00 (no reduction) → At wage = 70 SIU (2×): DR = 0.67 (33% reduction) → At wage = 105 SIU (3×): DR = 0.50 (50% reduction) Rationale: Mullainathan & Shafir (2013) + Carroll (1997) buffer-stock theory. Note: BLEI is purely measurement; the premium reflects the underlying stability it measures, not a circular self-reinforcing mechanism. Recession severity distribution (v3.3; mode figure corrected v4.0): incomeMultiplier = 0.70 + beta(RECESSION_BETA_A=5, RECESSION_BETA_B=2) × 0.25 Distribution range: [0.70, 0.95] Mode = 0.90 (10% income loss, most probable recession) — beta(5,2)'s mode is (5−1)/(5+2−2) = 0.80, so the multiplier's mode is 0.70+0.80×0.25 = 0.90. This entry previously stated the mode as "≈0.86 (14% income loss)", which was arithmetically wrong; the beta(5,2) formula itself was never wrong, only this prose (external review, Refine.ink, Aug 2026, caught this across all three project pages). Mean ≈0.88 (~12% loss) and median ≈0.88 (~11.6% loss) are close to the NBER target cited below and are unaffected by this correction. Tail to 0.70 (30% income loss, severe but rare) Prior (v3.1): incomeMultiplier = Uniform(0.65, 0.85) Replaced because: uniform distribution gave equal probability to mild (15% loss) and severe (35% loss) recessions, inconsistent with NBER post-WWII empirical data showing modal income decline of ~12–15% with a right-skewed distribution.
Internal Calibration Benchmarks

These benchmarks function as internal calibration checks — they confirm the simulation reaches its design targets under optimal parameters. They are not external empirical validation criteria. All benchmarks must be satisfied for a parameter set to be considered fully calibrated for v3.3. The four v3.3 validation suite checks (BU monotonicity, participation threshold, CCO benefit direction, PTF inflation dampening) must all return PASS.

BLEI Threshold Rate
≥ 95%
BLEI Secure Rate
≥ 80%
Gini (EDC-adjusted)
≤ 0.22 under revision
Median EPPM
≥ 2.0×
System Stability
≥ 90%
BLEI Poverty Rate
< 5%
Participant Poverty ≤ Non-Participant
Required
Validation Suite (v3.3)
4/4 Pass

The Gini benchmark predates v4.0's actual implementation of EDC-adjusted Gini (see Mathematical Framework §5 above) — measured full-deployment output from the current v4.4 large-N study (N=5,000, see Performance Comparison) is 0.5183 [95% CI 0.5179–0.5187], not ≤0.22 (was 0.4843 under v4.0-v4.2 mechanics; moved through 0.5359 under v4.3 before settling here under v4.4's wage-scale unification — see Version History). Marked under revision pending the wealth-initialization/target reconciliation discussed there, rather than silently left as a passing claim.

Known Limitations

The following limitations are documented as part of the ODD protocol (Grimm et al. 2010) and in the interests of transparent calibration. They identify directions for future model development and should be considered when interpreting simulation outputs.

Implementation Roadmap
Phase 1 — Foundation (Years 0–2): ├── Pilot Programs: 10 communities, ~50,000 participants ├── Infrastructure: CIP digital platform, PTH legal structures, PTF cooperative frameworks ├── Investment: $200B initial capital allocation ├── Target: 60%+ BLEI Threshold achievement in pilot areas │ (ε_food ≈ 1.50–2.00 before Mondragon-scale efficiency; Comfortable tier expected) ├── Metrics: actual PTF pricing data for ε validation; CLT-style AE tracking; │ APF-analogue labour supply monitoring; BLEI poverty rate tracking └── Failure mode monitoring: participation rate, network density, governance integrity Phase 2 — Scaling (Years 3–5): ├── Expansion: 100 communities, ~5M participants ├── Integration: full CCO-PTF-PTH deployment, SZH zone formation ├── Investment: $500B total (additional $300B) ├── Target: 85%+ BLEI Threshold; BLEI poverty <10%; network density above θ-activation │ (ε_food expected to reach 2.20–2.64 as cooperative efficiency scales) │ (PTF market share target ~18% — under active calibration revision for v3.x) └── Simulation update: recalibrate SIM_COST_SCALE and PTF_SHARE from pilot data Phase 3 — National Deployment (Years 6–10): ├── Scale: 50M+ participants nationwide ├── Investment: self-sustaining through conversion tax revenue │ (~60–65% participation at 12% conversion tax ≈ self-funding threshold) ├── Target: 97%+ BLEI Threshold, 84%+ Secure, 0.22 EDC-adjusted Gini, <5% BLEI poverty └── Flourishing: near-poverty entry to Tier 5 within 28–47 months (sensitivity range)
Appendix A: Calibrated Parameters Dataset — v3.3
Same caveat as Agent Architecture and Simulation Engine, above: this JSON dataset is a v3.5.0/v3.3-era snapshot, not kept in sync with the shipped v4.14 simulation. Its unit_system_note.sim_cost_scale field and automation_risk distribution both describe mechanics superseded in v4.3 (see Mathematical Framework §2, §3), and its unit_system_note.wealth field's "Fed SCF 2022" citation for the $36K median has not been checked against the actual SCF figures — see the Known Limitations entry on this, added in v4.7, for what a check turned up. Preserved as historical/illustrative rather than rewritten field-by-field — see index.html's own CFG object and CONTRIBUTING.md's Calibration Validation table for the current, authoritative parameter set.

Complete JSON dataset with v3.3 calibrated parameters. v3.1 additions: annual expense system, wealth floor, heterogeneous AI automation risk, PTF as cost-reduction mechanism, BLEI poverty metric, incomeMultiplier recession field. v3.3 additions: wage diminishing returns, beta(5,2) recession distribution, SIM_COST_SCALE rename, Gini zero-wealth fix, participant stratification, computed OAT sensitivity, validation suite, 50× Monte Carlo CI.

{ "simulation_metadata": { "version": "3.5.0", "doi": "https://doi.org/10.17605/OSF.IO/QWTE2", "last_updated": "2026-06-30", "calibration_iterations": 10000, "confidence_level": 0.95, "primary_welfare_metric": "BLEI (temporal stability in days)", "secondary_poverty_metric": "BLEI poverty = % agents with BLEI < 30 days (Crisis+Precarious)", "positioning": "calibrated institutional simulation architecture — not econometric forecast", "interactive_simulation": "https://bettertobest.github.io/compassionism-simulation/", "bu_accounting_convention": { "BLEI": "food BU effective value only: 360 BU × $2.75 = $990/adult/month", "EPPM": "full BU blended value: 360×$2.75 + 840×$1.80 = $2,502/adult/month", "FBS": "BU face value: $1,200 (cash-equivalent food expenditure reduction)" }, "v31_accuracy_improvements": [ "Annual expense system: SIM_COST_SCALE depleted each year", "PTF modelled as cost-reduction factor, not wealth injection", "PTH: AE growth and rent savings in separate accounting categories", "BLEI mInc: actual agent wage, not wealth/60 proxy", "Heterogeneous automationRisk per agent [0.2, 1.0]", "Negative wealth floor -10000 (was 0/100)", "Population-level multi-year recessions with incomeMultiplier", "PTF dynamic adoption via distress and diffusion", "Tier naming: Flourishing (CCO+PTF) vs Comfortable (without)" ], "v33_accuracy_improvements": [ "Gini zero-wealth edge case: totW=0 → Gini=0 (was ||1 fake fix)", "NaN/Inf guards throughout agentBLEI, agentEDC, runYear, calcMetrics", "Proper percentile interpolation: p10/p90 use linear interpolation", "PRESET crash fix: applyPreset() guards against undefined presets", "Wage growth diminishing returns on stability premium (M&S 2013 + Carroll 1997)", "Recession beta(5,2) distribution over [0.70, 0.95] (NBER calibration)", "SIM_COST_SCALE renamed from ANNUAL_BASE_COST", "50× Monte Carlo with 95% CI (n≥10: mean ± 1.96·SD/√n)", "Participant vs. non-participant KPI stratification tracked annually", "Computed OAT sensitivity: 11 mini-simulations ±20% on 5 params (seed 7777)", "Validation suite: 4 internal consistency checks", "JSON export: full parameter + time-series snapshot", "New High Automation preset", "ODD protocol in assumptions panel (Grimm et al. 2010)", "try/catch error handling in runSim() with user-visible message" ] }, "unit_system_note": { "wealth": "USD nominal; lognormal(10.5, 1.2) → median ~$36K; Fed SCF 2022 calibration", "wage": "Simulation Income Units (SIU); lognormal(3.5, 0.5) → median ~33 SIU; NOT USD", "sim_cost_scale": "Calibrated simulation scale; operative quantity is wage*12/SIM_COST_SCALE", "interpretation": "ABM calibrated unit system — standard practice (Epstein & Axtell 1996)" }, "v31_additions": { "annual_base_cost": { "value": 1500, "note": "Simulation scale; v3.3 renamed to SIM_COST_SCALE" }, "wealth_floor": { "value": -10000, "note": "Allows debt/insolvency dynamics" }, "automation_risk": { "distribution": "Uniform(0.2, 1.0) per agent", "note": "Heterogeneous AI displacement; wage_change -= pop_rate × agent_risk" }, "recession_model": { "field_name": "incomeMultiplier (renamed from severity)", "range_v31": [0.65, 0.85], "note": "v3.1 range superseded by v3.3 beta(5,2) distribution — see v33_additions" }, "inflation": { "default": 0.0, "baseline_preset": 0.03, "ptf_damping": "effective_rate *= (1 - ptfShare * 0.5)", "pth_damping": "effective_rate *= 0.90" }, "blei_poverty": { "definition": "% agents with BLEI < 30 days (Crisis + Precarious tiers)", "target": "< 5% under full integration" }, "ptf_mechanism": "Cost-reduction factor (0.12-0.16 of annual costs); NOT wealth addition", "pth_mechanism": "Housing cost reduction (35%) + separate AE growth; no double-count", "tier_naming": { "with_cco_ptf": "Flourishing (generative system maturation active)", "without_cco_ptf": "Comfortable (temporal stability, not full Compassionism)" } }, "v33_additions": { "wage_diminishing_returns": { "formula": "WAGE_BLEI_BONUS × 1/(1 + 0.5 × max(0, wage/WAGE_MEDIAN_SIU − 1))", "wage_median_siu": 35, "rationale": "Prevents structural compounding at high wages; grounded in Mullainathan & Shafir (2013) + Carroll (1997)", "note": "BLEI is purely measurement; premium reflects underlying stability it measures" }, "recession_distribution": { "type": "beta(5, 2) over [0.70, 0.95]", "mode": 0.90, "mean": 0.88, "range": [0.70, 0.95], "beta_a": 5, "beta_b": 2, "rationale": "NBER post-WWII recession calibration; replaces v3.1 Uniform(0.65, 0.85) which overstated severe recession frequency" }, "sim_cost_scale": { "value": 1500, "renamed_from": "ANNUAL_BASE_COST", "note": "Rename avoids apparent contradiction with BASE_DAILY_COST ($68.33/day ≈ $24,941/yr vs 1,500 SIU sim scale)" }, "gini_zero_wealth": "totW=0 → Gini=0 (mathematically correct: perfect equality of deprivation); BLEI poverty is the correct poverty indicator at zero wealth", "nan_inf_guards": "Added throughout agentBLEI, agentEDC, runYear, calcMetrics", "percentile_interpolation": "p10/p90 use linear interpolation; replaces index rounding", "preset_crash_fix": "applyPreset() guards against undefined presets with console.error", "oat_sensitivity": "11 computed mini-runs ±20% on 5 parameters, seed 7777; first-order only", "validation_suite": { "checks": 4, "list": [ "BU monotonicity: BU=1200 outperforms BU=800", "Participation threshold: 78% outperforms 45%", "CCO benefit: full integration outperforms baseline", "PTF dampens inflation: PTF+inflation < no-PTF+inflation" ] }, "participant_stratification": "CCO participants vs non-participants tracked annually; tests CCO benefit without non-participant harm", "monte_carlo_ci": "n≥10 shows 95% CI = mean ± 1.96·SD/√n; UI suppressed for n≥10 (performance)", "json_export": "Full parameter + time-series snapshot for replication", "presets_added": ["hiAI"], "odd_protocol": "Grimm et al. (2010) ABM documentation added to assumptions panel" }, "core_cco_parameters": { "bu_monthly_per_adult": { "value": 1200, "unit": "USD", "range": [800, 1500], "note": "FLAT allocation — not octave-scaled" }, "bu_food_eff_blei": { "value": 990, "note": "BLEI numerator (food only)" }, "bu_blended_eppm": { "value": 2502, "note": "EPPM full value" }, "bu_epsilon_food": { "value": 2.64, "range": [1.50, 3.00], "analogue": "Mondragon Eroski: 35–55% overhead reduction" }, "bu_epsilon_utilities": { "value": 1.80, "range": [1.40, 2.50] }, "gamma_entry": { "value": 0.12, "note": "Month 0-5" }, "gamma_established": { "value": 0.20, "note": "Month 6+ (CCO floor established)" }, "participation_rate": { "value": 0.78, "range": [0.60, 0.95], "minimum_viable": 0.55 }, "phi_enhancement": { "value": 1.618, "symbol": "Φ", "elasticity": 0.12, "note": "v3.4: Phi On: effective max ≈ quality ceiling × 1.618 (e.g., ceiling 9× → ≈ 14.56×). Phi Off: max = quality ceiling only." }, "conversion_tax": { "value": 0.12, "range": [0.10, 0.15] } }, "pth_parameters": { "uptake_rate": { "value": 0.20, "range": [0.15, 0.25] }, "monthly_payment": { "value": 600, "edc": 0.00, "note": "100% to Acre Equity" }, "acre_appreciation": { "value": 0.04, "range": [0.02, 0.07], "unit": "annual rate" }, "v31_note": "AE growth tracked separately from housing cost reduction — no double-count", "ae_liquidity_haircut": { "month_0_6": { "value": 0.15 }, "month_7_24": { "value": 0.40 }, "month_25_60": { "value": 0.65 }, "month_60_plus":{ "value": 0.85 } } }, "ptf_parameters": { "market_share": { "value": 0.18, "range": [0.12, 0.25], "calibration_status": "under revision for v3.x — earlier 30% from less rigorous sim" }, "mechanism": "Cost-reduction factor applied to annual living costs (v3.0 correction)", "savings_rate": { "value": 0.12, "szh_amplified": 0.12 }, "overhead_reduction": { "value": 0.50, "range": [0.40, 0.60], "note": "Mondragon-analogy internal-overhead figure, NOT the simulation's own consumer-facing cost-reduction parameter — see savings_rate below (v4.7 clarification, prompted by an external audit citing this field as if it were the engine's cost-reduction rate)" }, "dynamic_adoption": { "base_rate": 0.005, "distress_bonus": 0.015, "note": "v3.1: agents join via economic distress or diffusion, not only at init" } }, "synergy_parameters": { "theta_min": { "value": 0.05, "at_density": 0.55 }, "theta_max": { "value": 0.25, "at_density": 0.90 }, "network_threshold": { "value": 0.55 } }, "blei_parameters": { "tier_thresholds_days": { "crisis":7, "precarious":30, "threshold":120, "stable":365, "secure":730, "top_tier":"730+" }, "blei_poverty_definition":"% agents with BLEI < 30 days (Crisis + Precarious); primary poverty indicator v3.3", "daily_cost_cco": { "value": 31.67, "unit": "USD/day" }, "daily_cost_baseline": { "value": 68.33, "unit": "USD/day" }, "edc_floor_cco": { "value": 0.025 }, "edc_near_poverty_baseline": { "value": 0.625 }, "gamma_note": "0.12 at entry; 0.20 by Month 6 (CCO floor established)" }, "calibration_benchmarks": { "note": "Internal calibration checks — confirm design targets, not external empirical validation", "blei_threshold_rate_min": 0.95, "blei_secure_rate_min": 0.80, "gini_edc_max": 0.22, "eppm_median_min": 2.00, "system_stability_min": 0.90, "blei_poverty_max": 0.05, "participant_poverty_direction": "participant_poverty_rate <= non_participant_poverty_rate", "validation_suite_checks": 4 }, "citation": { "paper": "CCO-PTF-PTH-CIP-SZH Simulation Replication Framework (Johnson & Claude, 2026)", "blei_paper": "The Basic Living Economic Index: A Temporal Stability Framework (Johnson & Claude, 2026)", "interactive_simulation": "Compassionism Framework Simulation v4.14 — bettertobest.github.io/compassionism-simulation/", "interactive_simulation_doi": "https://doi.org/10.17605/OSF.IO/QWTE2", "authors": "Johnson, D. & Claude (Anthropic)", "year": 2026, "url": "https://bettertobest.github.io/research-hub/cco-ptf-simulation-replication.html", "license": "CC BY 4.0" } }
Appendix B: Related Research

🖥️ Compassionism Framework Simulation v4.14 — Interactive Tool

Browser-based HTML/JavaScript agent-based simulation implementing all five architectures with BLEI-calibrated welfare metrics. v3.3 builds on the v3.1 accuracy improvements (annual expense system, PTF as cost-reduction factor, PTH without double-counting, heterogeneous AI automation risk, multi-year population-level recessions, negative wealth floor, PTF dynamic adoption, BLEI poverty KPI) and adds: wage growth diminishing returns, beta(5,2) recession distribution calibrated to NBER data, parameterized 50× Monte Carlo with 95% CI, CCO participant vs. non-participant stratification, computed OAT sensitivity (11 mini-runs), a four-check validation suite, JSON export, High Automation preset, and ODD protocol documentation. v3.5 adds a permanent archival DOI (10.17605/OSF.IO/QWTE2), fixes version-string drift between the displayed version and exported CSV/JSON files, and adds a live effective-max-multiplier indicator. v3.6, prompted by an external technical audit, relabels the PTF slider to reflect its initial-condition semantics (final share can exceed it via organic adoption), discloses the System Stability metric's current trend-heuristic formula via an info tooltip and Known Limitations entry, fixes a mobile table overflow bug, adds a cancel control for long-running Monte Carlo batches, and declares a previously-implicit global variable — no simulation math changes. v3.7, prompted by an external Meta AI review cross-checked against the actual codebase, fixes a double preset-apply bug on page load, adds screen-reader labels to all 11 charts, and adds an in-app glossary panel mirroring this page's Key Concepts accordion — no simulation math changes. v3.8, prompted by an external Grok review, isolates the baseline and CCO-only comparison-run RNG streams from the main trajectory (previously they shared one stream, so comparison-run length could shift the main run's random sequence at a fixed seed) — no simulation output changes for a fixed (years, nAgents) configuration. v3.9, prompted by an external Gemini review, tightens the p90/p10 wealth-ratio KPI's near-zero guard and fixes a case where OAT sensitivity mutated a shared params object instead of copying it; a proposed Object.freeze() on that object and a supplied Chart.js SRI hash were investigated and not applied — the freeze would have broken OAT's legitimate override, and the supplied hash is the wrong length for a valid sha512 digest. v4.0, prompted by an external Refine.ink review, is the first release where behaviour changes for typical configurations: FBS-gated octave advancement, octave-governed conversion capacity, PTH payment→equity contributions, network-density-gated SZH synergy, Bass-diffusion PTF adoption, dimensionally-consistent BLEI/FBS/EDC-adjusted-Gini calculations, independently-initialised and shock-paired baseline/CCO-only comparisons, and fixes to the previously-nonfunctional Monte Carlo controls, the ablation attribution methodology, OAT's perturbation scale, and two validation-suite parameter-mapping bugs — see the v4.0 note above for the full list, including what was deliberately left unfixed and why. v4.1, an internal Claude (Anthropic) audit, fixes a paired-population ablation leak that let the SZH+PTF synergy bonus survive PTF removal on the Attribution chart when SZH was active, wires up a dormant "illustrative reference run" UI label that had never actually displayed since v3.4, and corrects several UI hint strings that had drifted from their underlying formulas (recession duration/severity, octave conversion-capacity description, an effective-max-multiplier default, a baseline-chart caption, an OAT sensitivity range) — no simulation mechanics changed, confirmed via an independent N=1,000-seed large-N re-run rather than assumed; see the v4.1 note above for the full list and the near-poverty cohort's new 40-year extension study. This paragraph itself was last updated at v4.1 and, found stale while fixing an unrelated version-number reference in v4.8, is not being backfilled through v4.2-v4.8 here — that would duplicate the Version History toggle (further up this page) rather than add anything; see that toggle and CONTRIBUTING.md for the complete, current account of every release since v4.1, including v4.8's UI fixes, relicensing to Apache License 2.0 for the source code, and validated WEALTH_FLOOR sensitivity sweep. No installation required — runs directly in any modern browser.

The Basic Living Economic Index (BLEI) — Foundation Paper

Full mathematical formalization of BLEI, EDC, EPPM, FBS, CSI, and IPBI including BU purchasing power accounting convention, Appendix A (symbol table), Appendix B (worked numerical example), ε cost pass-through model (§3.3), expanded literature review, and updated references.

Risk Mitigation Framework for CCO-PTH-CIP-SZH Implementation

Comprehensive risk identification and mitigation for the failure modes identified in the BLEI paper: governance capture, participation collapse, ε degradation from network density failure, and Acre Equity liquidity risk.

Optimal Transfer Design in Post-Scarcity Economies

Mathematical proof that CCO-PTF allocation Pareto dominates traditional welfare systems under the BLEI welfare criterion.

Dual Currency Systems and Inflation: CCO's Price Stability Mechanisms

GE analysis of BU-stimulated demand effects on non-PTF market price levels. Addresses the inflationary pressure failure mode and confirms 12% conversion tax sufficiency. PTF and PTH deflationary effects relevant to v3.1 inflation mechanism.

U.S. Real Estate Market Transformation Through PTH Integration

Validates Acre Equity parameter calibration and 20% PTH uptake modeling against US real estate market structure. Primary reference for r_a range selection and CLT analogue grounding.

Executive Summary & Research Index

Complete architectural overview of the Compassionism framework: formal definitions of CCO, PTF, PTH, SZH, and CIP, their interdependencies, and the full 18+ paper research corpus.