Skip to content

DynaSim exercise 2 (Track U) continued: invented data + dry run, diagnostics, registered entry, two referee passes (u1-draft-5; no real-data statistic) - #458

Merged
MaxGhenis merged 10 commits into
masterfrom
dynamics-ex2-track-u-2-20260924
Sep 25, 2026
Merged

MaxGhenis merged 10 commits into
masterfrom
dynamics-ex2-track-u-2-20260924

Conversation

@MaxGhenis

Copy link
Copy Markdown
Contributor

This PR continues DynaSim exercise 2 ("Track U": a uniform 13% benefit cut, and the change in adjusted poverty at age 67 for the 1936–45 cohorts) after #456. It adds the rest of the Track U work that could be built without Max's rulings, and applies two independent referee passes to the spec. The spec is now u1-draft-5, still a draft.

Nothing here computes a poverty status, threshold, annuity or rate on PSID data. The PSID-facing code produces structural counts only. The registered entry point refuses to run without a ratified spec and an issue #42 registration pointer.

What it adds

  • Invented data and dry run:
    • uniform_cut_track_u/invented.py builds a seeded invented age-67 population. Invented inputs are labelled as invented, regenerated from their seed, and refused on the registered path.
    • scripts/track_u_dry_run.py runs the pipeline end to end on invented data, headed INVENTED DATA - NOT A COMPARISON.
  • PSID diagnostics: track_u_component_diagnostics.py summarises PSID Social Security, SSI and WEALTH1 amounts against published aggregates. It computes no poverty threshold. A runtime check refuses the run if the income concept or the tabulation is loaded.
  • Registered entry point: scripts/run_track_u_registered.py mirrors Track A's. It refuses without a Candidate 2 design: latent-permanent conditioned chained QRF (research memo) #42 pointer, the registered commit and a clean tree, a ratified §15 with nothing awaiting, or Census thresholds whose hash is pinned. A --headline-row argument must match the wealth-supplement staging.
  • First referee pass (boomers2004-referee-20260924.md, R1–R17):
    • annuity and IRA income is removed from income;
    • farm income is split between labor and assets;
    • the annuity is priced on the head and the head's legal spouse, with ages from derived birth years;
    • the design SE uses the full sample design (63 strata of 2 clusters);
    • a fallback row, U0-F, is added;
    • a comparison and acceptance section is added;
    • the named deltas are kept equal to the code's.
  • Second referee pass (boomers2004-referee-2-20260924.md, S1–S9), checked against the cleared definitions extract:
    • the cells follow the Report's rows, with a four-way marital status;
    • the rows not computed are listed as named omissions;
    • cut_start_year = 2004 is the primary, following the Report's "beginning in 2004";
    • rows U6 and U-inst are withdrawn;
    • the alternatives are also registered on U0-F.
  • Registration and tiers: the new modules are registered in POST_REVIEW_SOURCE_EXCLUSIONS, the pinned tuple and the reachability guard. Master (Oracle: statutory computation years (42 USC 415(b)(2)); repair Track C AIME agreement (7,486/7,486 with Axiom) #457) is merged in, and the tier manifest is recollected.

Review

Each referee application was independently reviewed by an Opus 5.5 agent.

  • Checks: the reviewers checked every PSID label against the setup files, recomputed the annuity prices and worked cases, checked 20 CFR 416, and confirmed that no poverty quantity was computed on real PSID data.
  • Fixes: the final review (subfleet-briefs-20260924/tracku-review-report.md, VERDICT: APPROVE) fixed one defect and three texts in bc82604, adding two regression tests.
  • Governance: builders read only the material the lane's RESTRICTED-FILES.md clears. The cleared exercise-2 extract passed a values scan with no leaks.

Still pending (Max)

🤖 Generated with Claude Code

MaxGhenis and others added 10 commits September 24, 2026 05:42
…st, U6, F17, registered entry

Continues the partial Track U build of #456 (plan
critical-path-uniform-cut-20260923.md, items U5, U9 and U10, rows U6
and U-inst, field F17). Nothing here computes a poverty statistic on
PSID data; the registered entry point refuses to run (the specification
is a draft, d189 and d194 are open, the 2005/2007 wealth supplements are
not staged, and no #42 registration exists).

- cohorts/age67.py: institution_income_rule for row U-inst (builder
  default family_of_record, pending the referee; alternative excluded):
  an institutionalized member takes the family unit whose interview
  number its record carries, as an OFUM with no co-resident spouse. The
  PSID collects no income for persons in institutions (ER34137-ER34143
  are inapplicable for them) and attaches their record to the family
  they left (2011 User Guide 2.4). The builder also records an
  "invented" provenance kind for frames that hash to the digest their
  invented provenance carries.
- estimates/adjusted_poverty.py: cut_start_year (default None, every
  observation cut) builds row U6; with 2004 an observation is cut only
  when its member turns 67 in or after 2004, so U1's 1936 birth year is
  uncut and gets no SSI response. birth_year is now a required column.
  The start year is pending plan decision 8.
- uniform_cut_track_u/ (new package): rows.py (the registered rows as
  spec overrides, held equal to the specification block), invented.py
  (U5: a seeded INVENTED age-67 population in the reader shapes whose
  income and WEALTH1 identities hold exactly, an INVENTED threshold
  table, and re-generation checks), runner.py (the row pipeline with
  provenance guards and the F17 official-concept diagnostic),
  diagnostics.py (F17 Social Security, SSI and WEALTH1 summaries against
  the committed SSA Supplement 2025 Table 5.A4 snapshot and the committed
  federal benefit rates; imports neither the income concept nor the
  tabulation).
- scripts/track_u_dry_run.py (U9), scripts/run_track_u_registered.py
  (U10 entry point: #42 comment pointer, registered commit on a clean
  tree, ratified block with nothing awaiting or blocking, pinned Census
  capture, every wave's WEALTH1; exclusive artifact creation), and
  scripts/track_u_component_diagnostics.py (F17 components on the staged
  PSID, no threshold).
- docs/design/boomers2004_uniform_cut_comparison.md: u1-draft-3.
- New modules registered in POST_REVIEW_SOURCE_EXCLUSIONS, the pinned
  tuple and the reachability guard; tier counts recollected (7,414).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…(u1-draft-4)

Applies the independent referee report
EVID/boomers2004-referee-20260924.md (SHA-256
b083fb2638787c204d09324a16fbbc5fa09cfc191e0450bcadb7d44f1647b2b6),
which refereed u1-draft-2 at 8d7e743, to the specification, code and
tests. Each required change was checked against its source before it was
applied: the Report's lists of tables and printed pp. 19-24 (the range
RESTRICTED-FILES.md clears), the PSID codebooks and formats, the eCFR
text of 20 CFR 416.1112, 416.1121, 416.1124, 416.1163 and 416.1205, the
nine SSA COLA notices in the Federal Register, the committed life
tables, and a design count on the staged individual file. No income
concept, threshold or poverty statistic was computed on PSID data; the
specification stays a draft (d189, the fallback rule and ratification
pending).

- adjusted_poverty: retirement_account_income_rule (F4a, default
  remove_head: HEAD ANNUITIES, "Head's Income from Annuities and IRAs"
  in 2005-2011, plus HEAD IRAS in 2013, removed under replace);
  farm_asset_share (F4b, default 0.5 of positive farm income and the
  whole loss); annuity_lives defaults to fu_head_rule, priced on the
  head and the head's co-resident legal spouse (code 20 or 90); 0.02 is
  the real-rate sensitivity; pending decisions updated.
- age67: unresolved_marital_status defaults to relationship_code (R9)
  and annuitant_age_source to derived_birth_year, with the birth-year
  law extended to in-family heads and spouses outside the universe (R8);
  row U0-F (1941, 1943, 1945); head and head-spouse annuitant columns,
  marital_resolution and age sources; threshold-free counts of farm and
  head retirement-account income in the structural summary.
- uniform_cut_tabulation: the design SE is a domain estimator on the
  full sample design (design_se_domain; z = 0 outside the cell; R10).
- uniform_cut_track_u: row U0-F and the fallback headline rule (rows
  that need a wave without WEALTH1 are reported blocked with counts);
  the runner's design frame; NAMED_DELTAS held equal to section 12; the
  invented generator adds relationship-code couples, code-90 husbands,
  farm, annuity and IRA income, and interview ages.
- run_track_u_registered.py: --headline-row must equal the fallback
  rule's row for the staged PSID; the dry run reports the fallback as
  staged today. family_income notes the 2005-2011 HEAD ANNUITIES label.
- Specification u1-draft-4 (the referee asked for draft-3, already used
  on this branch): sections 1-19 revised, new 10a (comparison and
  acceptance); section 17 records the pass: R1-R17 applied, R11 in part
  (row U-inst kept, since u1-draft-3 gave it an income rule), O1 not
  adopted with reasons, open questions 9-14.
- Tier counts recollected (7,434).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ft-4 structural counts

- uniform_cut_tabulation.pending_decisions(): the design SE domain
  (full_sample_design, alternative tabulated_rows; referee Q5/R10) and
  the cells (plan decision 2(b)); the runner and the dry run carry them
  with the income-concept and builder decisions.
- Specification u1-draft-4, sections 3, 14, 16 and 19: the structural
  counts recollected under the new rules on the staged PSID (counts
  only; evidence EVID/track-u-structure-u1d4-20260924/): 1 of the 35
  unresolved U0 marital states resolves by relationship code (U1: 3 of
  98); every annuitant age came from a derived birth year; among the 320
  computable U0 observations, 5 have family farm income and 18 head
  annuity or IRA income (U1: 9 and 66 of 857). The dry-run evidence for
  this draft is EVID/track-u-dry-run-u1d4-20260924/.
- Tier counts recollected (7,435).

No income concept, threshold or poverty statistic was computed on PSID
data.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…er bound" labels

Independent review of 310c53a..5e32237 (Track U continuation and the
first referee pass, u1-draft-4).

- uniform_cut_track_u.runner._check_parameters: a registered_real run
  compared the thresholds' recorded SHA-256 with
  adjusted_poverty.THRESHOLDS_SHA256, which is None until the Census
  capture is committed, so a table labelled "census_capture" whose
  provenance omitted its SHA-256 (or recorded None) passed the check
  (None == None). The check now refuses every table while the pin is
  unset. Regression tests: the unpinned cases are refused, and with an
  invented pin a table recording it passes while others are refused.
- adjusted_poverty.SSI_RULES and uniform_cut_track_u.rows (row U3): the
  descriptions still called U3 "an upper bound"; the specification
  (sections 8 and 11, referee suggestion O4) calls it the largest SSI
  response of the three registered rules and not a bound on DYNASIM's
  simulation. The run artifact now carries the specification's wording.
- Tier counts recollected (7,436).

No income concept, threshold or poverty statistic was computed on PSID
data.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Independent adversarial review of 310c53a..c51e7c7 (Track U
continuation and the first referee pass, u1-draft-4). No rule, default
or row changes; the behaviour tests pin what the corrected text says.

- adjusted_poverty module text: row U3 was still called "an upper
  bound" across a line break after c51e7c7 dropped the label from
  SSI_RULES and the rows; it now uses the specification's wording
  (referee O4). Regression test collapses whitespace before searching
  the module text, SSI_RULES, the row descriptions and the
  specification.
- Specification section 9 said every member of a family unit gets the
  same B, R and T under fu_head_rule; under row U6 the cut follows each
  member's age-67 year (cut_applies), so two members of one family unit
  can get different R. The section now names the U4 and U6 exceptions.
  Tests: an invented family with 1936 and 1938 members under
  cut_start_year=2004, and a text check of section 9.
- age67._annuitant_birth_years and specification section 5 said the
  R8 extension seeds a person from the earliest wave in which they are
  in a family; the code seeds from the earliest wave in which they hold
  a head, spouse or partner code (or, for a marriage-history spouse, are
  in a family). The text now states the implemented rule and records a
  review count on the staged PSID: every in-family person with those
  codes has a positive weight in 2005-2013, so the extension adds no one
  to U0 or U1. Test: an invented zero-weight wife who is an OFUM earlier
  keeps the seed of her first spouse-coded wave.
- Specification section 3 listed code 90 beside the role codes; the
  builder's role for a code-90 legal husband is OFUM (U4 keeps him on
  the family-unit basis), which the section and question 11 now say,
  with a review count of 2 U0 and 4 U1 such observations.
