Skip to content

Releases: LemurTech/Net-Worth-Navigator

Net Worth Navigator v2.1.0

Choose a tag to compare

@LemurTech LemurTech released this 03 Sep 17:14

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 as start_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

Choose a tag to compare

@LemurTech LemurTech released this 28 Aug 14:13

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

Choose a tag to compare

@LemurTech LemurTech released this 28 Aug 04:36

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

Choose a tag to compare

@LemurTech LemurTech released this 10 Aug 23:58

✨ 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, and EndOfPlan events 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.enabled now 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

Choose a tag to compare

@LemurTech LemurTech released this 03 Aug 00:21

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.py embedded the MCP install path into the generated inline fetch script with str(), placing backslashed Windows paths (C:\Users\...) inside a string literal in the generated source. Any install under a user directory (via MONARCH_MCP_PATH) broke every live Monarch pull; other sequences (\t, \r, \b) corrupted the path silently. The path is now embedded with Path.as_posix() (forward slashes — accepted on Windows, byte-identical no-op on POSIX).
  • New regression test — tests/test_monarch_bridge.py pins 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

Choose a tag to compare

@LemurTech LemurTech released this 21 Jul 01:55

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). Added NWN_PUBLIC_PATH_PREFIX env var; default is /finances for 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() and apiPost() silent crash on non-JSON — both called r.json() without checking response.ok or 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 uses new URL(path, window.location.href) for correct resolution in all deployment modes
  • Compare page sidecar URLs wrong — sidecarBase() used bare relative paths; same new URL() fix
  • /compare.html and /finances/scenarios not 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