@@ -75,8 +75,10 @@ ACA variants don't create new regimes — they swap functions on baseline regime
7575
7676### Key State Variables
7777
78- - ` assets ` : Savings grid [ 0, 500k] , 24 points
79- - ` aime ` : Average Indexed Monthly Earnings [ 0, 8k] , 12 points
78+ - ` assets ` : Savings grid ` [≈ −221k, 500k] ` , 24 points (lower bound = minus one year of
79+ maximum full-time earnings, so it shifts with the wage parameters; finer at low levels)
80+ - ` aime ` : Average Indexed Monthly Earnings — piecewise grid at the PIA bend points
81+ (32 points total; ` n_aime_gridpoints ` is ignored on this path)
8082- ` health ` : ` HealthWithDisability ` (disabled/bad/good) pre-65, ` Health ` (bad/good)
8183 post-65
8284- ` log_ft_wage_res ` : AR(1) wage residual shock (5-point Rouwenhorst)
@@ -107,3 +109,30 @@ ACA variants don't create new regimes — they swap functions on baseline regime
107109- ** ` reference_age ` parameter** : Fixed cost of work uses ` age - reference_age ` (not a
108110 hardcoded constant). Same parameter appears in ` leisure() ` , ` tied() ` , ` with_hours() ` ,
109111 and ` utility_scale_factor() ` .
112+ - ** Premium default (uncompensated care)** : a household pays its insurance premium only
113+ up to what it can afford while staying at the consumption floor and defaults on the
114+ rest. ` premium_default = max(0, hic_premium − max(0, resources − consumption_dollars_floor)) `
115+ is a tracked DAG node; ` cash_on_hand ` subtracts only the affordable part. The floor is
116+ therefore on pre-premium resources; OOP stays the post-decision shock in ` next_assets ` .
117+ Coverage is unchanged on default (the defaulted premium is uncompensated care).
118+ - ** Two-track Medicaid eligibility** : ` is_medicaid_eligible ` is the union of a
119+ * categorical* track — ` (crossed_oamc_threshold OR is_disabled) ` AND the SSI asset and
120+ income tests (on SSI countable income) — and, under the ACA Medicaid-expansion variant,
121+ an * income-only* track — ` aca_magi < 138% FPL ` , scoped to the under-65 non-disabled
122+ population. The expansion uses MAGI (full income via ` aca_magi ` ), distinct from the
123+ half-counted SSI countable income of the categorical track.
124+ - ** ` crossed_oamc_threshold ` ** : per-regime constant fixed param (` = spec["mc"] == "oamc" ` ,
125+ i.e. age ≥ 65), the * aged* indicator in eligibility. It replaced the ` gets_medicare `
126+ gate there; ` is_disabled ` (= ` health == disabled ` , a DAG function in ` nomc ` /` dimc `
127+ regimes) supplies the disabled arm. The Medicare * transition* still uses its own
128+ build-time ` gets_medicare ` constant (` mc != nomc ` ) — distinct from this.
129+ - ** SS claim-age adjustment baked into AIME** : at the voluntary claim the early-retirement
130+ reduction / delayed-retirement credit is applied to PIA and converted back to AIME via
131+ ` find_aime ` (the exact inverse of ` pia ` ), so the permanent adjustment rides in the
132+ carried ` aime ` with no extra state and persists into the forced regimes. Pension
133+ imputation reads an * unadjusted* PIA (` pia_unadjusted_next_period ` ); the DI path
134+ (` ssdi_pia ` ) reads the un-baked AIME. ` inelig ` /` forced ` regimes use a plain ` next_aime `
135+ with no claim inputs (` _select_aime_law ` routes on ` spec["ss"] ` ).
136+ - ** ACA subsidies/mandate respect Medicaid** : ` premium_subsidy ` , ` cost_sharing ` , and
137+ ` mandate_penalty ` take ` is_medicaid_eligible ` and return the neutral value when the
138+ household is Medicaid-eligible (Medicaid is minimum-essential coverage).
0 commit comments