Skip to content

U2 births: count out seeds outside the birth law's support (d1724) - #552

Merged
MaxGhenis merged 11 commits into
masterfrom
u2-d1724-birth-bounds
Oct 20, 2026
Merged

MaxGhenis merged 11 commits into
masterfrom
u2-d1724-birth-bounds

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

Ruling d1724: fix U2's birth universe so §20 step 4 can run once more. Code and invented data only; no PSID record was read. career.py is byte-unchanged.

Why

The d1649 step-4 structure run (2026-10-19, 640adccf) stopped in cohort.derive_u2_births, before writing any output. career.derive_birth_years asserts that a birth year derived from a seed coordinate (age code 2–125) lies in [1889, 2016]. U2's universe takes every positive-weight, in-family person at any age, so a young child in a late wave, or an age code of 124–125 in 2013, reaches that assertion. The law also refuses, after its loop, every seed age code except 1–125 and 999. The assertion would have masked that refusal; the individual file's code 0 (Inap.) can reach it.

The rule (cohort._seed_for_the_law; spec §16d)

It applies only to persons whose birth year only the seed could give. Those are the persons the law, run without seed coordinates, leaves unresolved. For them:

  • Refused seed code (0, or anything except 1–125 and 999): the seed becomes the earliest presence aged 2–125 whose implied year lies in 1889–2016 (re-seeded). If no such presence exists, the person is counted out under seed_age_0 (first code 0) or no_valid_seed_age.
  • Out-of-support seed (age 2–125, implied year <1889 or >2016): the person is counted out under before_1889 or after_2016.

Everyone else keeps the law's precedence and record: a marriage-history or earnings year still wins, and codes 1 and 999 stay unresolved. A counted-out person never re-enters through the annuitant extension. That extension already seeds only presences the law accepts.

Disclosure: every row's structural counts carry n_seed_birth_year_counted_out (four keys) and n_seed_birth_year_reseeded. Each count decides nothing.

Reading choices (agreed with the coordinator; the widening approved by Max on 2026-10-20, noted on d1724):

  • Only seed-dated persons are counted out, so no cohort member with a history or earnings year can be lost.
  • Code 0 is re-seeded like any refused code instead of being counted out at once, because the loader documents 0 as Inap., not as an age. A cohort member with one bad presence keeps its seed. Max's approval named code 0 explicitly. It also named 999, but the law leaves 999 unresolved, so the rule keeps it on that path. That is narrower than what was described to Max, and §16d says so.

Invariants (tested)

  • The universe and the four counted-out sets partition the presence set.
  • Each person's outcome equals §16d's, computed from career run on that person alone. This is a Hypothesis property over every age code, bound and history/earnings mix, plus pinned examples.
  • No counted-out person can be dated into 1946–55. A cohort member with one refused code keeps its seed and its observations.
  • derive_u2_births completes on a fixture holding every case. The dry-run variant runs U1 and its income rows end to end.
  • Base invented births are identical to master's; checked one-off by loading master's derive_u2_births from Git. Master raises on the counted-out fixture.
  • Counting persons out changes nothing else: observations, dispositions, design frames, income rows and every other count stay as they were.
  • The derivation is deterministic.

Spec

§3's lines are pinned to draft 3, so the "§3 note" is a new §16d. The d1090 record test now cuts §16c's record at §16d and requires a unique §16d heading. §16d is pinned line by line, with 21 text mutations. §17 points to §16d. §20 step 4 records that the d1649 pass stopped with no output and that d1724 authorizes one more pass. The §19 entry, the spec pin (u1_identity.json) and the exposure record are updated.

Checks

  • U2 suite under an empty PSID root at the final head: 1,372 passed, 254 skipped. Estimates and Track M suites: passed.
  • Code mutation check (EV/rulings-records-20261019-d1724/mutate.py): 24/24 killed. That includes the three mutants that survived the first review: re-seed support narrowed at both ends, narrowed at 2016 only, and the extension admitting code 0.
  • Differential against master's derive_u2_births from Git: identical results on the base and all earlier invented variants. Master raises on both new variants. The first reviewer's 600-case random differential found no case where only this PR raises.
  • Tiers by collection: master e0a731ae 9,916 / 4,253 / 1,423 / 520 / 308. This head (aa597e24): unit 9,958, artifact 4,253, integration_psid 1,450, 520, 308 (total 16,489).

