docs/design/retirement_simulator_v2.md
planning::retirement.RetirementPlanRetirementFundingRuleExpenseBucketIncomeStreamTaxProfileWithdrawalPolicymonthly_expenses_at_fire field plus one healthcare override with
expense buckets.livinghealthcarehousingdiscretionarymonthly_expenses_at_fire -> livinghealthcare_monthly_at_fire -> healthcarehealthcare_inflation_rate -> healthcare bucket inflation overrideaccount_idfunding_role = residual_eligiblecountable_percenttax_bucket_override optionalnotes optionalcountable_percent = 100TaxProfile fields:
modetaxable_withdrawal_ratetax_deferred_withdrawal_ratetax_free_withdrawal_rateearly_withdrawal_penalty_rateearly_withdrawal_penalty_agetaxabletax_deferredtax_freeunknownconstant_realguardrailsconstant_percentage as exploratory onlyguardrailsconstant_percentage may remain available in scenarios, but must be labeled
as variable-spending modecountable %crates/core/src/planning/retirement/ as the new home for the
engine.portfolio::fire module as legacy math to be migrated, not
extended indefinitely.planning::retirement::modelplanning::retirement::fundingplanning::retirement::taxplanning::retirement::withdrawalplanning::retirement::engineplanning::retirement::analysisplanning::retirement::dtomonthlyExpensesAtFire -> living buckethealthcareMonthlyAtFire -> healthcare buckethealthcareInflationRate -> bucket inflation overridewithdrawalStrategy -> withdrawalPolicycountable_percent defaults to 100portfolio_now and spendable_portfolio_now as explicit retirement
overview fields.portfolio_at_retirement_start.fi_agefunded_at_goal_ageeventually_reaches_fiannual_taxeslifetime_tax_estimate optionalportfolio_at_retirement_start to retirement overview DTO.funded_at_goal_age from "eventually reaches FI".portfolioNow instead of household
totalValue where retirement scope matters.RetirementPlanV2 data structures in core.countable_percent.FireSettings.countable_percent behavior.countable_percent should never reduce funded capital.planning::retirement.