From edce11dd78baea0820830dd0d79ad3385391bdc1 Mon Sep 17 00:00:00 2001 From: Jean-Luc Makiola Date: Mon, 16 Mar 2026 23:32:04 +0100 Subject: [PATCH] chore: complete v1.1 milestone Archive v1.1 Calendar & Polish milestone artifacts (roadmap, requirements, phase directories) to milestones/. Evolve PROJECT.md with validated requirements and new key decisions. Update RETROSPECTIVE.md with v1.1 section and cross-milestone trends. Co-Authored-By: Claude Opus 4.6 --- .planning/MILESTONES.md | 17 +++ .planning/PROJECT.md | 47 ++++---- .planning/RETROSPECTIVE.md | 56 +++++++++- .planning/ROADMAP.md | 64 +++-------- .planning/STATE.md | 61 ++++------ .planning/config.json | 2 +- .../v1.1-REQUIREMENTS.md} | 9 ++ .planning/milestones/v1.1-ROADMAP.md | 81 ++++++++++++++ .../05-calendar-strip/05-01-PLAN.md | 0 .../05-calendar-strip/05-01-SUMMARY.md | 0 .../05-calendar-strip/05-02-PLAN.md | 0 .../05-calendar-strip/05-02-SUMMARY.md | 0 .../05-calendar-strip/05-VERIFICATION.md | 0 .../05-calendar-strip/5-CONTEXT.md | 105 ++++++++++++++++++ .../06-task-history/06-01-PLAN.md | 0 .../06-task-history/06-01-SUMMARY.md | 0 .../06-task-history/06-CONTEXT.md | 0 .../06-task-history/6-VERIFICATION.md | 0 .../07-task-sorting/07-01-PLAN.md | 0 .../07-task-sorting/07-01-SUMMARY.md | 0 .../07-task-sorting/07-02-PLAN.md | 0 .../07-task-sorting/07-02-SUMMARY.md | 0 .../07-task-sorting/07-CONTEXT.md | 0 .../07-task-sorting/7-VERIFICATION.md | 0 24 files changed, 319 insertions(+), 123 deletions(-) rename .planning/{REQUIREMENTS.md => milestones/v1.1-REQUIREMENTS.md} (94%) create mode 100644 .planning/milestones/v1.1-ROADMAP.md rename .planning/{phases => milestones/v1.1-phases}/05-calendar-strip/05-01-PLAN.md (100%) rename .planning/{phases => milestones/v1.1-phases}/05-calendar-strip/05-01-SUMMARY.md (100%) rename .planning/{phases => milestones/v1.1-phases}/05-calendar-strip/05-02-PLAN.md (100%) rename .planning/{phases => milestones/v1.1-phases}/05-calendar-strip/05-02-SUMMARY.md (100%) rename .planning/{phases => milestones/v1.1-phases}/05-calendar-strip/05-VERIFICATION.md (100%) create mode 100644 .planning/milestones/v1.1-phases/05-calendar-strip/5-CONTEXT.md rename .planning/{phases => milestones/v1.1-phases}/06-task-history/06-01-PLAN.md (100%) rename .planning/{phases => milestones/v1.1-phases}/06-task-history/06-01-SUMMARY.md (100%) rename .planning/{phases => milestones/v1.1-phases}/06-task-history/06-CONTEXT.md (100%) rename .planning/{phases => milestones/v1.1-phases}/06-task-history/6-VERIFICATION.md (100%) rename .planning/{phases => milestones/v1.1-phases}/07-task-sorting/07-01-PLAN.md (100%) rename .planning/{phases => milestones/v1.1-phases}/07-task-sorting/07-01-SUMMARY.md (100%) rename .planning/{phases => milestones/v1.1-phases}/07-task-sorting/07-02-PLAN.md (100%) rename .planning/{phases => milestones/v1.1-phases}/07-task-sorting/07-02-SUMMARY.md (100%) rename .planning/{phases => milestones/v1.1-phases}/07-task-sorting/07-CONTEXT.md (100%) rename .planning/{phases => milestones/v1.1-phases}/07-task-sorting/7-VERIFICATION.md (100%) diff --git a/.planning/MILESTONES.md b/.planning/MILESTONES.md index 1f4f502..b456ad9 100644 --- a/.planning/MILESTONES.md +++ b/.planning/MILESTONES.md @@ -1,5 +1,22 @@ # Milestones +## v1.1 Calendar & Polish (Shipped: 2026-03-16) + +**Phases completed:** 3 phases, 5 plans, 11 tasks +**Codebase:** 13,031 LOC Dart (9,051 lib + 3,980 test), 108 tests, 41 commits +**Timeline:** 2 days (2026-03-15 to 2026-03-16) + +**Key accomplishments:** +1. Horizontal 181-day calendar strip with German day cards, month boundaries, and floating Today button — replaces the stacked daily-plan HomeScreen +2. Date-parameterized CalendarDao with reactive Drift streams for day tasks and overdue tasks +3. Task completion history bottom sheet with per-task reverse-chronological log +4. Alphabetical, interval, and effort sort options persisted via SharedPreferences +5. SortDropdown widget integrated in both HomeScreen and TaskListScreen AppBars + +**Archive:** See `milestones/v1.1-ROADMAP.md` and `milestones/v1.1-REQUIREMENTS.md` + +--- + ## v1.0 MVP (Shipped: 2026-03-16) **Phases completed:** 4 phases, 13 plans diff --git a/.planning/PROJECT.md b/.planning/PROJECT.md index 7edf973..4027ec2 100644 --- a/.planning/PROJECT.md +++ b/.planning/PROJECT.md @@ -2,24 +2,12 @@ ## What This Is -A local-first Flutter app for organizing household chores, built for personal/couple use on Android. Uses a room-based task scheduling model where users create rooms, add recurring tasks with frequency intervals, and the app auto-calculates the next due date after each completion. Features a daily plan home screen, bundled German-language task templates, room cleanliness indicators, and daily summary notifications. Fully offline, free, privacy-respecting — all data stays on-device. +A local-first Flutter app for organizing household chores, built for personal/couple use on Android. Uses a room-based task scheduling model where users create rooms, add recurring tasks with frequency intervals, and the app auto-calculates the next due date after each completion. Features a horizontal calendar strip home screen with day-by-day task navigation, task completion history, configurable sorting (alphabetical, interval, effort), bundled German-language task templates, room cleanliness indicators, and daily summary notifications. Fully offline, free, privacy-respecting — all data stays on-device. ## Core Value Users can see what needs doing today, mark it done, and trust the app to schedule the next occurrence — without thinking about it. -## Current Milestone: v1.1 Calendar & Polish - -**Goal:** Replace the stacked daily plan with a horizontal calendar strip UI, add task completion history, and task sorting options. - -**Target features:** -- Horizontal date-strip calendar with day abbreviation + date number cards -- Month color shift for visual boundary between months -- Day-selection shows tasks in a list below the strip -- Undone tasks carry over to the next day with color accent (overdue marker) -- Task completion history log -- Additional task sorting (alphabetical, interval, effort) - ## Requirements ### Validated @@ -32,16 +20,16 @@ Users can see what needs doing today, mark it done, and trust the app to schedul - Daily summary notification with configurable time — v1.0 - Light/dark theme with calm Material 3 palette — v1.0 - Cleanliness indicator per room (based on overdue vs on-time) — v1.0 +- Horizontal calendar strip home screen replacing stacked daily plan — v1.1 +- Overdue task carry-over with red/orange visual accent — v1.1 +- Task completion history with per-task reverse-chronological log — v1.1 +- Alphabetical, interval, and effort task sorting with persistence — v1.1 ### Active -- [ ] Horizontal calendar strip home screen (replacing stacked daily plan) -- [ ] Overdue task carry-over with visual accent -- [ ] Task completion history log -- [ ] Additional task sorting (alphabetical, interval, effort) -- [ ] Data export/import (JSON) — deferred -- [ ] English localization — deferred -- [ ] Room cover photos from camera or gallery — deferred +- [ ] Data export/import (JSON) +- [ ] English localization +- [ ] Room cover photos from camera or gallery ### Out of Scope @@ -55,18 +43,22 @@ Users can see what needs doing today, mark it done, and trust the app to schedul - Firebase or any Google cloud services — contradicts local-first design - Real-time cross-device sync — potential future self-hosted feature - Tablet-optimized layout — future enhancement +- Weekly/monthly calendar views — date strip is sufficient for task app +- Drag tasks between days — tasks auto-schedule based on frequency +- Calendar sync (Google/Apple) — contradicts local-first, offline-only design - Statistics & insights dashboard — v2.0 - Onboarding wizard — v2.0 - Custom accent color picker — v2.0 ## Context -- Shipped v1.0 MVP with 10,588 LOC Dart (7,773 lib + 2,815 test), 89 tests -- Tech stack: Flutter + Dart, Riverpod 3 + code generation, Drift 2.31 SQLite, GoRouter, flutter_local_notifications +- Shipped v1.1 with 13,031 LOC Dart (9,051 lib + 3,980 test), 108 tests +- Tech stack: Flutter + Dart, Riverpod 3 + code generation, Drift 2.31 SQLite, GoRouter, flutter_local_notifications, SharedPreferences - Inspired by BeTidy (iOS/Android household cleaning app) — room-based model, no cloud/social - Built for personal use with partner on a shared Android device; may publish publicly later -- Code and comments in English; UI strings German-only for v1.0 +- Code and comments in English; UI strings German-only through v1.1 - Gitea (self-hosted on Hetzner) for version control; no CI/CD pipeline yet +- Dead code from v1.0: daily_plan_providers.dart, daily_plan_task_row.dart, progress_card.dart (DailyPlanDao still used by notification service) ## Constraints @@ -74,7 +66,7 @@ Users can see what needs doing today, mark it done, and trust the app to schedul - **Platform**: Android-first (iOS later) - **Offline**: 100% offline-capable, zero network dependencies - **Privacy**: No data leaves the device, no analytics, no tracking -- **Language**: German-only UI for v1.0, English code/comments +- **Language**: German-only UI through v1.1, English code/comments - **No CI**: No automated build pipeline initially ## Key Decisions @@ -91,6 +83,11 @@ Users can see what needs doing today, mark it done, and trust the app to schedul | Calendar-anchored scheduling | Monthly/quarterly/yearly tasks anchor to original day-of-month with clamping | Good — handles Feb 28/31 edge cases correctly with anchor memory | | flutter_local_notifications v21 | Standard Flutter notification package, TZ-aware scheduling | Good — inexactAllowWhileIdle avoids SCHEDULE_EXACT_ALARM complexity | | Manual StreamProvider for drift types | riverpod_generator throws InvalidTypeException with drift Task type | Revisit — may be fixed in future riverpod_generator versions | +| Calendar strip replaces daily plan | v1.1 goal — stacked overdue/today/upcoming sections replaced by horizontal 181-day strip | Good — cleaner navigation, day-by-day browsing | +| NotifierProvider over StateProvider | Riverpod 3.x removed StateProvider | Good — minimal Notifier subclass works cleanly | +| In-memory sort over SQL ORDER BY | Sort preference changes without re-querying DB | Good — stream.map applies sort after DB emit, reactive to preference changes | +| SharedPreferences for sort | Simple enum.name string persistence for sort preference | Good — lightweight, no DB migration needed, survives app restart | +| PopupMenuButton for sort UI | Material 3 AppBar action pattern, overlay menu | Good — clean integration in both HomeScreen and TaskListScreen AppBars | --- -*Last updated: 2026-03-16 after v1.1 milestone started* +*Last updated: 2026-03-16 after v1.1 milestone completed* diff --git a/.planning/RETROSPECTIVE.md b/.planning/RETROSPECTIVE.md index f440648..c401ff6 100644 --- a/.planning/RETROSPECTIVE.md +++ b/.planning/RETROSPECTIVE.md @@ -46,6 +46,50 @@ --- +## Milestone: v1.1 — Calendar & Polish + +**Shipped:** 2026-03-16 +**Phases:** 3 | **Plans:** 5 + +### What Was Built +- Horizontal 181-day calendar strip replacing the stacked daily plan HomeScreen +- CalendarDao with date-parameterized reactive Drift streams for day tasks and overdue tasks +- Task completion history bottom sheet with per-task reverse-chronological log +- Alphabetical, interval, and effort sort options with SharedPreferences persistence +- SortDropdown widget in both HomeScreen and TaskListScreen AppBars + +### What Worked +- Phase dependency ordering (5 → 6+7 parallel-capable) meant calendar strip was stable before building features on top +- TDD red-green cycle continued smoothly — every plan had failing tests before implementation +- Auto-advance mode enabled rapid phase chaining with minimal manual intervention +- Existing patterns from v1.0 (DAO, provider, widget test) were reused directly — no new patterns invented unnecessarily +- CalendarStripController (VoidCallback holder) was simpler than GlobalKey approach — good architecture call + +### What Was Inefficient +- StateProvider removal in Riverpod 3.x was discovered during execution rather than research — same category of issue as v1.0's riverpod_generator problem +- ROADMAP.md plan checkboxes still not auto-checked by executor (same bookkeeping gap as v1.0) +- Phase 5 plan split (data layer + UI) could have been a single plan given the small scope — overhead of 2 separate plans wasn't justified for ~13 min total + +### Patterns Established +- CalendarStripController: VoidCallback holder for parent-to-child imperative scroll communication +- CalendarDayList state machine: first-run → celebration → emptyDay → hasTasks (5 states) +- In-memory sort via stream.map after DB stream emit — sort preference changes without re-querying +- SortPreferenceNotifier: sync default + async _loadPersisted() — matches ThemeNotifier pattern +- Nested Scaffold pattern for per-tab AppBars in StatefulShellRoute.indexedStack + +### Key Lessons +1. Riverpod API surface changes (StateProvider removal) should be caught during phase research, not during execution — pattern repeats from v1.0 +2. Plans under ~5 min execution can be merged into a single plan to reduce orchestration overhead +3. In-memory sort is the right approach when sort criteria don't affect DB queries — avoids re-streaming +4. Bottom sheets for one-shot modals (history) don't need dedicated Riverpod providers — ref.read() in ConsumerWidget is sufficient + +### Cost Observations +- Model mix: orchestrator on opus, executors/checkers on sonnet +- Total execution: ~26 min for 5 plans across 3 phases +- Notable: Each plan averaged ~5 min — significantly faster than v1.0's ~6 min average due to established patterns + +--- + ## Cross-Milestone Trends ### Process Evolution @@ -53,13 +97,17 @@ | Milestone | Phases | Plans | Key Change | |-----------|--------|-------|------------| | v1.0 | 4 | 13 | Initial project — established all patterns | +| v1.1 | 3 | 5 | Reused v1.0 patterns — faster execution, auto-advance mode | ### Cumulative Quality -| Milestone | Tests | Key Metric | -|-----------|-------|------------| -| v1.0 | 89 | dart analyze clean, 0 issues | +| Milestone | Tests | LOC (lib) | Key Metric | +|-----------|-------|-----------|------------| +| v1.0 | 89 | 7,773 | dart analyze clean, 0 issues | +| v1.1 | 108 | 9,051 | dart analyze clean, 0 issues | ### Top Lessons (Verified Across Milestones) -1. (Single milestone — lessons above will be cross-validated as more milestones ship) +1. **Research must verify current package API signatures** — v1.0 hit riverpod_generator type incompatibility, v1.1 hit StateProvider removal. Same root cause: outdated API assumptions in plans. +2. **Established patterns compound** — v1.1 plans averaged ~5 min vs v1.0's ~6 min. Reusing DAO, provider, and test patterns eliminated design decisions. +3. **Verification gates are cheap insurance** — Consistently ~2 min per phase, caught regressions in both milestones. diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md index 9c1e55e..27859ca 100644 --- a/.planning/ROADMAP.md +++ b/.planning/ROADMAP.md @@ -2,13 +2,13 @@ ## Milestones -- **v1.0 MVP** — Phases 1-4 (shipped 2026-03-16) -- **v1.1 Calendar & Polish** — Phases 5-7 (in progress) +- ✅ **v1.0 MVP** — Phases 1-4 (shipped 2026-03-16) +- ✅ **v1.1 Calendar & Polish** — Phases 5-7 (shipped 2026-03-16) ## Phases
-v1.0 MVP (Phases 1-4) — SHIPPED 2026-03-16 +✅ v1.0 MVP (Phases 1-4) — SHIPPED 2026-03-16 - [x] Phase 1: Foundation (2/2 plans) — completed 2026-03-15 - [x] Phase 2: Rooms and Tasks (5/5 plans) — completed 2026-03-15 @@ -19,54 +19,16 @@ See `milestones/v1.0-ROADMAP.md` for full phase details.
-**v1.1 Calendar & Polish (Phases 5-7):** +
+✅ v1.1 Calendar & Polish (Phases 5-7) — SHIPPED 2026-03-16 -- [x] **Phase 5: Calendar Strip** - Replace the stacked daily plan home screen with a horizontal scrollable date-strip and day-task list (completed 2026-03-16) -- [x] **Phase 6: Task History** - Record every task completion with a timestamp and expose a per-task history view (completed 2026-03-16) -- [x] **Phase 7: Task Sorting** - Add alphabetical, interval, and effort sort options to task lists (completed 2026-03-16) +- [x] Phase 5: Calendar Strip (2/2 plans) — completed 2026-03-16 +- [x] Phase 6: Task History (1/1 plans) — completed 2026-03-16 +- [x] Phase 7: Task Sorting (2/2 plans) — completed 2026-03-16 -## Phase Details +See `milestones/v1.1-ROADMAP.md` for full phase details. -### Phase 5: Calendar Strip -**Goal**: Users navigate their tasks through a horizontal date-strip that replaces the stacked daily plan, seeing today's tasks by default and any day's tasks on tap -**Depends on**: Phase 4 (v1.0 shipped — all data layer and scheduling in place) -**Requirements**: CAL-01, CAL-02, CAL-03, CAL-04, CAL-05 -**Success Criteria** (what must be TRUE): - 1. The home screen shows a horizontal scrollable strip of day cards, each displaying the German day abbreviation (Mo, Di, Mi...) and the date number - 2. Tapping any day card updates the task list below the strip to show that day's tasks, with the selected card visually highlighted - 3. On app launch the strip auto-scrolls so today's card is centered and selected by default - 4. When two adjacent day cards span a month boundary, a subtle color shift or divider makes the boundary visible without extra chrome - 5. Tasks that were not completed on their due date appear in subsequent days' lists with a red/orange accent marking them as overdue -**Plans:** 2/2 plans complete -Plans: -- [ ] 05-01-PLAN.md — Data layer: CalendarDao, CalendarDayState model, Riverpod providers, localization, DAO tests -- [ ] 05-02-PLAN.md — UI: CalendarStrip, CalendarDayList, CalendarTaskRow widgets, HomeScreen replacement - -### Phase 6: Task History -**Goal**: Users can see exactly when each task was completed in the past, building trust that the scheduling loop is working correctly -**Depends on**: Phase 5 -**Requirements**: HIST-01, HIST-02 -**Success Criteria** (what must be TRUE): - 1. Every task completion (tap done in any view) is recorded in the database with a precise timestamp — data persists across app restarts - 2. From a task's detail or context menu the user can open a history view listing all past completion dates for that task in reverse-chronological order - 3. The history view shows a meaningful empty state if the task has never been completed -**Plans:** 1/1 plans complete -Plans: -- [ ] 06-01-PLAN.md — DAO query + history bottom sheet + TaskFormScreen integration + CalendarTaskRow navigation - -### Phase 7: Task Sorting -**Goal**: Users can reorder task lists by the dimension most useful to them — name, how often the task recurs, or how much effort it requires -**Depends on**: Phase 5 -**Requirements**: SORT-01, SORT-02, SORT-03 -**Success Criteria** (what must be TRUE): - 1. A sort control (dropdown, segmented button, or similar) is visible on task list screens and persists the chosen sort across app restarts - 2. Selecting alphabetical sort orders tasks A-Z by name within the visible list - 3. Selecting interval sort orders tasks from most-frequent (daily) to least-frequent (yearly/custom) intervals - 4. Selecting effort sort orders tasks from lowest effort to highest effort level -**Plans:** 2/2 plans complete -Plans: -- [ ] 07-01-PLAN.md — Sort model, persistence notifier, localization, provider integration -- [ ] 07-02-PLAN.md — Sort dropdown widget, HomeScreen AppBar, TaskListScreen integration, tests +
## Progress @@ -76,6 +38,6 @@ Plans: | 2. Rooms and Tasks | v1.0 | 5/5 | Complete | 2026-03-15 | | 3. Daily Plan and Cleanliness | v1.0 | 3/3 | Complete | 2026-03-16 | | 4. Notifications | v1.0 | 3/3 | Complete | 2026-03-16 | -| 5. Calendar Strip | 2/2 | Complete | 2026-03-16 | - | -| 6. Task History | 1/1 | Complete | 2026-03-16 | - | -| 7. Task Sorting | 2/2 | Complete | 2026-03-16 | - | +| 5. Calendar Strip | v1.1 | 2/2 | Complete | 2026-03-16 | +| 6. Task History | v1.1 | 1/1 | Complete | 2026-03-16 | +| 7. Task Sorting | v1.1 | 2/2 | Complete | 2026-03-16 | diff --git a/.planning/STATE.md b/.planning/STATE.md index 7f1142a..4aceb44 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -1,11 +1,11 @@ --- gsd_state_version: 1.0 -milestone: v1.0 -milestone_name: milestone +milestone: v1.1 +milestone_name: Calendar & Polish status: completed -stopped_at: Completed 07-task-sorting/07-02-PLAN.md -last_updated: "2026-03-16T21:43:23.009Z" -last_activity: 2026-03-16 — Completed Phase 6 Plan 01 (task completion history) +stopped_at: Milestone v1.1 archived +last_updated: "2026-03-16T23:26:00.000Z" +last_activity: 2026-03-16 — Milestone v1.1 archived progress: total_phases: 3 completed_phases: 3 @@ -21,55 +21,32 @@ progress: See: .planning/PROJECT.md (updated 2026-03-16) **Core value:** Users can see what needs doing today, mark it done, and trust the app to schedule the next occurrence — without thinking about it. -**Current focus:** v1.1 Calendar & Polish — Phase 6: Task History +**Current focus:** Planning next milestone ## Current Position -Phase: 6 — Task History -Plan: 1/1 complete (Phase 6 done) -Status: Phase Complete -Last activity: 2026-03-16 — Completed Phase 6 Plan 01 (task completion history) +Milestone: v1.1 Calendar & Polish — SHIPPED +Status: Milestone Complete +Last activity: 2026-03-16 — Archived milestone v1.1 ``` -Progress: [██████████] 100% (1/1 plans in Phase 6) +Progress: [██████████] 100% (v1.1 shipped) ``` ## Performance Metrics | Metric | v1.0 | v1.1 | |--------|------|------| -| Phases | 4 | 3 planned | -| Plans | 13 | TBD | -| LOC (lib) | 7,773 | TBD | -| Tests | 89 | TBD | -| Phase 05-calendar-strip P01 | 5 | 2 tasks | 10 files | -| Phase 05-calendar-strip P02 | 8 | 3 tasks | 9 files | -| Phase 06-task-history P01 | 5 | 2 tasks | 9 files | -| Phase 07-task-sorting P01 | 4 | 2 tasks | 9 files | -| Phase 07-task-sorting P02 | 4 | 2 tasks | 5 files | +| Phases | 4 | 3 | +| Plans | 13 | 5 | +| LOC (lib) | 7,773 | 9,051 | +| Tests | 89 | 108 | ## Accumulated Context ### Decisions -| Decision | Rationale | -|----------|-----------| -| Calendar strip replaces daily plan home screen | v1.1 goal per PROJECT.md — not additive, the stacked overdue/today/upcoming sections are removed | -| Phase 5 before Phase 6 and 7 | Calendar strip is the primary UI surface; history and sorting operate within or alongside it | -| Phase 6 and 7 both depend on Phase 5 only | History and sorting are independent of each other — could execute in either order | -| HIST-01 and HIST-02 in same phase | Data layer (HIST-01) is only 1-2 DAO additions; grouping with the UI (HIST-02) keeps the phase coherent | -| Used NotifierProvider instead of deprecated StateProvider | Riverpod 3.x removed StateProvider; NotifierProvider is the correct replacement | -| calendarDayProvider fetches overdue tasks with .first in asyncMap when isToday | Consistent with dailyPlanProvider pattern; avoids combining two streams | -| watchTasksForDate sorts alphabetically by task name | Same-day tasks have no meaningful time-based order; alpha sort is deterministic and user-friendly | -| CalendarStripController as VoidCallback holder | Avoids GlobalKey for single imperative scroll-to-today action — simpler | -| Tests use pump()+pump(Duration) instead of pumpAndSettle() | CalendarStrip animation controllers cause pumpAndSettle timeout — fixed-duration pump steps are reliable | -| No separate Riverpod provider for history sheet | ref.read(appDatabaseProvider) directly in ConsumerWidget — one-shot modals do not need a dedicated provider | -| CalendarTaskRow onTap navigates to task edit form | Makes history accessible in one tap from home screen, consistent with GoRouter route patterns | -- [Phase 07-task-sorting]: Default sort is alphabetical — continuity with existing A-Z SQL sort in CalendarDayList -- [Phase 07-task-sorting]: overdueTasks are NOT sorted — pinned at top in existing order per design decision -- [Phase 07-task-sorting]: Sort preference stored as enum.name string in SharedPreferences (not intEnum) — enum reordering safe -- [Phase 07-task-sorting]: Used PopupMenuButton for SortDropdown in AppBar — menu overlay vs inline expansion, Material 3 pattern -- [Phase 07-task-sorting]: HomeScreen uses nested Scaffold for AppBar — standard StatefulShellRoute.indexedStack per-tab AppBar pattern +Decisions archived to PROJECT.md Key Decisions table. ### Pending Todos @@ -77,11 +54,11 @@ None. ### Blockers/Concerns -- Phase 5 complete. daily_plan_providers.dart, daily_plan_task_row.dart, and progress_card.dart are now dead code (safe to clean up in a future phase). DailyPlanDao must NOT be deleted — still used by the notification service. +- Dead code from v1.0: daily_plan_providers.dart, daily_plan_task_row.dart, progress_card.dart (DailyPlanDao still used by notification service) ## Session Continuity -Last session: 2026-03-16T21:40:24.556Z -Stopped at: Completed 07-task-sorting/07-02-PLAN.md +Last session: 2026-03-16 +Stopped at: Milestone v1.1 archived Resume file: None -Next action: Phase 7 (task sorting) or release +Next action: /gsd:new-milestone diff --git a/.planning/config.json b/.planning/config.json index bdd5e98..62730ac 100644 --- a/.planning/config.json +++ b/.planning/config.json @@ -5,7 +5,7 @@ "commit_docs": true, "model_profile": "balanced", "workflow": { - "research": true, + "research": false, "plan_check": true, "verifier": true, "nyquist_validation": true, diff --git a/.planning/REQUIREMENTS.md b/.planning/milestones/v1.1-REQUIREMENTS.md similarity index 94% rename from .planning/REQUIREMENTS.md rename to .planning/milestones/v1.1-REQUIREMENTS.md index 6ac66b6..03953c3 100644 --- a/.planning/REQUIREMENTS.md +++ b/.planning/milestones/v1.1-REQUIREMENTS.md @@ -1,3 +1,12 @@ +# Requirements Archive: v1.1 Calendar & Polish + +**Archived:** 2026-03-16 +**Status:** SHIPPED + +For current requirements, see `.planning/REQUIREMENTS.md`. + +--- + # Requirements: HouseHoldKeaper **Defined:** 2026-03-16 diff --git a/.planning/milestones/v1.1-ROADMAP.md b/.planning/milestones/v1.1-ROADMAP.md new file mode 100644 index 0000000..9c1e55e --- /dev/null +++ b/.planning/milestones/v1.1-ROADMAP.md @@ -0,0 +1,81 @@ +# Roadmap: HouseHoldKeaper + +## Milestones + +- **v1.0 MVP** — Phases 1-4 (shipped 2026-03-16) +- **v1.1 Calendar & Polish** — Phases 5-7 (in progress) + +## Phases + +
+v1.0 MVP (Phases 1-4) — SHIPPED 2026-03-16 + +- [x] Phase 1: Foundation (2/2 plans) — completed 2026-03-15 +- [x] Phase 2: Rooms and Tasks (5/5 plans) — completed 2026-03-15 +- [x] Phase 3: Daily Plan and Cleanliness (3/3 plans) — completed 2026-03-16 +- [x] Phase 4: Notifications (3/3 plans) — completed 2026-03-16 + +See `milestones/v1.0-ROADMAP.md` for full phase details. + +
+ +**v1.1 Calendar & Polish (Phases 5-7):** + +- [x] **Phase 5: Calendar Strip** - Replace the stacked daily plan home screen with a horizontal scrollable date-strip and day-task list (completed 2026-03-16) +- [x] **Phase 6: Task History** - Record every task completion with a timestamp and expose a per-task history view (completed 2026-03-16) +- [x] **Phase 7: Task Sorting** - Add alphabetical, interval, and effort sort options to task lists (completed 2026-03-16) + +## Phase Details + +### Phase 5: Calendar Strip +**Goal**: Users navigate their tasks through a horizontal date-strip that replaces the stacked daily plan, seeing today's tasks by default and any day's tasks on tap +**Depends on**: Phase 4 (v1.0 shipped — all data layer and scheduling in place) +**Requirements**: CAL-01, CAL-02, CAL-03, CAL-04, CAL-05 +**Success Criteria** (what must be TRUE): + 1. The home screen shows a horizontal scrollable strip of day cards, each displaying the German day abbreviation (Mo, Di, Mi...) and the date number + 2. Tapping any day card updates the task list below the strip to show that day's tasks, with the selected card visually highlighted + 3. On app launch the strip auto-scrolls so today's card is centered and selected by default + 4. When two adjacent day cards span a month boundary, a subtle color shift or divider makes the boundary visible without extra chrome + 5. Tasks that were not completed on their due date appear in subsequent days' lists with a red/orange accent marking them as overdue +**Plans:** 2/2 plans complete +Plans: +- [ ] 05-01-PLAN.md — Data layer: CalendarDao, CalendarDayState model, Riverpod providers, localization, DAO tests +- [ ] 05-02-PLAN.md — UI: CalendarStrip, CalendarDayList, CalendarTaskRow widgets, HomeScreen replacement + +### Phase 6: Task History +**Goal**: Users can see exactly when each task was completed in the past, building trust that the scheduling loop is working correctly +**Depends on**: Phase 5 +**Requirements**: HIST-01, HIST-02 +**Success Criteria** (what must be TRUE): + 1. Every task completion (tap done in any view) is recorded in the database with a precise timestamp — data persists across app restarts + 2. From a task's detail or context menu the user can open a history view listing all past completion dates for that task in reverse-chronological order + 3. The history view shows a meaningful empty state if the task has never been completed +**Plans:** 1/1 plans complete +Plans: +- [ ] 06-01-PLAN.md — DAO query + history bottom sheet + TaskFormScreen integration + CalendarTaskRow navigation + +### Phase 7: Task Sorting +**Goal**: Users can reorder task lists by the dimension most useful to them — name, how often the task recurs, or how much effort it requires +**Depends on**: Phase 5 +**Requirements**: SORT-01, SORT-02, SORT-03 +**Success Criteria** (what must be TRUE): + 1. A sort control (dropdown, segmented button, or similar) is visible on task list screens and persists the chosen sort across app restarts + 2. Selecting alphabetical sort orders tasks A-Z by name within the visible list + 3. Selecting interval sort orders tasks from most-frequent (daily) to least-frequent (yearly/custom) intervals + 4. Selecting effort sort orders tasks from lowest effort to highest effort level +**Plans:** 2/2 plans complete +Plans: +- [ ] 07-01-PLAN.md — Sort model, persistence notifier, localization, provider integration +- [ ] 07-02-PLAN.md — Sort dropdown widget, HomeScreen AppBar, TaskListScreen integration, tests + +## Progress + +| Phase | Milestone | Plans Complete | Status | Completed | +|-------|-----------|----------------|--------|-----------| +| 1. Foundation | v1.0 | 2/2 | Complete | 2026-03-15 | +| 2. Rooms and Tasks | v1.0 | 5/5 | Complete | 2026-03-15 | +| 3. Daily Plan and Cleanliness | v1.0 | 3/3 | Complete | 2026-03-16 | +| 4. Notifications | v1.0 | 3/3 | Complete | 2026-03-16 | +| 5. Calendar Strip | 2/2 | Complete | 2026-03-16 | - | +| 6. Task History | 1/1 | Complete | 2026-03-16 | - | +| 7. Task Sorting | 2/2 | Complete | 2026-03-16 | - | diff --git a/.planning/phases/05-calendar-strip/05-01-PLAN.md b/.planning/milestones/v1.1-phases/05-calendar-strip/05-01-PLAN.md similarity index 100% rename from .planning/phases/05-calendar-strip/05-01-PLAN.md rename to .planning/milestones/v1.1-phases/05-calendar-strip/05-01-PLAN.md diff --git a/.planning/phases/05-calendar-strip/05-01-SUMMARY.md b/.planning/milestones/v1.1-phases/05-calendar-strip/05-01-SUMMARY.md similarity index 100% rename from .planning/phases/05-calendar-strip/05-01-SUMMARY.md rename to .planning/milestones/v1.1-phases/05-calendar-strip/05-01-SUMMARY.md diff --git a/.planning/phases/05-calendar-strip/05-02-PLAN.md b/.planning/milestones/v1.1-phases/05-calendar-strip/05-02-PLAN.md similarity index 100% rename from .planning/phases/05-calendar-strip/05-02-PLAN.md rename to .planning/milestones/v1.1-phases/05-calendar-strip/05-02-PLAN.md diff --git a/.planning/phases/05-calendar-strip/05-02-SUMMARY.md b/.planning/milestones/v1.1-phases/05-calendar-strip/05-02-SUMMARY.md similarity index 100% rename from .planning/phases/05-calendar-strip/05-02-SUMMARY.md rename to .planning/milestones/v1.1-phases/05-calendar-strip/05-02-SUMMARY.md diff --git a/.planning/phases/05-calendar-strip/05-VERIFICATION.md b/.planning/milestones/v1.1-phases/05-calendar-strip/05-VERIFICATION.md similarity index 100% rename from .planning/phases/05-calendar-strip/05-VERIFICATION.md rename to .planning/milestones/v1.1-phases/05-calendar-strip/05-VERIFICATION.md diff --git a/.planning/milestones/v1.1-phases/05-calendar-strip/5-CONTEXT.md b/.planning/milestones/v1.1-phases/05-calendar-strip/5-CONTEXT.md new file mode 100644 index 0000000..11cc9f0 --- /dev/null +++ b/.planning/milestones/v1.1-phases/05-calendar-strip/5-CONTEXT.md @@ -0,0 +1,105 @@ +# Phase 5: Calendar Strip - Context + +**Gathered:** 2026-03-16 +**Status:** Ready for planning + + +## Phase Boundary + +Replace the stacked daily plan home screen (overdue/today/tomorrow sections) with a horizontal scrollable date-strip and day-task list. Users navigate by tapping day cards to view that day's tasks below the strip. Requirements: CAL-01 through CAL-05. + + + + +## Implementation Decisions + +### Day card appearance +- Each card shows: German day abbreviation (Mo, Di, Mi...) and date number only +- No task-count badges, dots, or indicators on the cards +- All cards have a light sage/green tint +- Selected card has a noticeably stronger green and is always centered in the strip +- Today's card uses bold text with an accent underline +- When today is selected, both treatments combine (bold + underline + stronger green + centered) + +### Month boundary treatment (CAL-03) +- A slightly wider gap between the last day of one month and the first of the next +- A small month name label (e.g., "Apr") inserted in the gap between months + +### Scroll range & navigation +- Strip scrolls both into the past and into the future (Claude picks a reasonable range balancing performance and usefulness) +- On app launch, the strip auto-scrolls to center on today with a quick slide animation (~200ms) +- A floating "Today" button appears when the user has scrolled away from today; tap to snap back. Hidden when today is already visible. + +### Task list below the strip +- No ProgressCard — task list appears directly under the strip +- Overdue tasks (CAL-05) appear in a separate section with coral accent header above the day's own tasks, same pattern as current "Überfällig" section +- Task rows show: task name, tappable room tag, and checkbox — no relative date (strip already communicates which day) +- Checkboxes are interactive — tapping completes the task with the existing slide-out animation + +### Empty and celebration states +- If a selected day had tasks that were all completed: show celebration state (icon + message, same spirit as current AllClear) +- If a selected day never had any tasks: simple centered "Keine Aufgaben" message with subtle icon +- First-run empty state (no rooms/tasks at all): keep the current pattern pointing user to create rooms + +### Overdue carry-over behavior (CAL-05) +- Overdue tasks (due before today, not yet completed) appear in a separate "Überfällig" section when viewing today +- When viewing past days: show what was due that day (tasks whose nextDueDate matches that day) +- When viewing future days: show only tasks due that day, no overdue carry-over +- Overdue tasks use the existing warm coral/terracotta accent (#E07A5F) + +### Claude's Discretion +- Exact scroll range (past and future day count) +- Day card dimensions, spacing, and border radius +- Animation curves and durations beyond the ~200ms auto-scroll +- Floating "Today" button styling and position +- How the celebration state adapts to the calendar context (may simplify from current full-screen version) +- Whether to reuse DailyPlanDao or create a new CalendarDao +- Widget architecture and state management approach + + + + +## Specific Ideas + +- Day cards should feel like a unified strip with a light green wash — the selected day stands out by being a "marginally stronger green," not a completely different color. Think cohesive gradient, not toggle buttons. +- The selected card is always centered — the strip scrolls to keep the selection in the middle, giving a carousel feel. +- Month labels in the gap between months act as wayfinding, similar to section headers in a contact list. + + + + +## Existing Code Insights + +### Reusable Assets +- `DailyPlanTaskRow`: Existing task row widget — can be adapted by removing the relative date display and keeping name + room tag + checkbox +- `_CompletingTaskRow`: Animated slide-out on task completion — reuse directly for calendar task list +- `ProgressCard`: Will NOT be used in the new view, but the pattern of a card above a list is established +- `_overdueColor` (#E07A5F): Warm coral constant already defined for overdue indicators — reuse as-is +- `TaskWithRoom` model: Pairs task with room name/ID — directly usable for calendar task list + +### Established Patterns +- Riverpod `StreamProvider.autoDispose` for reactive data (see `dailyPlanProvider`) — calendar provider follows same pattern +- Manual provider definition (not `@riverpod`) because of drift's generated types — same constraint applies +- Feature folder structure: `features/home/data/`, `domain/`, `presentation/` — new calendar code lives here (replaces daily plan) +- German-only localization via `.arb` files and `AppLocalizations` + +### Integration Points +- `HomeScreen` at route `/` in `router.dart` — the calendar screen replaces this widget entirely +- `AppShell` with bottom NavigationBar — home tab stays as-is, just the screen content changes +- `DailyPlanDao.watchAllTasksWithRoomName()` — returns all tasks sorted by nextDueDate; may need a new query or adapted filtering for arbitrary date selection +- `TaskActionsProvider` — `completeTask(taskId)` already handles task completion and nextDueDate advancement +- `AppDatabase` with `DailyPlanDao` registered — any new DAO must be registered here + + + + +## Deferred Ideas + +None — discussion stayed within phase scope + + + +--- + +*Phase: 05-calendar-strip* +*Context gathered: 2026-03-16* diff --git a/.planning/phases/06-task-history/06-01-PLAN.md b/.planning/milestones/v1.1-phases/06-task-history/06-01-PLAN.md similarity index 100% rename from .planning/phases/06-task-history/06-01-PLAN.md rename to .planning/milestones/v1.1-phases/06-task-history/06-01-PLAN.md diff --git a/.planning/phases/06-task-history/06-01-SUMMARY.md b/.planning/milestones/v1.1-phases/06-task-history/06-01-SUMMARY.md similarity index 100% rename from .planning/phases/06-task-history/06-01-SUMMARY.md rename to .planning/milestones/v1.1-phases/06-task-history/06-01-SUMMARY.md diff --git a/.planning/phases/06-task-history/06-CONTEXT.md b/.planning/milestones/v1.1-phases/06-task-history/06-CONTEXT.md similarity index 100% rename from .planning/phases/06-task-history/06-CONTEXT.md rename to .planning/milestones/v1.1-phases/06-task-history/06-CONTEXT.md diff --git a/.planning/phases/06-task-history/6-VERIFICATION.md b/.planning/milestones/v1.1-phases/06-task-history/6-VERIFICATION.md similarity index 100% rename from .planning/phases/06-task-history/6-VERIFICATION.md rename to .planning/milestones/v1.1-phases/06-task-history/6-VERIFICATION.md diff --git a/.planning/phases/07-task-sorting/07-01-PLAN.md b/.planning/milestones/v1.1-phases/07-task-sorting/07-01-PLAN.md similarity index 100% rename from .planning/phases/07-task-sorting/07-01-PLAN.md rename to .planning/milestones/v1.1-phases/07-task-sorting/07-01-PLAN.md diff --git a/.planning/phases/07-task-sorting/07-01-SUMMARY.md b/.planning/milestones/v1.1-phases/07-task-sorting/07-01-SUMMARY.md similarity index 100% rename from .planning/phases/07-task-sorting/07-01-SUMMARY.md rename to .planning/milestones/v1.1-phases/07-task-sorting/07-01-SUMMARY.md diff --git a/.planning/phases/07-task-sorting/07-02-PLAN.md b/.planning/milestones/v1.1-phases/07-task-sorting/07-02-PLAN.md similarity index 100% rename from .planning/phases/07-task-sorting/07-02-PLAN.md rename to .planning/milestones/v1.1-phases/07-task-sorting/07-02-PLAN.md diff --git a/.planning/phases/07-task-sorting/07-02-SUMMARY.md b/.planning/milestones/v1.1-phases/07-task-sorting/07-02-SUMMARY.md similarity index 100% rename from .planning/phases/07-task-sorting/07-02-SUMMARY.md rename to .planning/milestones/v1.1-phases/07-task-sorting/07-02-SUMMARY.md diff --git a/.planning/phases/07-task-sorting/07-CONTEXT.md b/.planning/milestones/v1.1-phases/07-task-sorting/07-CONTEXT.md similarity index 100% rename from .planning/phases/07-task-sorting/07-CONTEXT.md rename to .planning/milestones/v1.1-phases/07-task-sorting/07-CONTEXT.md diff --git a/.planning/phases/07-task-sorting/7-VERIFICATION.md b/.planning/milestones/v1.1-phases/07-task-sorting/7-VERIFICATION.md similarity index 100% rename from .planning/phases/07-task-sorting/7-VERIFICATION.md rename to .planning/milestones/v1.1-phases/07-task-sorting/7-VERIFICATION.md