#!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