- family_income module text: an over-length line reflowed.
- Tier counts recollected (7,440).

Review counts on the staged PSID were structural only (relationship
codes, universe membership, design strata); no income concept,
threshold or poverty statistic was computed on PSID data.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Brings in the statutory AIME module (ss/statutory_aime.py) and the Track C
repair. Conflicts resolved by keeping both sides: the Track U and
statutory-AIME entries in POST_REVIEW_SOURCE_EXCLUSIONS and in the pinned
tuple of test_birth_evidence_artifact.py (the reachability guard merged
cleanly). tests/tier_counts.json and tests/README-tiers.md were recollected
with recount-tiers.py: unit 3,109, artifact 2,848, integration_psid 863,
reproduction_legacy 520, oracle_policyengine 163, total 7,503.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… (u1-draft-5)

Second referee report boomers2004-referee-2-20260924.md (SHA-256
2113ba9b...d5af2) on u1-draft-4 (37a94ea): ratifiable after S1-S9. Each
change was checked against the cleared exercise-2 definitions extract
(a3978b68...0384), the u1d4 structural counts, the PSID 1968 family
codebook, the family_income transfer labels or the Census poverty-measures
page before it was applied.

- S1: section 1 states the target as the cleared extract defines it (the
  1936-45 column, 36 rows, whole-number cells, the 2004 start and no
  behavioural response).
