PolicyEngine / PolicyEngine/microcosm-dynamics

W1 transport gate: design

Open
#151 2 comments 0 reactions 0 assignees View on GitHub

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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.