@retiregolden/planner-ui 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/README.md +181 -0
- package/package.json +77 -0
- package/src/App.tsx +246 -0
- package/src/RouteErrorBoundary.tsx +45 -0
- package/src/assets/hero.png +0 -0
- package/src/assets/react.svg +1 -0
- package/src/assets/vite.svg +1 -0
- package/src/data/fedInvestClient.ts +113 -0
- package/src/data/localStore.ts +42 -0
- package/src/data/planOrigin.ts +24 -0
- package/src/data/planStore.ts +165 -0
- package/src/data/v2Backup.ts +101 -0
- package/src/import/ImportPage.tsx +347 -0
- package/src/import/ReviewChecklistView.tsx +38 -0
- package/src/import/brokerCsv.ts +395 -0
- package/src/import/csv.ts +133 -0
- package/src/import/genericCsv.ts +224 -0
- package/src/import/projectionLab.ts +350 -0
- package/src/import/reviewChecklist.ts +33 -0
- package/src/import/tenForty.ts +275 -0
- package/src/index.css +630 -0
- package/src/index.ts +16 -0
- package/src/learn/ArticleBody.tsx +78 -0
- package/src/learn/ArticlePage.tsx +57 -0
- package/src/learn/GlossaryPage.tsx +33 -0
- package/src/learn/LearnAboutScreen.tsx +41 -0
- package/src/learn/LearnCards.tsx +41 -0
- package/src/learn/LearnLink.tsx +91 -0
- package/src/learn/LearningCenterPage.tsx +114 -0
- package/src/learn/SourcesPage.tsx +98 -0
- package/src/learn/components/ArticleFigure.tsx +34 -0
- package/src/learn/components/ArticleShell.tsx +86 -0
- package/src/learn/components/ComparisonTable.tsx +42 -0
- package/src/learn/components/FormulaBlock.tsx +34 -0
- package/src/learn/components/PurchasingPowerChart.tsx +41 -0
- package/src/learn/components/RelatedArticles.tsx +27 -0
- package/src/learn/components/ScenarioCard.tsx +24 -0
- package/src/learn/components/SourceList.tsx +23 -0
- package/src/learn/components/charts.tsx +21 -0
- package/src/learn/content/about-retiregolden.ts +100 -0
- package/src/learn/content/aca-premium-tax-credits-and-magi.ts +103 -0
- package/src/learn/content/account-types-overview.ts +106 -0
- package/src/learn/content/after-tax-estate.ts +111 -0
- package/src/learn/content/agi-magi-and-taxable-income.ts +112 -0
- package/src/learn/content/appealing-irmaa-ssa-44.ts +95 -0
- package/src/learn/content/assumption-general-inflation.ts +82 -0
- package/src/learn/content/assumption-healthcare-inflation.ts +85 -0
- package/src/learn/content/assumption-heir-tax-rate.ts +79 -0
- package/src/learn/content/assumption-investment-returns.ts +90 -0
- package/src/learn/content/assumption-longevity-planning-age.ts +78 -0
- package/src/learn/content/assumption-recent-magi.ts +83 -0
- package/src/learn/content/assumption-social-security-cola.ts +89 -0
- package/src/learn/content/assumption-social-security-trust-fund.ts +83 -0
- package/src/learn/content/assumption-state-tax-override.ts +79 -0
- package/src/learn/content/beneficiaries-and-account-titling.ts +99 -0
- package/src/learn/content/break-even-useful-lens.ts +94 -0
- package/src/learn/content/building-a-retirement-spending-budget.ts +100 -0
- package/src/learn/content/cola-and-inflation-protection.ts +102 -0
- package/src/learn/content/divorced-spousal-and-survivor-records.ts +104 -0
- package/src/learn/content/dynamic-spending-guardrails.ts +90 -0
- package/src/learn/content/earnings-test-before-fra.ts +100 -0
- package/src/learn/content/employer-match-and-contribution-order.ts +104 -0
- package/src/learn/content/examplePlanArticles.ts +525 -0
- package/src/learn/content/fees-expense-ratios-and-compounding-drag.ts +98 -0
- package/src/learn/content/fi-number-and-four-percent-rule.ts +64 -0
- package/src/learn/content/filling-a-tax-bracket-with-roth-conversions.ts +98 -0
- package/src/learn/content/funded-ratio.ts +70 -0
- package/src/learn/content/healthcare-after-65.ts +103 -0
- package/src/learn/content/healthcare-before-65.ts +104 -0
- package/src/learn/content/historical-vs-random-return-models.ts +101 -0
- package/src/learn/content/how-assumptions-change-the-answer.ts +105 -0
- package/src/learn/content/how-much-can-i-spend.ts +105 -0
- package/src/learn/content/how-social-security-is-taxed.ts +95 -0
- package/src/learn/content/how-the-optimizer-thinks.ts +102 -0
- package/src/learn/content/how-the-optimizer-values-after-tax-estate.ts +97 -0
- package/src/learn/content/how-to-model-accumulation.ts +67 -0
- package/src/learn/content/how-to-read-a-retirement-projection.ts +115 -0
- package/src/learn/content/hsas-and-qualified-medical-expenses.ts +108 -0
- package/src/learn/content/hsas-as-retirement-accounts.ts +101 -0
- package/src/learn/content/inflation-risk.ts +98 -0
- package/src/learn/content/inherited-ira-10-year-rule.ts +105 -0
- package/src/learn/content/insurance-in-your-retirement-plan.ts +103 -0
- package/src/learn/content/irmaa-two-year-lookback.ts +99 -0
- package/src/learn/content/long-term-care-costs-and-insurance.ts +103 -0
- package/src/learn/content/long-term-care-insurance-as-risk-transfer.ts +98 -0
- package/src/learn/content/longevity-risk.ts +99 -0
- package/src/learn/content/marginal-vs-effective-tax-rate.ts +98 -0
- package/src/learn/content/medicare-part-b-vs-part-d-irmaa.ts +102 -0
- package/src/learn/content/mortality-weighted-social-security.ts +113 -0
- package/src/learn/content/moving-to-retiregolden.ts +86 -0
- package/src/learn/content/niit-high-income-investment-tax.ts +98 -0
- package/src/learn/content/ordinary-income-vs-capital-gains.ts +103 -0
- package/src/learn/content/paying-conversion-taxes-taxable-vs-ira.ts +102 -0
- package/src/learn/content/pensions-and-annuities.ts +101 -0
- package/src/learn/content/permanent-life-insurance-in-a-plan.ts +106 -0
- package/src/learn/content/pia-aime-and-bend-points.ts +103 -0
- package/src/learn/content/planner-overview.ts +106 -0
- package/src/learn/content/planning-for-couples-and-survivor-years.ts +108 -0
- package/src/learn/content/privacy-what-stays-in-your-browser.ts +99 -0
- package/src/learn/content/qcds-qualified-charitable-distributions.ts +101 -0
- package/src/learn/content/reading-the-results-page.ts +96 -0
- package/src/learn/content/reading-the-social-security-analysis-page.ts +106 -0
- package/src/learn/content/real-estate-home-equity-and-debt.ts +100 -0
- package/src/learn/content/reports-csv-exports-and-sharing.ts +101 -0
- package/src/learn/content/risk-based-guardrails.ts +100 -0
- package/src/learn/content/rmds-required-minimum-distributions.ts +100 -0
- package/src/learn/content/roth-conversion-basics.ts +104 -0
- package/src/learn/content/rsus-and-espp.ts +101 -0
- package/src/learn/content/rule-of-55-and-72t.ts +107 -0
- package/src/learn/content/savings-rate-biggest-lever.ts +66 -0
- package/src/learn/content/seed-your-plan-from-your-tax-return.ts +93 -0
- package/src/learn/content/sensitivity-testing-what-changes-the-answer.ts +104 -0
- package/src/learn/content/sequence-of-returns-risk.ts +98 -0
- package/src/learn/content/social-security-bridge.ts +67 -0
- package/src/learn/content/social-security-claiming-age-basics.ts +113 -0
- package/src/learn/content/social-security-taxes-vs-benefits.ts +76 -0
- package/src/learn/content/spending-profiles-and-the-retirement-smile.ts +92 -0
- package/src/learn/content/spousal-and-survivor-benefits.ts +120 -0
- package/src/learn/content/ssdi-and-retirement-planning.ts +72 -0
- package/src/learn/content/standard-deduction-senior-deduction-and-itemizing.ts +97 -0
- package/src/learn/content/state-income-taxes-in-retirement.ts +97 -0
- package/src/learn/content/step-up-in-basis.ts +102 -0
- package/src/learn/content/survivor-planning-for-couples.ts +110 -0
- package/src/learn/content/survivor-spending-in-couple-plans.ts +98 -0
- package/src/learn/content/tax-cliffs-and-bracket-edges.ts +105 -0
- package/src/learn/content/tax-loss-and-gain-harvesting.ts +99 -0
- package/src/learn/content/taxable-brokerage-basis-and-capital-gains.ts +99 -0
- package/src/learn/content/three-big-questions-spending-time-risk.ts +103 -0
- package/src/learn/content/tips-ladders.ts +92 -0
- package/src/learn/content/todays-dollars-vs-future-dollars.ts +107 -0
- package/src/learn/content/traditional-vs-roth-contributions.ts +113 -0
- package/src/learn/content/troubleshooting-surprising-results.ts +105 -0
- package/src/learn/content/trust-fund-haircut-scenarios.ts +101 -0
- package/src/learn/content/understanding-monte-carlo-success-rate.ts +118 -0
- package/src/learn/content/understanding-your-plan-assumptions.ts +134 -0
- package/src/learn/content/using-assumptions-and-provenance.ts +98 -0
- package/src/learn/content/using-scenarios-to-compare-choices.ts +99 -0
- package/src/learn/content/what-changes-when-you-move-states.ts +141 -0
- package/src/learn/content/what-is-fire.ts +65 -0
- package/src/learn/content/what-monte-carlo-proves.ts +98 -0
- package/src/learn/content/what-retiregolden-models.ts +103 -0
- package/src/learn/content/what-retirement-healthcare-really-costs.ts +117 -0
- package/src/learn/content/why-95-percent-is-not-a-guarantee.ts +98 -0
- package/src/learn/content/why-roth-conversions-raise-other-costs.ts +106 -0
- package/src/learn/content/why-small-tax-cliffs-can-matter.ts +109 -0
- package/src/learn/content/widows-penalty-and-survivor-brackets.ts +106 -0
- package/src/learn/content/withdrawal-order-basics.ts +105 -0
- package/src/learn/glossary.ts +191 -0
- package/src/learn/inlineMarkdown.tsx +54 -0
- package/src/learn/learn.css +537 -0
- package/src/learn/learningRegistry.ts +502 -0
- package/src/longevity/LongevityResults.tsx +85 -0
- package/src/longevity/LongevityWizard.tsx +305 -0
- package/src/longevity/constants.ts +15 -0
- package/src/longevity/factors.ts +125 -0
- package/src/longevity/model.ts +31 -0
- package/src/longevity/persistedGuard.ts +129 -0
- package/src/longevity/storage.ts +40 -0
- package/src/mc/messages.ts +118 -0
- package/src/mc/monteCarlo.worker.ts +44 -0
- package/src/mc/pool.ts +267 -0
- package/src/mc/runRequest.ts +125 -0
- package/src/optimize/messages.ts +84 -0
- package/src/optimize/optimize.worker.ts +29 -0
- package/src/optimize/runOptimize.ts +92 -0
- package/src/optimize/runSpendingSolve.ts +47 -0
- package/src/optimize/runner.ts +21 -0
- package/src/optimize/spendingMessages.ts +44 -0
- package/src/optimize/spendingRunner.ts +21 -0
- package/src/optimize/spendingSolve.worker.ts +18 -0
- package/src/planner/AssumptionsCardPage.tsx +136 -0
- package/src/planner/BucketLensCard.tsx +114 -0
- package/src/planner/ComparePlansPage.tsx +219 -0
- package/src/planner/DisclaimerPage.tsx +88 -0
- package/src/planner/HowTestedPage.tsx +159 -0
- package/src/planner/LiveStatus.tsx +15 -0
- package/src/planner/LongevityModal.tsx +55 -0
- package/src/planner/Modal.tsx +97 -0
- package/src/planner/MonteCarloPage.tsx +907 -0
- package/src/planner/OptimizePage.tsx +611 -0
- package/src/planner/PlanContext.tsx +198 -0
- package/src/planner/PlanPickerPage.tsx +124 -0
- package/src/planner/PlanWorkspace.tsx +290 -0
- package/src/planner/ProvenancePanel.tsx +45 -0
- package/src/planner/RelocationComparePage.tsx +485 -0
- package/src/planner/ReportPage.tsx +375 -0
- package/src/planner/ResultsPage.tsx +817 -0
- package/src/planner/ScenariosPage.tsx +285 -0
- package/src/planner/SocialSecuritySection.tsx +556 -0
- package/src/planner/SpendingSolverPage.tsx +512 -0
- package/src/planner/SsAnalysisPage.tsx +1134 -0
- package/src/planner/SurvivalPercentileModal.tsx +161 -0
- package/src/planner/SurvivorTransitionPage.tsx +286 -0
- package/src/planner/assumptionsExport.ts +371 -0
- package/src/planner/bucketLens.ts +89 -0
- package/src/planner/chartFrame.ts +8 -0
- package/src/planner/chartStyle.ts +11 -0
- package/src/planner/dialogViews.tsx +184 -0
- package/src/planner/dialogs.tsx +133 -0
- package/src/planner/examples/ExampleLibrary.tsx +189 -0
- package/src/planner/examples/ExamplePreviewBanner.tsx +55 -0
- package/src/planner/examples/ExamplesPage.tsx +25 -0
- package/src/planner/examples/OpenExampleButton.tsx +61 -0
- package/src/planner/examples/buildAggressiveSaver.ts +102 -0
- package/src/planner/examples/buildAnnuityEstate.ts +137 -0
- package/src/planner/examples/buildBaristaFire.ts +115 -0
- package/src/planner/examples/buildBracketFillRoth.ts +65 -0
- package/src/planner/examples/buildBridgeEarlyRetirement.ts +94 -0
- package/src/planner/examples/buildBrokerageNoHsa.ts +109 -0
- package/src/planner/examples/buildCoastFire.ts +88 -0
- package/src/planner/examples/buildContext.ts +20 -0
- package/src/planner/examples/buildEarlyCareerMatch.ts +93 -0
- package/src/planner/examples/buildEarlyRetireeAca.ts +61 -0
- package/src/planner/examples/buildExampleCouple.ts +103 -0
- package/src/planner/examples/buildFixedTargetSpending.ts +74 -0
- package/src/planner/examples/buildGlidepathAllocation.ts +131 -0
- package/src/planner/examples/buildGuardrailsFlex.ts +120 -0
- package/src/planner/examples/buildHsaPropertyDepth.ts +109 -0
- package/src/planner/examples/buildHsaStealthRetirement.ts +97 -0
- package/src/planner/examples/buildLeanFatFire.ts +109 -0
- package/src/planner/examples/buildLtcShock.ts +62 -0
- package/src/planner/examples/buildMovingStateTax.ts +53 -0
- package/src/planner/examples/buildNoAnnuityBrokerage.ts +92 -0
- package/src/planner/examples/buildRmdIrmaa.ts +55 -0
- package/src/planner/examples/buildSalaryGrowthEscalation.ts +96 -0
- package/src/planner/examples/buildStaticAllocationControl.ts +96 -0
- package/src/planner/examples/buildSurvivorYears.ts +62 -0
- package/src/planner/examples/buildUnderSavedSingle.ts +51 -0
- package/src/planner/examples/exampleCopy.ts +23 -0
- package/src/planner/examples/loadExample.ts +90 -0
- package/src/planner/examples/registry.ts +313 -0
- package/src/planner/explainPanels.tsx +233 -0
- package/src/planner/fields.tsx +381 -0
- package/src/planner/format.ts +33 -0
- package/src/planner/home/DataAndPrivacyCard.tsx +56 -0
- package/src/planner/home/GettingStartedPaths.tsx +46 -0
- package/src/planner/home/GettingStartedReopener.tsx +32 -0
- package/src/planner/home/StartHereLinks.tsx +22 -0
- package/src/planner/home/WelcomeHero.tsx +39 -0
- package/src/planner/home/YourPlans.tsx +72 -0
- package/src/planner/home/importErrorMessage.ts +22 -0
- package/src/planner/home/startHereSlugs.ts +7 -0
- package/src/planner/home/useHomeData.ts +190 -0
- package/src/planner/home/useHomeMode.ts +47 -0
- package/src/planner/householdActions.ts +22 -0
- package/src/planner/insights/InsightCardView.tsx +340 -0
- package/src/planner/insights/InsightsPage.tsx +204 -0
- package/src/planner/insights/categoryLabels.ts +11 -0
- package/src/planner/learnLinks.ts +85 -0
- package/src/planner/marketModelPicker.ts +172 -0
- package/src/planner/optimizePageChart.ts +40 -0
- package/src/planner/optimizePageClaim.ts +64 -0
- package/src/planner/planCompleteness.ts +27 -0
- package/src/planner/planContextCore.ts +26 -0
- package/src/planner/planner.css +2304 -0
- package/src/planner/provenanceLinks.ts +25 -0
- package/src/planner/sections/AccountFields.tsx +872 -0
- package/src/planner/sections/AccountsSection.tsx +89 -0
- package/src/planner/sections/AllocationPanel.tsx +261 -0
- package/src/planner/sections/AssumptionsSection.tsx +256 -0
- package/src/planner/sections/HouseholdSection.tsx +243 -0
- package/src/planner/sections/IncomeFloorSection.tsx +418 -0
- package/src/planner/sections/IncomeSection.tsx +170 -0
- package/src/planner/sections/InsuranceSection.tsx +362 -0
- package/src/planner/sections/SpendingSection.tsx +904 -0
- package/src/planner/sections/StrategySection.tsx +349 -0
- package/src/planner/sections/UpdateBalancesPanel.tsx +182 -0
- package/src/planner/sections/sectionHelpers.ts +48 -0
- package/src/planner/sections/shared.tsx +15 -0
- package/src/planner/sections.tsx +15 -0
- package/src/planner/ssAnalysis.ts +325 -0
- package/src/planner/successBand.ts +20 -0
- package/src/planner/survivorAnalysis.ts +277 -0
- package/src/planner/usStates.ts +19 -0
- package/src/planner/useMcSuccessRate.ts +77 -0
- package/src/planner/useProjection.ts +63 -0
- package/src/relocation/messages.ts +21 -0
- package/src/relocation/relocation.worker.ts +18 -0
- package/src/relocation/runRelocation.ts +17 -0
- package/src/relocation/runner.ts +22 -0
- package/src/report/brandingContext.ts +15 -0
- package/src/report/downloadReport.ts +34 -0
- package/src/report/reportHtml.ts +547 -0
- package/src/routes/LearnRoutes.tsx +46 -0
- package/src/routes/PlanRoutes.tsx +55 -0
- package/src/routes/RouteFallback.tsx +9 -0
- package/src/socialSecurity/breakEven.ts +107 -0
- package/src/socialSecurity/expectedPv.ts +164 -0
- package/src/socialSecurity/explain.ts +92 -0
- package/src/socialSecurity/ficaReturn.ts +81 -0
- package/src/socialSecurity/persistedSsGuard.ts +138 -0
- package/src/socialSecurity/ssFormUtils.ts +48 -0
- package/src/socialSecurity/ssaStatementXml.ts +156 -0
- package/src/socialSecurity/storage.ts +69 -0
- package/src/socialSecurity/survivorSwitching.ts +153 -0
- package/src/testSupport/samplePlan.ts +2 -0
- package/src/workers/run.ts +45 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "How much can I spend?" - a Using RetireGolden P1 article.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { LearningArticle } from '../learningRegistry'
|
|
6
|
+
|
|
7
|
+
export const howMuchCanISpendArticle: LearningArticle = {
|
|
8
|
+
slug: 'how-much-can-i-spend',
|
|
9
|
+
title: 'How much can I spend?',
|
|
10
|
+
description: 'How RetireGolden finds the highest sustainable baseline spending level for a plan.',
|
|
11
|
+
category: 'using-retiregolden',
|
|
12
|
+
tags: ['sustainable spending', 'solver', 'spending slack', 'bequest target', 'scenarios'],
|
|
13
|
+
audience: 'intermediate',
|
|
14
|
+
status: 'ready',
|
|
15
|
+
lastReviewed: '2026-07-06',
|
|
16
|
+
reviewCadence: 'stable',
|
|
17
|
+
sourceUrls: [],
|
|
18
|
+
relatedArticles: [
|
|
19
|
+
'building-a-retirement-spending-budget',
|
|
20
|
+
'spending-profiles-and-the-retirement-smile',
|
|
21
|
+
'survivor-spending-in-couple-plans',
|
|
22
|
+
'using-scenarios-to-compare-choices',
|
|
23
|
+
'after-tax-estate',
|
|
24
|
+
],
|
|
25
|
+
relatedPlannerRoutes: [
|
|
26
|
+
'/plan/:planId/spending-solver',
|
|
27
|
+
'/plan/:planId/spending',
|
|
28
|
+
'/plan/:planId/optimize',
|
|
29
|
+
'/plan/:planId/insights',
|
|
30
|
+
'/plan/:planId/results',
|
|
31
|
+
'/plan/:planId/scenarios',
|
|
32
|
+
],
|
|
33
|
+
currentYearSensitive: false,
|
|
34
|
+
priority: 'P1',
|
|
35
|
+
blocks: [
|
|
36
|
+
{
|
|
37
|
+
type: 'prose',
|
|
38
|
+
md: 'The "How much can I spend?" page turns a retirement plan around. Instead of asking whether your current spending works, it searches for the highest baseline spending level the exact projection ledger can sustain.',
|
|
39
|
+
},
|
|
40
|
+
{ type: 'heading', text: 'Quick takeaways' },
|
|
41
|
+
{
|
|
42
|
+
type: 'list',
|
|
43
|
+
items: [
|
|
44
|
+
'The answer is annual baseline spending in today\'s dollars.',
|
|
45
|
+
'The solver reruns the same exact ledger used by Results: taxes, withdrawals, healthcare, Social Security, ACA, IRMAA, survivor years, and spending phases all count.',
|
|
46
|
+
'A bequest target on the Spending screen becomes an estate floor the answer must preserve.',
|
|
47
|
+
],
|
|
48
|
+
},
|
|
49
|
+
{ type: 'heading', text: 'The basic idea' },
|
|
50
|
+
{
|
|
51
|
+
type: 'prose',
|
|
52
|
+
md: 'RetireGolden tests spending levels by bisection. It tries a baseline spending amount, runs the full projection, and checks whether the portfolio ever depletes or the ending after-tax estate falls below the bequest target. Then it moves the test higher or lower until it finds the highest feasible level within the interactive simulation budget.',
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
type: 'formula',
|
|
56
|
+
expression: 'spending slack = max sustainable baseline spending - current baseline spending',
|
|
57
|
+
basis: 'today',
|
|
58
|
+
note: 'Positive slack means the solved level is above the current baseline. Negative slack means the current baseline is higher than the ledger can sustain under the same assumptions.',
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
type: 'table',
|
|
62
|
+
caption: 'What the solver does and does not move.',
|
|
63
|
+
columns: ['Plan item', 'How the solver treats it', 'Why'],
|
|
64
|
+
rows: [
|
|
65
|
+
['Baseline spending', 'Moves up or down', 'This is the question being solved'],
|
|
66
|
+
['Spending phases and survivor percentage', 'Kept and priced into every tested level', 'They shape the baseline spending path'],
|
|
67
|
+
['One-time goals', 'Kept as entered', 'A named goal should not become recurring spending'],
|
|
68
|
+
['Healthcare, debt, property, insurance, taxes', 'Kept and recalculated through the ledger', 'They affect feasibility but are not the spending answer'],
|
|
69
|
+
['Bequest target', 'Used as an ending estate floor', 'A spending level is not sustainable if it violates the floor'],
|
|
70
|
+
],
|
|
71
|
+
},
|
|
72
|
+
{ type: 'heading', text: 'A worked example' },
|
|
73
|
+
{
|
|
74
|
+
type: 'scenario',
|
|
75
|
+
name: 'The Jordan household',
|
|
76
|
+
assumptions: [
|
|
77
|
+
{ label: 'Current baseline', value: '$72,000 per year in today\'s dollars' },
|
|
78
|
+
{ label: 'Bequest target', value: '$250,000 in today\'s dollars' },
|
|
79
|
+
{ label: 'Solver answer', value: '$81,500 per year' },
|
|
80
|
+
{ label: 'Spending slack', value: '+$9,500 per year' },
|
|
81
|
+
],
|
|
82
|
+
summary:
|
|
83
|
+
'The answer means the exact ledger found a higher baseline that still avoids depletion and preserves the bequest floor. It does not mean every future path is risk-free.',
|
|
84
|
+
},
|
|
85
|
+
{ type: 'heading', text: 'How to use the answer' },
|
|
86
|
+
{
|
|
87
|
+
type: 'prose',
|
|
88
|
+
md: 'Use the answer as a planning boundary. If the solved amount is much higher than current spending, you may have room for a scenario with higher lifestyle spending, earlier retirement, gifts, or a larger bequest target. If it is lower than current spending, the plan needs attention before Roth conversions or other fine tuning matter.',
|
|
89
|
+
},
|
|
90
|
+
{ type: 'heading', text: 'Common mistakes' },
|
|
91
|
+
{
|
|
92
|
+
type: 'list',
|
|
93
|
+
items: [
|
|
94
|
+
'Treating the deterministic answer as a guarantee. Use Monte Carlo to test market variation.',
|
|
95
|
+
'Forgetting that one-time goals stay fixed. A large goal can reduce sustainable baseline spending without showing up as part of the answer.',
|
|
96
|
+
'Ignoring the binding constraint. A bequest target can be the limit even when the portfolio never depletes.',
|
|
97
|
+
],
|
|
98
|
+
},
|
|
99
|
+
{ type: 'heading', text: 'Where to use this in the app' },
|
|
100
|
+
{
|
|
101
|
+
type: 'prose',
|
|
102
|
+
md: 'Use **How much can I spend?** from the Optimize rail. Use **Spending** to set the baseline, phases, survivor spending, and bequest target. Use **Add as scenario** to compare the solved spending level without changing the base plan.',
|
|
103
|
+
},
|
|
104
|
+
],
|
|
105
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "How Social Security is taxed" - a Taxes P1 article.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { LearningArticle } from '../learningRegistry'
|
|
6
|
+
|
|
7
|
+
export const howSocialSecurityIsTaxedArticle: LearningArticle = {
|
|
8
|
+
slug: 'how-social-security-is-taxed',
|
|
9
|
+
title: 'How Social Security is taxed',
|
|
10
|
+
description: 'Why up to 85% of benefits can become taxable income.',
|
|
11
|
+
category: 'taxes',
|
|
12
|
+
tags: ['social security', 'taxable benefits', 'provisional income', 'combined income', 'magi'],
|
|
13
|
+
audience: 'beginner',
|
|
14
|
+
status: 'ready',
|
|
15
|
+
lastReviewed: '2026-06-20',
|
|
16
|
+
reviewCadence: 'annual',
|
|
17
|
+
sourceUrls: ['https://www.irs.gov/forms-pubs/about-publication-915'],
|
|
18
|
+
relatedArticles: [
|
|
19
|
+
'agi-magi-and-taxable-income',
|
|
20
|
+
'ordinary-income-vs-capital-gains',
|
|
21
|
+
'tax-cliffs-and-bracket-edges',
|
|
22
|
+
'why-roth-conversions-raise-other-costs',
|
|
23
|
+
],
|
|
24
|
+
relatedPlannerRoutes: ['/plan/:planId/social-security', '/plan/:planId/results', '/plan/:planId/strategy'],
|
|
25
|
+
currentYearSensitive: true,
|
|
26
|
+
priority: 'P1',
|
|
27
|
+
blocks: [
|
|
28
|
+
{
|
|
29
|
+
type: 'prose',
|
|
30
|
+
md: 'Social Security benefits are not automatically tax-free and they are not automatically fully taxable. Federal tax law uses a formula that looks at benefits plus other income. As other income rises, more of the benefit can become taxable, up to a cap.',
|
|
31
|
+
},
|
|
32
|
+
{ type: 'heading', text: 'Quick takeaways' },
|
|
33
|
+
{
|
|
34
|
+
type: 'list',
|
|
35
|
+
items: [
|
|
36
|
+
'The taxable share of Social Security depends on benefits plus other income.',
|
|
37
|
+
'Extra IRA withdrawals, Roth conversions, wages, or capital gains can make more benefits taxable.',
|
|
38
|
+
'RetireGolden models taxable Social Security as part of the federal tax calculation, not as a flat percentage.',
|
|
39
|
+
],
|
|
40
|
+
},
|
|
41
|
+
{ type: 'heading', text: 'The basic idea' },
|
|
42
|
+
{
|
|
43
|
+
type: 'prose',
|
|
44
|
+
md: 'The Social Security tax formula uses a combined-income style calculation: other income plus a portion of benefits. When that measure crosses certain thresholds, part of the benefits enters taxable income. This can make the next dollar of other income cost more than expected, because it may bring some Social Security income along with it.',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
type: 'figure',
|
|
48
|
+
image: { src: '/learn/images/social-security-taxation.webp' },
|
|
49
|
+
caption:
|
|
50
|
+
'Other income can pull more Social Security benefits into taxable income as the year fills up.',
|
|
51
|
+
alt: 'A Social Security ribbon runs beside other income streams toward a tax gate, with rising steps showing more of the benefit becoming taxable.',
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
type: 'formula',
|
|
55
|
+
expression: 'provisional income = income excluding Social Security + 50% of Social Security benefits',
|
|
56
|
+
where: [
|
|
57
|
+
{ symbol: 'income excluding Social Security', meaning: 'ordinary income and gains before adding taxable benefits in RetireGolden\'s planning model' },
|
|
58
|
+
{ symbol: '50% of Social Security benefits', meaning: 'half of the annual Social Security benefit used in the federal formula' },
|
|
59
|
+
],
|
|
60
|
+
note: 'Tax-exempt interest and several form-level details are not separately modeled in RetireGolden.',
|
|
61
|
+
},
|
|
62
|
+
{ type: 'heading', text: 'A worked example' },
|
|
63
|
+
{
|
|
64
|
+
type: 'scenario',
|
|
65
|
+
name: 'The Martin household',
|
|
66
|
+
assumptions: [
|
|
67
|
+
{ label: 'Benefits', value: 'Social Security begins at 67' },
|
|
68
|
+
{ label: 'Other income', value: '$30,000 traditional IRA withdrawal fills the spending gap' },
|
|
69
|
+
{ label: 'Tax ripple', value: 'The withdrawal also makes about $12,000 more Social Security taxable' },
|
|
70
|
+
],
|
|
71
|
+
summary:
|
|
72
|
+
'The tax return does not just see a $30,000 IRA withdrawal. It can also pull roughly **$12,000** more benefits into taxable income, so taxable income rises faster than the withdrawal alone.',
|
|
73
|
+
},
|
|
74
|
+
{ type: 'heading', text: 'Why it matters in RetireGolden' },
|
|
75
|
+
{
|
|
76
|
+
type: 'prose',
|
|
77
|
+
md: 'RetireGolden computes taxable Social Security inside the federal tax engine each year. The taxable portion feeds AGI, MAGI, deductions, taxable income, and the final tax calculation. The Results ledger shows the pieces so you can see when benefits start affecting taxes.',
|
|
78
|
+
},
|
|
79
|
+
{ type: 'heading', text: 'Common mistakes' },
|
|
80
|
+
{
|
|
81
|
+
type: 'list',
|
|
82
|
+
items: [
|
|
83
|
+
'Assuming no Social Security is taxable because payroll tax was already paid.',
|
|
84
|
+
'Assuming exactly 85% is always taxable. That is only a maximum federal share.',
|
|
85
|
+
'Ignoring the effect of capital gains or Roth conversions on taxable benefits.',
|
|
86
|
+
'Forgetting that state treatment of Social Security can differ from federal treatment.',
|
|
87
|
+
],
|
|
88
|
+
},
|
|
89
|
+
{ type: 'heading', text: 'Where to use this in the app' },
|
|
90
|
+
{
|
|
91
|
+
type: 'prose',
|
|
92
|
+
md: 'Use **Social Security** to set claiming assumptions. Use **Results** to inspect Social Security income, taxable Social Security, AGI, MAGI, taxable income, and tax. Use **Strategy** to test whether different withdrawal or conversion choices change the taxable share.',
|
|
93
|
+
},
|
|
94
|
+
],
|
|
95
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "How the Optimize tab thinks about Roth conversions" - a Using RetireGolden P0 article.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { LearningArticle } from '../learningRegistry'
|
|
6
|
+
|
|
7
|
+
export const howTheOptimizerThinksArticle: LearningArticle = {
|
|
8
|
+
slug: 'how-the-optimizer-thinks',
|
|
9
|
+
title: 'How the Optimize tab thinks about Roth conversions',
|
|
10
|
+
description: 'How the optimizer searches, how objective modes rank candidates, and how to interpret the result.',
|
|
11
|
+
category: 'using-retiregolden',
|
|
12
|
+
tags: ['optimizer', 'roth conversions', 'objective modes', 'after-tax estate', 'linear model', 'strategy'],
|
|
13
|
+
audience: 'intermediate',
|
|
14
|
+
status: 'ready',
|
|
15
|
+
lastReviewed: '2026-07-06',
|
|
16
|
+
reviewCadence: 'stable',
|
|
17
|
+
sourceUrls: [],
|
|
18
|
+
relatedArticles: [
|
|
19
|
+
'roth-conversion-basics',
|
|
20
|
+
'how-the-optimizer-values-after-tax-estate',
|
|
21
|
+
'filling-a-tax-bracket-with-roth-conversions',
|
|
22
|
+
'why-roth-conversions-raise-other-costs',
|
|
23
|
+
'understanding-monte-carlo-success-rate',
|
|
24
|
+
],
|
|
25
|
+
relatedPlannerRoutes: ['/plan/:planId/optimize', '/plan/:planId/strategy', '/plan/:planId/results', '/plan/:planId/monte-carlo'],
|
|
26
|
+
currentYearSensitive: false,
|
|
27
|
+
priority: 'P0',
|
|
28
|
+
blocks: [
|
|
29
|
+
{
|
|
30
|
+
type: 'prose',
|
|
31
|
+
md: 'The Optimize tab searches for a multi-year Roth conversion schedule, then compares candidate schedules on the exact RetireGolden ledger. The default objective is after-tax estate, but the **Optimize for** selector can rank the same evaluated candidates by other goals.',
|
|
32
|
+
},
|
|
33
|
+
{ type: 'heading', text: 'Quick takeaways' },
|
|
34
|
+
{
|
|
35
|
+
type: 'list',
|
|
36
|
+
items: [
|
|
37
|
+
'Optimize starts from a no-conversion baseline, then searches across plan years at once.',
|
|
38
|
+
'The solver uses a simplified math model to find a raw candidate schedule, then RetireGolden trims it to what the exact ledger can execute and measures the cleaned result.',
|
|
39
|
+
'Objective modes change what "better" means after candidates have been evaluated; they do not bypass the exact ledger.',
|
|
40
|
+
'A proposed schedule should still be checked in Results and Monte Carlo before you treat it as a good idea.',
|
|
41
|
+
],
|
|
42
|
+
},
|
|
43
|
+
{ type: 'heading', text: 'The basic idea' },
|
|
44
|
+
{
|
|
45
|
+
type: 'prose',
|
|
46
|
+
md: 'Roth conversions have timing effects. A conversion raises income and tax now, but can lower future traditional balances, RMDs, survivor-year pressure, and taxes owed by heirs. Optimize searches years together because the best year for one conversion depends on the conversions before and after it.\n\nAfter candidates are evaluated, the selected objective policy decides how to rank them. The default maximizes after-tax estate. Other modes can favor money lasting longer, lifetime tax savings while preserving an estate floor, survivor-year liquidity, or bridge-year resilience.',
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
type: 'figure',
|
|
50
|
+
image: { src: '/learn/images/optimizer-thinks-roth-conversions.webp' },
|
|
51
|
+
caption:
|
|
52
|
+
'Optimize searches a full conversion schedule, then measures the candidate against the exact RetireGolden ledger.',
|
|
53
|
+
alt: 'A conversion scheduler machine places bars across a timeline, then sends the proposed schedule through a detailed ledger check before reaching an after-tax estate comparison.',
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
type: 'table',
|
|
57
|
+
caption: 'What happens when Optimize runs.',
|
|
58
|
+
columns: ['Stage', 'What RetireGolden does', 'Why it matters'],
|
|
59
|
+
rows: [
|
|
60
|
+
['Baseline probe', 'Runs the plan with conversions stripped out to capture spending, income, RMDs, and tax context', 'Gives the solver a clean starting point'],
|
|
61
|
+
['Search', 'Uses a linearized model to test conversion amounts across years', 'Makes a multi-year search fast enough for the browser'],
|
|
62
|
+
['Exact cleanup', 'Runs the raw schedule through the projection ledger, trims conversions the ledger cannot execute, and re-runs the cleaned schedule', 'Keeps the schedule applyable and tied to the same engine used by Results'],
|
|
63
|
+
['Objective ranking', 'Ranks the exact-ledger evaluations under the selected objective policy', 'Lets the same candidates answer different planning questions without a second ranking system'],
|
|
64
|
+
['Risk check', 'Runs a Monte Carlo success estimate for the proposed schedule', 'Shows whether the schedule appears to strain the plan under market variation'],
|
|
65
|
+
],
|
|
66
|
+
},
|
|
67
|
+
{ type: 'heading', text: 'A worked example' },
|
|
68
|
+
{
|
|
69
|
+
type: 'scenario',
|
|
70
|
+
name: 'The Ortega household',
|
|
71
|
+
assumptions: [
|
|
72
|
+
{ label: 'Early retirement window', value: 'Six low-income years before Social Security and RMDs' },
|
|
73
|
+
{ label: 'Later pressure', value: '$850,000 traditional balance could create large future RMDs' },
|
|
74
|
+
{ label: 'Optimizer result', value: '$35,000 conversions for several early years, then little or none later' },
|
|
75
|
+
],
|
|
76
|
+
summary:
|
|
77
|
+
'The optimizer may accept higher tax on each $35,000 early conversion if it lowers later RMD pressure and improves after-tax estate. The value comes from the whole timeline, not one year.',
|
|
78
|
+
},
|
|
79
|
+
{ type: 'heading', text: 'Why it matters in RetireGolden' },
|
|
80
|
+
{
|
|
81
|
+
type: 'prose',
|
|
82
|
+
md: 'The Optimize tab shows after-tax estate delta, lifetime tax delta, success rate, and proposed conversions by year. When you choose a non-default objective, the page calls out that estate and tax deltas are context rather than the ranking metric. If the raw solver request is larger than the exact ledger can execute, the chart shows the cleaned schedule. "Apply optimized schedule" keeps the cleaned schedule labeled as optimizer output. "Accept as manual" copies the same cleaned amounts into an editable manual schedule under Strategy.',
|
|
83
|
+
},
|
|
84
|
+
{ type: 'heading', text: 'Common mistakes' },
|
|
85
|
+
{
|
|
86
|
+
type: 'list',
|
|
87
|
+
items: [
|
|
88
|
+
'Thinking the optimizer minimizes lifetime tax. It may raise taxes while improving after-tax estate.',
|
|
89
|
+
'Switching objectives without reading the objective hint; a survivor-liquidity winner may not also be the largest-estate winner.',
|
|
90
|
+
'Applying a schedule without noticing whether the exact ledger cleaned or rejected part of the raw solver request.',
|
|
91
|
+
'Ignoring MAGI, IRMAA, ACA, and cash-flow effects in Results.',
|
|
92
|
+
'Assuming an infeasible result means Optimize is broken; often the plan has a spending shortfall before any conversion strategy matters.',
|
|
93
|
+
'Forgetting to test the heir tax rate assumption, which changes how valuable leftover traditional dollars appear.',
|
|
94
|
+
],
|
|
95
|
+
},
|
|
96
|
+
{ type: 'heading', text: 'Where to use this in the app' },
|
|
97
|
+
{
|
|
98
|
+
type: 'prose',
|
|
99
|
+
md: 'Use **Optimize** after the base plan works in **Results**. Then inspect the proposed years, check any raw-versus-cleaned differences, run **Monte Carlo**, and only then decide whether to apply or copy the schedule into **Strategy**.',
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "How RetireGolden's optimizer values after-tax estate" - a Withdrawals and Roth P0 article.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { LearningArticle } from '../learningRegistry'
|
|
6
|
+
|
|
7
|
+
export const optimizerAfterTaxEstateArticle: LearningArticle = {
|
|
8
|
+
slug: 'how-the-optimizer-values-after-tax-estate',
|
|
9
|
+
title: "How RetireGolden's optimizer values after-tax estate",
|
|
10
|
+
description: 'Why the optimizer compares plans on what heirs keep after tax.',
|
|
11
|
+
category: 'withdrawals-roth',
|
|
12
|
+
tags: ['optimizer', 'after-tax estate', 'heir tax', 'roth conversion', 'traditional ira'],
|
|
13
|
+
audience: 'intermediate',
|
|
14
|
+
status: 'ready',
|
|
15
|
+
lastReviewed: '2026-06-19',
|
|
16
|
+
reviewCadence: 'stable',
|
|
17
|
+
sourceUrls: [],
|
|
18
|
+
relatedArticles: [
|
|
19
|
+
'roth-conversion-basics',
|
|
20
|
+
'filling-a-tax-bracket-with-roth-conversions',
|
|
21
|
+
'why-roth-conversions-raise-other-costs',
|
|
22
|
+
'after-tax-estate',
|
|
23
|
+
],
|
|
24
|
+
relatedPlannerRoutes: ['/plan/:planId/optimize', '/plan/:planId/assumptions', '/plan/:planId/results'],
|
|
25
|
+
currentYearSensitive: false,
|
|
26
|
+
priority: 'P0',
|
|
27
|
+
blocks: [
|
|
28
|
+
{
|
|
29
|
+
type: 'prose',
|
|
30
|
+
md: 'The optimizer is not trying to minimize this year\'s taxes. It is trying to leave the highest after-tax estate at the end of the plan, after accounting for the tax heirs might owe on inherited pre-tax money.',
|
|
31
|
+
},
|
|
32
|
+
{ type: 'heading', text: 'Quick takeaways' },
|
|
33
|
+
{
|
|
34
|
+
type: 'list',
|
|
35
|
+
items: [
|
|
36
|
+
'A traditional IRA dollar and a Roth dollar are not equally valuable to heirs.',
|
|
37
|
+
'The optimizer applies a user-controlled heir tax rate to leftover traditional balances.',
|
|
38
|
+
'The proposed schedule is checked by re-running the exact RetireGolden ledger; if the raw request cannot be fully executed, RetireGolden measures the cleaned schedule instead.',
|
|
39
|
+
],
|
|
40
|
+
},
|
|
41
|
+
{ type: 'heading', text: 'The basic idea' },
|
|
42
|
+
{
|
|
43
|
+
type: 'prose',
|
|
44
|
+
md: 'A pre-tax account can look larger than a Roth account, but some of that balance may really belong to future tax. For estate comparison, RetireGolden treats leftover traditional dollars as partly taxable to heirs, while Roth, taxable, cash, HSA, property, and life-insurance death benefit use simpler pass-through assumptions.',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
type: 'figure',
|
|
48
|
+
image: { src: '/learn/images/after-tax-estate.webp' },
|
|
49
|
+
caption:
|
|
50
|
+
'The optimizer compares what is left after the assumed tax on inherited pre-tax dollars, not just the largest ending balance.',
|
|
51
|
+
alt: 'Two ending estate buckets are compared: a traditional bucket loses a slice to a tax gate while a Roth bucket passes through more fully to heirs.',
|
|
52
|
+
},
|
|
53
|
+
{ type: 'heading', text: 'A quick formula' },
|
|
54
|
+
{
|
|
55
|
+
type: 'formula',
|
|
56
|
+
expression: 'after-tax estate = ending net worth - traditional balance * heir tax rate',
|
|
57
|
+
where: [
|
|
58
|
+
{ symbol: 'ending net worth', meaning: 'the plan\'s modeled end-of-plan net worth' },
|
|
59
|
+
{ symbol: 'traditional balance', meaning: 'leftover pre-tax retirement balance at the end of the plan' },
|
|
60
|
+
{ symbol: 'heir tax rate', meaning: 'the assumed income-tax rate heirs pay on inherited pre-tax dollars' },
|
|
61
|
+
],
|
|
62
|
+
basis: 'nominal',
|
|
63
|
+
note: 'This is a planning simplification for comparing strategies. The optimizer uses the assumption you set, then RetireGolden re-runs the full ledger and applies only a cleaned schedule that the ledger can execute.',
|
|
64
|
+
},
|
|
65
|
+
{ type: 'heading', text: 'Why conversions can help the estate' },
|
|
66
|
+
{
|
|
67
|
+
type: 'prose',
|
|
68
|
+
md: 'A conversion can look bad in the year it happens because it raises tax. It can still help the after-tax estate if it moves money from a future-taxed bucket into a Roth bucket at a lower lifetime cost. The optimizer searches across years because one conversion can change later RMDs, taxes, Medicare costs, and ending balances.',
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
type: 'table',
|
|
72
|
+
caption: 'How the optimizer thinks about account buckets.',
|
|
73
|
+
columns: ['Bucket', 'How the optimizer treats it', 'Why it matters'],
|
|
74
|
+
rows: [
|
|
75
|
+
['Traditional', 'Haircut by the heir tax rate at the end', 'A larger balance may not all belong to heirs'],
|
|
76
|
+
['Roth', 'Kept whole in the estate comparison', 'Future qualified Roth dollars are more flexible'],
|
|
77
|
+
['Taxable, cash, HSA, property', 'Simplified as passing through untaxed in the estate comparison', 'Keeps the optimizer focused on the pre-tax vs Roth trade'],
|
|
78
|
+
['Current taxes', 'Counted through the exact ledger re-run', 'A good schedule must survive the real plan math'],
|
|
79
|
+
],
|
|
80
|
+
},
|
|
81
|
+
{ type: 'heading', text: 'Common mistakes' },
|
|
82
|
+
{
|
|
83
|
+
type: 'list',
|
|
84
|
+
items: [
|
|
85
|
+
'Expecting the optimizer to minimize lifetime tax. It may raise lifetime tax while still improving after-tax estate.',
|
|
86
|
+
'Leaving the heir tax rate at a default that does not match the question you want to test.',
|
|
87
|
+
'Applying a proposed schedule without checking Monte Carlo risk and yearly cash flow.',
|
|
88
|
+
'Treating the optimizer\'s math model as the final answer instead of the cleaned exact-ledger re-run shown in the app.',
|
|
89
|
+
],
|
|
90
|
+
},
|
|
91
|
+
{ type: 'heading', text: 'Where to use this in the app' },
|
|
92
|
+
{
|
|
93
|
+
type: 'prose',
|
|
94
|
+
md: 'Use **Optimize** to search for a conversion schedule. Use the heir tax rate slider to test sensitivity, then inspect **Results** for taxes, MAGI, RMDs, and ending after-tax estate.',
|
|
95
|
+
},
|
|
96
|
+
],
|
|
97
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { LearningArticle } from '../learningRegistry'
|
|
2
|
+
|
|
3
|
+
export const howToModelAccumulationArticle: LearningArticle = {
|
|
4
|
+
slug: 'how-to-model-accumulation',
|
|
5
|
+
title: 'How to model your accumulation in RetireGolden',
|
|
6
|
+
description: 'A guided tour of using salary growth, contribution schedules, and employer matches to build your plan.',
|
|
7
|
+
category: 'early-investing-fire',
|
|
8
|
+
tags: ['accumulation', 'tutorial', 'employer match', 'contribution schedule', 'raise rate'],
|
|
9
|
+
audience: 'beginner',
|
|
10
|
+
status: 'ready',
|
|
11
|
+
lastReviewed: '2026-06-29',
|
|
12
|
+
reviewCadence: 'stable',
|
|
13
|
+
sourceUrls: [],
|
|
14
|
+
relatedArticles: [
|
|
15
|
+
'what-is-fire',
|
|
16
|
+
'savings-rate-biggest-lever',
|
|
17
|
+
'fi-number-and-four-percent-rule',
|
|
18
|
+
],
|
|
19
|
+
relatedPlannerRoutes: [
|
|
20
|
+
'/plan/:planId/income',
|
|
21
|
+
'/plan/:planId/accounts',
|
|
22
|
+
'/plan/:planId/assumptions',
|
|
23
|
+
'/plan/:planId/scenarios',
|
|
24
|
+
'/plan/:planId/results',
|
|
25
|
+
],
|
|
26
|
+
currentYearSensitive: false,
|
|
27
|
+
priority: 'P0',
|
|
28
|
+
blocks: [
|
|
29
|
+
{
|
|
30
|
+
type: 'prose',
|
|
31
|
+
md: 'RetireGolden features robust controls designed specifically to model the wealth accumulation phase. This article walks you through configuring salary growth, matching, and schedules to map your journey to Financial Independence.',
|
|
32
|
+
},
|
|
33
|
+
{ type: 'heading', text: 'Three key steps' },
|
|
34
|
+
{
|
|
35
|
+
type: 'list',
|
|
36
|
+
items: [
|
|
37
|
+
'Set up real salary growth on your wages in the Income screen.',
|
|
38
|
+
'Configure employer matches and custom contribution schedules in the Accounts screen.',
|
|
39
|
+
'Review the Path to Financial Independence card and SWR under Assumptions and Results.',
|
|
40
|
+
],
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
type: 'scenario',
|
|
44
|
+
name: 'Walkthrough: Dana\'s setup',
|
|
45
|
+
assumptions: [
|
|
46
|
+
{ label: 'Step 1 (Income)', value: 'Dana sets a 3% real raise rate on her $80,000 wages.' },
|
|
47
|
+
{ label: 'Step 2 (Accounts)', value: 'Dana sets a 100% employer match up to 5% of pay on her 401(k), and schedules brokerage contributions.' },
|
|
48
|
+
{ label: 'Step 3 (Results)', value: 'Dana views her FI Number and SWR target (4%) on the Results page.' },
|
|
49
|
+
],
|
|
50
|
+
summary: 'Dana\'s plan now reflects realistic, compounding career growth rather than flat, static savings.',
|
|
51
|
+
},
|
|
52
|
+
{ type: 'heading', text: 'Common mistakes' },
|
|
53
|
+
{
|
|
54
|
+
type: 'list',
|
|
55
|
+
items: [
|
|
56
|
+
'Entering nominal raises in the real raise field. Use the raise above inflation, not the total expected raise.',
|
|
57
|
+
'Turning on a contribution schedule and forgetting that it replaces the flat annual contribution.',
|
|
58
|
+
'Putting an employer match on an IRA. Matches belong on employer retirement accounts such as a 401(k) or 403(b).',
|
|
59
|
+
],
|
|
60
|
+
},
|
|
61
|
+
{ type: 'heading', text: 'Where this shows up in RetireGolden' },
|
|
62
|
+
{
|
|
63
|
+
type: 'prose',
|
|
64
|
+
md: 'Each section has context-specific fields: **Real raise rate** in Income, **Employer match** and **Schedule contributions over time** in Accounts, the **Coast check: stop contributing** template in Scenarios, and the **Path to Financial Independence (FIRE)** chart card in Results.',
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "How to read a retirement projection" - a Start Here P0 article.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { LearningArticle } from '../learningRegistry'
|
|
6
|
+
|
|
7
|
+
export const howToReadProjectionArticle: LearningArticle = {
|
|
8
|
+
slug: 'how-to-read-a-retirement-projection',
|
|
9
|
+
title: 'How to read a retirement projection',
|
|
10
|
+
description: 'What the lines, balances, and end-of-plan numbers in a projection actually tell you.',
|
|
11
|
+
category: 'start-here',
|
|
12
|
+
tags: ['projection', 'cash flow', 'results', 'shortfall', 'net worth'],
|
|
13
|
+
audience: 'beginner',
|
|
14
|
+
status: 'ready',
|
|
15
|
+
lastReviewed: '2026-06-19',
|
|
16
|
+
reviewCadence: 'stable',
|
|
17
|
+
sourceUrls: [],
|
|
18
|
+
relatedArticles: [
|
|
19
|
+
'todays-dollars-vs-future-dollars',
|
|
20
|
+
'reading-the-results-page',
|
|
21
|
+
'understanding-monte-carlo-success-rate',
|
|
22
|
+
'what-retiregolden-models',
|
|
23
|
+
],
|
|
24
|
+
relatedPlannerRoutes: ['/plan/:planId/results', '/plan/:planId/monte-carlo', '/plan/:planId/assumptions'],
|
|
25
|
+
currentYearSensitive: false,
|
|
26
|
+
priority: 'P0',
|
|
27
|
+
featured: true,
|
|
28
|
+
blocks: [
|
|
29
|
+
{
|
|
30
|
+
type: 'prose',
|
|
31
|
+
md: 'A retirement projection is not a forecast of what will happen. It is a year-by-year story of what could happen **if your assumptions are close enough**. The useful question is not "is this exact?" It is "what is driving the result?"',
|
|
32
|
+
},
|
|
33
|
+
{ type: 'heading', text: 'Quick takeaways' },
|
|
34
|
+
{
|
|
35
|
+
type: 'list',
|
|
36
|
+
items: [
|
|
37
|
+
'Start with the **spending gap**: what income covers, and what the portfolio must cover.',
|
|
38
|
+
'Then look for the first stress year: a shortfall, a tax spike, a healthcare jump, or a balance that falls faster than expected.',
|
|
39
|
+
'Read the final number as a comparison tool, not a promise about your exact future wealth.',
|
|
40
|
+
],
|
|
41
|
+
},
|
|
42
|
+
{ type: 'heading', text: 'The basic idea' },
|
|
43
|
+
{
|
|
44
|
+
type: 'prose',
|
|
45
|
+
md: 'A projection turns your inputs into a ledger. Each year starts with balances, adds income and investment growth, subtracts spending, taxes, premiums, debt, and withdrawals, then carries the remaining balances into the next year.\n\nThat simple rhythm matters because retirement plans usually fail in the middle, not on the last line. A plan can look fine at age 67 and strain at age 74 because Social Security is delayed, healthcare changes, Roth conversions raise income, or early market losses leave fewer dollars to recover.',
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
type: 'figure',
|
|
49
|
+
image: { src: '/learn/images/projection-flow.webp' },
|
|
50
|
+
caption:
|
|
51
|
+
'A projection turns account and income inputs into yearly balances, spending needs, taxes, healthcare costs, and possible stress points.',
|
|
52
|
+
alt: 'Teal income and account streams flow into stacked account buckets, then branch toward spending, tax, healthcare, and warning symbols across a retirement timeline.',
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
type: 'scenario',
|
|
56
|
+
name: 'The Patel household',
|
|
57
|
+
assumptions: [
|
|
58
|
+
{ label: 'Spending need', value: '$90,000 a year in today\'s dollars' },
|
|
59
|
+
{ label: 'Income floor', value: '$55,000 from Social Security and a pension' },
|
|
60
|
+
{ label: 'Portfolio role', value: 'Cover the $35,000 annual gap, taxes, and one-time goals' },
|
|
61
|
+
],
|
|
62
|
+
summary:
|
|
63
|
+
'Their projection is not mainly about the final balance. It is about whether the portfolio can cover a **$35,000** yearly gap plus taxes without creating a shortfall too early.',
|
|
64
|
+
},
|
|
65
|
+
{ type: 'heading', text: 'Follow the cash gap first' },
|
|
66
|
+
{
|
|
67
|
+
type: 'prose',
|
|
68
|
+
md: 'The most important line is often the gap between spending and income. If income covers most spending, the portfolio has a lighter job. If income starts later or spending is front-loaded, the portfolio has to bridge more years.',
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
type: 'formula',
|
|
72
|
+
expression: 'portfolio gap = spending + taxes + penalties + contributions - income',
|
|
73
|
+
where: [
|
|
74
|
+
{ symbol: 'spending', meaning: 'base spending, goals, healthcare, insurance premiums, and debt service' },
|
|
75
|
+
{ symbol: 'income', meaning: 'wages, Social Security, pensions, annuities, and other income streams' },
|
|
76
|
+
{ symbol: 'portfolio gap', meaning: 'the rough amount accounts must cover before the withdrawal-order details' },
|
|
77
|
+
],
|
|
78
|
+
basis: 'nominal',
|
|
79
|
+
note: 'The app uses the full annual ledger, account order, taxable gains, RMDs, Roth conversions, and surplus investing. This quick formula is only a reading aid.',
|
|
80
|
+
},
|
|
81
|
+
{ type: 'heading', text: 'Read the projection in layers' },
|
|
82
|
+
{
|
|
83
|
+
type: 'table',
|
|
84
|
+
caption: 'A practical order for reading a projection.',
|
|
85
|
+
columns: ['Layer', 'Question to ask', 'What to look for'],
|
|
86
|
+
rows: [
|
|
87
|
+
['Inputs', 'Does the plan describe the household accurately?', 'Ages, spending, retirement dates, accounts, Social Security, and assumptions'],
|
|
88
|
+
['Cash flow', 'Which years need portfolio withdrawals?', 'Income vs spending, taxes, healthcare, goals, and debt'],
|
|
89
|
+
['Balances', 'Which account types are doing the work?', 'Taxable, traditional, Roth, HSA, cash, and whether one bucket empties early'],
|
|
90
|
+
['Stress points', 'Where does the plan bend?', 'Shortfalls, depletion year, tax spikes, MAGI jumps, or sudden spending increases'],
|
|
91
|
+
['Ending value', 'What is left at the end?', 'Ending investable assets, net worth, and after-tax estate for comparisons'],
|
|
92
|
+
],
|
|
93
|
+
},
|
|
94
|
+
{ type: 'heading', text: 'Why it matters in RetireGolden' },
|
|
95
|
+
{
|
|
96
|
+
type: 'prose',
|
|
97
|
+
md: 'RetireGolden gives you both the summary view and the year-by-year detail. The summary tells you whether the plan lasts through the modeled horizon. The detail shows **why**. When the headline result surprises you, the table is usually where the explanation lives.',
|
|
98
|
+
},
|
|
99
|
+
{ type: 'heading', text: 'Common mistakes' },
|
|
100
|
+
{
|
|
101
|
+
type: 'list',
|
|
102
|
+
items: [
|
|
103
|
+
'Treating the final balance as the only grade on the plan.',
|
|
104
|
+
'Ignoring whether numbers are shown in today\'s dollars or nominal dollars.',
|
|
105
|
+
'Missing one-time stress years because the long-term ending value still looks comfortable.',
|
|
106
|
+
'Comparing two plans without checking whether assumptions changed at the same time.',
|
|
107
|
+
],
|
|
108
|
+
},
|
|
109
|
+
{ type: 'heading', text: 'Where to use this in the app' },
|
|
110
|
+
{
|
|
111
|
+
type: 'prose',
|
|
112
|
+
md: 'Use this reading order on the **Results** screen first. Then use **Monte Carlo** to ask how the same plan behaves when returns and inflation vary, and **Scenarios** to compare deliberate changes side by side.',
|
|
113
|
+
},
|
|
114
|
+
],
|
|
115
|
+
}
|