PolicyEngine / PolicyEngine/microcosm-dynamics
W1 transport gate: design
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 1
- Forks
- 1
- Avg merge
- 1h 46m
- Merged PRs (30d)
- 28
Description
W1 transport gate: design
The certification design for milestone M5 (#113) — the representative-frame transport gate, workstream W1 of #100. This issue is the design half of the M5 gate ceremony; the floors evidence base is the companion draft PR (the #79/#118/#124 role, one milestone up). gates.yaml is untouched by both; the gate_w1 stub below is a proposal for the eventual ratifying flip, not a change made here.
What W1 certifies — the transport, not the dynamics
The program's signature architectural bet (#113): dynamics are estimated on PSID panels and deployed on a CPS-anchored representative frame. DYNASIM sidesteps this by basing itself on SIPP; we deliberately don't, so M5 carries a burden Urban never took on (#113 named hard part 1). It is also the entire unlock — the transport is what lets one person-period panel serve the cross-sectional microsim, the local-area cuts, and the 75-year projection.
W1 certifies that generators ESTIMATED on PSID (gate-1 earnings histories; gate-2a/2b/2c demographic, household, and marriage×earnings dynamics; M4 disability), when DEPLOYED on populace CPS person records, produce distributions matching targets OBSERVABLE without panel data. It does not re-certify the generators' dynamics — those remain 2a/2b/2c/M4-certified on their PSID holdouts. W1 certifies the deployment map — the CPS↔PSID covariate transport and the SSA-target calibration of #100 W1 — is faithful.
Three target families, each with its own holdout-pricing discipline.
Estimand (honest)
The deployment frame is the certified populace US file, pinned through the policyengine.py release bundle (pe.us.model.release_bundle):
| field | value |
|---|---|
| bundle | us-4.18.8 |
| dataset | populace_us_2024 |
| dataset URI | hf://policyengine/populace-us/populace_us_2024.h5@populace-us-2024-sparse-l0-refit-57k-71a0887-national-only-20260701 |
| artifact sha256 | c2065b642ab00da74746afdfd9f06890e5f32f9b10bd6610ff236452d40f39c5 |
| model | policyengine-us 1.752.2 · data-package populace-data 0.1.0 |
| scale | 166,302 sample persons · 57,240 households · 340.0M weighted · reference period 2024 |
The population claimed is US resident persons, 2024, on the CPS-ASEC-derived, L0-sparse-refit, admin-calibrated certified file — NOT an uncalibrated CPS extract and NOT the PSID estimation sample. Per governance.amendment_rules.description_claims_exactly_the_scored_surface, family A gates exactly the CPS-observable cross-sectional cells the certified file itself carries with verified non-zero support (this is the sparse-57k default, which zeroes untargeted inputs — the floor builds moments only on columns verified populated: age, is_female, employment_income_before_lsr, social_security_retirement/_disability, A_MARITL, household/marital membership; earnings $9.71T, OASI $1.11T, DI $147B all land on plausible national totals).
Target family A — CPS-observable cross-sectional joints (FLOOR-priced)
The deployed generators' terminal/current cross-section must reproduce the joints the CPS already pins, within the deployment frame's own sampling noise. A transport that distorts the observed cross-section while adding history is broken; this is the internal-consistency leg.
- earnings × age × sex distributional moments — participation share, within-cell dispersion (p90/p50, p50/p10 earnings ratios), and the age-earnings profile (cell median / prime-age median) by age band × sex — vs the certified file's own weighted values.
- marital composition × demographics — share in each marital status (married / widowed / divorced / separated / never-married) by age band × sex — vs the file's own
A_MARITL. - household composition — person-level household-size shares and coresident-with-spouse share by age × sex — vs the certified populace columns.
Pricing. 100-seed household-disjoint half-split floor on the file's OWN weighted moments (the sampling-noise floor of the deployment frame). Household-disjoint, not merely person-disjoint: CPS is a household-cluster sample and composition moments are household-level, so the honest null must keep every household intact on one side (the 2c "couple/person-disjoint where units correlate" lesson, applied to the CPS cluster). Statistic is the symmetric scale-free |ln(rate_candidate / rate_ref)|, identical in shape to 2a/2b/2c. Tolerance = round(mean + 4·sd, 3), capped at T_max = ln(1.5); gate-eligible iff ≥20 raw sample units on the weaker half of every seed AND stabilised tolerance ≤ T_max. Gated vs report-only is the floor's own machine partition — never hand-picked.
Target family B — SSA administrative anchors (ANCHOR-priced, point values)
The deployed and simulated benefits — the statutory formula (§415 chain, 402-aux) run on the transported AIME and calibrated claiming — must land on administrative margins PSID never sees and the CPS only crudely proxies. These are the external-validity leg.
| anchor | source (staged) | 2022/2023 headline |
|---|---|---|
| claim-age distribution | Supplement 6.B5.1 (dynasim-refs/ssa_supplement_2023_6b.txt) |
men age-62 share 23.8%, avg age 65.1; women 25.6%, 65.0 — 8 collapsed categories (the claiming module's COLLAPSED_CATEGORIES) |
| benefit-level distribution | 6.B4 (PIA) / 6.B3 (MOB) | avg PIA $1,984.09; avg monthly benefit $1,908.86 (men $2,131.04, women $1,683.57) |
| DI prevalence | data/external/di_asr_2023 Table 19 |
2023 disabled-worker age distribution (60–FRA 45.4%, avg age 55.9), 7.366M workers |
Pricing. Anchors are point values, so there is no half-split sampling floor. Instead each carries a named, machine-derivable measurement/vintage tolerance: the tolerance is the recent-window dispersion of the anchor's OWN published series (both 6.B5.1 and Table 19 publish annual vintages), tol = k · sd(anchor over the last L published vintages), L and k pinned knobs, plus a measurement floor of half the published rounding unit. This is honest about the real uncertainty — "which vintage should a 2024-frame steady state match" — and is reconstructible from the committed anchor series alone. Non-stationary anchors (the FRA-transition-driven claim-age drift) get genuinely wide vintage tolerances, disclosed as such, not hidden. Report-only where the certified file cannot carry the margin (e.g. benefit LEVELS depend on the not-yet-deployed transported AIME).
Target family C — the two ordinal compression fingerprints (BINARY, no floor)
The sharpest transport test, pre-committed in #113: two reform orderings came out wrong on the PSID observed-career frame (compressed careers), and a certified representative frame must REVERSE both to the anchor orderings, and nothing else.
| fingerprint | PSID-frame order (committed "before") | representative-frame order (required "after") | adjacent pair that must swap |
|---|---|---|---|
| C1 PPI↔NRA (#115 T2 / #117 F4) | PI > NRA > PPI > COLA (τ=0.667 vs Mermin) |
PI > PPI > NRA > COLA (τ=1.0) |
PPI must outrank NRA |
| C2 elimination↔+2pp (#117 F2) | +2pp > elim > +1pp > cap-$150k (τ=0.667 vs Smith) |
elim > +2pp > +1pp > cap-$150k (τ=1.0) |
elimination must outrank +2pp |
Both are τ=0.667 single-adjacent-swap fingerprints of the same mechanism — observed-career compression at the PIA bends (C1) and at the taxable maximum (C2). C1 reverses because a representative frame carries more AIME above the second bend where progressive price indexing bites; C2 reverses because a representative frame carries >16.1% of payroll above the wage base, above the break-even where elimination's revenue gain exceeds +2pp's. Ordinal → no floor: family C is a binary check against the committed anchor orderings. If transport is real both reverse; if it is cosmetic they don't. This is the falsifiable heart of the gate.
Holdout / pricing discipline (summary)
| family | priced by | gated | report-only |
|---|---|---|---|
| A (CPS-observable joints) | 100-seed household-disjoint half-split floor | cells clearing ≥20 events + T_max |
cells demoted by the power cap (machine reason) |
| B (SSA anchors) | named vintage/measurement tolerance on the anchor's own series | margins the deployed+simulated benefits can hit | margins needing the not-yet-deployed AIME |
| C (fingerprints) | binary vs committed anchor orderings | both reversals | — |
What W1 does NOT certify
- The dynamics. Earnings, marital, household, marriage×earnings, and disability dynamics remain 2a/2b/2c/M4-certified on their PSID holdouts. W1 certifies transport, not re-estimation.
- The projection (M6), revenue/trust-fund accounting (M7), integrated scoring (M8) — later milestones.
- Behavioral response — v1 transport is mechanical (claiming from the calibrated distribution; no labor-supply feedback), stated as a domain-of-validity.
- Levels not carried by the frame — anything the sparse-57k certified file zeroes is out of family-A scope by construction, not silently gated.
Proposed gate_w1 stub (for the eventual flip — NOT changed here)
gate_w1:
id: w1_representative_frame_transport
status: unlocked # flips to locked only after the full ceremony
locked: false
covers: >-
the TRANSPORT of the PSID-estimated generators onto the certified populace
CPS representative frame: CPS-observable cross-sectional joints (family A),
SSA administrative margins of the deployed+simulated benefits (family B),
and the two committed ordinal compression fingerprints that must reverse to
the anchor orderings (family C). Does NOT re-certify the dynamics (2a/2b/2c/
M4) nor certify the projection (M6+).
deployment_frame:
bundle: us-4.18.8
dataset: populace_us_2024
dataset_uri: hf://policyengine/populace-us/populace_us_2024.h5@populace-us-2024-sparse-l0-refit-57k-71a0887-national-only-20260701
artifact_sha256: c2065b642ab00da74746afdfd9f06890e5f32f9b10bd6610ff236452d40f39c5
pe_us_version: 1.752.2
holdout_basis: [populace_us_2024_certified, ssa_supplement_6b, di_asr_2023, mermin_smith_committed_orderings]
lock_ceremony:
exists: true
required_before_any_w1_pass: >-
the SAME ceremony 2a/2b/2c followed — a pre-registered gate on a 100-seed
household-disjoint split noise floor over the CPS-observable joints
(family A), named vintage/measurement tolerances on the SSA anchors
(family B), and the binary committed fingerprint orderings (family C);
an adversarial referee round, a verification round, and a ratifying merge.
thresholds:
locked: false
status: draft_pending_referee_round
floor_run: runs/gate_w1_floors_v1.json
# family-A tolerances machine-bound to the floor exactly as 2c:
# tol == round(mean + 4*sd, 3), capped at T_max = ln(1.5)
# family-B tolerances machine-derived from each anchor's own vintage series
# family-C: binary vs the committed before/after orderings (no tolerance)
Ceremony
Step 1 (this round): the floors evidence base as a draft PR — family-A floor + partition, family-B anchor values + vintage-tolerance rules, family-C committed orderings, K=20 estimator protocol from the start, machine-recorded gated/report-only reasons, a WARTS section pre-empting the 2b/2c referee classes. It reads no gate and changes no gate; gates.yaml stays untouched. The ceremony — adversarial referee → fixes → verification → ratifying flip — controls the lock; the draft is never marked ready or merged by its author.
Refs: #113 (M5), #100 (W1), #115 (C1 fingerprint), #117 (C2 fingerprint), #79/#118/#124 (the floors-PR precedent), #42 (registry).
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the proposed gate_w1 stub in gates.yaml and the referenced runs/gate_w1_floors_v1.json path, then read the linked milestone and workstream issues. Define the draft floors evidence, anchor tolerances, fingerprint checks, and ceremony requirements without changing gates.yaml; done means the evidence base is reviewable and ready for referee and verification rounds.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- backend-api-design, data, testing-qa
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Needs clarification
- Newbie friendliness
- 20/100