Skip to content

Registration 19: SSI asset-test population run, with its released results - #511

Merged
MaxGhenis merged 29 commits into
masterfrom
pe-us-depletion-cut-population-20261001
Oct 12, 2026
Merged

MaxGhenis merged 29 commits into
masterfrom
pe-us-depletion-cut-population-20261001

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor

Registration 19: specification, code, and the released one-shot results. The registered run took place on 2026-10-06 at the registered commit 3ba0d020 (tag registration-19-sa1). Max released the results on d905 (2026-10-10), and they were posted on issue #42 here.

Warning

Frame defect: microcosm#1178. The frame's PUF-support channel erases CPS-reported Social Security for 11.8 million weighted people, 9.2 million of them aged 65 and over. Only 15.8% of the model's SSI recipients aged 65 and over have Social Security, against SSA's 57%. The results are the registered result on that frame, published as the registration commits; they are not an estimate for the US population. A rerun on the corrected frame will be registered separately once #1178 is fixed.

Merge with a merge commit, never squash or rebase: the registered commit 3ba0d020 and the results commit 5fc28d08 must stay in history.

Results in this PR

  • runs/pe_us_depletion_cut_population_v1.json and its .env.json sidecar: the bytes whose SHA-256 (ef9366be…, 360a3b99…) were posted on issue Candidate 2 design: latent-permanent conditioned chained QRF (research memo) #42 before release (comment 6014920955). A pin test (tests/bridge/test_pe_us_depletion_cut_population_v1_artifact.py) holds them.
  • docs/analysis/pe_us_depletion_cut_population_20261001/: the report and the chart.
  • Run: Modal call fc-01M48CG9VMP741AWN9A163FE9B, first attempt, exit 0. Every refusal and row-validity check passed. An independent recomputation from the raw arrays reproduced all 12,319 compared values.

What this is

PR #506 showed that for an illustrative low earner with $1,500 in the bank, SSI replaces a depletion-sized Social Security cut dollar for dollar. At the NASI meeting on 2026-10-01, participants asked how often that holds for real beneficiaries, since SSI's asset limit excludes many people, and asked for results by age, sex, marital status, race and income quintile.

This PR adds the registered analysis that answers it: the same cut (22 percent OASI, with 17 percent OASDI as the sensitivity) on Microcosm's populace-us-2024 frame, which carries imputed bank, stock and bond assets, through PolicyEngine-US 2.18.0, with and without SSI's resource test.

What it adds

  • src/populace_dynamics/bridge/depletion_cut_population.py: the registered arithmetic on arrays. The cut, the marital-unit replacement labels (full, part, none), the resource tests for rows R0, R3 and R4, the cells, the statistics and the household bootstrap.
  • src/populace_dynamics/bridge/depletion_cut_population_child.py: the worker that runs inside the PolicyEngine-US interpreter. It always passes an explicit dataset, refuses the real frame outside a registered run, and removes the resource test with a structural reform.
  • scripts/run_pe_us_depletion_cut_population_registered.py: the one-shot entry point, with the preflight refusals, the run-time checks and the labelled outputs.
  • Tests: unit and property tests, a specification test that holds the code's constants to the spec's machine-readable block, script tests, and live oracle tests on invented households.

It also fixes one thing in #506: its artifact test ran git diff --quiet <commit> HEAD -- src scripts, so it would fail as soon as any later change touched src/ or scripts/. The diff now covers only the files that artifact records as its dependencies.

Invariants

Stated in the specification and tested as properties:

  • The vectorized cut equals PolicyEngine-US bridge: depletion-cut offsets for illustrative households #506's payable_monthly_benefit element by element; 12m <= a < 12(m + 1) holds exactly; a payable share of 1 changes nothing; the OASI cut never touches the disability component.
  • The three replacement labels partition the cut beneficiaries, and their shares sum to one.
  • Person by person, SSI with an asset test equals SSI without it times the pass indicator (checked at run time; rows R3 and R4 rest on it).
  • Household pooling (R4) blocks at least as often as spousal deeming (R3).
  • One-way cells partition each universe; quintile cutpoints follow the registered weighted rule, and ties share a quintile.
  • The bootstrap is deterministic under its seed and does not depend on the order of people within a household.

What the review found

