diff --git a/docs/DECISIONS.md b/docs/DECISIONS.md index 18baca8..54b9290 100644 --- a/docs/DECISIONS.md +++ b/docs/DECISIONS.md @@ -228,8 +228,8 @@ Not oversights. Each was decided against, and reopening one needs a reason. amounts are all **allowed**. Adding validation is a regression. → [`AGENTS.md`](../AGENTS.md) §3 - The income field and the split editor's fixed-amount fields **do not parse a - currency**; only the purchase total does. → [`TODO.md`](TODO.md) §3 + currency**; only the purchase total does. → [`TODO.md`](TODO.md) §5 - **No currency picker.** Adding a currency means typing code, name, symbol and - decimals by hand. → [`TODO.md`](TODO.md) §3 + decimals by hand. → [`TODO.md`](TODO.md) §5 - **Symbol collisions resolve to the first currency defined with that symbol.** - Tested and documented rather than solved. → [`TODO.md`](TODO.md) §3 + Tested and documented rather than solved. → [`TODO.md`](TODO.md) §5 diff --git a/docs/TODO.md b/docs/TODO.md index 69afe54..5ea03a4 100755 --- a/docs/TODO.md +++ b/docs/TODO.md @@ -8,15 +8,19 @@ decisions behind it are in `docs/specs/` — one spec per sub-project, each recording the alternatives that were rejected. Rules that outlived their task moved to `AGENTS.md`. -**Current state:** merged to `main`. 661 tests passing, -`bunx tsc --noEmit` clean, `bun run build` succeeds on both the live-fetch and -offline paths. +**Current feature worktree state:** budget folders and recurring cost placement +are implemented. +707 tests passing across 54 files. `bunx tsc --noEmit` is clean; +`bun run --bun build` succeeds using the committed seed rates when live-fetch +is unavailable. The runtime override bypasses a broken local Bun shim. -**Schema is at version 7.** v1 -> v2 made allocation rules a dated series; +**Schema is at version 8.** v1 -> v2 made allocation rules a dated series; v2 -> v3 moved currencies into the dataset; v3 -> v4 drops a stored rate-service URL that can no longer work; v4 -> v5 adds sterling to an existing dataset; v5 -> v6 collapses per-currency decimals into one dataset-wide setting; v6 -> v7 -adds `Dataset.recurring`. All six are behaviour-preserving by construction — +adds `Dataset.recurring`; v7 -> v8 adds budget folders and assigns existing +posts and recurring bills a deterministic mixed sibling order under Unfiled. +All seven are behaviour-preserving by construction — not one changes a stored figure — and are tested as such. A migration applies **on load, in memory**; it is written back on the next @@ -27,7 +31,24 @@ IndexedDB instead of the app. --- -## 1. Visual redesign, sub-project 3 — Year, Summary, Post detail +## 1. Folder rename blur during an in-flight save + +A folder name draft can remain unsaved if the owner changes it while a rename +save is in flight and then blurs the field before that save finishes. Preserve +the newer draft and ensure the blur requests a subsequent save after the pending +write completes. Cover the delayed-write sequence with a UI interaction test, +including the final persisted name and any surfaced write error. + +## 2. Recurring split editor interaction coverage + +`RecurringSplitEditor` has coverage for destination selection and dedicated post +creation, but its rendered split mode and value controls lack a focused +interaction test. Exercise the real controls to switch percentage/fixed mode +and edit a split value, then assert the resulting splits and remainder behavior. +Keep this scoped to the editor's user interaction; domain split calculations +already have their own tests. + +## 3. Visual redesign, sub-project 3 — Year, Summary, Post detail The owner's brief for the whole redesign: *"right now it looks a bit boring, simple and ugly. We want sleek, modern, and nice to use."* On scoping: both @@ -67,7 +88,7 @@ than re-decide** (spec: `2026-09-02-month-view-design.md`): phone. `formatMoney` is still right wherever an amount can be in some other currency — every purchase row, for one. -## 2. Visual redesign, sub-project 4 — dialogs and fast entry +## 4. Visual redesign, sub-project 4 — dialogs and fast entry Untouched. Native `