Repository navigation
Releases: LemurTech/Net-Worth-Navigator
Release list
Net Worth Navigator v2.1.0
What's new
- Event cards in the Setup Panel's Events tab show more at a glance: Spending Shift events display their annual spending amount, and Retirement / End of Plan events show the age each person will be at that event.
Bug fixes
- Editing an event no longer duplicates it in the scenario's TOML file.
- Start Year no longer appears blank when editing Spending Shift, Education, or Career Break events.
- Fixed a render crash (
KeyError: 'year') for scenarios whose Spending Shift events store their start year asstart_year— these shifts also now take effect starting in the correct year. - Market Assumptions fields (Stock Return, Bond Return, Inflation, Equity Alloc) no longer reject normal percentage entries with a "must be less than or equal to 1" message.
Housekeeping
- Removed the non-functional Clones badge from the README.
No config or scenario changes needed — existing scenarios carry over unchanged.
v2.0.2
v2.0.2 — Security hardening
Security & robustness
- API error responses no longer expose internal exception details or stack traces — the details now go to the server log instead (from GitHub CodeQL findings).
- The scenario-migration report no longer prints Social Security benefit amounts (privacy).
Dependency updates
- Updated build-time dependencies for the User Guide to patched versions: js-yaml, nanoid, postcss.
No config or TOML changes — nothing to migrate.
v2.0.1
v2.0.1 — Social Security paste fix
Bugfixes since v2.0.0
- Fixed: a Social Security benefit table (ages 62–70) pasted into the Setup Panel's Raw TOML tab was silently discarded on Save. It now persists exactly as entered — paste it in, hit Save, done.
v2.0.0
✨ v2.0 is here: an event-driven planning workflow
v2 changes how you model the big timeline decisions. Retirement, Social Security claiming, and each person's modeled end of plan are no longer buried in per-person settings — they're explicit, editable events on one shared timeline, managed in a visual Events workspace.
The Scenario Setup panel grew from three tabs to six — Metadata · Social Security · Income & Contributions · Accounts · Events · Raw TOML — and now exposes the full supported settings surface: Social Security benefit tables, per-person income and contribution controls, accounts and liabilities, advanced tax/spending/RMD and simulation settings. For normal scenario setup, direct TOML editing is no longer required.
🛟 Migration assistance
Existing v1 scenarios keep running with legacy fallbacks, but to get full v2 behavior (Social Security income, modeled plan boundaries) they should be migrated. The Setup Panel shows a migration banner on any scenario still in the old format, listing exactly what's missing and linking to step-by-step instructions in the User Guide: back up your scenarios/ folder, run scripts/migrate_v2.py (preview safely with --dry-run), and verify in the Events tab. The script is idempotent, so re-running is harmless.
What's new
- Event-driven timeline —
Retire,SocialSecurity, andEndOfPlanevents replace the old per-person timeline fields; age-based forms compute the year for you - Events workspace — add, edit, delete, enable/disable, and sort every event from the Setup Panel
- Social Security tab — benefit-by-age table editor per person, with automatic benefit lookup at the claiming age (no more stored snapshots that silently go stale)
- Income & Contributions tab — per-person pay, contribution method (flat or percent-of-gross), employer match, IRA routing, 401(k) split, and ownership shares
- Liabilities CRUD — add, edit, and delete liabilities in the Accounts tab, with synthetic balances kept in sync
- Advanced settings — spending baseline, taxes and RMDs, assumptions, and full simulation/Monte Carlo controls (render modes, run count, seed, volatility, historical returns)
- Read-only sample scenarios — bundled samples can't be overwritten; clone them to make them yours
- Projection freshness — every projection page shows the version tag and a render timestamp
- Single-person support hardening — Person 2 settings can no longer leak into single-person scenarios; survivor-only controls are couple-only
Bug fixes since v1.8.4
- Single-person scenarios are no longer misdetected as couples by the Setup Panel
- Sample scenarios are write-protected server-side (every edit path rejected) while still allowing re-render
event.enablednow defaults consistently to true across the engine- Percentage inputs no longer show floating-point artifacts (e.g.
3.5000000000000004) - Removed the dark shadow artifact that scrolled across projection table headers
- Setup Panel API errors now show the real message instead of a generic failure
- Fixed the Setup Panel render subprocess using the wrong Python on Windows
- Removed dead editor fields (BuyHome mortgage fields, Education person scope) that the model never read
- Projection subtitle no longer implies Monarch data for synthetic or imported scenarios
- Stored Social Security benefit values no longer go stale — benefits are resolved live and validated before a run
Tests: 238 passing, 1 skipped; the CI test gate runs on every push to main and every pull request.
v1.8.4
v1.8.4 — Windows Monarch bridge path fix
Bug fix. Backward-compatible — no TOML schema changes.
Fixed
- Monarch fetch fails on Windows with
SyntaxError: truncated \UXXXXXXXX escape—monarch_bridge.pyembedded the MCP install path into the generated inline fetch script withstr(), placing backslashed Windows paths (C:\Users\...) inside a string literal in the generated source. Any install under a user directory (viaMONARCH_MCP_PATH) broke every live Monarch pull; other sequences (\t,\r,\b) corrupted the path silently. The path is now embedded withPath.as_posix()(forward slashes — accepted on Windows, byte-identical no-op on POSIX). - New regression test —
tests/test_monarch_bridge.pypins the embedded path form: a Windows-gated repro test (red on the unfixed code, green after the fix) plus a platform-independent compile check.
Thanks to Ben Wendell for the report and fix.
Files changed: src/monarch_bridge.py, tests/test_monarch_bridge.py
v1.8.3
v1.8.3 — URL prefix, exception handling, and filesystem fixes
Bug fixes for other-environment deployments. All changes are backward-compatible — no TOML schema changes.
Fixed
- URL prefix missing in generated links —
_public_urls()produced URLs without the/finances/nginx proxy prefix (e.g./projection.html→/finances/projection.html). AddedNWN_PUBLIC_PATH_PREFIXenv var; default is/financesfor backward compat, set to empty string for direct localhost deployments) - "Internal Server Error" JSON parse crash —
api_save_quick_controls()had no exception handler around its main logic; any error returned FastAPI's plain-text 500 page instead of JSON, crashing the JS client. Now returns proper JSON error responses (404/400/500) apiGet()andapiPost()silent crash on non-JSON — both calledr.json()without checkingresponse.okor content-type. Now validate both before parsing[Errno 9] Bad file descriptor—os.fsync()on read-only file descriptors fails under Docker overlay2 and NFS filesystems. Wrapped both fsync calls in try/except OSError (best-effort flush)- Shell page iframe shows
{"detail":"Not Found"}—projectionUrlFor()built bare relative URLs that resolved incorrectly from sub-path shell pages. Now usesnew URL(path, window.location.href)for correct resolution in all deployment modes - Compare page sidecar URLs wrong —
sidecarBase()used bare relative paths; samenew URL()fix /compare.htmland/finances/scenariosnot served by FastAPI — added missing route and StaticFiles mount for direct deployments without nginx
Files changed: admin_app.py, run.py, src/scenario_shell.py, src/version.py, templates/setup_panel.html