73 lines
3.5 KiB
Text
73 lines
3.5 KiB
Text
#!srfv1
|
||
# Pre-retirement projection: target spending with explicit
|
||
# retirement_target override anchored on an INFEASIBLE cell.
|
||
#
|
||
# Same household and balance sheet as `pre-retirement-spending/`, but
|
||
# with a much higher `target_spending` ($2.4M/yr) AND a horizon
|
||
# annotation that pins the headline to a (horizon × confidence) pair
|
||
# that turns out to be infeasible within the 50-year accumulation
|
||
# search cap.
|
||
#
|
||
# This example exists to demonstrate two things:
|
||
#
|
||
# 1. The explicit `retirement_target` override on a horizon record.
|
||
# Without it, the default rule would walk horizons longest →
|
||
# shortest at 99% confidence; with it, the user picks exactly
|
||
# which (horizon × confidence) cell drives the Accumulation
|
||
# phase block headline.
|
||
#
|
||
# 2. The "not feasible" rendering path. When the annotated cell
|
||
# returns no value of `accumulation_years` ≤ 50 that sustains
|
||
# the target spending, the headline retirement line renders
|
||
# "Years until possible retirement: not feasible" instead of a
|
||
# date. The full Earliest retirement grid still renders below
|
||
# so the user can see which cells DO work and pick a different
|
||
# anchor if they want.
|
||
#
|
||
# Validation rules (enforced at parse time):
|
||
# - At most ONE horizon may carry a `retirement_target` annotation.
|
||
# Two or more drops them all (warning logged) and the default
|
||
# rule applies.
|
||
# - Allowed `retirement_target` values: 90, 95, 99. Anything else
|
||
# drops the annotation on that record (warning logged).
|
||
# - The annotation rides on `horizon:num:N` or `horizon_age:num:N`
|
||
# records identically. When on a `horizon_age` record, the
|
||
# annotation survives age-resolution into the resolved horizon.
|
||
|
||
# Asset allocation target (80% stocks / 20% bonds — typical pre-retirement)
|
||
type::config,target_stock_pct:num:80
|
||
|
||
# Distribution-phase horizons. The 50-year horizon (resolved from
|
||
# `horizon_age:num:95`) is the user's preferred planning anchor —
|
||
# they want to see whether retirement is achievable at maximum
|
||
# conservatism (99% confidence) over the longest distribution
|
||
# phase. With the high target_spending below, this cell turns out
|
||
# to be INFEASIBLE within the 50-year search cap. The headline
|
||
# retirement line reflects that honestly: "not feasible". The
|
||
# Earliest grid below still renders the full matrix so the user can
|
||
# see which horizon × confidence pairs DO work.
|
||
type::config,horizon:num:25
|
||
type::config,horizon:num:35
|
||
type::config,horizon_age:num:95,retirement_target:num:99
|
||
|
||
# Annual household contribution to retirement accounts
|
||
type::config,annual_contribution:num:80000
|
||
type::config,contribution_inflation_adjusted:bool:true
|
||
|
||
# Target retirement spending — set deliberately high so the
|
||
# longest-horizon × highest-confidence cell falls outside the 50-year
|
||
# search cap. This is what produces the "not feasible" headline AND
|
||
# the mixed feasible/infeasible cells visible in the grid.
|
||
type::config,target_spending:num:2400000
|
||
type::config,target_spending_inflation_adjusted:bool:true
|
||
|
||
# Birthdates (drives life-event ages even without retirement_age)
|
||
type::birthdate,date::1981-04-12
|
||
type::birthdate,date::1983-09-08,person:num:2
|
||
|
||
# Social Security at age 70 (more conservative claim age)
|
||
type::event,name::Social Security (Pat),start_age:num:70,person:num:1,amount:num:38400
|
||
type::event,name::Social Security (Sam),start_age:num:70,person:num:2,amount:num:36000
|
||
|
||
# College tuition for the kids — 4-year overlap when Pat is age 50-53
|
||
type::event,name::College Tuition,start_age:num:50,person:num:1,duration:num:4,amount:num:-55000
|