Calculation catalog › Medicare and ACA
ACA economic net premium annual
Gross enrollment premium net of the modeled allowable credit.
Field: ACA net premium Unit: US dollars Basis: nominal dollars Computed by: Engine Status: Complete chain
Appears in: report (aca-ledger block and ReportPage ACA table "Net premium")
Calculation records
-
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
-
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 expected contribution Composition record, justified by derivation
Purpose: Price the household's own share of the benchmark premium from its income as a percentage of the poverty line.
Statement: tax/aca.ts#acaFederalPovertyLine, #acaApplicablePct and #acaEconomicPremiumByMonth compute the expected annual benchmark-premium contribution as household MAGI times the piecewise-linear applicable percentage selected from MAGI as a percentage of the regional poverty line, both read from the coverage year's parameters (params/acaCoverageYears.ts#acaParametersForCoverageYear: the Rev. Proc. 2025-25 table and the HHS 2025 guidelines for 2026 coverage, Rev. Proc. 2026-26 and the HHS 2026 guidelines for 2027). The poverty line is the first-person amount plus one additional-person amount for each member past the first; the applicable percentage is interpolated between the breakpoints with a real step at exactly 133%. Units: nominal USD. Rounding: the poverty-line percentage is truncated to a whole number before the table is read (Form 8962 instructions, Worksheet 2, line 4: "drop any numbers after the decimal point"), and the applicable percentage there is rounded half up to the nearest one-hundredth of one percent (26 CFR 1.36B-3(g)(1): "is rounded to the nearest one-hundredth of one percent"); the contribution itself is not rounded to the whole dollar Form 8962 line 8a prints.
Formula:
FPL = (first + (h - 1) x perAdditional) x fplScale; f = 100 x M / FPL; w = floor(f); C = M x round(r(w), 0.01) / 100-
h: Household size (unit: people) (domain: integer >= 1) -
M: Household MAGI (unit: usd/year) (domain: nonnegative) -
f: MAGI as a percentage of the poverty line (unit: percent) (domain: nonnegative) -
w: The whole-number percentage the table is read at (Form 8962, Worksheet 2, line 4) (unit: percent) (domain: integer) -
r(w): Applicable percentage interpolated from the coverage year's applicablePctBreakpoints (acaParametersForCoverageYear), then rounded half up to 0.01 (unit: percent) (domain: positive)
Timing: one coverage year
Rounding: f truncated to a whole number (Form 8962 instructions, Worksheet 2, line 4); r rounded half up to 0.01 percent (26 CFR 1.36B-3(g)(1)); C not rounded (Form 8962 line 8a rounds it to a whole dollar: a stated limit)
Limits:
- The contribution is an intermediate: no census family publishes it, and it is visible only through the credit and the net premium it produces
- The applicable-percentage curve is linear between published breakpoints with a discontinuous step at exactly 133%; it is the coverage-year parameters’ reproduction of a published table, not a statutory formula
- The worksheet's household is a 2026 one; the 2027 poverty line and table are evidenced on aca-coverage-year-parameters
- 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
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-expected-contribution.md Mutation receipt: aca-expected-contribution.mutation.md
Evidence tests: aca.evidence.test.ts
Implemented in: aca.ts
Feeds: aca-modeled-allowable-ptc-annual, aca-economic-net-premium-annual
-
-
ACA household MAGI composition Composition record, justified by derivation
Purpose: Assemble the program-specific household income the credit is measured against.
Statement: tax/aca.ts#buildAcaHouseholdMagi computes current-year ACA household MAGI as federal AGI plus nontaxable Social Security (gross less taxable), plus known tax-exempt interest, plus the known foreign-exclusion addback, plus the MAGI of dependents required to file, floored at zero. Unknown tax-exempt interest, an unknown foreign addback or an unknown dependent filing status make the result non-actionable and publish a null MAGI with blockers instead. These addbacks change ACA MAGI evidence only and are never fed back into ordinary taxable income. Units: nominal USD. Rounding: none.
Formula:
MAGI = max(0, AGI + max(0, SSgross - SStaxable) + TEI + FEA + sum of required-filer dependent MAGI)-
AGI: Federal adjusted gross income, carried signed until the household floor (unit: usd/year) (domain: any finite number) -
SSgross: Gross Social Security benefits (unit: usd/year) (domain: nonnegative) -
SStaxable: Taxable share of those benefits (unit: usd/year) (domain: nonnegative) -
TEI: Tax-exempt interest, counted only when its state is known (unit: usd/year) (domain: nonnegative) -
FEA: Foreign-exclusion addback, counted only when its state is known (unit: usd/year) (domain: nonnegative)
Timing: one coverage year
Rounding: none
Limits:
- Only dependents whose filing status is required contribute; a not-required dependent contributes zero and an unknown one blocks the whole result rather than being guessed
- This is the ACA program MAGI, a different quantity from the IRMAA ledger MAGI on YearResult.magi even though both are catalogued under magi-annual
Provenance: derived by
codex, implemented byclaude.Independent review:
cursorGates (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-household-magi-composition.md Mutation receipt: aca-household-magi-composition.mutation.md
Evidence tests: aca.evidence.test.ts
Implemented in: aca.ts
Is the number of: magi-annual
Feeds: aca-modeled-allowable-ptc-annual, aca-economic-net-premium-annual
-
Engine source: engine/src/projection/internal/types/aca.ts
(YearAcaResult.economicNetPremium)
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.