Reviews (records: EV/rulings-records-20261019-d1724/)

  1. 20261020-030251-d1724-review-552b, Opus 5.5 (no Codex lane free): APPROVE at 8a6a8192, with test gaps and record points. Addressed in 068ee2e2; one point declined (the version line is pinned by the d1090 check).
  2. 20261020-045107-d1724-review-552-delta, GPT-6.1 Sol: APPROVE at 068ee2e2, one nit. Fixed in 88f3a172.
  3. 20261020-051420-d1724-review-552-delta2 (one-line exposure-record fix): APPROVE at 88f3a172.
  4. 20261020-114816-d1724-review-552-delta3b, Opus 5.5: REQUEST_CHANGES at 5dfc8413. It found that §16d left out the 999 divergence from the description Max approved, plus two wording points. Fixed in aa597e24.
  5. 20261020-130902-d1724-review-552-delta4, GPT-6.1 Sol: APPROVE at aa597e24, with no findings.

axiom: n/a: U2 cohort-construction code and specification records, no policy rule

🤖 Generated with Claude Code

The d1649 step-4 pass stopped in derive_u2_births: career's derived-age
clause asserts a seed-derived birth year in [1889, 2016], and U2's
universe takes every positive-weight in-family person at any age.

Before the law runs, count out each universe person whose birth year
only the seed coordinate could give (the law, run without seeds, leaves
them unresolved) and whose seed implies a year before 1889 or after
2016. The law's precedence is unchanged: a marriage-history or earnings
year wins whatever the seed implies. Seed codes 1, 999 and 0 stay on
their existing paths. A counted-out person never re-enters through the
annuitant extension, whose own row filter already keeps it inside the
support. Each side's count is disclosed per row as
n_seed_birth_year_counted_out and decides nothing. career.py is
unchanged.

Two invented variants (outside and at the bounds) and a new test module
cover both sides, the 1889 and 2016 boundaries, the disclosed counts,
that nothing else changes, and a per-person career oracle property.

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

vercel Bot commented Oct 19, 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 20, 2026 8:21pm UTC

Request Review

§3 keeps its draft-3 lines (the registries cite them), so the note d1724
names stands in a new §16d, as §§16b-16c amend §3: the count-out rule,
how the ruling's words are read (only persons the seed would date, so
the law's precedence is kept), why no cohort member is lost, Track M's
precedent and the disclosure. §17 and §20 step 4 point to it; step 4
records the stopped d1649 pass and the one further pass d1724 allows;
§19 logs the change. The d1090 record test cuts §16c at §16d, §16d is
pinned line by line with 16 mutations, and the spec pin moves.

The invented variants' members now join, in their first wave, families
that supply a U1 observation in that wave. Tiers by collection: unit
9,916 -> 9,941, integration_psid 1,423 -> 1,441 (total 16,463).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis and others added 3 commits October 20, 2026 02:59
… seed

At the coordinating session's request (d1724's purpose: step 4 runs once
more). career.derive_birth_years refuses, after its loop, any seed age
code but 1-125 and 999; the d1649 assertion masked that. For a person
only the seed would date: a seed whose code the law refuses (0, which
the individual file documents as Inap., or any code outside 1-125 and
999) is replaced by the earliest presence aged 2-125 whose implied year
lies in 1889-2016; a person with none is counted out under seed_age_0 or
no_valid_seed_age. Disclosed per row with the bound counts, plus
n_seed_birth_year_reseeded. Codes 1 and 999 and the law's precedence
are unchanged; career.py is unchanged.

The invented variants become seed_births_counted_out (every reason) and
seed_births_every_case (plus the 1889/2016 members and two cohort
members re-seeded past codes 0 and 998). Tests cover each reason, the
re-seed, the masked refusal without the rule, and a per-person career
oracle over refused codes; 21 mutants each fail a test. §16d and §19
state the widened rule; the spec pin moves.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Tiers by collection at the merged head: unit 9,956, integration_psid
1,445 (artifact, reproduction_legacy and oracle unchanged; total
16,482). The disclosure mutation now names "Each reason's count".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Tests: re-seeding at both ends of the support ({2017: 0, 2019: 2} ->
  2016; {2013: 998, 2015: 125} -> 1889), and the extension's code-0
  filter where the implied year lies inside the support (2015). The
  review's three surviving mutants now fail; the mutation check is
  24/24.
