Calculation catalog › Medicare and ACA
Spending healthcare annual
Healthcare expense charged in a projection year, excluding the separately shown insurance premium channel.
Field: Healthcare expense Unit: US dollars Basis: nominal dollars Computed by: Engine Status: Complete chain
Appears in: chart (healthcare); csv (healthcare); cash-flow-drilldown (healthcare use line)
Calculation records
-
Annual healthcare expense: Medicare, extras and marketplace premiums Composition record, justified by derivation
Purpose: Everything the projection charges the household for health coverage in one year.
Statement: YearResult.expenses.healthcare adds, for each LIVING person: the tier-priced annual Medicare premium (Part B plus any Part D IRMAA surcharge, itself scaled by the healthcare factor from the year of the published parameters to this year) prorated by Medicare months / 12, plus medicareExtrasMonthlyPerPerson x Medicare months x the healthcare inflation factor from the start year, plus (with the ACA credit OFF) pre65MonthlyPremiumPerPerson x marketplace months x that same factor. Medicare months are 12 minus marketplace months, and marketplace months are 12 below 65, birth month minus 1 in the year 65 is attained, and 0 after. With the credit ON the marketplace component instead enters the ACA gross enrollment premium during the solve, and when the year is published actionable (its coverage year has published figures, no support code blocks pricing, and the funding fixed point converges) healthcare is republished as healthcare excluding enrollment plus the economic net premium; every other year keeps the gross premium, by design in a year whose credit cannot be priced (no published coverage-year figures, or a blocking support code) and as a fallback in a year whose fixed point does not converge, which the engine marks fixed-point-nonconvergent and publishes non-actionable. Units: nominal dollars per year. Rounding: none.
Formula:
credit off: healthcare = sum_p [ P_tier(p) x M_p/12 + extras x M_p x h + premium x A_p x h ], M_p = 12 - A_p; credit on: healthcare = H_ex + N in an actionable year, H_ex + G in any other year, H_ex = sum_p [ P_tier(p) x M_p/12 + extras x M_p x h ]-
P_tier(p): Annual Part B + Part D surcharge at the lookback MAGI tier for the year, from CMS's published tier table (medicare-irmaa-first-tier-boundary) (unit: usd/year) (domain: positive) -
H_ex: Healthcare excluding the marketplace enrollment premium (unit: usd/year) (domain: nonnegative) -
G: The year's gross marketplace enrollment premium (aca-contract-premium-basis) (unit: usd/year) (domain: nonnegative) -
N: The economic net premium, the gross premium less the modeled allowable credit (aca-economic-net-premium) (unit: usd/year) (domain: nonnegative) -
A_p, M_p: Marketplace and Medicare months for person p (unit: months) (domain: A_p + M_p = 12) -
h: Cumulative healthcare inflation factor from the start year (general inflation plus the healthcare extra) (unit: 1) (domain: positive)
Timing: annual; the Medicare tier reads the two-year lookback MAGI
Rounding: none
Limits:
- The worksheet's household is constructible on one plan as it now stands: the second person's 4 marketplace months and 8 Medicare months partition that person's year, so a March-1958 birth (12 Medicare months) and a May-1961 birth (4 marketplace, 8 Medicare) are one household whose published healthcare is $8,832.00. The first derivation gave the second person the 4 marketplace months with no Medicare months and totalled $6,002.72 (on the old tier premium), an impossible annual partition; it was corrected on 2026-09-18, and the same reading, $6,003.20 on CMS's tier premium, is now the worksheet's third wrong reading, asserted as not matching
- Beyond the worksheet's inputs the evidence plans fix: startYear 2025 with the asserted row in 2026, inflationPct 0 and healthcareExtraInflationPct 10, so the factor from the start year is 1.10 while the factor from the year of the published parameters (2026) to the asserted year is 1; this is what leaves the tier-priced premium unscaled while extras and the marketplace premium are scaled, the distinction the worksheet's first wrong reading names. Each person's own component is asserted on that person's own single-filer plan, and the household plan asserts the total and the 12 + 8 Medicare months behind it
- Tier 1 is reached through assumptions.recentAnnualMagi, because the 2024 lookback year is before the projection and resolves to that plan fallback rather than to a projected MAGI. The two-person household files jointly, so it reaches the SAME tier 1 through the $218,000 joint threshold rather than the worksheet's $109,000 single threshold; the tier-priced premium is a function of the tier alone, so it is $3,583.20 either way: CMS's published $284.10 Part B total and $14.50 Part D amount, times 12
- The second person's marketplace component is read as healthcare minus medicarePremiums minus that person's extras, since the phase result itself is not published on the year row; the extras rule it subtracts is pinned independently by the first person, whose zero marketplace months make healthcare minus medicarePremiums the extras exactly
- The credit-on branch carries no numeric expectation: the worksheet states none without a complete ACA quote and a converged fixed point
- With the credit on, the gross premium is the year's contract as the run prices it (aca-contract-premium-basis): a premiumField contract grows the premium field by the same healthcare factor as the credit-off branch, and a stated contract is held as written and charges nothing for a member who has died
- A household funded just above 100% of the poverty line by need-driven withdrawals can have no self-consistent credit: the credit lowers the withdrawal need and with it MAGI, to below 100% where no credit is allowed, while the gross-funded MAGI is back above 100%. The fixed point then runs out its evaluations, publishes fixed-point-nonconvergent and budgets the gross premium (fixed-target-spending and brokerage-no-hsa in 2027, at 114.7% and 124.1% of the poverty line). That is the engine's model, not the law: 26 CFR 1.36B-2(b)(6) treats a household whose income ends below 100% as an applicable taxpayer when an Exchange estimated 100% to 400% at enrollment and advance credit was paid, and the engine does not model that exception (below-100-fpl-exception-unsupported), which is the truer reason such a year stays unpriced
Provenance: derived by
claude, implemented byclaude-subagent.Independent review:
codexGates (6 of 6 pass): fixture registers a test: pass; pins resolve: pass; families exist: pass; worksheet exists: pass; mutation receipt exists: pass; provenance independent: pass
Worksheet: spending-healthcare-annual.md Mutation receipt: spending-healthcare-annual.mutation.md
Evidence tests: annualHealthcareExpenses.spendingHealthcare.evidence.test.ts
Implemented in: annualHealthcareExpenses.ts; medicare.ts
Is the number of: spending-healthcare-annual
-
Records that feed this number
-
ACA 400% FPL cliff Data record, justified by derivation
Purpose: Allow the premium tax credit at exactly 400% of the poverty line and deny it one dollar above.
Statement: tax/aca.ts#acaEconomicPremiumByMonth allows the credit at exactly 400% FPL but no credit strictly above it, reflecting the restored post-2025 cliff: the coverage year's parameters (params/acaCoverageYears.ts#acaParametersForCoverageYear) set maxFplPctForCredit at 400 in 2026 and in 2027, and AcaResult.overCliff is true only above, not at, the ceiling. The separate 100% floor still applies, and below-100%-FPL exception pathways are outside this calculation. Units: percent of the federal poverty line, and nominal USD for the resulting credit.
Formula:
f = 100 x MAGI / FPL; overCliff = f > 400; credit = 0 when overCliff-
f: MAGI as a percentage of the regional poverty line (unit: percent) (domain: nonnegative; Infinity when the poverty line is zero) -
MAGI: ACA household MAGI for the coverage year (unit: usd/year) (domain: nonnegative) -
FPL: Regional federal poverty line for the household size (unit: usd/year) (domain: positive)
Timing: one coverage year
Rounding: none: both the 400% and the 100% tests compare the exact percentage, never the whole number the applicable-percentage table is read at, as Form 8962 Worksheet 2 line 4 compares household income with 4 times the poverty line in dollars
Limits:
- The cliff is the only eligibility question this record answers: the separate below-100%-FPL floor and its exception pathways are outside it
- It is annual planning math, not APTC cash timing or a Form 8962 reconciliation
- The worksheet's household is a 2026 one; the 2027 cliff reads the same 400 from the 2027 block, and its dollar amounts (63,840 for one person, 132,000 for four) are pinned by a test built from the published 2027 guidelines
Provenance: derived by
codex, implemented byclaude-subagent.Independent review:
grokGates (6 of 6 pass): fixture registers a test: pass; pins resolve: pass; families exist: pass; worksheet exists: pass; mutation receipt exists: pass; provenance independent: pass
Worksheet: aca-400-percent-cliff.md Mutation receipt: aca-400-percent-cliff.mutation.md
Evidence tests: aca.evidence.test.ts
Implemented in: aca.ts
Feeds: aca-modeled-allowable-ptc-annual, aca-economic-net-premium-annual, spending-healthcare-annual
-
-
ACA modeled allowable premium tax credit Formula record, justified by derivation
Purpose: Size the credit from the benchmark premium less the expected contribution, capped by what the household actually enrolled in.
Statement: tax/aca.ts#acaEconomicPremiumByMonth computes current-year modeled allowable PTC from the SLCSP benchmark less the expected contribution, floored at zero and capped by the actual enrollment premium. The month loop applies both the floor and the enrollment cap on each month against a twelfth of the annual contribution, so the annual figure is the sum of twelve monthly credits. Units: nominal USD. Rounding: the contribution carries the applicable percentage's rounding (aca-expected-contribution); the monthly credit is then computed from the unrounded contribution, where Form 8962 rounds line 8b to a whole dollar (a stated limit).
Formula:
P = sum over months m of min(E_m, max(0, S_m - C/12))-
E_m: Enrollment premium for month m (unit: usd/month) (domain: nonnegative) -
S_m: Applicable SLCSP benchmark premium for month m (unit: usd/month) (domain: nonnegative) -
C: Expected annual contribution toward the benchmark premium (unit: usd/year) (domain: nonnegative)
Timing: twelve coverage months of one year
Rounding: none beyond the applicable percentage rounded to 0.01% inside C (26 CFR 1.36B-3(g)(1)); C / 12 is not rounded to a whole dollar as Form 8962 line 8b rounds it
Limits:
- Annual planning math: APTC cash timing, refunds and balances due, and Form 8962 reconciliation are outside this module
- A month with no enrollment premium contributes no benchmark and no credit, so the annual benchmark is the enrolled-month benchmark rather than a full-year figure
- Form 8962 rounds the annual contribution (line 8a) and the monthly contribution (line 8b) to whole dollars; the engine keeps both unrounded, which moves the annual credit by at most about $0.50 on the annual path and about $6 on the monthly path
Provenance: derived by
codex, implemented byclaude-subagent.Independent review:
grokGates (6 of 6 pass): fixture registers a test: pass; pins resolve: pass; families exist: pass; worksheet exists: pass; mutation receipt exists: pass; provenance independent: pass
Worksheet: aca-allowable-premium-tax-credit.md Mutation receipt: aca-allowable-premium-tax-credit.mutation.md
Evidence tests: aca.evidence.test.ts
Implemented in: aca.ts
Is the number of: aca-modeled-allowable-ptc-annual
Feeds: aca-economic-net-premium-annual, spending-healthcare-annual
-
-
Premium-credit contract as a run prices it: premium basis and deaths Model record, justified by derivation
Purpose: Where each year's Marketplace premiums come from on a run: filled from the premium field, or the coverage year's stated figures with nothing charged for a member who has died.
Statement: Each stored premium-credit year contract becomes the contract the run prices, by its premiumBasis (decisions D-EXAMPLE-SOURCE-SWITCH and D-ACA-CONTRACT-PATHS, 2026-09-28). A 'premiumField' contract stores only its year, the filing assertions, tax-exempt interest and the foreign-exclusion addback; for the run and year the engine fills the poverty-guideline region from the state lived in (Alaska and Hawaii their own tables, every other state the contiguous one), the tax family from the people alive in household order (the first primary, the next spouse, each required to file, MAGI 0), the covered members alive with Marketplace months before Medicare (12 under 65, birth month minus 1 in the year of 65), and in each covered month an enrollment premium and an SLCSP benchmark both equal to pre65MonthlyPremiumPerPerson x h, with h the run's healthcare inflation factor from the start year (the path's own inflation on a Monte Carlo path). A 'stated' contract (the default when the basis is absent) is the coverage year's actual figures, used as written on every run and never grown with inflation, except that a covered member not alive in the year is charged nothing: under the ledger's annual convention a person is alive through the calendar year of the death age, so charging stops on 1 January of the next year. The stated tax family is left as written, and because it names a person who is not alive the year is unpriced with tax-family-member-unknown. The engine never reads exampleSourceId. YearAcaResult.premiumBasis names the basis. Worksheet: a couple (born 1966-02-10 and 1961-07-20, Colorado, 2.5 percent inflation plus 2.0 percent healthcare extra, $800 premium field) prices 12 x 800 + 6 x 800 = 14,400 in 2026 with a family of 2, 12 x 836 = 10,032 in 2027 at the plan rates and 12 x 840 = 10,080 on a path with 3 percent inflation in 2026; a stated $700 couple contract charges 16,800 in 2026 and 8,400 in 2027 after one member's death age of 62 is passed, where the premium-field version charges 12 x 731.5 = 8,778 with a family of 1. Units: nominal dollars per month and per year. Rounding: none.
Formula:
premiumField: E_i,m = B_i,m = [alive_i and m < M_i] x premium x h, family = alive people in order (primary, spouse); stated: E_i,m and B_i,m as written, 0 for a member not alive-
premium: pre65MonthlyPremiumPerPerson (unit: usd/month) (domain: >= 0; worksheet 800 and 700) -
h: Run's healthcare inflation factor from the start year to the year (unit: ratio) (domain: > 0; worksheet 1, 1.045 and 1.05) -
M_i: Marketplace months before Medicare for person i (unit: months) (domain: 0 to 12; worksheet 12 and 6) -
alive_i: Person i alive this year on this run (age attained at most the death age) (unit: boolean) (domain: true or false)
Timing: once per run and coverage year, before any reader of the year's contract
Rounding: none
Limits:
- Coverage ends at death: 45 CFR 155.430(d)(7), "In the case of a termination due to death, the last day of enrollment in a QHP through the Exchange is the date of death.", and 26 U.S.C. 36B(c)(2)(A) counts no month after the month of death for the credit. The ledger has no month of death (a person is alive through the calendar year of the death age for income, benefits, filing status and spending), so the whole death year is charged. Measured by the independent review (finding L2) on all-401k-no-bridge with stated contracts and stochastic longevity, on the 2022 SSA period life table (before decision D-LIFE-TABLE-2023 moved the longevity draw to the 2023 table): a third of paths have a covered member die in a contract year, the convention overcharges about 5.5 months of that member's premium there (about $12,000 on such a path, $3,884 averaged over all paths), and it lowers the success rate by about 0.15 points, at most 0.23
- A stated contract is held in nominal dollars on every Monte Carlo path, including a future year whose premiums are not published: the engine cannot tell a quote from an estimate, and an estimate belongs in the premiumField basis
- The premium-field family is the people alive in household order: the first living person is the primary and the next the spouse, whatever the filing status. So the survivor's credit after a death is priced, except in two cases refused with tax-family-structure-unsupported, not repriced: a qualifying-surviving-spouse year (the structure check wants a dependent, which the derived family never has) and two people filing single (the second is made a spouse)
- The premium-field SLCSP benchmark equals the enrollment premium, the library examples' stated assumption, not a Marketplace estimate
- A plan saved from an example before schema v6 has the contracts the recipe wrote (its shape, and the premium field grown at one rate per plan, to half a cent) rewritten to premiumField on load (migratePlanV5ToV6, reported as the exampleContractsFollowPremiumField repair). A contract that came from the recipe but no longer matched the plan's premium (the premium, the inflation or the household changed after saving, or a quote typed in the recipe's shape) was already left out by the v5 engine, so it is removed and recorded as exampleNoLongerMatched (the exampleContractsLeftOut repair) and the figures do not change; one the v5 engine priced as written (the premium field at the stored rates) whose shape is what the premium-field fill derives becomes premiumField too, so it matches the v5 engine in the deterministic run and follows the premium field on every path; the rewrite repair says the year-by-year figures stay the same except in the years the v5 engine left out (previouslyLeftOut) and that the Monte Carlo success rate can move. Any contract not in that shape stays stated, and one of those the v5 engine priced as written is announced (exampleEditedContractsKept: the same year-by-year figures, but Monte Carlo counts it at its entered dollars on every path, where the v5 engine dropped it when inflation differed); among those, one the v5 engine refused is now priced as entered and announced (exampleEnteredContractsNowPriced), since its figures change. The contracts a stored scenario writes are sorted by the same rule in the plan the scenario makes, and each repair names the scenario. The rewrite reads exampleSourceId once, on a v5 document, and the projection never does
- A premium-field contract is kept through a premium edit and through a change of state, a move, a date of birth or a planning age, because everything but its assertions is derived on each run; a partner added or removed, or a new filing status, removes it, because the assertions are facts about who is on the return (model/acaContractRemovals.ts; review finding M2). A stated contract is removed by all of those edits. Each removal is recorded on the plan with the edit and its years, and the planner names the edit where it explains an unpriced year
Provenance: derived by
claude, implemented byclaude.Independent review:
codexGates (6 of 6 pass): fixture registers a test: pass; pins resolve: pass; families exist: pass; worksheet exists: pass; mutation receipt exists: pass; provenance independent: pass
Worksheet: aca-contract-premium-basis.md Mutation receipt: aca-contract-premium-basis.mutation.md
Evidence tests: effectiveAcaYearContract.evidence.test.ts
Implemented in: effectiveAcaYearContract.ts; annualHealthcareExpenses.ts
Feeds: aca-gross-enrollment-premium-annual, aca-applicable-slcsp-premium-annual, aca-modeled-allowable-ptc-annual, aca-economic-net-premium-annual, spending-healthcare-annual
-
-
ACA credit figures by coverage year Data record, justified by derivation
Purpose: Price a Marketplace year on its own published applicable-percentage table and poverty guidelines, as published, and price no year whose figures are not published.
Statement: params/acaCoverageYears.ts#acaParametersForCoverageYear returns the published block for a coverage year: the Applicable Percentage Table of that year's revenue procedure and the HHS poverty guidelines in effect when that year's open enrollment began (Rev. Proc. 2025-25 and the HHS 2025 guidelines for 2026; Rev. Proc. 2026-26 and the HHS 2026 guidelines for 2027). projection/simulate.ts#simulatePlan resolves the block for each year beside the income-tax figures and prices the credit, publishes the poverty line, sizes the acaCliff conversion ceiling and reads the cliff for the optimizer probe from it, at a poverty-line scale of exactly 1, so a published guideline is never inflated. A year with no published block resolves to its nearest block as a stand-in: it is marked tax-year-parameters-unsupported, withholds its poverty line and budgets the gross premium. A priced year whose income-tax figures are projected from an earlier year (2027, while only the 2026 income-tax figures are published) publishes the informational support code income-tax-parameters-projected beside actionable, because its household MAGI was computed on projected brackets. Units: nominal USD for the poverty line and the credit, percent for the table. Rounding: none of its own; the credit it feeds reads the table at the whole-number poverty-line percentage and rounds the applicable percentage to 0.01 (aca-expected-contribution).
Formula:
block(Y) = published block for Y, else stand-in; FPL = first + (h - 1) x perAdditional, scale 1; priced only when block(Y) is published; codes += income-tax-parameters-projected when the income-tax figures for Y are projected-
Y: Coverage year (the taxable year of the credit) (unit: year) (domain: integer) -
h: Tax-family size (unit: people) (domain: integer >= 1) -
first, perAdditional: The block's poverty guidelines for the region (unit: usd/year) (domain: positive)
Timing: one coverage year
Rounding: none of its own; the pricing it feeds rounds as aca-expected-contribution states
Limits:
- Coverage years after the latest published block (2028 and later today) are stand-ins and are not priced: no source projects the Applicable Percentage Table, which moves with premium growth against income growth
- A year priced on its published ACA figures while its income-tax figures are projected from an earlier year has a household MAGI that rests on those projected figures through bracket-sized conversions, the tax fixed point and indexed contribution caps; measured, a 1% change in those figures moves early-retiree-aca's 2027 credit by about $44 of $10,925, moves the MAGI of two other examples by about $1,350, and can move a credit by its whole jump where the income lands within about 1% of 100%, 133% or 400% of the poverty line. The year says so with income-tax-parameters-projected rather than being refused
- The 2027 required contribution percentage (10.22%, Rev. Proc. 2026-26 section 3.02) is recorded and read by no calculation: employer-coverage affordability is the household's coverageEligibility assertion
- 26 CFR 1.36B-1(h) applies the higher poverty guideline when a household's primary residence moves during the year between states with different guidelines, or when married taxpayers live in separate states with different guidelines (Alaska or Hawaii and another state). The engine does not apply that rule: the year contract names one fplRegion for the household and the year, and the credit reads that region's guideline, so such a year gets the rule's result only when its contract names the region with the higher guideline
Provenance: derived by
claude, implemented byclaude-subagent.Independent review:
codexGates (6 of 6 pass): fixture registers a test: pass; pins resolve: pass; families exist: pass; worksheet exists: pass; mutation receipt exists: pass; provenance independent: pass
Worksheet: aca-coverage-year-parameters.md Mutation receipt: aca-coverage-year-parameters.mutation.md
Evidence tests: acaCoverageYears.evidence.test.ts
Implemented in: acaCoverageYears.ts; simulate.ts; annualAcaResultPublication.ts; rothConversion.ts
Feeds: aca-modeled-allowable-ptc-annual, aca-economic-net-premium-annual, spending-healthcare-annual
-
-
ACA economic net premium Formula record, justified by derivation
Purpose: Publish what the household actually bears: gross enrollment premium less the modeled allowable credit.
Statement: tax/aca.ts#acaEconomicPremiumByMonth computes annual economic net premium as gross enrollment premium minus modeled allowable PTC. The monthly credit is itself capped at that month's enrollment premium, so the difference cannot fall below zero. Units: nominal USD. Rounding: none; it inherits the credit's (aca-allowable-premium-tax-credit).
Formula:
N = E - P, where each month's P is capped at that month's E-
E: Gross annual enrollment premium (unit: usd/year) (domain: nonnegative) -
P: Modeled allowable premium tax credit (unit: usd/year) (domain: 0 <= P <= E)
Timing: one coverage year
Rounding: none; the difference is not rounded
Limits:
- Economic cost, not cash timing: advance payments of the credit are not modeled, so this is not what the household pays month to month
- The zero floor the worksheet states is enforced by the per-month enrollment cap inside the credit, not by a second clamp on the difference
Provenance: derived by
codex, implemented byclaude-subagent.Independent review:
grokGates (6 of 6 pass): fixture registers a test: pass; pins resolve: pass; families exist: pass; worksheet exists: pass; mutation receipt exists: pass; provenance independent: pass
Worksheet: aca-economic-net-premium.md Mutation receipt: aca-economic-net-premium.mutation.md
Evidence tests: aca.evidence.test.ts
Implemented in: aca.ts
Is the number of: aca-economic-net-premium-annual
Feeds: spending-healthcare-annual
-
-
Medicare base Part B premium Data record, justified by derivation
Purpose: Annualize the standard Part B premium for a covered person at tier 0.
Statement: tax/medicare.ts#medicareAnnualPremiumPerPerson publishes the 2026 standard Part B premium per Medicare-covered person as year2026.medicare.partBStandardMonthly times twelve, with no Part D surcharge and no IRMAA surcharge at tier 0. Units: nominal USD per person per year. Rounding: none stated.
Formula:
partBAnnual = partBMonthly(tier) x premiumScale x 12; at tier 0 partBMonthly = base-
base: year2026.medicare.partBStandardMonthly (unit: usd/person/month) (domain: positive) -
partBMonthly(tier): The standard premium at tier 0; above it, CMS's published tier total (medicare-irmaa-first-tier-boundary) (unit: usd/person/month) (domain: positive) -
premiumScale: Healthcare-inflation scale to the premium year, from the latest year CMS has published (unit: 1) (domain: positive; 1 in a year CMS has published)
Timing: one premium year, per covered person
Rounding: none stated
Limits:
- Per person, not per household: a two-person Medicare year charges this twice
- The Part D out-of-pocket threshold the published parameters also carry is not a premium and never enters this figure
- Restated 2026-09-28 under decision D-2027-ROLLOVER: the premium scale runs from the year of the latest CMS publication (params/index.ts#componentPackView), not the year of the whole set of published figures, so a year whose Medicare premiums CMS has published reads them at a scale of 1 while its other figures may still be projected. Until CMS publishes 2027 the scale from 2026 is exactly the one used before
Provenance: derived by
claude, implemented byclaude.Independent review:
codexGates (6 of 6 pass): fixture registers a test: pass; pins resolve: pass; families exist: pass; worksheet exists: pass; mutation receipt exists: pass; provenance independent: pass
Worksheet: medicare-base-part-b-premium.md Mutation receipt: medicare-base-part-b-premium.mutation.md
Evidence tests: medicare.evidence.test.ts
Implemented in: medicare.ts; index.ts
Is the number of: medicare-premiums-annual, irmaa-surcharge-annual
Feeds: spending-healthcare-annual
-
-
Medicare IRMAA tier premiums and the first-tier boundary Formula record, justified by derivation
Purpose: Price each IRMAA tier at the premiums CMS publishes, and the cliff at the first threshold on both sides of the same dollar.
Statement: tax/medicare.ts#medicareAnnualPremiumPerPerson applies the 2026 single-filer first IRMAA tier only when two-year-lookback MAGI is strictly greater than the tier's magiOver (the top tier when it is at or above its floor), then prices Part B at CMS's published total monthly premium for the tier (params/data/year2026.ts, irmaaTiers[i].partBTotalMonthly: 284.10, 405.80, 527.50, 649.20 and 689.90 dollars for 2026) and adds CMS's published monthly Part D amount (14.50, 37.50, 60.40, 83.30 and 91.00). The table is read as published, not re-derived as the standard premium times the applicable percentage over 25, which CMS applies to the unrounded actuarial rate and which misses four of the five totals by cents. The IRMAA-only surcharge is the Part B amount above standard plus the Part D amount. A year after the latest CMS publication grows the latest published figures by the Medicare component's projection factor (cmsMedicare), as the standard premium grows. At 109,001 of single MAGI Part B is 3,409.20 a year and the IRMAA-only surcharge 1,148.40. Units: nominal USD per person per year, and an integer tier. Rounding: none; the published figures are whole cents.
Formula:
tier = 1 when MAGI > magiOver (the top tier when MAGI >= its floor); partBMonthly = partBTotalMonthly(tier) x premiumScale, standard at tier 0; irmaaSurchargeAnnual = max(0, partBMonthly - base x premiumScale) x 12 + partDSurchargeMonthly x premiumScale x 12-
MAGI: Two-year-lookback MAGI (unit: usd/year) (domain: nonnegative) -
magiOver: First-tier floor, year2026.medicare.irmaaTiers[0].magiOver for the filing status (unit: usd/year) (domain: positive) -
partBTotalMonthly(tier): CMS's published total monthly Part B premium for the tier, full Part B coverage (unit: usd/person/month) (domain: above base) -
base: year2026.medicare.partBStandardMonthly (unit: usd/person/month) (domain: positive) -
partDSurchargeMonthly: CMS's published Part D income-related monthly adjustment for the tier (unit: usd/person/month) (domain: nonnegative, or null when unverified) -
premiumScale: Healthcare-inflation scale to the premium year from the latest year CMS has published (unit: 1) (domain: positive; 1 in a year CMS has published)
Timing: one premium year, per covered person
Rounding: none; the published figures are whole cents
Limits:
- The tier totals are CMS's published figures, not the standard premium times the applicable percentage over 25 (284.06 against 284.10 at the 2026 first tier); reading the percentage as a surcharge on the standard premium (35% as standard plus 35%) understates every tier further
- A year after the latest CMS publication is projected: it grows the latest published totals and Part D amounts by the Medicare component's factor, a stand-in for CMS's next table, which re-derives every tier from a new actuarial rate
- The lower tiers use a strict greater-than test and only the top tier is inclusive; that asymmetry is the module's own stated convention
- A tier whose Part D surcharge is unpublished sets partDSurchargeUnverified rather than inventing a figure; every 2026 tier's is published
- The table is the full-Part-B-coverage table for single and joint filers; the separate tables for married people filing separately who lived with their spouse, and for immunosuppressive-drug-only coverage, are not read
Provenance: derived by
claude, implemented byclaude.Independent review:
codexGates (6 of 6 pass): fixture registers a test: pass; pins resolve: pass; families exist: pass; worksheet exists: pass; mutation receipt exists: pass; provenance independent: pass
Worksheet: medicare-irmaa-first-tier-boundary.md Mutation receipt: medicare-irmaa-first-tier-boundary.mutation.md
Evidence tests: medicare.evidence.test.ts
Implemented in: medicare.ts; year2026.ts
Is the number of: medicare-premiums-annual, irmaa-surcharge-annual
Feeds: spending-healthcare-annual
-
Engine source: engine/src/projection/internal/types/result.ts
(YearResult.expenses.healthcare)
The evidence links on this page (each record's worksheet, mutation receipt, evidence tests
and implementation, and the source links) are pinned to engine commit
2624dbdba9fd, committed 2026-10-11.
The live calculation index and
output-family census links point at the repository's main
branch, so you can check this snapshot against them.