# todo Everything in the previous list is done — the original wording is in git history (`git show d2bc2e9:todo.md`). What landed, and what is still open, below. ## Done - **Yearly periods keep their weekday.** A Mon–Sun week recurs as Mon–Sun, not as the same two calendar dates landing mid-week. Fixed periods only; flexible ones already re-place themselves each year. — `224fe7a` - **Red days cost nothing, and now there is a switch.** A test states outright that a full week off spends nothing on the Saturday, the Sunday or a holiday. A workspace setting, off by default, lets parental benefit be drawn on those days for the money; it never reaches for a vacation day, which is not legally possible there. — `b87ad0e` - **Calendar cells never resize.** A long holiday name no longer squeezes its week's row, and every row is the same height. — `f0f537c` - **Presets mean both parents, in long stretches.** Two-parent households default to being off together, and the funding switches once per period (3+3 over six weeks) instead of flipping daily. — `f76de7b` - **Today button**, left of the month dropdown. — `1837154` - **FK scraping runs headless again** — `APP_SCRAPER_HEADLESS` in the local, gitignored `backend/.env`. The committed defaults were already correct. - **`how-it-works.md`** — what the profile fields do to the plan. - **Click a holiday to make it a working day**, that date only. — `663d5fc` - **Removing a period offers three scopes**: this day, this year, every year. — `35e479a` - **A hand-drawn period is funded by the planner** by default; pinning an exact day type moved behind Advanced. Double days are now offered in the UI. — `35e479a` - **Two parents can hold the same days.** Saving for the second parent was rewriting the first parent's days. — `35e479a` - **Opening a period shows the dates it actually has**, not the first year's. — `1837154` - **A shortfall funds what it can and says what would close it**, including moving the window onto Easter — the search now covers four weeks either side instead of three days, and the advice is finally rendered. — `11f2a17` - **`dubbeldagar.md`** — answers the question, and corrects half of it. - **Every year of a repeating period is its own row**, linked by a series id, so one year can differ from the rest — Easter moves, and the cheapest week is not the same week every year. — `6d92b87` - **A day removed from a period stays removed**, across every later sync, with the calendar marking it and offering to put it back. — `8cfb9c8` - **The e2e suite runs green**, 20 passed on three consecutive runs. It had never been executed; the first run failed six ways because the test runner tripped the auth rate limiter from a single address. — `e39ec9a` ## Open - **Rate limiting is keyed on the caller's address**, which behind a reverse proxy without forwarded-header handling is the proxy's — so every user would share one 30/minute refresh budget, and `AuthContext.tsx` turns a failed refresh into a silent logout. The e2e suite hit exactly this. Two separable calls: which proxies to trust for `X-Forwarded-For`, and whether a non-401 refresh failure should log someone out or retry. The `catch` there has two identical branches, which reads unfinished. - **A removed day is never cleaned up.** Delete the whole period and the veto rows stay, so a later period covering that date still skips it. Reachable only through that day's popover; there is no list of them. - **Undo after an "every year" edit** restores the anchor's dates across the series rather than each year's previous dates, so per-year divergence from before the edit is lost. Would need a per-edit snapshot. - **`PLANNING_ENGINE_SPEC.md` §2.1/§3.2/§10.2 and parts of `ARCHITECTURE.md`** still describe the single-row recurrence model that no longer exists. - **Dubbeldagar are not outside the 480.** `dubbeldagar.md` sets this out: the 60 are combined for the couple, as assumed, but each parent still spends one of their own days on a doubled date. Nothing in the engine changed on the strength of it — worth confirming against Försäkringskassan before anything is built on the other reading. - **`ParentalLeaveFetch.dubbeldagar_left`** is scraped per parent and read by nothing. Per-parent is the wrong shape for a combined pot. Flagged, not touched.