Repository navigation
Register gate_epuf against SSA's Earnings Public-Use File (unlocked, report-only) - #509
Conversation
Registers the rules of a proposed gate that scores the gate-1 generator's earnings against SSA's 2006 Earnings Public-Use File, before any real-PSID value in EPUF units exists. The floor artifact and the draft gates.yaml block follow in a later commit, built by the code committed here. - data/epuf.py: byte-pinned EPUF reader (POPULACE_DYNAMICS_EPUF_DIR) that reproduces SSA's published Table A1, Table 4, Charts 3-4 and the research note's Table 8 from the staged bytes. - harness/epuf_operator.py: EPUF's cap and disclosure operator for survey-side and model-side earnings, with per-year constants read off the pinned bytes. - harness/epuf_cells.py: the window cells (r6, zint, d_anyzero, q_atmax, mpers, q_sexratio by sex and cohort band, 1998-2004) and the report-only career cells. - harness/epuf_gate.py: floor replicate, tolerance, acceptance interval, eligibility, ladder and scoring. - scripts/build_epuf_gate_floors.py: the candidate-blind floor builder. - docs/amendments/gate_epuf_registration_proposal.md: the proposal's rules; its results section is filled by the floor build. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
The report-only career AIME ranked only ages 22-61. The statute ranks every year after 1950 through the cutoff, including years before age 22, and its oracle test had been built the same way, so it matched by construction. The test now passes the oracle every year through age 61. The career-assembler mask now starts each career at max(1968, birth year + 22), as build_career does, rather than at 1968 for everyone. For the cohorts it is applied to (born 1930-1944) the two agree. Neither cell enters the gate: both belong to tranche R, which is report-only. Found after the first floor build, whose outputs are preserved in the evidence folder (epuf-20261001/first-floor-build). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adds the floor artifact the rules-first commit's builder produced, the draft gates.yaml block it renders (locked: false, not in gates.yaml), the test that binds the two, and the proposal's results. - Support: 5,769 PSID persons present at 1998-2004 with a last period of 2006 or later; EPUF side 1,311,282 persons born 1947-1973. - Gated: 1998-2004 rank persistence by sex. PSID 0.668 vs EPUF 0.711 (men) and 0.640 vs 0.672 (women); faithful-candidate pass probability 0.9986. - Reported: zero-year and maximum cells, unpowered at PSID scale or with a bridge past the cap (PSID men at the maximum 17.8% vs EPUF 11.6%). - Pause: the registered persistence bite fails the gate 44% of the time, against 90% required. Options are listed for the referee round; no rule was changed to clear it. - Tranche R, EPUF only: the career assembler's rules cut the median AIME of men born 1940-1944 by 10% and 1930-1934 by 36%. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ion-20261001 # Conflicts: # tests/README-tiers.md # tests/tier_counts.json
CI shard 1 failed test_reducer_input_identity_matches_reviewed_branch: the
five new opt-in modules (data/epuf.py and harness/epuf_{operator,cells,
gate,run}.py) were not in POST_REVIEW_SOURCE_EXCLUSIONS or the test's
matching tuple. Nothing historical imports them; the reachability test now
asserts that for the five, as it does for the bridge modules.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The independent referee (reviews/gate_epuf_round1_referee_20261002.md, verdict AMEND) found that the registered gate cannot fail the generator for anything gate 1 does not already catch, and rejected relaxing the bite requirement after the result. This commit takes that ruling. - The block's status is unlocked_report_only and it gates nothing. The two cells the registered rules selected are recorded beside the ruling. - runs/epuf_gate_supplement_v1.json stores each bite's per-seed estimates, mean shift and power under the gate's own noise model. The registered persistence bite shifts the correlation by 0.067 (men) while the cell's 90 percent detection point is 0.111, so the pause was built into the registration. It also stores the support's birth-year mix beside EPUF's. - runs/epuf_gate_floors_v1_first_build.json is the first floor build, frozen; a test checks its window results equal the rebuild's. - The block names the rules commit and the build commit separately and pins the scoring path's SHA-256. - The proposal states the outcome in plain words, corrects the wording the referee flagged, and lists what a gate with bite would need. - The paper's section on the PSID's limits no longer says the comparison is undesigned and unregistered. No derivation file changed: the floor artifact still binds to the code that built it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The round-2 verifier (reviews/gate_epuf_round2_verification_20261002.md, merge after listed fixes, no blockers) found that the record claimed a report-only path the code did not provide: the scoring function split the gap for the two persistence cells only and still returned a pass field. - harness/epuf_run.py: report_candidate replaces score_candidate. It reports every window cell (estimate, distance from EPUF, and that distance split into model and source terms) and returns no pass or fail. No run script calls it yet, and the record now says so. - The proposal, block and paper say the gate "has not been shown to catch anything gate 1 does not already catch" where they said it "cannot fail" the generator for it; no perturbation was ever scored on gate 1. - Section 7: sex-level figures are labelled as means over the three cohort bands; two bridges corrected in the third decimal (+0.424, +0.086); one cohort cell (r6.women.c1) is eligible and reported; the both-sexes donor bite lands slightly past EPUF, not short of it. - The birth-year comparison is described as a comparison of labels, not a measure of the shift. - Tests pin the reporting path and supplement by literal SHA-256 and recompute the 80 percent detection points, the per-cell bite fail shares and the birth-year mix. - The paper sentence follows the verifier's wording. No derivation file changed (git diff ce8d500 HEAD on the five is empty). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The re-review of the round-2 fixes (reviews/gate_epuf_round3_rereview_ 20261002.md) approved head 9384832 and listed five minor points. - The paper and the proposal's outcome say only two cells "met the rules for gating". A third cell had the power but the ladder did not select it, so "had enough power" contradicted section 7.2. - report_candidate is now tested against the committed artifact, where the bridges are not zero: the source term equals the stored bridge, the model term is the rest, and undefined values propagate. - The supplement tests assert their cell sets and band years, so none can pass on an empty loop. - Section 10 lists the round-2 commit; the checklist says "reporting path"; the block's ruling gives the bite shift for both sexes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Confirmation review of the final head APPROVE All five of round 3's points are fixed at
Point 2 in detail. The new tests cannot pass vacuously:
Point 3 in detail.
New findings. Nothing blocks merge. Three optional nits:
Lock and certification check.
What I could not check:
|
Resolves the only conflicts, in tests/tier_counts.json and tests/README-tiers.md, by recounting the merged suite with pytest --collect-only -m <tier>: unit 5,948, artifact 3,361, integration_psid 1,341, reproduction_legacy 520, oracle_policyengine 220 (total 11,390). No registration file, derivation file or result changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…l points - reviews/gate_epuf_round4_confirmation_20261002.md commits round 4 (job 20261002-173551-epuf-gate-r4, head 95291e7) verbatim; the block records it as confirmation_round_4. - Rounds 3 and 4 keep the reviewer's verdict apart from the fixes. - The committed-bridges test checks each estimate against the seeds' mean computed without pooled_estimate. The invented seed values are now skewed: with the old symmetric tilt, a median passed. A median and a mean of logs each fail the test now. - One proposal line rewrapped; section 10 names 95291e7. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The history list stopped at round 2, and its round-2 line mixed the verdict with the fixes. It now has one entry per review round, each keeping the verdict apart from the commit that applied the fixes, and the rounds test checks every round appears in the history. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ion-20261001 # Conflicts: # tests/README-tiers.md # tests/tier_counts.json
|
Merge record:
|
#509 merged as 492d5a6, so this branch now targets master. Merged rather than rebased so the registered floor build's commit (cb76ad1) stays on the branch's history, which the bound-file test diffs against. Only the tier-count files conflicted; recounted against the full collection: unit 6,017, artifact 3,388 (total 11,486). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ates branch Brings in master through #509 (492d5a6). Merged, not rebased, so the manifest's code_commit (b722382) stays on this branch's history; the manifest, the staged fills and every pinned file are unchanged. Only the tier-count files conflicted; recounted against the full collection: unit 6,037, artifact 3,398 (total 11,516). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…eakdowns PR Keeps both sides' reducer exclusions. Tier manifest from a full collection, reconciled with master plus this PR's delta: unit 6,401, artifact 3,904, integration_psid 1,346. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
What this does
Registers
gate_epuf: the rules for scoring the gate-1 generator's earnings against SSA's 2006 Earnings Public-Use File (EPUF), a public 1 percent sample of Social Security numbers with capped taxable earnings for 1951-2006. A gate is a pass-or-fail test whose rules and thresholds are fixed and published before the model is scored against it.Outcome: the gate does not lock. As registered it has not been shown to catch anything gate 1 does not already catch, and it could not meet its own check on its bite. It gates nothing. Nothing here edits
gates.yaml, a locked gate or a committedruns/*.json; the registration record isdocs/design/gate_epuf_block_draft.yaml(locked: false,status: unlocked_report_only). No model has been scored.Full record:
docs/amendments/gate_epuf_registration_proposal.md. Review rounds, each by an independent Opus 5.5 lane:reviews/gate_epuf_round1_referee_20261002.md(AMEND: do not lock),reviews/gate_epuf_round2_verification_20261002.md(merge after listed fixes),reviews/gate_epuf_round3_rereview_20261002.md(APPROVE, five minor points), andreviews/gate_epuf_round4_confirmation_20261002.md, a confirmation of95291e75(APPROVE, three optional points; also posted below as a comment).Why it does not lock
The round-1 referee (independent Opus 5.5) rejected loosening the check after the result. This PR takes that ruling. Section 12 of the proposal lists what a gate with bite would need: cells whose bridges no one has computed (which needs a generator of earlier years or careers), a bite dosed above the cell's own detection point, and a demonstrated catch beyond gate 1.
What EPUF does measure
On the generator's support (5,769 PSID persons; 1,311,282 EPUF persons born 1947-1973). Each figure is the unweighted mean of three birth-cohort bands.
The persistence gap holds in five of the six sex-by-cohort cells. The artifact measures these gaps; it does not separate how much comes from reporting, from who the PSID samples, or from noncovered work.
On EPUF alone, rewriting careers by two of the career assembler's rules (nothing before 1968; odd years from 1997 filled from neighbours) lowers the median AIME of men born 1940-1944 by 10 percent and of men born 1930-1934 by 36 percent. A cohort born in 1946 or later loses no year to the first rule.
EPUF has 4,384,254 persons; the 4,348,254 in parts of SSA's article is a digit transposition.
What a run reports
populace_dynamics.harness.epuf_run.report_candidatereports every window cell for a candidate's 20 generated panels: the 20-seed estimate, its distance from EPUF, and that distance split into the candidate's distance from the PSID and the PSID's distance from EPUF. It returns no pass or fail. No run script calls it yet.Invariants, and where they are tested
tests/data/test_epuf.py).tests/harness/test_epuf_operator.py).ss.statutory_aime.aime(tests/harness/test_epuf_cells.py).tests/harness/test_epuf_gate.py).test_floor_prices_a_faithful_generator).tests/test_epuf_gate_floor_builder.py).tests/test_gate_epuf_block_draft.py).Commits
eec910d6rules first, pushed before any real-PSID value in EPUF units existed.970a9db7fixes the report-only career AIME (it now ranks every year after 1950, as the statute does).ce8d5000floor artifact, block, results.246eab02excludes the new modules from the birth-evidence reducer's identity seal (the earlier CI failure).d606ddeareferee round 1: ruling, supplement, frozen first build, corrected wording, paper sentence.93848324verification round 2: a reporting path with no verdict; wording.95291e75the approving re-review's five minor points.56938042the confirmation review's three optional points: an independent check of the pooled estimate (on seed values now skewed, since a median passed the old symmetric ones), verdicts kept apart from fixes in the block's review records, and one rewrapped line. The block now records round 4.The five derivation files are unchanged since
ce8d5000, so the floor artifact still binds to the code that built it.Paper
paper/paper.qmd, section "The PSID's limits": the last sentences of the EPUF paragraph no longer say the comparison is undesigned and unregistered. They say its rules are registered for the generated earnings, that only two cells met the rules for gating and nothing was found that they would catch beyond gate 1, so the comparison is reported without a pass or fail, and that the model has not yet been scored. The site's paper bundle needs a rebuild after merge.Tests
150 new tests (120 unit, 30 artifact); the EPUF reader's reproduction tests skip unless the pinned bytes are staged.
tests/tier_counts.jsonandtests/README-tiers.mdare updated.🤖 Generated with Claude Code