- §16d and §19 record that the coordinating session asked for code 0
  to be counted out at once, and that re-seeding it is this change's
  choice (code 0 is documented as Inap.); a pinned mutation guards it.
  The infant and annuitant-fallback sentences are corrected. Spec pin
  moves.
- The structure script's docstring lists every reason and the
  re-seeded count; derive_u2_births no longer reuses `present`.
- Exposure record names the review lane. Tiers: unit 9,958,
  integration_psid 1,446.

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

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Max approved widening the rule to refused seed codes, re-seeding
included, on 2026-10-20 (noted on d1724). §16d's ruled line and its
reading paragraph, and the §19 entry, now cite that approval in place
of the coordinating session's request, and keep the record that the
session first asked for code 0 to be counted out at once. Two pinned
mutations guard the approval clauses; spec pin moves. Tiers:
integration_psid 1,447 (total 16,486).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The coordinating session confirmed that Max's 2026-10-20 approval
(noted on d1724) named code 0 (Inap.) explicitly as re-seeded from the
earliest presence the law can date. §16d now states that approval as
the operative line and keeps the earlier count-out request only as a
parenthetical; §19 states the approval alone. A pinned mutation guards
the code-0 clause; spec pin moves. Tiers: integration_psid 1,448
(total 16,487).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- §16d and §19 say that the widening described to Max also named code
  999 (DK/NA) as refused; the law leaves 999 unresolved, so the rule
  keeps it on that path, narrower than described (the correction noted
  on d1724). A pinned mutation guards it.
- §16d says re-seeding "can keep" a cohort member, not "keeps" one.
- The exposure record lists d1724's two notes among the lane's reads
  and how it learned of the approval.
- Spec pin moves; tiers: integration_psid 1,450 (total 16,489).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis marked this pull request as ready for review October 20, 2026 17:23
@MaxGhenis
MaxGhenis merged commit 1e739d3 into master Oct 20, 2026
12 checks passed
@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Merge audit (d1724). Merged with a merge commit as 1e739d328b73c99d259a72952b3452546721bfb8, pinned with --match-head-commit 7791ceaf7bffd13be41f7f10e5a6c22a3bf11ec2.

  • Rulings:
    • Max's d1724 (2026-10-19) authorizes the fix.
    • Max approved its widening to seed codes the law refuses on 2026-10-20, including re-seeding code 0; this is noted on d1724.
    • The coordinating session (local_6085d52a-…) granted the tier slot.
  • Reviews (records in EV/rulings-records-20261019-d1724/):
    • …-review-552b, Opus 5.5: APPROVE at 8a6a8192.
    • …-review-552-delta, GPT-6.1 Sol: APPROVE at 068ee2e2.
    • …-review-552-delta2: APPROVE at 88f3a172.
    • …-review-552-delta3b: REQUEST_CHANGES at 5dfc8413; fixed in aa597e24.
    • …-review-552-delta4, GPT-6.1 Sol: APPROVE at aa597e24, no findings.
    • …-review-552-merge: APPROVE at 7791ceaf. It confirmed the master merge brings in exactly Progress scorecard: add gate_epuf_fill and B2's failure #553's diff, byte for byte.
    • No review was outstanding with changes requested.
  • Gates at 7791ceaf:
    • gh pr checks exited 0: lint, build, pytest (3.14), all four pytest shards and both graph-integration jobs passed.
    • mergeable was MERGEABLE (CLEAN), and the PR was not a draft.
    • Master was b7dae930, already merged into the branch.
  • Checks:
    • 24/24 code mutants killed.
    • U2 suite under an empty PSID root: 1,372 passed.
    • Tiers by collection: unit 9,958, artifact 4,253, integration_psid 1,450, reproduction_legacy 520, oracle_policyengine 308 (total 16,489).
    • career.py is byte-unchanged.
  • Data access: no PSID record was read, and no file on the restricted list was opened.
  • Next: the coordinating session runs §20 step 4 once more under d1724 (structure, then component diagnostics), once master's Tests pass at the run head.

@MaxGhenis
MaxGhenis deleted the u2-d1724-birth-bounds branch October 20, 2026 21:41

This branch was successfully deployed

1 active deployment
Preview — 7791ceaf Deployed Oct 20, 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