{"model":"salary-jump","specVersion":"1.0.1","specUrl":"/api/v1/models/salary-jump/spec","inputs":{"currentSalary":{"kind":"float","min":30000,"max":500000},"newSalary":{"kind":"float","min":30000,"max":500000},"currentAge":{"kind":"int","min":22,"max":60},"retirementAge":{"kind":"int","min":45,"max":75},"currentSavings":{"kind":"float","min":0,"max":1000000},"currentSavingsRate":{"kind":"float","min":0.01,"max":0.5},"newSavingsRate":{"kind":"float","min":0.01,"max":0.5},"annualReturn":{"kind":"float","min":0.02,"max":0.15},"marginalTaxRate":{"kind":"float","min":0.1,"max":0.5}},"arrayInputs":{},"constraints":["retirementAge must exceed currentAge"],"sentinels":[{"field":"currentFireYears","value":50,"meaning":"FIRE not reached within the 600-month loop (intermediate; clamps fireYearsGained)"},{"field":"newFireYears","value":50,"meaning":"FIRE not reached within the 600-month loop (intermediate; clamps fireYearsGained)"}],"facts":[],"disclaimer":"Illustrative planning model, not financial advice. Outputs follow the published model spec exactly; read the spec for assumptions and exclusions before relying on any number."}