Skip to content

Commit 4cf2589

Browse files
hmgaudeckerclaude
andcommitted
Docs: refresh AGENTS.md for the audit (grids, premium-default, two-track Medicaid, crossed_oamc_threshold, AIME claim-bake)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 81def90 commit 4cf2589

1 file changed

Lines changed: 31 additions & 2 deletions

File tree

AGENTS.md

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)