- S2: cells are the Report's Total, Gender, Marital Status and Gender and
  Marital Status rows. age67 emits marital_status_4 (married, widowed,
  divorced, never_married, unclassified); the tabulation's cells,
  REPORT_ROWS and unclassified_marital_cells ("excluded_counted") follow,
  non_married is gone, and the official-concept diagnostic uses the same
  cells.
- S3: the other 21 rows are named omissions (NOT_COMPUTED_REPORT_ROWS,
  listed in the run artifact); corrected to say only the own
  lifetime-earnings measure is stated to include uncovered earnings.
- S4: the comparator interval is +/-0.5 per level and 1 for the difference.
- S5: cut_start_year defaults to 2004; row U6 is withdrawn.
- S6: named deltas drop "imputed rent excluded" and add the income-source
  and unresolved-marital deltas.
- S7: row U-inst is withdrawn; institution_income_rule defaults to
  "excluded" (the referee's Q9 answer).
- S8: U2-F ... U10-F register each one-field alternative on U0-F's
  population, awaiting the fallback rule.
- S9: the extract, the pass and the S-item dispositions are recorded
  (section 17.3; referee_passes gains the second entry).

Optional O2-O6 and O9 applied; O1 left to the freeze. The runner records
the spouse's age source. No income, threshold or poverty status was
computed on PSID data.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Recollected the structural counts under the u1-draft-5 code (b862d2d;
evidence track-u-structure-u1d5-20260924, counts only) and built each
row with the withdrawn U-inst settings. Admitting institutions adds one
U0 observation (a 1937-born person in no wave's in-family universe, in
an institution in 2005) and none to U0-F, so the second referee's S7
premise that U-inst adds nothing holds for U0-F only. The withdrawal
stands on the Census and Q9 reasons; section 3, section 11, the named
delta (runner.NAMED_DELTAS and section 12), section 17 and the age67
and rows texts now say so.

Section 3 records the four-way marital counts by sex, the annuitant age
sources (no wave-age fallback), the code-90 husband counts (the family
file records no AGE OF WIFE for them; question 11, O7) and the 2013
HEAD ANNUITIES and HEAD IRAS counts (question 14, O8); section 4 states
U4's size rule for a female head with a legal husband.

No income, threshold or poverty status was computed on PSID data.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The builder's last step, left uncommitted when its session hit a usage
limit: spec section 14 lists EVID/track-u-dry-run-u1d5-20260924/ (run at
4666857), and the tier manifest counts the tests 4666857 added
(unit 3,125; total 7,519). The tier-policy test passes on a full
collection; black and ruff are clean.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…1-draft-5 texts

Independent review of the second referee pass (37a94ea..1fa6e60).

- Section 15: withdrawing row U6 removed the block's only "awaiting" for
  plan decision 8, which adjusted_poverty.pending_decisions (the
  cut_start_year decision) and section 16 still list as awaiting Max's
  confirmation of the scorecard's "from 2004" wording. The cut block now
  carries that "awaiting", so the registered run's ratification scan
  refuses the block until Max rules. A new test holds every code decision
  awaiting Max (ssi_rule, cut_start_year) to an "awaiting" key the scan
  finds; it fails on 1fa6e60.
- Builder boundary: it said RESTRICTED-FILES.md did not yet hold the
  2026-09-24 16:10 changelog entry for the cleared extract's values scan;
  the file now holds it (values scan clean, 0 genuine leaks, 0
  unclassified). A test holds the sentence to the file; it fails on
  1fa6e60.
- Section 16 lists the decisions awaiting Max without a card one per
  line, so decision 8 and the fallback rule no longer read as one item;
  section 11 no longer says every registered row is computed (under the
  fallback rule the rows defined on U0 or U1 are reported as blocked);
  section 14 records that the invented dry run re-run at 1fa6e60 equals
  the u1d5 evidence except for the commit and output path.
- Tier manifest recollected (unit 3,127; total 7,521).

No rule, default or row changed. No income, threshold, annuity or poverty
status was computed on PSID data.

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

vercel Bot commented Sep 24, 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 Sep 24, 2026 11:19pm UTC

Request Review

@MaxGhenis
MaxGhenis merged commit e79a920 into master Sep 25, 2026
12 checks passed
@MaxGhenis
MaxGhenis deleted the dynamics-ex2-track-u-2-20260924 branch September 25, 2026 14:11

This branch was successfully deployed

1 active deployment
Preview — bc82604e Deployed Sep 24, 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