{
 "schema": "quantcalc-federal-tax-calc-registry/1",
 "description": "Every calculation step of the federal engine (backend/src/federal_tax.c, the Form 1040 composition, and its API layer federal_tax_json.c), in engine order: what it computes, the Form 1040 lines it fills, its code, its official sources (keys of research/data/federal-tax-provenance.json; `when` limits a source to one filing status) and the tests that prove it. The steps whose id is a FedTrace rule id are the composition's own steps: every trace row names one. scripts/gen_federal_tax_embedded.mjs embeds the steps, lines and API text into the engine build; scripts/gen_federal_tax_docs.mjs renders /docs/federal-tax/ from them; scripts/check_federal_tax_docs.mjs fails when a trace rule, a field or a line has no step, a step has no page section, no official source (API steps: a stated convention) or no test that exists.",
 "engine_version": "1.2.0",
 "tax_year": 2026,
 "stages": [
  {
   "id": "api",
   "title": "Request handling (the API)"
  },
  {
   "id": "income",
   "title": "Income: Form 1040 lines 2a to 8"
  },
  {
   "id": "gains",
   "title": "Capital gains: Schedule D netting"
  },
  {
   "id": "agi",
   "title": "Total income and adjusted gross income"
  },
  {
   "id": "deductions",
   "title": "Deductions: the standard deduction, §63(f) and the senior deduction"
  },
  {
   "id": "tax",
   "title": "Tax: the brackets and the capital-gains worksheet"
  },
  {
   "id": "other_taxes",
   "title": "Other taxes: §72(t) and the NIIT"
  },
  {
   "id": "itemized",
   "title": "Itemized deductions: Schedule A, §68 and the non-itemizer charitable deduction"
  },
  {
   "id": "retirement",
   "title": "Retirement accounts: Form 8606 basis, Roth distributions, Form 5329 and the RMD"
  },
  {
   "id": "payments",
   "title": "Estimated tax: the §6654 safe harbors and the Form 2210 penalty"
  }
 ],
 "steps": [
  {
   "id": "api-field-table",
   "stage": "api",
   "title": "One field table: keys, types, limits and unknown keys",
   "summary": "Every request key is one row of a table: its camelCase name, its snake_case spelling, its type and limits, whether it is required, and where its value goes in the engine input. The parser reads the body through the table; a key that is not a row is refused with 400 rather than ignored, because a field the engine does not model (wages, dividends, credits) would otherwise vanish from a figure that looks complete. Keys match case-insensitively; a row sent twice (two spellings or two cases) is refused. GET /api/federal-tax/schema is generated from the same table.",
   "code": {
    "file": "backend/src/federal_tax_json.c",
    "symbols": [
     "federal_tax_json_fields",
     "federal_tax_json_parse"
    ]
   },
   "provenance": [],
   "convention": "API design, not tax law.",
   "tests": [
    "backend/tests/test_federal_api.c:test_parse_types",
    "backend/tests/test_federal_api.c:test_unknown_and_duplicate_keys",
    "backend/tests/test_federal_api.c:test_field_table_documented"
   ]
  },
  {
   "id": "api-validate",
   "stage": "api",
   "title": "Value checks and the return's facts",
   "summary": "`age` is required: the filer's age at the end of the year decides the §72(t) additional tax, the §63(f) aged amount and the senior deduction, and no default would be right for everyone. Amounts are finite and at most $100 billion; gains may be negative (a loss), every other amount may not. `spouseAge` is required on a joint return and refused on any other; `mfsLivedApart` only on a separate return.",
   "code": {
    "file": "backend/src/federal_tax_json.c",
    "symbols": [
     "federal_tax_request_eval"
    ]
   },
   "provenance": [],
   "convention": "API design, not tax law.",
   "tests": [
    "backend/tests/test_federal_api.c:test_value_checks",
    "backend/tests/test_federal_api.c:test_status_dependent_fields",
    "backend/tests/test_federal_api.c:test_extended_fields"
   ]
  },
  {
   "id": "api-year-config",
   "stage": "api",
   "title": "The year's parameters",
   "summary": "The 2026 parameters of the filing status (Rev. Proc. 2025-32), the §63(f) aged amount for each 65+ filer (both spouses on a joint return) added to the standard deduction, and the senior deduction's amount, count, threshold and rate when someone qualifies: built by federal_tax_config_for_year (backend/src/federal_tax.c), the same builder /api/simulate uses for its 2026 year and the ACA bridge uses for every year (a test holds the API, the simulation and the builder byte-identical for every status and age pair).",
   "code": {
    "file": "backend/src/federal_tax_json.c",
    "symbols": [
     "federal_tax_json_config"
    ]
   },
   "provenance": [],
   "convention": "API design, not tax law: the rules themselves are the deduction steps below.",
   "tests": [
    "backend/tests/test_federal_api_sim.c:test_config_matches_simulation"
   ]
  },
  {
   "id": "api-response",
   "stage": "api",
   "title": "The response: result, Form 1040 lines and sources",
   "summary": "The response carries the inputs as sent, the year's result, one entry per Form 1040 line the composition fills (with the rule that produced it) and, per calculation step on the return, its official sources with the quote that was checked and the date (only the bracket table of the return's filing status). `includeSources: false` leaves the sources out; nothing else changes. `rules.notModeled` lists what the engine does not compute.",
   "code": {
    "file": "backend/src/federal_tax_json.c",
    "symbols": [
     "federal_tax_json_response"
    ]
   },
   "provenance": [],
   "convention": "API design, not tax law.",
   "tests": [
    "backend/tests/test_federal_api.c:test_response_shape",
    "backend/tests/test_federal_api.c:test_sources_per_step",
    "backend/tests/test_federal_api.c:test_metadata_endpoints"
   ]
  },
  {
   "id": "api-compute-federal",
   "stage": "api",
   "title": "The state API's computeFederal",
   "summary": "`POST /api/state-tax` with `computeFederal: true` builds one federal return from the state request (IRA and employer-plan distributions, pensions including Railroad Retirement Tier 2, Roth conversions, gains, gross Social Security, the ages) and hands the state engine what /api/simulate hands it: the taxable Social Security, the income tax excluding the NIIT as the federal tax before and after credits, the NIIT, zero refundable credits and federal taxable income. A state request carrying anything the federal engine does not model (wages, interest and dividends, qualified dividends, disability pay, the state request's early-distribution split, IRA basis without the year-end value, disability, dependents, a separate filer's blind spouse) or its own federal figures is refused with 400. Off by default: without it the state API is unchanged, byte for byte. For a single filer the state tax then equals the planner's for the same year in every jurisdiction (tested); on a joint return the state API attributes each amount to the spouse who received it (the `spouse` object), which the planner's household model does not, so the two can differ in states with per-spouse rules while the federal return is the same. Blindness and filingStatus qss are priced (§63(f)(2); the joint tables for a qualifying surviving spouse).",
   "code": {
    "file": "backend/src/state_tax_federal.c",
    "symbols": [
     "state_tax_federal_json_eval"
    ]
   },
   "provenance": [],
   "convention": "API design, not tax law: it composes the federal and state engines exactly as /api/simulate does.",
   "tests": [
    "backend/tests/test_federal_api_sim.c:test_compute_federal_matches_simulation",
    "backend/tests/test_federal_api.c:test_compute_federal_values",
    "backend/tests/test_federal_api.c:test_compute_federal_refusals",
    "backend/tests/test_federal_api.c:test_compute_federal_off_is_unchanged",
    "backend/tests/test_federal_api.c:test_compute_federal_extended"
   ]
  },
  {
   "id": "api-extended",
   "stage": "api",
   "title": "Extended fields: Schedule A, 8606, 5329, the RMD, blindness, QSS and Form 2210",
   "summary": "Any of the fields for the forms beyond the base return (birthMonth, blindCount, the Schedule A amounts, the retirement-account fields, the RMD fields, the Form 2210 fields) or filingStatus qss runs the extended composition and adds `schedules` to the response; without one, the response is the one the base composition gives. The Form 2210 calendar (due dates and quarterly underpayment rates) is the one the underpayment calculator uses, compared row by row by the drift gate.",
   "code": {
    "file": "backend/src/federal_tax_json.c",
    "symbols": [
     "federal_tax_request_eval",
     "federal_tax_json_schedules",
     "federal_tax_json_est_calendar"
    ]
   },
   "provenance": [
    {
     "rule": "int_rates"
    }
   ],
   "convention": "API design: fields that are absent are off, so an existing request's response is unchanged.",
   "tests": [
    "backend/tests/test_federal_api.c:test_extended_fields",
    "backend/tests/test_federal_api.c:test_extended_forms"
   ]
  },
  {
   "id": "irc_103_tax_exempt_interest",
   "stage": "income",
   "title": "Tax-exempt interest",
   "summary": "Tax-exempt interest (`taxExemptInterest`) is reported on line 2a and never taxed. It is added to provisional income for the Social Security test (§86(b)(2)(B)) and to the income the IRMAA tiers read, and nowhere else: not to AGI and not to the NIIT's MAGI.",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "federal_tax_compute"
    ]
   },
   "provenance": [
    {
     "rule": "tax_exempt_103"
    },
    {
     "rule": "form_1040_lines"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax.c:test_tax_exempt_interest"
   ]
  },
  {
   "id": "irc_408d_ira_distribution",
   "stage": "income",
   "title": "IRA distributions and Roth conversions",
   "summary": "A traditional IRA or plan distribution (`iraDistributions`) is ordinary income (§408(d)(1)), line 4b. A Roth conversion (`rothConversion`) is a distribution too and is reported on line 4b with it; the engine taxes it as ordinary income and, unlike the distribution, never charges the §72(t) additional tax on it. No after-tax basis (Form 8606) is modelled: every dollar is taxable.",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "federal_tax_compute"
    ]
   },
   "provenance": [
    {
     "rule": "ira_408d"
    },
    {
     "rule": "form_1040_lines"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax.c:test_single_senior_with_gains",
    "backend/tests/test_federal_api.c:test_lines_map_inputs"
   ]
  },
  {
   "id": "irc_72_pension",
   "stage": "income",
   "title": "Pensions and annuities",
   "summary": "Pension and annuity income (`pension`) is ordinary income (§72(a)), line 5b, fully taxable (no exclusion ratio for after-tax contributions is modelled).",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "federal_tax_compute"
    ]
   },
   "provenance": [
    {
     "rule": "annuity_72"
    },
    {
     "rule": "form_1040_lines"
    }
   ],
   "tests": [
    "backend/tests/test_federal_api.c:test_lines_map_inputs"
   ]
  },
  {
   "id": "irc_86_ss_benefits",
   "stage": "income",
   "title": "Social Security benefits",
   "summary": "Gross Social Security benefits (`socialSecurityGross`, with any Railroad Retirement Tier 1) are line 6a; the taxable part is the next step.",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "federal_tax_compute"
    ]
   },
   "provenance": [
    {
     "rule": "ss86"
    },
    {
     "rule": "form_1040_lines"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax.c:test_single_senior_with_gains"
   ]
  },
  {
   "id": "irc_86_pub915_taxable_ss",
   "stage": "income",
   "title": "Taxable Social Security (the Pub 915 worksheet)",
   "summary": "Provisional income is every other income item (IRA, pension, conversions, other income and both gain buckets after netting), plus tax-exempt interest, plus half the benefits. Up to 50% of benefits are taxable above the base amount ($25,000; $32,000 joint; $0 separate) and up to 85% above the adjusted base ($34,000; $44,000 joint; $0 separate), the smaller of the two worksheet amounts. A separate filer who lived apart from the spouse all year (`mfsLivedApart`) uses the single amounts.",
   "code": {
    "file": "backend/src/tax_calculator.c",
    "symbols": [
     "compute_ss_taxable_amount_v2"
    ]
   },
   "provenance": [
    {
     "rule": "ss86"
    },
    {
     "rule": "p915"
    },
    {
     "rule": "form_1040_lines"
    }
   ],
   "tests": [
    "backend/tests/test_tax_calculator.c:test_ss_taxation",
    "backend/tests/test_tax_calculator.c:test_ss_mfj",
    "backend/tests/test_tax_calculator.c:test_ss_mfs_zero_thresholds",
    "backend/tests/test_tax_calculator.c:test_ss_mfs_lived_apart_single_thresholds"
   ]
  },
  {
   "id": "irc_1222_net_short_term",
   "stage": "gains",
   "title": "Net short-term gain or loss",
   "summary": "`shortTermGains` is the year's net short-term gain or loss (Schedule D line 7), signed.",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "federal_tax_compute"
    ]
   },
   "provenance": [
    {
     "rule": "cg_1222"
    },
    {
     "rule": "form_1040_lines"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax.c:test_netting"
   ]
  },
  {
   "id": "irc_1222_net_long_term",
   "stage": "gains",
   "title": "Net long-term gain or loss",
   "summary": "`longTermGains` is the year's net long-term gain or loss (Schedule D line 15), signed.",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "federal_tax_compute"
    ]
   },
   "provenance": [
    {
     "rule": "cg_1222"
    },
    {
     "rule": "form_1040_lines"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax.c:test_netting"
   ]
  },
  {
   "id": "irc_1222_net_capital_gain",
   "stage": "gains",
   "title": "Combined net gain or loss",
   "summary": "Schedule D line 16 is the sum of lines 7 and 15. A net loss in one bucket first offsets a net gain in the other; what is left in each bucket is taxed by its own character: short-term as ordinary income, long-term in the capital-gains worksheet.",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "federal_tax_compute"
    ]
   },
   "provenance": [
    {
     "rule": "cg_1222"
    },
    {
     "rule": "form_1040_lines"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax.c:test_netting"
   ]
  },
  {
   "id": "sched_d_netting_floor_0",
   "stage": "gains",
   "title": "Line 7a: a net loss enters as zero",
   "summary": "Line 7a is the net gain after netting. When the year's combined result is a loss, the engine enters 0: it does not yet deduct up to $3,000 ($1,500 separate) of the loss against other income (§1211(b)) or carry the rest forward, so for a year with a net loss the federal tax it reports is up to the tax on $3,000 too high. The capital-loss deduction and carryover are planned (R2).",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "federal_tax_compute"
    ]
   },
   "provenance": [
    {
     "rule": "cap_loss"
    },
    {
     "rule": "form_1040_lines"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax.c:test_netting",
    "backend/tests/test_federal_tax.c:test_identities"
   ]
  },
  {
   "id": "irc_61_other_income",
   "stage": "income",
   "title": "Other ordinary income",
   "summary": "`otherOrdinaryIncome` is ordinary income that is neither an IRA distribution, a conversion nor a pension, and is not net investment income (for example other income reported on Schedule 1). It goes to line 8. Interest and dividends are not this field: the engine does not model them yet (R1), and they would change the NIIT.",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "federal_tax_compute"
    ]
   },
   "provenance": [
    {
     "rule": "gross_income_61"
    },
    {
     "rule": "form_1040_lines"
    }
   ],
   "tests": [
    "backend/tests/test_federal_api.c:test_lines_map_inputs"
   ]
  },
  {
   "id": "irc_61_total_income",
   "stage": "agi",
   "title": "Total income",
   "summary": "Line 9 adds lines 4b, 5b, 6b, 7a and 8.",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "federal_tax_compute"
    ]
   },
   "provenance": [
    {
     "rule": "gross_income_61"
    },
    {
     "rule": "form_1040_lines"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax.c:test_identities"
   ]
  },
  {
   "id": "irc_62_agi_no_adjustments",
   "stage": "agi",
   "title": "Adjusted gross income",
   "summary": "No adjustment to income (Schedule 1 Part II) is modelled, so AGI (line 11a) equals total income. AGI is also the MAGI of the NIIT and of the senior deduction's phase-out.",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "federal_tax_compute"
    ]
   },
   "provenance": [
    {
     "rule": "agi_62"
    },
    {
     "rule": "form_1040_lines"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax.c:test_identities",
    "backend/tests/test_federal_tax.c:test_single_senior_with_gains"
   ]
  },
  {
   "id": "irc_63c_63f_standard_deduction",
   "stage": "deductions",
   "title": "Standard deduction and the §63(f) aged amount",
   "summary": "The 2026 standard deduction of the filing status ($16,100 single and separate, $32,200 joint, $24,150 head of household), plus the §63(f) additional amount for each filer 65 or older at the end of the year ($2,050 unmarried, $1,650 per spouse married; on a joint return each spouse 65+ adds one). The engine does not itemize (Schedule A, R3) and has no blindness amount yet (R6).",
   "code": {
    "file": "backend/src/tax_calculator.c",
    "symbols": [
     "tax_config_init",
     "additional_std_deduction_aged_2026_couple"
    ]
   },
   "provenance": [
    {
     "rule": "std_ded"
    },
    {
     "rule": "aged_63f"
    },
    {
     "rule": "form_1040_lines"
    }
   ],
   "tests": [
    "backend/tests/test_tax_calculator.c:test_std_deduction_2026_all_statuses",
    "backend/tests/test_tax_calculator.c:test_aged_deduction_couple"
   ]
  },
  {
   "id": "irc_63f2_blind",
   "stage": "deductions",
   "title": "Additional standard deduction for blindness",
   "summary": "§63(f)(2): an additional amount for a filer who is blind at the end of the year, and for the spouse on a joint return: $2,050 if unmarried (single or head of household) and $1,650 if married or a qualifying surviving spouse (Rev. Proc. 2025-32). Added to the standard deduction; lost when the return itemizes. Request field blindCount.",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "ext_deduction"
    ]
   },
   "provenance": [
    {
     "rule": "blind_63f2"
    },
    {
     "rule": "form_lines_schedules"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax_forms.c:test_blind"
   ]
  },
  {
   "id": "irc_151d5_senior_deduction",
   "stage": "deductions",
   "title": "The senior deduction (Schedule 1-A)",
   "summary": "For tax years 2025 to 2028, $6,000 for each individual 65 or older at the end of the year (both spouses on a joint return), reduced by 6% of MAGI over $75,000 ($150,000 joint), each individual's amount separately, not below zero. A separate return does not qualify. MAGI here is AGI.",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "federal_tax_compute"
    ]
   },
   "provenance": [
    {
     "rule": "senior"
    },
    {
     "rule": "senior_eff"
    },
    {
     "rule": "senior_irs"
    },
    {
     "rule": "form_1040_lines"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax.c:test_senior_branches",
    "backend/tests/test_tax_calculator.c:test_obbba_senior_deduction_couple"
   ]
  },
  {
   "id": "sched1a_line38_additional_deductions",
   "stage": "deductions",
   "title": "Additional deductions on line 13b",
   "summary": "Schedule 1-A's total (line 38) goes to Form 1040 line 13b. The engine's only Schedule 1-A deduction is the senior deduction; the tips, overtime and car-loan interest deductions are not modelled.",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "federal_tax_compute"
    ]
   },
   "provenance": [
    {
     "rule": "form_1040_lines"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax.c:test_single_senior_with_gains"
   ]
  },
  {
   "id": "irc_63_total_deductions",
   "stage": "deductions",
   "title": "Total deductions",
   "summary": "Line 14 adds the standard deduction (12e) and the senior deduction (13b). There is no qualified business income deduction (13a).",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "federal_tax_compute"
    ]
   },
   "provenance": [
    {
     "rule": "taxable_income_63"
    },
    {
     "rule": "form_1040_lines"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax.c:test_single_senior_with_gains"
   ]
  },
  {
   "id": "irc_63_taxable_income",
   "stage": "deductions",
   "title": "Taxable income",
   "summary": "Line 15 is AGI less the deductions, not below zero. The deductions reduce ordinary income first; what is left over (the unused deduction) reduces the long-term gain that enters the capital-gains worksheet.",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "federal_tax_compute"
    ]
   },
   "provenance": [
    {
     "rule": "taxable_income_63"
    },
    {
     "rule": "form_1040_lines"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax.c:test_unused_deduction",
    "backend/tests/test_federal_tax.c:test_identities"
   ]
  },
  {
   "id": "irc_1_1h_tax_qdcg_worksheet",
   "stage": "tax",
   "title": "Tax: the brackets and the capital-gains worksheet",
   "summary": "Ordinary taxable income is taxed on the 2026 brackets of the filing status (10% to 37%). Long-term gain is stacked on top of it and taxed at 0%, 15% and 20% by where it falls on the 2026 capital-gains bands (the Qualified Dividends and Capital Gain Tax Worksheet). Line 16 is the sum.",
   "code": {
    "file": "backend/src/tax_calculator.c",
    "symbols": [
     "compute_ordinary_income_tax",
     "compute_capital_gains_tax"
    ]
   },
   "provenance": [
    {
     "rule": "ord_single",
     "when": "single"
    },
    {
     "rule": "ord_mfj",
     "when": "mfj"
    },
    {
     "rule": "ord_mfs",
     "when": "mfs"
    },
    {
     "rule": "ord_hoh",
     "when": "hoh"
    },
    {
     "rule": "ltcg"
    },
    {
     "rule": "form_1040_lines"
    }
   ],
   "tests": [
    "backend/tests/test_tax_calculator.c:test_ordinary_bracket_edges_2026",
    "backend/tests/test_tax_calculator.c:test_cg_stacking_15pct",
    "backend/tests/test_tax_calculator.c:test_cg_boundary_all_statuses",
    "backend/tests/test_federal_tax.c:test_single_senior_with_gains"
   ]
  },
  {
   "id": "irc_72t_additional_tax",
   "stage": "other_taxes",
   "title": "The 10% additional tax on early distributions",
   "summary": "10% of `iraDistributions` when the filer is 59 or younger at the end of the year (every month of that year is before 59½); none from the year the filer turns 60. None of the §72(t)(2) exceptions (separation from service at 55, substantially equal payments, disability and others) is modelled yet (R5), and Roth conversions are never charged. Schedule 2 line 8.",
   "code": {
    "file": "backend/src/tax_calculator.c",
    "symbols": [
     "compute_early_withdrawal_penalty",
     "early_withdrawal_penalty_rate"
    ]
   },
   "provenance": [
    {
     "rule": "72t"
    },
    {
     "rule": "form_1040_lines"
    }
   ],
   "tests": [
    "backend/tests/test_tax_calculator.c:test_early_withdrawal_59",
    "backend/tests/test_tax_calculator.c:test_early_withdrawal_60",
    "backend/tests/test_federal_tax.c:test_niit_short_term_and_penalty"
   ]
  },
  {
   "id": "irc_1411_niit",
   "stage": "other_taxes",
   "title": "Net investment income tax",
   "summary": "3.8% of the smaller of net investment income and MAGI over the threshold ($200,000 single and head of household, $250,000 joint, $125,000 separate; not indexed). Net investment income here is the year's net short-term and long-term gain; the engine models no interest, dividends or other investment income yet (R1). Schedule 2 line 12.",
   "code": {
    "file": "backend/src/tax_calculator.c",
    "symbols": [
     "compute_niit"
    ]
   },
   "provenance": [
    {
     "rule": "niit"
    },
    {
     "rule": "niit_irs"
    },
    {
     "rule": "form_1040_lines"
    }
   ],
   "tests": [
    "backend/tests/test_tax_calculator.c:test_cg_niit",
    "backend/tests/test_tax_calculator.c:test_niit_threshold_2026",
    "backend/tests/test_federal_tax.c:test_niit_short_term_and_penalty"
   ]
  },
  {
   "id": "sched2_other_taxes",
   "stage": "other_taxes",
   "title": "Other taxes",
   "summary": "Line 23 carries Schedule 2's total: the §72(t) additional tax and the NIIT.",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "federal_tax_compute"
    ]
   },
   "provenance": [
    {
     "rule": "form_1040_lines"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax.c:test_niit_short_term_and_penalty"
   ]
  },
  {
   "id": "total_tax",
   "stage": "other_taxes",
   "title": "Total tax",
   "summary": "Line 24 adds line 16 and line 23. No credit (child tax credit, credit for the elderly, premium tax credit reconciliation) and no alternative minimum tax is modelled (R7), so line 22 equals line 16. `result.totalTax` is this line; `result.incomeTax` leaves out the §72(t) additional tax.",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "federal_tax_compute"
    ]
   },
   "provenance": [
    {
     "rule": "form_1040_lines"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax.c:test_identities",
    "backend/tests/test_federal_api.c:test_response_shape"
   ]
  },
  {
   "id": "irc_213a_medical_over_7_5pct",
   "stage": "itemized",
   "title": "Medical and dental expenses",
   "summary": "Schedule A line 4: unreimbursed medical and dental expenses to the extent they exceed 7.5% of AGI (§213(a)).",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "ext_deduction"
    ]
   },
   "provenance": [
    {
     "rule": "sched_a_medical"
    },
    {
     "rule": "form_lines_schedules"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax_forms.c:test_itemize_mfj"
   ]
  },
  {
   "id": "irc_164a_salt_paid",
   "stage": "itemized",
   "title": "State and local taxes paid",
   "summary": "Schedule A line 5d: state and local income (or general sales) tax, real estate tax and personal property tax paid in the year.",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "ext_deduction"
    ]
   },
   "provenance": [
    {
     "rule": "salt"
    },
    {
     "rule": "form_lines_schedules"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax_forms.c:test_itemize_mfj"
   ]
  },
  {
   "id": "irc_164b6_b7_salt_cap",
   "stage": "itemized",
   "title": "The SALT cap and its phase-down",
   "summary": "Schedule A line 5e: line 5d up to the cap of §164(b)(6)-(7): $40,400 for 2026, reduced by 30% of MAGI over $505,000 but not below $10,000; a separate return gets half the threshold and half the amount. MAGI is AGI (the engine has no foreign or territory exclusions).",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "federal_salt_cap",
     "ext_deduction"
    ]
   },
   "provenance": [
    {
     "rule": "salt"
    },
    {
     "rule": "salt_sched_a"
    },
    {
     "rule": "form_lines_schedules"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax_forms.c:test_salt_cap",
    "backend/tests/test_federal_tax_forms.c:test_section_68"
   ]
  },
  {
   "id": "irc_163h_interest",
   "stage": "itemized",
   "title": "Interest you paid",
   "summary": "Schedule A line 10: home mortgage interest and points and Form 4952 investment interest, as deductible amounts the caller supplies (the §163(h)(3) debt limit is applied by the caller).",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "ext_deduction"
    ]
   },
   "provenance": [
    {
     "rule": "itemize_election"
    },
    {
     "rule": "form_lines_schedules"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax_forms.c:test_itemize_mfj",
    "backend/tests/test_federal_tax_forms.c:test_charity_limits"
   ]
  },
  {
   "id": "irc_170b_charity_limits_floor",
   "stage": "itemized",
   "title": "Gifts to charity: the percentage limits and the 0.5% floor",
   "summary": "Schedule A line 14: capital-gain property to public charities up to 30% of AGI, cash up to 60% of AGI less that property; from 2026 only the amount above 0.5% of AGI is deductible, taken first from the property and last from the cash (§170(b)(1)(C), (G), (I)). Carryovers of amounts over the limits are not modelled.",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "ext_deduction"
    ]
   },
   "provenance": [
    {
     "rule": "charity_limits"
    },
    {
     "rule": "form_lines_schedules"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax_forms.c:test_charity_limits",
    "backend/tests/test_federal_tax_forms.c:test_itemize_mfj"
   ]
  },
  {
   "id": "irc_68_2_37_limitation",
   "stage": "itemized",
   "title": "The §68 limitation on itemized deductions",
   "summary": "From 2026 (OBBBA §70111) itemized deductions are reduced by 2/37 of the smaller of the itemized total and the taxable income (before §68, plus the itemized total) above the start of the 37% bracket: in that bracket each itemized dollar saves 35 cents. It applies to all itemized deductions, after every other limit.",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "ext_deduction"
    ]
   },
   "provenance": [
    {
     "rule": "section_68"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax_forms.c:test_section_68"
   ]
  },
  {
   "id": "irc_63d_itemized_total",
   "stage": "itemized",
   "title": "Total itemized deductions",
   "summary": "Schedule A line 17: lines 4 through 16 after §68. This is the figure the state engine's itemized-conformity states read.",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "ext_deduction"
    ]
   },
   "provenance": [
    {
     "rule": "itemize_election"
    },
    {
     "rule": "form_lines_schedules"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax_forms.c:test_itemize_mfj"
   ]
  },
  {
   "id": "irc_63e_itemize_election",
   "stage": "itemized",
   "title": "Itemize or take the standard deduction",
   "summary": "§63(e): itemizing is an election. itemizeMode auto takes the larger of Schedule A (after §68) and the standard deduction plus the non-itemizer charitable deduction (a larger deduction never raises the tax); itemize elects it anyway (Schedule A line 18); standard never itemizes. A separate filer whose spouse itemizes has a standard deduction of zero (§63(c)(6)(A)).",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "ext_deduction"
    ]
   },
   "provenance": [
    {
     "rule": "itemize_election"
    },
    {
     "rule": "salt"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax_forms.c:test_itemize_mfj",
    "backend/tests/test_federal_tax_forms.c:test_mfs_spouse_itemizes"
   ]
  },
  {
   "id": "irc_170p_nonitemizer_charity",
   "stage": "itemized",
   "title": "Charitable deduction for non-itemizers",
   "summary": "From 2026 a filer who does not itemize deducts cash gifts to public charities (not donor-advised funds or supporting organizations) up to $2,000 on a joint return, less otherwise; no 0.5% floor (§170(p), §63(b)(4)).",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "ext_deduction"
    ]
   },
   "provenance": [
    {
     "rule": "charity_170p"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax_forms.c:test_nonitemizer_charity"
   ]
  },
  {
   "id": "irc_408d2_conversion_nontaxable",
   "stage": "retirement",
   "title": "Form 8606: the nontaxable part of a conversion",
   "summary": "Form 8606 line 11: all traditional IRAs are one contract and the year's distributions one distribution (§408(d)(2)), so basis is recovered pro rata: line 10 = basis / (December 31 value + distributions + conversions), at most 1; line 11 = the conversion times line 10.",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "ext_prepare"
    ]
   },
   "provenance": [
    {
     "rule": "f8606_prorata"
    },
    {
     "rule": "form_lines_schedules"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax_forms.c:test_form_8606"
   ]
  },
  {
   "id": "irc_408d2_nontaxable_total",
   "stage": "retirement",
   "title": "Form 8606: the nontaxable part of all distributions",
   "summary": "Form 8606 line 13: line 11 plus the IRA distributions times line 10. Employer-plan dollars carry no basis here.",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "ext_prepare"
    ]
   },
   "provenance": [
    {
     "rule": "f8606_prorata"
    },
    {
     "rule": "form_lines_schedules"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax_forms.c:test_form_8606"
   ]
  },
  {
   "id": "irc_408d2_basis_remaining",
   "stage": "retirement",
   "title": "Form 8606: basis carried forward",
   "summary": "Form 8606 line 14: the basis left for later years.",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "ext_prepare"
    ]
   },
   "provenance": [
    {
     "rule": "f8606_prorata"
    },
    {
     "rule": "form_lines_schedules"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax_forms.c:test_form_8606"
   ]
  },
  {
   "id": "irc_408a_d4_roth_taxable",
   "stage": "retirement",
   "title": "Roth IRA distributions: ordering and the 5-year rules",
   "summary": "A Roth distribution comes first from contributions, then from conversions oldest first (each conversion's taxable part first), then from earnings (§408A(d)(4)(B)). A qualified distribution (59½ or disabled, and 5 taxable years since the first Roth contribution) is tax-free. Otherwise the earnings are taxable (Form 8606 line 25c), and a conversion's taxable part taken within 5 years of that conversion is subject to the §72(t) additional tax (§408A(d)(3)(F)). On the age clock, with the 5-year clock met, only the share of the year before 59½ is nonqualified.",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "ext_prepare"
    ]
   },
   "provenance": [
    {
     "rule": "roth_408a"
    },
    {
     "rule": "form_lines_schedules"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax_forms.c:test_roth_ordering",
    "backend/tests/test_federal_tax_forms.c:test_age_clock_birth_month"
   ]
  },
  {
   "id": "irc_72t_early_distributions",
   "stage": "retirement",
   "title": "Form 5329: early distributions",
   "summary": "Form 5329 line 1: the taxable traditional-account withdrawal before 59½ plus nonqualified Roth earnings and recaptured conversions.",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "ext_penalty"
    ]
   },
   "provenance": [
    {
     "rule": "72t"
    },
    {
     "rule": "72t_exceptions"
    },
    {
     "rule": "form_lines_schedules"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax_forms.c:test_72t_exceptions"
   ]
  },
  {
   "id": "irc_72t2_exceptions",
   "stage": "retirement",
   "title": "Form 5329: the exceptions to the additional tax",
   "summary": "Form 5329 line 2: disability (§72(t)(2)(A)(iii)); substantially equal periodic payments (iv), their taxable part; and employer-plan distributions after separation from service in or after the year the filer reaches 55, or 50 for a qualified public safety employee ((v), §72(t)(10)); never for an IRA (§72(t)(3)(A)). The 10% applies to the rest at the age clock's rate.",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "ext_penalty"
    ]
   },
   "provenance": [
    {
     "rule": "72t_exceptions"
    },
    {
     "rule": "form_lines_schedules"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax_forms.c:test_72t_exceptions",
    "backend/tests/test_federal_tax_forms.c:test_age_clock_birth_month"
   ]
  },
  {
   "id": "irc_4974_missed_rmd_excise",
   "stage": "retirement",
   "title": "Form 5329: the missed-RMD excise tax",
   "summary": "Form 5329 line 55: 25% of a required minimum distribution not taken, or 10% when it is corrected within the correction window (§4974(a), (e)). It is part of Schedule 2 line 8 and of the total tax, but not of the tax Form 2210 uses.",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "federal_missed_rmd_excise",
     "ext_penalty"
    ]
   },
   "provenance": [
    {
     "rule": "missed_rmd_4974"
    },
    {
     "rule": "form_lines_schedules"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax_forms.c:test_missed_rmd"
   ]
  },
  {
   "id": "reg_401a9_rmd_divisor",
   "stage": "retirement",
   "title": "The RMD divisor: Uniform Lifetime or Joint and Last Survivor",
   "summary": "From the SECURE 2.0 applicable age for the birth year (the tax year minus the age reached), the divisor is the Uniform Lifetime Table's, or the Joint and Last Survivor Table's when the spouse is the sole beneficiary all year and more than 10 years younger (26 CFR 1.401(a)(9)-5(c)(2), -9(d)); ages are those reached in the year.",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "rmd_joint_life_divisor",
     "ext_prepare"
    ]
   },
   "provenance": [
    {
     "rule": "joint_life"
    },
    {
     "rule": "ult"
    },
    {
     "rule": "rmd_age"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax_forms.c:test_rmd",
    "backend/tests/test_federal_tax_forms.c:test_joint_life"
   ]
  },
  {
   "id": "reg_401a9_rmd_required",
   "stage": "retirement",
   "title": "The required minimum distribution",
   "summary": "The December 31 balance of the prior year divided by the divisor.",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "ext_prepare"
    ]
   },
   "provenance": [
    {
     "rule": "joint_life"
    },
    {
     "rule": "ult"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax_forms.c:test_rmd"
   ]
  },
  {
   "id": "irc_6654d_required_annual_payment",
   "stage": "payments",
   "title": "Form 2210: the required annual payment",
   "summary": "Form 2210 line 9: the smaller of 90% of this year's tax (income tax plus the additional tax on distributions) and 100% of last year's tax, 110% when last year's AGI exceeded $150,000 ($75,000 on a separate return); the prior-year harbor only when last year was a full 12-month year with a return (§6654(d)). No penalty when the tax less withholding is under $1,000 (§6654(e)(1)) or last year's 12-month return showed no tax (§6654(e)(2)).",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "federal_est_compute"
    ]
   },
   "provenance": [
    {
     "rule": "6654"
    },
    {
     "rule": "estimated_2210"
    },
    {
     "rule": "form_lines_schedules"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax_forms.c:test_est_harbours",
    "backend/tests/test_federal_tax_forms.c:test_2210_on_return"
   ]
  },
  {
   "id": "irc_6654_underpayment",
   "stage": "payments",
   "title": "Form 2210: the underpayment by installment",
   "summary": "Form 2210 line 17: a quarter of the required annual payment is due on each of April 15, June 15 and September 15, 2026 and January 15, 2027; withholding counts as paid in four equal parts on those dates (§6654(g)(1)); payments go to the oldest unpaid installment and an overpayment carries forward.",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "federal_est_compute"
    ]
   },
   "provenance": [
    {
     "rule": "estimated_2210"
    },
    {
     "rule": "form_lines_schedules"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax_forms.c:test_est_ledger",
    "backend/tests/test_federal_tax_forms.c:test_2210_on_return"
   ]
  },
  {
   "id": "irc_6654_penalty",
   "stage": "payments",
   "title": "Form 2210: the penalty",
   "summary": "Form 2210 line 19: simple interest on each installment's underpayment at the §6621 rate of each quarter, days x rate / 365, from the due date to the earlier of the payment date and April 15, 2027 (the regular method; the annualized income method is not modelled). The first quarter of 2027 carries the last announced rate forward and the response flags it.",
   "code": {
    "file": "backend/src/federal_tax.c",
    "symbols": [
     "federal_est_compute"
    ]
   },
   "provenance": [
    {
     "rule": "estimated_2210"
    },
    {
     "rule": "int_rates"
    },
    {
     "rule": "form_lines_schedules"
    }
   ],
   "tests": [
    "backend/tests/test_federal_tax_forms.c:test_est_nothing_paid",
    "backend/tests/test_federal_tax_forms.c:test_2210_on_return"
   ]
  }
 ],
 "trace_lines": [
  {
   "line": "1040.2a",
   "form": "Form 1040",
   "number": "2a",
   "label": "Tax-exempt interest",
   "step": "irc_103_tax_exempt_interest"
  },
  {
   "line": "1040.4b",
   "form": "Form 1040",
   "number": "4b",
   "label": "IRA distributions, taxable amount",
   "step": "irc_408d_ira_distribution"
  },
  {
   "line": "1040.5b",
   "form": "Form 1040",
   "number": "5b",
   "label": "Pensions and annuities, taxable amount",
   "step": "irc_72_pension"
  },
  {
   "line": "1040.6a",
   "form": "Form 1040",
   "number": "6a",
   "label": "Social security benefits",
   "step": "irc_86_ss_benefits"
  },
  {
   "line": "1040.6b",
   "form": "Form 1040",
   "number": "6b",
   "label": "Social security benefits, taxable amount",
   "step": "irc_86_pub915_taxable_ss"
  },
  {
   "line": "1040sd.7",
   "form": "Schedule D",
   "number": "7",
   "label": "Net short-term capital gain or (loss)",
   "step": "irc_1222_net_short_term"
  },
  {
   "line": "1040sd.15",
   "form": "Schedule D",
   "number": "15",
   "label": "Net long-term capital gain or (loss)",
   "step": "irc_1222_net_long_term"
  },
  {
   "line": "1040sd.16",
   "form": "Schedule D",
   "number": "16",
   "label": "Lines 7 and 15 combined",
   "step": "irc_1222_net_capital_gain"
  },
  {
   "line": "1040.7a",
   "form": "Form 1040",
   "number": "7a",
   "label": "Capital gain or (loss)",
   "step": "sched_d_netting_floor_0"
  },
  {
   "line": "1040.8",
   "form": "Form 1040",
   "number": "8",
   "label": "Additional income from Schedule 1, line 10",
   "step": "irc_61_other_income"
  },
  {
   "line": "1040.9",
   "form": "Form 1040",
   "number": "9",
   "label": "Total income",
   "step": "irc_61_total_income"
  },
  {
   "line": "1040.11a",
   "form": "Form 1040",
   "number": "11a",
   "label": "Adjusted gross income",
   "step": "irc_62_agi_no_adjustments"
  },
  {
   "line": "1040.12e",
   "form": "Form 1040",
   "number": "12e",
   "label": "Standard deduction",
   "step": "irc_63c_63f_standard_deduction"
  },
  {
   "line": "1040s1a.37",
   "form": "Schedule 1-A",
   "number": "37",
   "label": "Enhanced deduction for seniors",
   "step": "irc_151d5_senior_deduction"
  },
  {
   "line": "1040.13b",
   "form": "Form 1040",
   "number": "13b",
   "label": "Additional deductions from Schedule 1-A, line 38",
   "step": "sched1a_line38_additional_deductions"
  },
  {
   "line": "1040.14",
   "form": "Form 1040",
   "number": "14",
   "label": "Total deductions (lines 12e, 13a and 13b)",
   "step": "irc_63_total_deductions"
  },
  {
   "line": "1040.15",
   "form": "Form 1040",
   "number": "15",
   "label": "Taxable income",
   "step": "irc_63_taxable_income"
  },
  {
   "line": "1040.16",
   "form": "Form 1040",
   "number": "16",
   "label": "Tax",
   "step": "irc_1_1h_tax_qdcg_worksheet"
  },
  {
   "line": "1040s2.8",
   "form": "Schedule 2",
   "number": "8",
   "label": "Additional tax on IRAs or other tax-favored accounts",
   "step": "irc_72t_additional_tax"
  },
  {
   "line": "1040s2.12",
   "form": "Schedule 2",
   "number": "12",
   "label": "Net investment income tax",
   "step": "irc_1411_niit"
  },
  {
   "line": "1040.23",
   "form": "Form 1040",
   "number": "23",
   "label": "Other taxes, from Schedule 2, line 21",
   "step": "sched2_other_taxes"
  },
  {
   "line": "1040.24",
   "form": "Form 1040",
   "number": "24",
   "label": "Total tax",
   "step": "total_tax"
  },
  {
   "line": "1040.12e.blind",
   "form": "Form 1040",
   "number": "12e (part)",
   "label": "Additional standard deduction for blindness (§63(f)(2); no line of its own)",
   "step": "irc_63f2_blind"
  },
  {
   "line": "1040sa.4",
   "form": "Schedule A",
   "number": "4",
   "label": "Medical and dental expenses over 7.5% of AGI",
   "step": "irc_213a_medical_over_7_5pct"
  },
  {
   "line": "1040sa.5d",
   "form": "Schedule A",
   "number": "5d",
   "label": "State and local taxes: add lines 5a through 5c",
   "step": "irc_164a_salt_paid"
  },
  {
   "line": "1040sa.5e",
   "form": "Schedule A",
   "number": "5e",
   "label": "State and local taxes after the cap",
   "step": "irc_164b6_b7_salt_cap"
  },
  {
   "line": "1040sa.10",
   "form": "Schedule A",
   "number": "10",
   "label": "Interest you paid: add lines 8e and 9",
   "step": "irc_163h_interest"
  },
  {
   "line": "1040sa.14",
   "form": "Schedule A",
   "number": "14",
   "label": "Gifts to charity: add lines 11 through 13",
   "step": "irc_170b_charity_limits_floor"
  },
  {
   "line": "1040sa.68",
   "form": "Schedule A",
   "number": "(2026)",
   "label": "Section 68 reduction (TY2026 line not yet published)",
   "step": "irc_68_2_37_limitation"
  },
  {
   "line": "1040sa.17",
   "form": "Schedule A",
   "number": "17",
   "label": "Total itemized deductions (to Form 1040 line 12e)",
   "step": "irc_63d_itemized_total"
  },
  {
   "line": "1040.12e.itemized",
   "form": "Form 1040",
   "number": "12e (flag)",
   "label": "1 = line 12e carries itemized deductions, 0 = the standard deduction",
   "step": "irc_63e_itemize_election"
  },
  {
   "line": "1040.170p",
   "form": "Form 1040",
   "number": "(2026)",
   "label": "Charitable deduction for non-itemizers, §170(p) (TY2026 line not yet published)",
   "step": "irc_170p_nonitemizer_charity"
  },
  {
   "line": "8606.11",
   "form": "Form 8606",
   "number": "11",
   "label": "Nontaxable portion of the amount converted to Roth IRAs",
   "step": "irc_408d2_conversion_nontaxable"
  },
  {
   "line": "8606.13",
   "form": "Form 8606",
   "number": "13",
   "label": "Nontaxable portion of all distributions",
   "step": "irc_408d2_nontaxable_total"
  },
  {
   "line": "8606.14",
   "form": "Form 8606",
   "number": "14",
   "label": "Total basis in traditional IRAs carried forward",
   "step": "irc_408d2_basis_remaining"
  },
  {
   "line": "8606.25c",
   "form": "Form 8606",
   "number": "25c",
   "label": "Roth IRA distributions: taxable amount",
   "step": "irc_408a_d4_roth_taxable"
  },
  {
   "line": "5329.1",
   "form": "Form 5329",
   "number": "1",
   "label": "Early distributions includible in income",
   "step": "irc_72t_early_distributions"
  },
  {
   "line": "5329.2",
   "form": "Form 5329",
   "number": "2",
   "label": "Early distributions not subject to the additional tax",
   "step": "irc_72t2_exceptions"
  },
  {
   "line": "5329.55",
   "form": "Form 5329",
   "number": "55",
   "label": "Additional tax on excess accumulation (missed RMD)",
   "step": "irc_4974_missed_rmd_excise"
  },
  {
   "line": "rmd.divisor",
   "form": "26 CFR 1.401(a)(9)",
   "number": "divisor",
   "label": "RMD divisor (Uniform Lifetime or Joint and Last Survivor Table)",
   "step": "reg_401a9_rmd_divisor"
  },
  {
   "line": "rmd.required",
   "form": "26 CFR 1.401(a)(9)",
   "number": "RMD",
   "label": "Required minimum distribution for the year",
   "step": "reg_401a9_rmd_required"
  },
  {
   "line": "2210.9",
   "form": "Form 2210",
   "number": "9",
   "label": "Required annual payment",
   "step": "irc_6654d_required_annual_payment"
  },
  {
   "line": "2210.17",
   "form": "Form 2210",
   "number": "17",
   "label": "Underpayment (total of the four installments)",
   "step": "irc_6654_underpayment"
  },
  {
   "line": "2210.19",
   "form": "Form 2210",
   "number": "19",
   "label": "Penalty",
   "step": "irc_6654_penalty"
  }
 ],
 "not_modeled": [
  {
   "item": "Wages, self-employment income, FICA and the Additional Medicare Tax",
   "plan": "R4"
  },
  {
   "item": "Taxable interest, ordinary and qualified dividends (and so their share of the NIIT and the capital-gains worksheet)",
   "plan": "R1"
  },
  {
   "item": "The $3,000 capital-loss deduction and loss carryovers (a net loss enters as zero)",
   "plan": "R2"
  },
  {
   "item": "Credits (child and other dependent credits, the credit for the elderly, the saver's credit, the premium tax credit reconciliation) and the alternative minimum tax",
   "plan": "R7"
  },
  {
   "item": "Adjustments to income (Schedule 1 Part II), the qualified business income deduction and the Schedule 1-A tips, overtime and car-loan interest deductions",
   "plan": null
  },
  {
   "item": "Charitable contribution carryovers, private-foundation gift limits, and the §163(h)(3) mortgage-debt limit (mortgage interest is taken as a deductible amount)",
   "plan": null
  },
  {
   "item": "The calculation of substantially equal periodic payments (the installment is an input), the other §72(t)(2) exceptions (death, first home, medical, birth or adoption, emergency, domestic abuse, terminal illness) and first-home or death Roth distributions",
   "plan": null
  },
  {
   "item": "The §4974(d) reasonable-cause waiver of the missed-RMD excise and inherited-account RMDs",
   "plan": null
  },
  {
   "item": "Form 2210's annualized income method (Schedule AI), penalty waivers and the farmer and fisherman rules",
   "plan": null
  },
  {
   "item": "A qualifying surviving spouse's eligibility (the year of death, the dependent child) is the caller's assertion; the split-interest QCD is an engine function, not a request field",
   "plan": null
  }
 ],
 "api": {
  "request_fields": [
   {
    "name": "filingStatus",
    "aliases": [
     "filing_status"
    ],
    "type": "string",
    "required": false,
    "default": "single",
    "meaning": "single, mfj or married_filing_jointly, mfs or married_filing_separately, hoh or head_of_household, qss or qualifying_surviving_spouse (any case). A qualifying surviving spouse (§2(a): the spouse died in 2024 or 2025, a dependent child lives with the filer, not remarried; the caller asserts it) files on the joint brackets and standard deduction with the single Social Security base amounts and senior-deduction threshold, and has no spouseAge.",
    "step": "api-field-table",
    "relation": "The return's filing status: the brackets, the standard deduction, the thresholds.",
    "limits": "One of the nine strings, any case; null = absent. Anything else: 400 naming the field."
   },
   {
    "name": "age",
    "aliases": [],
    "type": "integer",
    "required": true,
    "default": "(none: 400)",
    "meaning": "The age the filer reaches in 2026 (the age clock: the birth year is 2026 minus age). The §72(t) additional tax applies through the year the filer reaches 59 (with birthMonth, only to the part of the year before 59½); the §63(f) aged amount and the senior deduction from the year the filer reaches 65.",
    "step": "api-validate",
    "relation": "The primary filer (the owner of iraDistributions).",
    "limits": "Whole number 0 to 120. Absent: 400 \"age is required\"."
   },
   {
    "name": "spouseAge",
    "aliases": [
     "spouse_age"
    ],
    "type": "integer",
    "required": false,
    "default": "(none: 400 on a joint return)",
    "meaning": "The spouse's age at the end of 2026, on a joint return: a spouse 65 or older adds the §63(f) married amount and their own senior deduction.",
    "step": "api-validate",
    "relation": "Joint returns only.",
    "limits": "Whole number 1 to 120. Required when filingStatus is mfj; refused on any other status."
   },
   {
    "name": "mfsLivedApart",
    "aliases": [
     "mfs_lived_apart"
    ],
    "type": "boolean",
    "required": false,
    "default": "false",
    "meaning": "true: a separate filer who lived apart from the spouse all year, so the Social Security test uses the single base amounts ($25,000 and $34,000) instead of $0 (Pub 915).",
    "step": "api-validate",
    "relation": "Separate returns only.",
    "limits": "true or false; null = absent. true on any other status: 400."
   },
   {
    "name": "iraDistributions",
    "aliases": [
     "ira_distributions"
    ],
    "type": "number",
    "required": false,
    "default": "0",
    "meaning": "Taxable distributions from traditional IRAs and employer plans (Form 1040 line 4b). The §72(t) additional tax applies to them by the filer's age.",
    "step": "irc_408d_ira_distribution",
    "relation": "Component: added to income once. Does not contain rothConversion.",
    "limits": "Finite, from 0 to $100 billion; null = absent. Otherwise 400 naming the field."
   },
   {
    "name": "rothConversion",
    "aliases": [
     "roth_conversion"
    ],
    "type": "number",
    "required": false,
    "default": "0",
    "meaning": "Amounts converted from a traditional account to a Roth IRA this year: ordinary income on line 4b, never charged the §72(t) additional tax.",
    "step": "irc_408d_ira_distribution",
    "relation": "Component: added to income once. Not part of iraDistributions.",
    "limits": "Finite, from 0 to $100 billion; null = absent. Otherwise 400 naming the field."
   },
   {
    "name": "pension",
    "aliases": [],
    "type": "number",
    "required": false,
    "default": "0",
    "meaning": "Taxable pension and annuity income (Form 1040 line 5b), including Railroad Retirement Tier 2.",
    "step": "irc_72_pension",
    "relation": "Component: added to income once.",
    "limits": "Finite, from 0 to $100 billion; null = absent. Otherwise 400 naming the field."
   },
   {
    "name": "otherOrdinaryIncome",
    "aliases": [
     "other_ordinary_income"
    ],
    "type": "number",
    "required": false,
    "default": "0",
    "meaning": "Other ordinary income that is not net investment income (Form 1040 line 8). Not interest or dividends: the engine does not model those yet, and they would change the NIIT.",
    "step": "irc_61_other_income",
    "relation": "Component: added to income once.",
    "limits": "Finite, from 0 to $100 billion; null = absent. Otherwise 400 naming the field."
   },
   {
    "name": "shortTermGains",
    "aliases": [
     "short_term_gains"
    ],
    "type": "number",
    "required": false,
    "default": "0",
    "meaning": "The year's net short-term capital gain, or loss as a negative number (Schedule D line 7).",
    "step": "irc_1222_net_short_term",
    "relation": "Component; netted against longTermGains.",
    "limits": "Finite, from -$100 billion to $100 billion; null = absent. Otherwise 400 naming the field."
   },
   {
    "name": "longTermGains",
    "aliases": [
     "long_term_gains"
    ],
    "type": "number",
    "required": false,
    "default": "0",
    "meaning": "The year's net long-term capital gain, or loss as a negative number (Schedule D line 15).",
    "step": "irc_1222_net_long_term",
    "relation": "Component; netted against shortTermGains.",
    "limits": "Finite, from -$100 billion to $100 billion; null = absent. Otherwise 400 naming the field."
   },
   {
    "name": "socialSecurityGross",
    "aliases": [
     "social_security_gross"
    ],
    "type": "number",
    "required": false,
    "default": "0",
    "meaning": "Gross Social Security benefits received (with any Railroad Retirement Tier 1), Form 1040 line 6a. The engine computes the taxable part.",
    "step": "irc_86_ss_benefits",
    "relation": "Gross benefits; the taxable part (line 6b) is computed, not sent.",
    "limits": "Finite, from 0 to $100 billion; null = absent. Otherwise 400 naming the field."
   },
   {
    "name": "taxExemptInterest",
    "aliases": [
     "tax_exempt_interest"
    ],
    "type": "number",
    "required": false,
    "default": "0",
    "meaning": "Tax-exempt interest (Form 1040 line 2a): not taxed, but counted in provisional income for Social Security.",
    "step": "irc_103_tax_exempt_interest",
    "relation": "Not added to AGI.",
    "limits": "Finite, from 0 to $100 billion; null = absent. Otherwise 400 naming the field."
   },
   {
    "name": "includeSources",
    "aliases": [
     "include_sources"
    ],
    "type": "boolean",
    "required": false,
    "default": "true",
    "meaning": "false leaves rules.sources and rules.unsourced out of the response; the result is the same.",
    "step": "api-response",
    "relation": "Not an engine input: shapes the response only.",
    "limits": "true or false; null = true. Anything else: 400."
   },
   {
    "name": "birthMonth",
    "aliases": [
     "birth_month"
    ],
    "type": "integer",
    "required": false,
    "default": "(none: the whole-year rules)",
    "meaning": "The filer's birth month (1 to 12). With it, the §72(t) additional tax applies only to the share of the year before 59½ (the month of 59½ counts as before it), the Roth 59½ test uses the same share, and the split-interest QCD 70½ test is exact. Without it the whole-year rules apply: the additional tax through the year the filer reaches 59.",
    "step": "api-extended",
    "relation": "The age clock: age is the age reached in 2026, so the birth year is 2026 minus age.",
    "limits": "Whole number 1 to 12; null = absent."
   },
   {
    "name": "blindCount",
    "aliases": [
     "blind_count"
    ],
    "type": "integer",
    "required": false,
    "default": "0",
    "meaning": "How many people on the return are blind at the end of 2026 (§63(f)(2)): the filer, and on a joint return the spouse. Each adds the §63(f) amount to the standard deduction.",
    "step": "irc_63f2_blind",
    "relation": "Joint returns only for 2.",
    "limits": "Whole number 0 to 2; 2 needs filingStatus mfj (400 otherwise)."
   },
   {
    "name": "saltIncomeOrSalesTax",
    "aliases": [
     "salt_income_or_sales_tax"
    ],
    "type": "number",
    "required": false,
    "default": "0",
    "meaning": "State and local income tax, or general sales tax instead (Schedule A line 5a).",
    "step": "irc_164a_salt_paid",
    "relation": "Schedule A amount paid in 2026.",
    "limits": "Finite, from 0 to $100 billion; null = absent. Otherwise 400 naming the field."
   },
   {
    "name": "saltRealEstateTax",
    "aliases": [
     "salt_real_estate_tax"
    ],
    "type": "number",
    "required": false,
    "default": "0",
    "meaning": "State and local real estate tax (Schedule A line 5b).",
    "step": "irc_164a_salt_paid",
    "relation": "Schedule A amount paid in 2026.",
    "limits": "Finite, from 0 to $100 billion; null = absent. Otherwise 400 naming the field."
   },
   {
    "name": "saltPersonalPropertyTax",
    "aliases": [
     "salt_personal_property_tax"
    ],
    "type": "number",
    "required": false,
    "default": "0",
    "meaning": "State and local personal property tax (Schedule A line 5c).",
    "step": "irc_164a_salt_paid",
    "relation": "Schedule A amount paid in 2026.",
    "limits": "Finite, from 0 to $100 billion; null = absent. Otherwise 400 naming the field."
   },
   {
    "name": "otherTaxes",
    "aliases": [
     "other_taxes"
    ],
    "type": "number",
    "required": false,
    "default": "0",
    "meaning": "Other deductible taxes, such as foreign income tax (Schedule A line 6); not under the SALT cap.",
    "step": "irc_63d_itemized_total",
    "relation": "Schedule A amount paid in 2026.",
    "limits": "Finite, from 0 to $100 billion; null = absent. Otherwise 400 naming the field."
   },
   {
    "name": "mortgageInterest",
    "aliases": [
     "mortgage_interest"
    ],
    "type": "number",
    "required": false,
    "default": "0",
    "meaning": "Deductible home mortgage interest and points (Schedule A lines 8a to 8c), already limited to the qualified-residence debt limit.",
    "step": "irc_163h_interest",
    "relation": "Schedule A amount paid in 2026.",
    "limits": "Finite, from 0 to $100 billion; null = absent. Otherwise 400 naming the field."
   },
   {
    "name": "investmentInterest",
    "aliases": [
     "investment_interest"
    ],
    "type": "number",
    "required": false,
    "default": "0",
    "meaning": "Deductible investment interest from Form 4952 (Schedule A line 9).",
    "step": "irc_163h_interest",
    "relation": "Schedule A amount paid in 2026.",
    "limits": "Finite, from 0 to $100 billion; null = absent. Otherwise 400 naming the field."
   },
   {
    "name": "charityCash",
    "aliases": [
     "charity_cash"
    ],
    "type": "number",
    "required": false,
    "default": "0",
    "meaning": "Cash gifts to public charities (§170(b)(1)(A) organizations), including any to donor-advised funds.",
    "step": "irc_170b_charity_limits_floor",
    "relation": "Schedule A amount paid in 2026.",
    "limits": "Finite, from 0 to $100 billion; null = absent. Otherwise 400 naming the field."
   },
   {
    "name": "charityCashDaf",
    "aliases": [
     "charity_cash_daf"
    ],
    "type": "number",
    "required": false,
    "default": "0",
    "meaning": "The part of charityCash given to a donor-advised fund or a supporting organization: deductible when itemizing, not for the non-itemizer deduction.",
    "step": "irc_170p_nonitemizer_charity",
    "relation": "Part of charityCash; cannot exceed it (400).",
    "limits": "Finite, from 0 to $100 billion; null = absent. Otherwise 400 naming the field."
   },
   {
    "name": "charityCapitalGainProperty",
    "aliases": [
     "charity_capital_gain_property"
    ],
    "type": "number",
    "required": false,
    "default": "0",
    "meaning": "Fair market value of long-term capital-gain property given to public charities (the 30% limit).",
    "step": "irc_170b_charity_limits_floor",
    "relation": "Schedule A amount paid in 2026.",
    "limits": "Finite, from 0 to $100 billion; null = absent. Otherwise 400 naming the field."
   },
   {
    "name": "medicalExpenses",
    "aliases": [
     "medical_expenses"
    ],
    "type": "number",
    "required": false,
    "default": "0",
    "meaning": "Unreimbursed medical and dental expenses (Schedule A line 1).",
    "step": "irc_213a_medical_over_7_5pct",
    "relation": "Schedule A amount paid in 2026.",
    "limits": "Finite, from 0 to $100 billion; null = absent. Otherwise 400 naming the field."
   },
   {
    "name": "otherItemized",
    "aliases": [
     "other_itemized"
    ],
    "type": "number",
    "required": false,
    "default": "0",
    "meaning": "Other itemized deductions (Schedule A line 16), with no floor or cap.",
    "step": "irc_63d_itemized_total",
    "relation": "Schedule A amount paid in 2026.",
    "limits": "Finite, from 0 to $100 billion; null = absent. Otherwise 400 naming the field."
   },
   {
    "name": "itemizeMode",
    "aliases": [
     "itemize_mode"
    ],
    "type": "string",
    "required": false,
    "default": "auto",
    "meaning": "auto takes the larger of Schedule A (after §68) and the standard deduction plus the non-itemizer charitable deduction; itemize elects Schedule A even when smaller (Schedule A line 18); standard never itemizes.",
    "step": "irc_63e_itemize_election",
    "relation": "The §63(e) election.",
    "limits": "auto, itemize or standard, any case; null = absent."
   },
   {
    "name": "mfsSpouseItemizes",
    "aliases": [
     "mfs_spouse_itemizes"
    ],
    "type": "boolean",
    "required": false,
    "default": "false",
    "meaning": "On a separate return: the spouse itemizes, so this filer's standard deduction is zero and the return itemizes (§63(c)(6)(A)).",
    "step": "irc_63e_itemize_election",
    "relation": "filingStatus mfs only (true on another status: 400).",
    "limits": "true or false; null = absent (false). Anything else: 400."
   },
   {
    "name": "employerPlanDistribution",
    "aliases": [
     "employer_plan_distribution"
    ],
    "type": "number",
    "required": false,
    "default": "0",
    "meaning": "The part of iraDistributions paid by a qualified employer plan (401(k), 403(b), governmental plan), not an IRA: the only dollars the separation-from-service exception covers.",
    "step": "irc_72t2_exceptions",
    "relation": "Part of iraDistributions; cannot exceed it (400).",
    "limits": "Finite, from 0 to $100 billion; null = absent. Otherwise 400 naming the field."
   },
   {
    "name": "separationYearAge",
    "aliases": [
     "separation_year_age"
    ],
    "type": "integer",
    "required": false,
    "default": "(none: not separated)",
    "meaning": "The age the filer reached in the year they left the employer that maintains the plan. At 55 or more (50 for a public safety employee) employerPlanDistribution is excepted from the §72(t) additional tax.",
    "step": "irc_72t2_exceptions",
    "relation": "At most age (400 otherwise).",
    "limits": "Whole number 1 to 120; null = absent."
   },
   {
    "name": "publicSafetyEmployee",
    "aliases": [
     "public_safety_employee"
    ],
    "type": "boolean",
    "required": false,
    "default": "false",
    "meaning": "A qualified public safety employee (§72(t)(10)): the separation age is 50.",
    "step": "irc_72t2_exceptions",
    "relation": "Read with separationYearAge.",
    "limits": "true or false; null = absent (false). Anything else: 400."
   },
   {
    "name": "seppDistribution",
    "aliases": [
     "sepp_distribution"
    ],
    "type": "number",
    "required": false,
    "default": "0",
    "meaning": "The part of iraDistributions that is an installment of substantially equal periodic payments (§72(t)(2)(A)(iv)); its taxable part is excepted. The engine does not compute the payment schedule.",
    "step": "irc_72t2_exceptions",
    "relation": "Part of iraDistributions; cannot exceed it (400).",
    "limits": "Finite, from 0 to $100 billion; null = absent. Otherwise 400 naming the field."
   },
   {
    "name": "disabled",
    "aliases": [],
    "type": "boolean",
    "required": false,
    "default": "false",
    "meaning": "The filer is disabled (§72(m)(7)): no §72(t) additional tax, and a Roth distribution can be qualified before 59½.",
    "step": "irc_72t2_exceptions",
    "relation": "The primary filer.",
    "limits": "true or false; null = absent (false). Anything else: 400."
   },
   {
    "name": "iraBasis",
    "aliases": [
     "ira_basis"
    ],
    "type": "number",
    "required": false,
    "default": "0",
    "meaning": "Total nondeductible basis in traditional IRAs (Form 8606 line 5: prior-year basis plus this year's nondeductible contributions).",
    "step": "irc_408d2_conversion_nontaxable",
    "relation": "Read with iraYearEndValue.",
    "limits": "Finite, from 0 to $100 billion; null = absent. Otherwise 400 naming the field."
   },
   {
    "name": "iraYearEndValue",
    "aliases": [
     "ira_year_end_value"
    ],
    "type": "number",
    "required": false,
    "default": "0",
    "meaning": "The value of all traditional, SEP and SIMPLE IRAs on December 31, 2026, plus outstanding rollovers (Form 8606 line 6).",
    "step": "irc_408d2_conversion_nontaxable",
    "relation": "Read with iraBasis.",
    "limits": "Finite, from 0 to $100 billion; null = absent. Otherwise 400 naming the field."
   },
   {
    "name": "rothDistribution",
    "aliases": [
     "roth_distribution"
    ],
    "type": "number",
    "required": false,
    "default": "0",
    "meaning": "Gross Roth IRA distributions in 2026.",
    "step": "irc_408a_d4_roth_taxable",
    "relation": "Not part of iraDistributions.",
    "limits": "Finite, from 0 to $100 billion; null = absent. Otherwise 400 naming the field."
   },
   {
    "name": "rothContributions",
    "aliases": [
     "roth_contributions"
    ],
    "type": "number",
    "required": false,
    "default": "0",
    "meaning": "Regular Roth contributions still in the Roth at the start of 2026 (distributed first).",
    "step": "irc_408a_d4_roth_taxable",
    "relation": "Read with rothDistribution.",
    "limits": "Finite, from 0 to $100 billion; null = absent. Otherwise 400 naming the field."
   },
   {
    "name": "rothFirstContributionYear",
    "aliases": [
     "roth_first_contribution_year"
    ],
    "type": "integer",
    "required": false,
    "default": "(none: the 5-year clock is taken as not met)",
    "meaning": "The first tax year a contribution was made to any Roth IRA for the filer (the qualified-distribution 5-year clock).",
    "step": "irc_408a_d4_roth_taxable",
    "relation": "Read with rothDistribution.",
    "limits": "Whole number 1998 to 2026; null = absent."
   },
   {
    "name": "rothConversions",
    "aliases": [
     "roth_conversions"
    ],
    "type": "array",
    "required": false,
    "default": "[] (none)",
    "meaning": "The conversions still in the Roth at the start of 2026: [{year, taxable, nontaxable}], any order. They come out oldest first, each one's taxable part first; a taxable part taken within 5 years of its conversion carries the §72(t) additional tax under 59½.",
    "step": "irc_408a_d4_roth_taxable",
    "relation": "Read with rothDistribution.",
    "limits": "At most 16 objects: year a whole number 1998 to 2026, taxable and nontaxable dollars 0 to $100 billion (nontaxable may be left out); no other key. Otherwise 400."
   },
   {
    "name": "iraBalancePriorYearEnd",
    "aliases": [
     "ira_balance_prior_year_end"
    ],
    "type": "number",
    "required": false,
    "default": "0",
    "meaning": "The traditional IRA balance on December 31, 2025: with it the response carries the 2026 required minimum distribution (schedules.rmd).",
    "step": "reg_401a9_rmd_required",
    "relation": "The account owner is the filer (age, birth year 2026 minus age).",
    "limits": "Finite, from 0 to $100 billion; null = absent. Otherwise 400 naming the field."
   },
   {
    "name": "spouseSoleBeneficiary",
    "aliases": [
     "spouse_sole_beneficiary"
    ],
    "type": "boolean",
    "required": false,
    "default": "false",
    "meaning": "The spouse is the sole beneficiary all year: when more than 10 years younger, the RMD uses the Joint and Last Survivor Table.",
    "step": "reg_401a9_rmd_divisor",
    "relation": "Needs iraBalancePriorYearEnd; the spouse's age is spouseAge on a joint return, else beneficiarySpouseAge. Refused for a qualifying surviving spouse.",
    "limits": "true or false; null = absent (false). Anything else: 400."
   },
   {
    "name": "beneficiarySpouseAge",
    "aliases": [
     "beneficiary_spouse_age"
    ],
    "type": "integer",
    "required": false,
    "default": "(none)",
    "meaning": "The spouse's age reached in 2026 when the spouse is not on the return (a separate return).",
    "step": "reg_401a9_rmd_divisor",
    "relation": "Needs spouseSoleBeneficiary true; refused on a joint return (spouseAge is used).",
    "limits": "Whole number 0 to 120; null = absent."
   },
   {
    "name": "rmdShortfall",
    "aliases": [
     "rmd_shortfall"
    ],
    "type": "number",
    "required": false,
    "default": "0",
    "meaning": "The part of a required minimum distribution not taken: the §4974 excise, 25%.",
    "step": "irc_4974_missed_rmd_excise",
    "relation": "Form 5329 Part IX.",
    "limits": "Finite, from 0 to $100 billion; null = absent. Otherwise 400 naming the field."
   },
   {
    "name": "rmdShortfallCorrected",
    "aliases": [
     "rmd_shortfall_corrected"
    ],
    "type": "boolean",
    "required": false,
    "default": "false",
    "meaning": "The shortfall was distributed within the correction window: the excise is 10%.",
    "step": "irc_4974_missed_rmd_excise",
    "relation": "Read with rmdShortfall.",
    "limits": "true or false; null = absent (false). Anything else: 400."
   },
   {
    "name": "priorYearTax",
    "aliases": [
     "prior_year_tax"
    ],
    "type": "number",
    "required": false,
    "default": "0",
    "meaning": "The tax on the 2025 return (Form 2210 line 8). With it the response carries Form 2210 (schedules.form2210) on this return's tax.",
    "step": "irc_6654d_required_annual_payment",
    "relation": "Turns on Form 2210.",
    "limits": "Finite, from 0 to $100 billion; null = absent. Otherwise 400 naming the field."
   },
   {
    "name": "priorYearAgi",
    "aliases": [
     "prior_year_agi"
    ],
    "type": "number",
    "required": false,
    "default": "0",
    "meaning": "The 2025 AGI: above $150,000 ($75,000 on a separate return) the prior-year safe harbor is 110%.",
    "step": "irc_6654d_required_annual_payment",
    "relation": "Needs priorYearTax.",
    "limits": "Finite, from 0 to $100 billion; null = absent. Otherwise 400 naming the field."
   },
   {
    "name": "priorYearFullYearReturn",
    "aliases": [
     "prior_year_full_year_return"
    ],
    "type": "boolean",
    "required": false,
    "default": "true",
    "meaning": "false when 2025 was not a full 12-month year with a return filed: the prior-year safe harbor and the no-liability rule do not apply.",
    "step": "irc_6654d_required_annual_payment",
    "relation": "Needs priorYearTax.",
    "limits": "true or false; null = absent (true). Anything else: 400."
   },
   {
    "name": "withholding",
    "aliases": [],
    "type": "number",
    "required": false,
    "default": "0",
    "meaning": "Income tax withheld in 2026: counted as paid in four equal parts on the due dates.",
    "step": "irc_6654_underpayment",
    "relation": "Needs priorYearTax.",
    "limits": "Finite, from 0 to $100 billion; null = absent. Otherwise 400 naming the field."
   },
   {
    "name": "estimatedPayments",
    "aliases": [
     "estimated_payments"
    ],
    "type": "array",
    "required": false,
    "default": "[0, 0, 0, 0]",
    "meaning": "The four 2026 estimated tax payments, in installment order.",
    "step": "irc_6654_underpayment",
    "relation": "Needs priorYearTax.",
    "limits": "Up to 4 amounts, dollars 0 to $100 billion. Otherwise 400."
   },
   {
    "name": "estimatedPaymentDates",
    "aliases": [
     "estimated_payment_dates"
    ],
    "type": "array",
    "required": false,
    "default": "each installment's due date",
    "meaning": "The date each estimated payment was made; null for one paid on its due date. Accrual stops at the earlier of the payment date and April 15, 2027.",
    "step": "irc_6654_penalty",
    "relation": "Needs priorYearTax.",
    "limits": "Up to 4 dates YYYY-MM-DD from 2026-01-01 to 2028-12-31, or null. Otherwise 400."
   }
  ],
  "response_fields": [
   {
    "path": "engineVersion",
    "type": "string",
    "meaning": "The federal engine version (FEDERAL_TAX_ENGINE_VERSION)."
   },
   {
    "path": "taxYear",
    "type": "integer",
    "meaning": "2026."
   },
   {
    "path": "filingStatus",
    "type": "string",
    "meaning": "single, mfj, mfs, hoh or qss: the status the return was computed on."
   },
   {
    "path": "inputs",
    "type": "object",
    "meaning": "Every field that was sent, under its camelCase name."
   },
   {
    "path": "result",
    "type": "object",
    "meaning": "The year's return."
   },
   {
    "path": "result.shortTermGain",
    "type": "number",
    "meaning": "Short-term gain after netting, at least 0 (taxed as ordinary income)."
   },
   {
    "path": "result.longTermGain",
    "type": "number",
    "meaning": "Long-term gain after netting, at least 0."
   },
   {
    "path": "result.socialSecurityTaxable",
    "type": "number",
    "meaning": "The taxable part of the benefits (line 6b)."
   },
   {
    "path": "result.grossOrdinaryIncome",
    "type": "number",
    "meaning": "Ordinary income: IRA distributions, conversions, pension, other income, taxable Social Security and the short-term gain."
   },
   {
    "path": "result.agi",
    "type": "number",
    "meaning": "Adjusted gross income (line 11a); also the NIIT's and the senior deduction's MAGI."
   },
   {
    "path": "result.magiIrmaa",
    "type": "number",
    "meaning": "AGI plus tax-exempt interest: the income the engine's Medicare IRMAA tiers read."
   },
   {
    "path": "result.standardDeduction",
    "type": "number",
    "meaning": "The standard deduction with the §63(f) aged amounts (line 12e)."
   },
   {
    "path": "result.seniorDeduction",
    "type": "number",
    "meaning": "The senior deduction after its phase-out (line 13b)."
   },
   {
    "path": "result.taxableOrdinaryIncome",
    "type": "number",
    "meaning": "The ordinary part of taxable income."
   },
   {
    "path": "result.unusedDeduction",
    "type": "number",
    "meaning": "Deductions left after ordinary income, which reduce the long-term gain in the worksheet."
   },
   {
    "path": "result.taxableLongTermGain",
    "type": "number",
    "meaning": "The long-term gain in taxable income (the worksheet's base)."
   },
   {
    "path": "result.ordinaryTax",
    "type": "number",
    "meaning": "Bracket tax on the ordinary part."
   },
   {
    "path": "result.capitalGainsTax",
    "type": "number",
    "meaning": "Worksheet tax on the long-term gain plus the NIIT."
   },
   {
    "path": "result.niit",
    "type": "number",
    "meaning": "The net investment income tax (Schedule 2 line 12)."
   },
   {
    "path": "result.incomeTax",
    "type": "number",
    "meaning": "ordinaryTax + capitalGainsTax: income tax with the NIIT, without the §72(t) additional tax."
   },
   {
    "path": "result.incomeTaxExcludingNiit",
    "type": "number",
    "meaning": "incomeTax less the NIIT: line 16 (and, with no credits modelled, line 22)."
   },
   {
    "path": "result.earlyWithdrawalTax",
    "type": "number",
    "meaning": "The §72(t) additional tax (Schedule 2 line 8)."
   },
   {
    "path": "result.totalTax",
    "type": "number",
    "meaning": "incomeTax + earlyWithdrawalTax: line 24. With extended fields it also carries the missed-RMD excise (Form 5329 line 55)."
   },
   {
    "path": "lines",
    "type": "array",
    "meaning": "One entry per Form 1040 or schedule line the composition fills, in form order."
   },
   {
    "path": "lines[].line",
    "type": "string",
    "meaning": "The line id: 1040.<n>, 1040sd.<n> (Schedule D), 1040s1a.<n> (Schedule 1-A), 1040s2.<n> (Schedule 2); TY2025 form numbering."
   },
   {
    "path": "lines[].form",
    "type": "string",
    "meaning": "The form or schedule."
   },
   {
    "path": "lines[].lineNumber",
    "type": "string",
    "meaning": "The line number on it."
   },
   {
    "path": "lines[].label",
    "type": "string",
    "meaning": "The line's name."
   },
   {
    "path": "lines[].rule",
    "type": "string",
    "meaning": "The calculation step that produced the value (a section of the calculation-order page)."
   },
   {
    "path": "lines[].value",
    "type": "number",
    "meaning": "The amount."
   },
   {
    "path": "lines[].docs",
    "type": "string",
    "meaning": "The step's documentation."
   },
   {
    "path": "rules",
    "type": "object",
    "meaning": "What the figure rests on."
   },
   {
    "path": "rules.docs",
    "type": "string",
    "meaning": "The engine documentation."
   },
   {
    "path": "rules.sources",
    "type": "object",
    "meaning": "Per calculation step on the return: its official sources (absent with includeSources: false)."
   },
   {
    "path": "rules.sources[].rule",
    "type": "string",
    "meaning": "The provenance record (research/data/federal-tax-provenance.json)."
   },
   {
    "path": "rules.sources[].url",
    "type": "string",
    "meaning": "The source."
   },
   {
    "path": "rules.sources[].title",
    "type": "string",
    "meaning": "Its title."
   },
   {
    "path": "rules.sources[].publisher",
    "type": "string",
    "meaning": "Its publisher."
   },
   {
    "path": "rules.sources[].kind",
    "type": "string",
    "meaning": "statute, guidance, instructions, agency_page, ..."
   },
   {
    "path": "rules.sources[].official",
    "type": "boolean",
    "meaning": "Published by the body that sets the rule, or the text of the law."
   },
   {
    "path": "rules.sources[].quote",
    "type": "string",
    "meaning": "The first passage checked on the source."
   },
   {
    "path": "rules.sources[].checked",
    "type": "string",
    "meaning": "The date the quote was last found on the source."
   },
   {
    "path": "rules.unsourced",
    "type": "array",
    "meaning": "Steps on the return with no official source, with the reason (absent with includeSources: false)."
   },
   {
    "path": "rules.unsourced[].rule",
    "type": "string",
    "meaning": "The step."
   },
   {
    "path": "rules.unsourced[].reason",
    "type": "string",
    "meaning": "Why."
   },
   {
    "path": "rules.notModeled",
    "type": "array",
    "items": "string",
    "meaning": "What the engine does not compute."
   },
   {
    "path": "schedules",
    "type": "object",
    "meaning": "On a request with any extended field (or filingStatus qss): the forms behind the return."
   },
   {
    "path": "schedules.scheduleA",
    "type": "object",
    "meaning": "Schedule A, the §68 limitation, the standard deduction and the non-itemizer charitable deduction."
   },
   {
    "path": "schedules.scheduleA.itemizes",
    "type": "boolean",
    "meaning": "true when line 12e carries Schedule A."
   },
   {
    "path": "schedules.scheduleA.deduction",
    "type": "number",
    "meaning": "Form 1040 line 12e as filed (equals result.standardDeduction)."
   },
   {
    "path": "schedules.scheduleA.standardDeduction",
    "type": "number",
    "meaning": "The standard deduction available, with the §63(f) aged and blind amounts (0 under §63(c)(6)(A))."
   },
   {
    "path": "schedules.scheduleA.blindAddition",
    "type": "number",
    "meaning": "The §63(f)(2) amount for blindness included in it."
   },
   {
    "path": "schedules.scheduleA.itemizedBeforeSection68",
    "type": "number",
    "meaning": "Schedule A lines 4 to 16 before §68."
   },
   {
    "path": "schedules.scheduleA.section68Reduction",
    "type": "number",
    "meaning": "The 2/37 limitation of §68."
   },
   {
    "path": "schedules.scheduleA.itemized",
    "type": "number",
    "meaning": "Schedule A line 17 after §68: the figure an itemized-conformity state reads."
   },
   {
    "path": "schedules.scheduleA.medicalDeducted",
    "type": "number",
    "meaning": "Line 4."
   },
   {
    "path": "schedules.scheduleA.saltPaid",
    "type": "number",
    "meaning": "Line 5d."
   },
   {
    "path": "schedules.scheduleA.saltCap",
    "type": "number",
    "meaning": "The SALT cap after the phase-down (half on a separate return)."
   },
   {
    "path": "schedules.scheduleA.saltDeducted",
    "type": "number",
    "meaning": "Line 5e."
   },
   {
    "path": "schedules.scheduleA.interestDeducted",
    "type": "number",
    "meaning": "Line 10."
   },
   {
    "path": "schedules.scheduleA.charityFloor",
    "type": "number",
    "meaning": "0.5% of AGI (2026)."
   },
   {
    "path": "schedules.scheduleA.charityDeducted",
    "type": "number",
    "meaning": "Line 14 after the percentage limits and the floor."
   },
   {
    "path": "schedules.scheduleA.nonitemizerCharity",
    "type": "number",
    "meaning": "The §170(p) deduction (0 when itemizing)."
   },
   {
    "path": "schedules.form8606",
    "type": "object",
    "meaning": "IRA basis and Roth distributions."
   },
   {
    "path": "schedules.form8606.basisRatio",
    "type": "number",
    "meaning": "Line 10 (0 without basis)."
   },
   {
    "path": "schedules.form8606.nontaxableConversion",
    "type": "number",
    "meaning": "Line 11."
   },
   {
    "path": "schedules.form8606.nontaxableTotal",
    "type": "number",
    "meaning": "Line 13."
   },
   {
    "path": "schedules.form8606.basisRemaining",
    "type": "number",
    "meaning": "Line 14."
   },
   {
    "path": "schedules.form8606.rothQualified",
    "type": "boolean",
    "meaning": "true when the Roth distribution is qualified."
   },
   {
    "path": "schedules.form8606.rothTaxableEarnings",
    "type": "number",
    "meaning": "Line 25c: taxable Roth earnings."
   },
   {
    "path": "schedules.form8606.rothConversionsWithinFiveYears",
    "type": "number",
    "meaning": "Converted amounts taken within 5 years of their conversion (subject to the additional tax, not taxable)."
   },
   {
    "path": "schedules.form8606.rothContributionsRemaining",
    "type": "number",
    "meaning": "Regular contributions left in the Roth."
   },
   {
    "path": "schedules.form5329",
    "type": "object",
    "meaning": "The additional taxes on retirement accounts."
   },
   {
    "path": "schedules.form5329.earlyDistributions",
    "type": "number",
    "meaning": "Line 1."
   },
   {
    "path": "schedules.form5329.exceptions",
    "type": "number",
    "meaning": "Line 2."
   },
   {
    "path": "schedules.form5329.missedRmdExcise",
    "type": "number",
    "meaning": "Line 55: the §4974 excise (in result.totalTax)."
   },
   {
    "path": "schedules.rmd",
    "type": "object",
    "meaning": "With iraBalancePriorYearEnd: the 2026 required minimum distribution."
   },
   {
    "path": "schedules.rmd.startAge",
    "type": "integer",
    "meaning": "The SECURE 2.0 applicable age for the birth year."
   },
   {
    "path": "schedules.rmd.divisor",
    "type": "number",
    "meaning": "The divisor (0 before the start age)."
   },
   {
    "path": "schedules.rmd.jointLifeTable",
    "type": "boolean",
    "meaning": "true when the Joint and Last Survivor Table applies."
   },
   {
    "path": "schedules.rmd.required",
    "type": "number",
    "meaning": "The required minimum distribution."
   },
   {
    "path": "schedules.form2210",
    "type": "object",
    "meaning": "With priorYearTax: Form 2210 (regular method) on this return's tax."
   },
   {
    "path": "schedules.form2210.tax",
    "type": "number",
    "meaning": "The tax Form 2210 uses: income tax plus the additional tax on distributions."
   },
   {
    "path": "schedules.form2210.requiredAnnualPayment",
    "type": "number",
    "meaning": "Line 9."
   },
   {
    "path": "schedules.form2210.requiredInstallment",
    "type": "number",
    "meaning": "Line 10, each installment."
   },
   {
    "path": "schedules.form2210.priorYearSafeHarbor",
    "type": "boolean",
    "meaning": "true when the prior-year harbor sets the requirement."
   },
   {
    "path": "schedules.form2210.underThousandDollars",
    "type": "boolean",
    "meaning": "true when the tax less withholding is under the §6654(e)(1) threshold: no penalty."
   },
   {
    "path": "schedules.form2210.noPriorYearLiability",
    "type": "boolean",
    "meaning": "true when last year's full-year return showed no tax: no penalty."
   },
   {
    "path": "schedules.form2210.underpayment",
    "type": "array",
    "meaning": "Line 17 per installment.",
    "items": "number"
   },
   {
    "path": "schedules.form2210.penaltyByInstallment",
    "type": "array",
    "meaning": "The penalty attributable to each installment.",
    "items": "number"
   },
   {
    "path": "schedules.form2210.totalUnderpayment",
    "type": "number",
    "meaning": "The sum of line 17."
   },
   {
    "path": "schedules.form2210.penalty",
    "type": "number",
    "meaning": "Line 19."
   },
   {
    "path": "schedules.form2210.usesUnannouncedRate",
    "type": "boolean",
    "meaning": "true when some accrual falls in a quarter whose rate is carried forward, not announced."
   }
  ],
  "errors": [
   {
    "template": "Invalid JSON body",
    "when": "The body is not JSON (or is empty)."
   },
   {
    "template": "The request body must be a JSON object",
    "when": "The body is JSON but not an object."
   },
   {
    "template": "{1} is not a field of the federal tax API: the engine models only the fields listed at https://quantcalc.app/docs/federal-tax/api/ (income it does not model must not be sent as if it were counted)",
    "when": "A key that is not a request field. {1} = the key, as sent."
   },
   {
    "template": "{1} is given more than once (as two spellings or two cases of the key)",
    "when": "Two keys name the same field (camelCase and snake_case, or two cases)."
   },
   {
    "template": "{1} must be a string, one of: {2}",
    "when": "filingStatus is not a string."
   },
   {
    "template": "{1} \"{2}\" is not recognised — use one of: {3}",
    "when": "filingStatus is not one of the accepted values."
   },
   {
    "template": "{1} must be a number (annual dollars)",
    "when": "An amount is not a number."
   },
   {
    "template": "{1} must be a whole number between {2} and {3}",
    "when": "age or spouseAge is not a whole number in range."
   },
   {
    "template": "{1} must be true or false",
    "when": "mfsLivedApart or includeSources is not a boolean."
   },
   {
    "template": "{1} is required ({2})",
    "when": "A required field is absent or null. Only age is required: {2} says why (the filer's age at the end of the year decides the §72(t) additional tax, the §63(f) aged amount and the senior deduction)."
   },
   {
    "template": "{1} must be a finite number",
    "when": "An amount is not finite (a number too large for a double)."
   },
   {
    "template": "{1} cannot be negative",
    "when": "An amount other than the gains is below 0."
   },
   {
    "template": "{1} is below the engine's range (-$100 billion)",
    "when": "A gain is below -$100 billion."
   },
   {
    "template": "{1} is larger than the engine accepts ($100 billion)",
    "when": "An amount is above $100 billion."
   },
   {
    "template": "spouseAge applies only to filingStatus mfj (the spouse's §63(f) aged amount and senior deduction are claimed on a joint return)",
    "when": "spouseAge on a status other than mfj."
   },
   {
    "template": "spouseAge is required when filingStatus is mfj (the spouse's age at the end of the year decides their §63(f) aged amount and senior deduction)",
    "when": "A joint return without spouseAge."
   },
   {
    "template": "mfsLivedApart applies only to filingStatus mfs (Pub 915: a separate filer who lived apart from their spouse all year)",
    "when": "mfsLivedApart: true on a status other than mfs."
   },
   {
    "template": "{1} must be an array of at most {2} objects {year, taxable, nontaxable}: year a whole number {3} to {4}, the amounts dollars 0 or more (nontaxable may be left out)",
    "when": "rothConversions is not a list of conversions."
   },
   {
    "template": "{1} must be an array of up to 4 amounts (dollars, 0 or more), one per installment",
    "when": "estimatedPayments is not a list of up to 4 amounts."
   },
   {
    "template": "{1} must be an array of up to 4 dates \"YYYY-MM-DD\" from 2026-01-01 to 2028-12-31 (null = paid on the installment's due date)",
    "when": "estimatedPaymentDates holds something that is not such a date."
   },
   {
    "template": "blindCount 2 needs filingStatus mfj (a spouse's §63(f) amount for blindness is claimed on a joint return)",
    "when": "blindCount 2 on another status."
   },
   {
    "template": "mfsSpouseItemizes applies only to filingStatus mfs (§63(c)(6)(A): a separate filer whose spouse itemizes has no standard deduction)",
    "when": "mfsSpouseItemizes true on another status."
   },
   {
    "template": "{1} is part of iraDistributions and cannot exceed it",
    "when": "employerPlanDistribution or seppDistribution above iraDistributions."
   },
   {
    "template": "charityCashDaf is part of charityCash and cannot exceed it",
    "when": "charityCashDaf above charityCash."
   },
   {
    "template": "separationYearAge cannot exceed age (it is the age reached in the year the filer left the employer)",
    "when": "separationYearAge above age."
   },
   {
    "template": "beneficiarySpouseAge needs spouseSoleBeneficiary true (it only picks the RMD table)",
    "when": "beneficiarySpouseAge without spouseSoleBeneficiary."
   },
   {
    "template": "spouseSoleBeneficiary needs iraBalancePriorYearEnd (it picks the table the RMD is figured with)",
    "when": "spouseSoleBeneficiary without a balance."
   },
   {
    "template": "spouseSoleBeneficiary cannot apply to a qualifying surviving spouse (there is no spouse)",
    "when": "spouseSoleBeneficiary with filingStatus qss."
   },
   {
    "template": "beneficiarySpouseAge is for a spouse who is not on the return: on a joint return the RMD reads spouseAge",
    "when": "beneficiarySpouseAge on a joint return."
   },
   {
    "template": "spouseSoleBeneficiary needs beneficiarySpouseAge (the spouse's age reached in 2026) unless filingStatus is mfj",
    "when": "spouseSoleBeneficiary on a non-joint return without beneficiarySpouseAge."
   },
   {
    "template": "{1} needs priorYearTax (Form 2210 runs only with last year's tax)",
    "when": "A Form 2210 field without priorYearTax."
   }
  ],
  "examples": [
   {
    "id": "retired-couple",
    "endpoint": "federal",
    "title": "A retired couple, both 65 or older",
    "why": "A joint return: IRA distributions, a pension, Social Security and a long-term gain. Both spouses are 65 or older at the end of the year, so the standard deduction carries two §63(f) amounts and each spouse has a senior deduction; the gain falls in the 0% band.",
    "request": {
     "filingStatus": "mfj",
     "age": 67,
     "spouseAge": 65,
     "iraDistributions": 60000,
     "pension": 10000,
     "socialSecurityGross": 40000,
     "longTermGains": 20000
    }
   },
   {
    "id": "early-retiree",
    "endpoint": "federal",
    "title": "An early retiree with a conversion",
    "why": "Age 55 at the end of the year: the §72(t) additional tax applies to the IRA distribution and not to the Roth conversion. Short-term gains are taxed as ordinary income.",
    "request": {
     "age": 55,
     "iraDistributions": 40000,
     "rothConversion": 30000,
     "shortTermGains": 5000,
     "longTermGains": 25000
    }
   },
   {
    "id": "high-income-senior",
    "endpoint": "federal",
    "title": "A high-income single retiree",
    "why": "MAGI far above the phase-out threshold removes the senior deduction entirely. With MAGI above the net investment income tax threshold, the gain owes 3.8% on the smaller of the gain and the MAGI above the threshold. Tax-exempt interest counts in provisional income (the benefits are 85% taxable either way here) and in the IRMAA MAGI, but not in AGI.",
    "request": {
     "age": 70,
     "iraDistributions": 150000,
     "socialSecurityGross": 45000,
     "longTermGains": 120000,
     "taxExemptInterest": 8000
    }
   },
   {
    "id": "loss-year",
    "endpoint": "federal",
    "title": "A year with a net capital loss",
    "why": "An $8,000 short-term loss and a $2,000 long-term gain net to a $6,000 loss (Schedule D line 16). The engine enters 0 on line 7a: it does not yet deduct $3,000 of the loss against other income or carry the rest forward, so this return's tax is higher than the one the IRS would compute.",
    "request": {
     "age": 66,
     "iraDistributions": 30000,
     "socialSecurityGross": 20000,
     "shortTermGains": -8000,
     "longTermGains": 2000
    }
   },
   {
    "id": "itemizing-couple",
    "endpoint": "federal",
    "title": "A couple who itemize, with the SALT phase-down and §68",
    "why": "A joint return with $620,000 of AGI: the SALT cap of $40,400 is phased down by 30% of the MAGI over $505,000 and stops at the $10,000 floor, the cash gift loses 0.5% of AGI to the floor, and §68 takes nothing because taxable income stays below the 37% bracket. Schedule A beats the standard deduction, so the return itemizes (schedules.scheduleA).",
    "request": {
     "filingStatus": "mfj",
     "age": 62,
     "spouseAge": 60,
     "iraDistributions": 120000,
     "otherOrdinaryIncome": 500000,
     "saltIncomeOrSalesTax": 38000,
     "saltRealEstateTax": 14000,
     "mortgageInterest": 22000,
     "charityCash": 25000,
     "medicalExpenses": 3000
    }
   },
   {
    "id": "rule-of-55",
    "endpoint": "federal",
    "title": "Retiring at 56: the rule of 55, IRA basis and a Roth withdrawal",
    "why": "The filer reached 55 in the year they left their employer, so the 401(k) part of the withdrawal has no §72(t) additional tax; the IRA part does, after Form 8606 takes out its share of the nondeductible basis. A Roth withdrawal beyond the contributions reaches a 2023 conversion inside its 5 years.",
    "request": {
     "age": 56,
     "birthMonth": 4,
     "iraDistributions": 60000,
     "employerPlanDistribution": 40000,
     "separationYearAge": 55,
     "iraBasis": 30000,
     "iraYearEndValue": 250000,
     "rothDistribution": 30000,
     "rothContributions": 20000,
     "rothFirstContributionYear": 2012,
     "rothConversions": [
      {
       "year": 2023,
       "taxable": 15000
      }
     ]
    }
   },
   {
    "id": "widow-rmd-2210",
    "endpoint": "federal",
    "title": "A qualifying surviving spouse with an RMD, a missed RMD and Form 2210",
    "why": "filingStatus qss: the joint brackets and standard deduction with the single Social Security base amounts and senior-deduction threshold. The 2026 RMD comes from the Uniform Lifetime Table; last year's shortfall, corrected, costs 10%; estimated payments made late run Form 2210.",
    "request": {
     "filingStatus": "qss",
     "age": 76,
     "iraDistributions": 45000,
     "socialSecurityGross": 36000,
     "blindCount": 1,
     "iraBalancePriorYearEnd": 900000,
     "rmdShortfall": 8000,
     "rmdShortfallCorrected": true,
     "priorYearTax": 9000,
     "withholding": 2000,
     "estimatedPayments": [
      1750,
      1750,
      1750,
      1750
     ],
     "estimatedPaymentDates": [
      null,
      "2026-07-31",
      null,
      null
     ]
    }
   },
   {
    "id": "state-compute-federal",
    "endpoint": "state",
    "title": "The state API with computeFederal (Colorado)",
    "why": "POST /api/state-tax with computeFederal: true. Colorado's return starts from federal taxable income, which the federal engine supplies (federal.toState); the response carries the whole federal return under federal.",
    "request": {
     "state": "CO",
     "filingStatus": "mfj",
     "age": 67,
     "iraDistributions": 90000,
     "socialSecurityGross": 40000,
     "spouse": {
      "age": 66
     },
     "computeFederal": true
    }
   }
  ]
 }
}
