# TODO Work queued for whoever picks this up next, human or agent. Ordered. Each item says enough to act on without re-deriving the reasoning. **Current state:** merged to `main`. 443 tests passing, `bunx tsc --noEmit` clean, `bun run build` succeeds on both the live-fetch and offline paths. Sections 2, 4 and 7 are DONE. Section 3 (redesign) is 2 of 4 sub-projects in. Section 6 (currencies) is DONE. Every screen has now actually been looked at — see section 5. **Schema is at version 3.** v1 -> v2 made allocation rules a dated series; v2 -> v3 moved currencies into the dataset. Both migrations are behaviour-preserving by construction and tested as such. --- ## 1. ~~Time-versioned allocation rules~~ — DONE, all six tasks **Spec:** `docs/specs/2026-09-02-versioned-allocation-rules-design.md` **Plan:** `docs/plans/2026-09-02-versioned-allocation-rules.md` **Ledger + extracted briefs:** `.superpowers/sdd/2026-09-02-versioned-allocation-rules/` | Task | What | Commit | |---|---|---| | 1 | `Post.rules: RuleVersion[]` replaces `standingRule` | `68712e7` | | 2 | v1 -> v2 migration | `15dcf93`, `1214d2b` | | 3 | `setRuleFrom` / `removeRuleFrom` actions | `de128e3` | | 4 | JSON import validation for the rule series | `1cb91d3` | | 5 | Rule-history editor in Settings | `e3023d0` | | 6 | "Change from here" control in the month view | `f94e458` | Tasks 3-6 were executed by hand rather than dispatched. Every deviation from the briefs is recorded in the ledger's task log with its reasoning; four of them fixed real defects in the brief code (JSX that would not compile, a component that pre-filled the previous post's rule, a number field that could not be cleared, and missing validation that let a NaN allocation into the fold). Worth a read before reviewing the diff. Not yet done for this feature: nobody has independently reviewed tasks 3-6, and no browser has seen the two new editing surfaces. ## 2. ~~Baked FX rates~~ — DONE (`b4e1933`) So a fresh install can convert a EUR purchase on day one instead of erroring. Built as designed, all three build paths verified (live fetch, unreachable endpoint, `SKIP_FX_FETCH=1`), and confirmed in the real UI: Settings shows USD 6.449532 / EUR 7.474959 as `manual · 2026-09-01` on a fresh dataset. The reasoning below is kept because it is the reasoning, not a plan. - `build.ts` fetches DKK/USD/EUR at build time and embeds them via `define`; on any network failure it falls back to **committed constants** rather than failing the build. Fetched rates get `source: "api"` with the build date; the fallback constants get `source: "manual"`, so Settings never claims a hardcoded number came from an API. - They **seed a new dataset only**. They must NOT act as a fallback whenever a rate is missing — that would undo a deliberate decision: clearing a rate removes the row so `MissingRateError` surfaces, instead of silently converting money at a number the user never chose. - Domain purity forces the shape: `createSeedDataset` takes the rates as an **argument**; the env read lives in a new `src/store/bakedRates.ts`, in the store layer, using the `try/catch` accessor pattern (see AGENTS.md gotchas). ## 3. Visual redesign — sub-projects 1 and 2 of 4 DONE The owner's words: *"right now it looks a bit boring, simple and ugly. We want sleek, modern, and nice to use."* Then, on scoping: both themes with a toggle, a full rethink of every screen, purchases compact and grouped by date, ship a webfont — and *"override everything you want for this step."* **Spec:** `docs/specs/2026-09-02-design-foundation-design.md` **The diagnosis, which should shape the rest:** a design system already existed and was never wired up. `src/index.css` defined the paper/ink/teal palette with a contract document behind it, while the app painted shadcn's default white and near-black. The tokens reached the screen in two places only. Doing the foundation last is how that happened; do not repeat it. | # | Sub-project | State | |---|---|---| | 1 | Design foundation — two-theme tokens, theme toggle, self-hosted Inter + JetBrains Mono, one Section/Stat card, table furniture | DONE (`bb3c661`) | | 2 | Month view | DONE. Date-grouped purchases (`a159189`), then the header, the post rows and the carry meter | | 3 | Year, Summary, Post detail | on the new foundation but not rethought. The 12-month matrix only fits by scrolling — decide whether compact number formatting replaces that | | 4 | Dialogs and fast entry | untouched. Native `