diff --git a/PLAYBOOK_VIKTOR.md b/PLAYBOOK_VIKTOR.md index 0f847a8..d29ebe1 100644 --- a/PLAYBOOK_VIKTOR.md +++ b/PLAYBOOK_VIKTOR.md @@ -1,5 +1,17 @@ # Viktor's UK-exit playbook — derived from fire-planner runs +> ⚠️ **Partially superseded (2026-06).** This 2026-04-26 run anchors on +> Cyprus, NW £1.5M, and £60k spend. Later decisions moved the base case to +> **Bulgaria**, the real measured NW is **~£1.13M** (not the aspirational +> £1.5M), and the real spend floor is **~£40k** (the £60k was padding). Also, +> the simulator now **drains tax from the portfolio** (since 2026-05), so the +> old "success rate is regime-invariant" claim below is **no longer true** — +> jurisdiction now moves the FIRE number. The live, current view is the +> **"FIRE Countdown"** section of the wealth Grafana dashboard, backed by the +> `fire_target` table (see `CONTEXT.md` + `docs/adr/0001`). Treat the tax- +> optimisation playbook (§3) as still useful, but re-validate the headline +> numbers against the dashboard. + **Run date**: 2026-04-26 **Working anchor**: NW £1.5M today, £60k/yr real spending target, £40k floor, target departure 2027–2028 (year 1 or 2 from today), diff --git a/README.md b/README.md index b6eb946..1554481 100644 --- a/README.md +++ b/README.md @@ -17,9 +17,14 @@ strategy, and "year you break UK tax residency". - `simulator.py` — vectorised NumPy MC engine - `scenarios.py` — Cartesian product over (jurisdiction × strategy × leave-UK-year × glide) + - `spend_model.py` — per-Case real-GBP spend, COL-scaled per country (the + FIRE-countdown cases: Solo / Household / Family) + - `geo.py` — COL city → tax jurisdiction + - `fire_target.py` — solves each Case's "FIRE number" (smallest liquid NW + where Guyton-Klinger hits the 99% bar); see `docs/adr/0001` - `app.py` — FastAPI on-demand `/recompute` - `__main__.py` — `click` CLI: `ingest`, `simulate`, `recompute-all`, - `migrate` + `recompute-fire-targets`, `migrate` ## Common commands @@ -37,11 +42,15 @@ DB_CONNECTION_STRING=postgresql+asyncpg://... alembic upgrade head DB_CONNECTION_STRING=... python -m fire_planner ingest DB_CONNECTION_STRING=... python -m fire_planner simulate --scenario=cyprus-vpw-leave-y3 DB_CONNECTION_STRING=... python -m fire_planner recompute-all + +# Solve the FIRE-countdown targets (per Case × country) for the wealth +# Grafana dashboard's "FIRE Countdown" section: +DB_CONNECTION_STRING=... python -m fire_planner recompute-fire-targets --countries all ``` ## Schema -Six tables in `fire_planner` schema on `pg-cluster-rw`: +Core tables in `fire_planner` schema on `pg-cluster-rw`: - `account_snapshot` — daily NW per account (Wealthfolio) - `scenario` — Cartesian-product scenario definition @@ -49,3 +58,5 @@ Six tables in `fire_planner` schema on `pg-cluster-rw`: - `mc_path` — sparse storage (top decile, bottom decile, median) - `projection_yearly` — deterministic point projection per scenario - `scenario_summary` — denormalised fast-read for Grafana +- `fire_target` — solved FIRE number per (Case × country × with-home) for the + "FIRE Countdown" section of the wealth Grafana dashboard