Four independent referees reviewed the specification in two rounds, plus two re-checks before ratification; §20 of the specification and the registration comment list them. Findings that changed the design:

  • PolicyEngine-US 2.18.0 does not deem a spouse's resources (20 CFR 416.1202(a)); row R3 applies that rule.
  • It caps a deemed benefit at the individual rate only, where 20 CFR 416.1163(e)(2) also subtracts the person's own countable income; the "none" label therefore includes SSI that falls.
  • The frame puts each household's assets on one person, so rows R3 and R4 show how the result depends on that.
  • The frame's beneficiaries aged 62 and over are 85.6 percent married, against about 60 percent in published figures. Every output carries that as a named difference.

Tests

The code was tested on Modal (Linux, the frozen environments of #506's runner) with invented data only: 239 tests at the registered commit, plus a frame-sized invented dry run and control-path rehearsals of the runner. CI runs the full suite here, including the tier census: unit 6,166; artifact 3,540; integration_psid 1,341; reproduction_legacy 520; oracle_policyengine 232.

axiom: n/a: analysis code, no policy change. (Two PolicyEngine-US SSI encoding gaps found here are filed separately.)

🤖 Generated with Claude Code

MaxGhenis and others added 20 commits October 1, 2026 18:46
The registration spec for extending PR #506's depletion cut to
Microcosm's populace-us-2024 frame: how often SSI's resource test stops
SSI from replacing a 22% OASI cut (17% OASDI sensitivity), by age, sex,
marital status, race and income quintile. Draft, not registered.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Methodology-review fixes: statistics renamed _test, a conditional
denominator and small-cell rule for B_cond, a fully specified bootstrap,
the none label covering SSI decreases, the spousal-deeming cap named as
difference 12, defined diagnostic aggregation, and a fifth label for the
headline's basis.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Implementability-review fixes: the refusal rule covers only the refusal
checks, empty cells are exempt from the partition check, the baseline
components come from a probe simulation, the cut check is exact per
component, and the synthetic-split check has an exact rule.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: GPT-6 <noreply@openai.com>
Co-Authored-By: GPT-6 <noreply@openai.com>
Co-Authored-By: GPT-6 <noreply@openai.com>
Co-Authored-By: GPT-6 <noreply@openai.com>
Round-2 fixes: drop the beneficiary record count that the exposure record
lists as a frame tabulation, add the re-execution marker and the rule for
a failure after the statistics phase, state the bootstrap's household set
and replicate weights, restate refusal 3 for the probe, register
dataset_end_year=2026, and describe the review lanes by round.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The cut check is exact per component (each calculated component equals
the float32 of the input set), the synthetic-split check uses the
specification's rounding rule, operational failures are distinguished
from the numbered refusal checks, and the release decision is filed
before the run so the artifact can record its id.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The specification has the artifact record the id of the decision that
holds the release, so the entry point refuses a registered run whose
metadata does not name it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The specification is sa1-draft-6 with its version and status set and the
ratification check recorded; two independent re-checks recommended
ratifying it as it stood. The code pins its SHA-256, and the cut check
again refuses a non-finite Social Security total.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@vercel

vercel Bot commented Oct 2, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
social-security-model Ready Ready Preview Oct 12, 2026 9:15am UTC

Request Review

@MaxGhenis
MaxGhenis changed the base branch from pe-us-depletion-cut-20261001 to master October 3, 2026 18:34
MaxGhenis and others added 3 commits October 3, 2026 14:36
Any failure now leaves a refusal record; entity order and exact inputs
are recorded by the parent under their registered refusal numbers rather
than as a child crash; a weightless decile-0 household no longer raises;
the context block reports the beneficiary record count; a registered run
needs matplotlib for its chart; the SSA page is hashed when present.
Adds a worked end-to-end test with expected values for every row.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Tier counts are master's plus this branch's additions (unit +122,
oracle +12).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Refusal 4 again covers only what the specification registers; the
no-local-path check (refusal 7) is settled before any child runs and now
catches embedded paths and path-valued keys; repeated probes are compared
bit for bit; the child refuses the real frame unless a validated
registration record is set; a frame that stored a calculated variable is
refused before any outcome is computed; undefined unscored totals carry a
reason; the chart marks small cells; a registered run needs its context
snapshot. PR #506's identity test now follows the artifact's import
closure instead of a recorded module list.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The frame's time-period table is a Series; the stored-variable guard now
skips tables without columns. Found by the frame-sized invented dry run.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The registered one shot (issue #42, Registration 19) ran on Modal at
3ba0d02 (call fc-01M48CG9VMP741AWN9A163FE9B, 2026-10-06 10:35-11:04Z),
exit 0. The artifact, sidecar, report and chart are the volume's bytes;
their SHA-256 were posted on issue #42 (comment 6014920955) before any
release decision. A pin test keeps the committed copies identical.

LOCAL ONLY: release (push, PR, run-complete comment) waits for Max's go
on d905.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…lation branch

Takes master's version of PR #506's artifact test (#514 narrowed its pin
to the generator's own code). Tier counts are master's plus this branch's
additions: unit 6,166; artifact 3,536; integration_psid 1,341;
reproduction_legacy 520; oracle_policyengine 232 (11,795).

The registered commit 3ba0d02 (tag registration-19-sa1) is unchanged;
this merge only brings the branch up to date for PR #511.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis and others added 2 commits October 10, 2026 05:53
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Brings in 5fc28d0 unchanged: the artifact, sidecar, report and chart
whose SHA-256 were posted on issue #42 (comment 6014920955) before
release, and their pin test. Max released them on d905 (2026-10-10),
with microcosm#1178 disclosed on issue #42.

Tier counts: unit 6,166; artifact 3,540; integration_psid 1,341;
reproduction_legacy 520; oracle_policyengine 232 (11,799).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis MaxGhenis changed the title Register and build the SSI asset-test population run (Registration 19; no results) Registration 19: SSI asset-test population run, with its released results Oct 10, 2026
…e population branch

Tier counts are master's plus this branch's additions over the merge
base 1fadf50 (unit +137, artifact +4, oracle_policyengine +12):
unit 6,550; artifact 3,929; integration_psid 1,346;
reproduction_legacy 520; oracle_policyengine 232 (12,577). The one
file both sides edited, the birth-evidence exclusion lists, only gains
entries; its test count is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis marked this pull request as ready for review October 12, 2026 09:27
@MaxGhenis
MaxGhenis merged commit 42bd11a into master Oct 12, 2026
12 checks passed
@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Merge audit. Merged at 2026-10-12T11:54:00Z as merge commit 42bd11a1, pinned to the reviewed head e5fc2165 (--match-head-commit). No squash or rebase.

Gates at merge

Verified on master after the merge

  • The registered commit 3ba0d020 (tag registration-19-sa1) and the results commit 5fc28d08 are both in master's history.
  • runs/pe_us_depletion_cut_population_v1.json hashes to ef9366be…, the value posted on Candidate 2 design: latent-permanent conditioned chained QRF (research memo) #42 before release.
  • Tier counts: unit 6,550; artifact 3,929; integration_psid 1,346; reproduction_legacy 520; oracle_policyengine 232. These are master's counts plus this PR's additions, confirmed by CI's tier census.

Still open

  • Registration 20, the rerun on a frame without the defect, stays an unregistered draft until microcosm#1178 is fixed (PR microcosm#1186) and the frame is recertified.
  • No numbers go to outside readers until then.

@MaxGhenis
MaxGhenis deleted the pe-us-depletion-cut-population-20261001 branch October 12, 2026 11:56
MaxGhenis added a commit that referenced this pull request Oct 12, 2026
Brings in #511. Tier counts resolved as master's plus this branch's
change, and verified by collecting each tier: unit 6,766, artifact
3,929, integration_psid 1,346, reproduction_legacy 520,
oracle_policyengine 307; total 12,868.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Oct 12, 2026
…to the read-log branch

Tier counts by collection on the merged tree: unit 6,834 (#505's 6,766
plus this PR's 68), artifact 3,929, integration_psid 1,346,
reproduction_legacy 520, oracle_policyengine 307; total 12,936.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Oct 13, 2026
…505)

Master 3d23760. gates.yaml (blob b0c39af) and runs/legacy_manifest_v1.json
are unchanged on master since this branch's last merge base, so the lock
flip's pins hold. Only the tier counts conflicted; recounted against the
full collection: unit 6,747, artifact 4,036 (total 12,956).

Against master + (branch - merge-base), 80 tests move from unit to
artifact: tests/track_u2/test_source_registries.py now reads
runs/legacy_manifest_v1.json (62ad264), and the classifier assigns any
module that reads a committed runs/*.json to the artifact tier
(tests/conftest.py, _references_committed_artifact; README-tiers rule 5).
CI runs every tier, so coverage is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

This branch was successfully deployed

1 active deployment
Preview — e5fc2165 Deployed Oct 12, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant