---
phase: 03-daily-plan-and-cleanliness
verified: 2026-03-16T12:30:00Z
status: human_needed
score: 14/14 automated must-haves verified
human_verification:
  - test: "Launch app (`flutter run`) and verify the Home tab shows the daily plan, not a placeholder"
    expected: "Progress card at top showing 'X von Y erledigt' with linear progress bar"
    why_human: "Visual layout and actual screen presentation cannot be verified programmatically"
  - test: "If overdue tasks exist, verify the 'Uberfaellig' section header appears in warm coral color above those tasks"
    expected: "Section header styled in Color(0xFFE07A5F), only visible when overdue tasks are present"
    why_human: "Color rendering requires visual inspection"
  - test: "Tap a checkbox on an overdue or today task"
    expected: "Task animates out (SizeTransition + SlideTransition, 300ms) and progress counter updates"
    why_human: "Animation behavior and timing must be observed at runtime"
  - test: "Scroll down to the 'Demnaechst (N)' section and tap to expand it"
    expected: "Section collapses by default; tomorrow tasks appear with no checkboxes after tap"
    why_human: "ExpansionTile interaction and read-only state of tomorrow tasks requires runtime verification"
  - test: "Complete all overdue and today tasks"
    expected: "Screen transitions to 'Alles erledigt! (star emoji)' celebration empty state"
    why_human: "Empty state transition requires actual task completion flow at runtime"
  - test: "Tap the room name tag on a task row"
    expected: "Navigates to that room's task list screen"
    why_human: "GoRouter navigation to '/rooms/:roomId' requires runtime verification"
  - test: "Switch to Rooms tab and inspect room cards"
    expected: "Each room card displays a thin coloured cleanliness bar at the bottom (green=clean, coral=dirty)"
    why_human: "CLEAN-01 visual indicator requires runtime inspection"
---

# Phase 3: Daily Plan and Cleanliness -- Verification Report

**Phase Goal:** Users can open the app and immediately see what needs doing today, act on tasks directly from the plan view, and see a room-level health indicator
**Verified:** 2026-03-16T12:30:00Z
**Status:** human_needed (all automated checks pass; 7 items need runtime confirmation)
**Re-verification:** No -- initial verification

---

## Goal Achievement

### Observable Truths

| #  | Truth                                                                                               | Status     | Evidence                                                                 |
|----|-----------------------------------------------------------------------------------------------------|------------|--------------------------------------------------------------------------|
| 1  | DailyPlanDao.watchAllTasksWithRoomName() returns tasks joined with room name, sorted by nextDueDate | VERIFIED  | `daily_plan_dao.dart` L16-33: innerJoin on rooms.id, orderBy nextDueDate asc; 4 tests cover it |
| 2  | DailyPlanDao.watchCompletionsToday() returns count of completions recorded today                    | VERIFIED  | `daily_plan_dao.dart` L37-51: customSelect COUNT(*) with readsFrom; 3 tests cover boundaries  |
| 3  | dailyPlanProvider categorizes tasks into overdue, today, and tomorrow sections                      | VERIFIED  | `daily_plan_providers.dart` L26-43: date-only partition into overdue/todayList/tomorrowList    |
| 4  | Progress total = remaining overdue + remaining today + completedTodayCount (stable denominator)     | VERIFIED  | `daily_plan_providers.dart` L53: `totalTodayCount: overdue.length + todayList.length + completedToday` |
| 5  | Localization keys for daily plan sections and progress text exist in app_de.arb                     | VERIFIED  | `app_de.arb` L72-91: all 10 keys present (dailyPlanProgress, SectionOverdue, SectionToday, SectionUpcoming, UpcomingCount, AllClearTitle, AllClearMessage, NoOverdue, NoTasks) |
| 6  | User sees progress card at top with 'X von Y erledigt' and linear progress bar                      | VERIFIED  | `progress_card.dart` L31: `l10n.dailyPlanProgress(completed, total)`; L39-44: LinearProgressIndicator; widget test confirms "2 von 3 erledigt" renders |
| 7  | User sees overdue tasks in highlighted section (warm coral) only when overdue tasks exist           | VERIFIED  | `home_screen.dart` L236-244: `if (state.overdueTasks.isNotEmpty)` + `color: _overdueColor`; widget test confirms section header appears |
| 8  | User sees today's tasks in a section below overdue                                                  | VERIFIED  | `home_screen.dart` L246-265: always-rendered today section with DailyPlanTaskRow list        |
| 9  | User sees tomorrow's tasks in collapsed 'Demnachst (N)' section that expands on tap                 | VERIFIED  | `home_screen.dart` L313-328: ExpansionTile with `initiallyExpanded: false`; widget test confirms collapse state |
| 10 | User can check a checkbox on overdue/today task -- task animates out and increments progress         | VERIFIED* | `home_screen.dart` L287-305: `_completingTaskIds` Set + `_CompletingTaskRow` with SizeTransition+SlideTransition; `_onTaskCompleted` calls `taskActionsProvider.notifier.completeTask()`; *animation requires human confirmation |
| 11 | When no tasks due, user sees 'Alles erledigt!' empty state                                          | VERIFIED  | `home_screen.dart` L72-77, L138-177; widget test confirms "Alles erledigt!" text and celebration icon |
| 12 | Room name tag on each task row navigates to room's task list on tap                                 | VERIFIED  | `daily_plan_task_row.dart` L62: `context.go('/rooms/${taskWithRoom.roomId}')` on GestureDetector; *runtime navigation needs human check |
| 13 | Task rows have NO row-tap navigation -- only checkbox and room tag are interactive                  | VERIFIED  | `daily_plan_task_row.dart` L46-92: ListTile has no `onTap` or `onLongPress`; confirmed by code inspection |
| 14 | CLEAN-01: Room cards display cleanliness indicator from Phase 2                                     | VERIFIED  | `room_card.dart` L79-85: LinearProgressIndicator with `cleanlinessRatio`, lerped green-to-coral color |

**Score:** 14/14 truths verified (automated). 7 of these require human runtime confirmation for full confidence.

---

## Required Artifacts

| Artifact                                                          | Expected                                              | Lines | Status     | Details                                          |
|-------------------------------------------------------------------|-------------------------------------------------------|-------|------------|--------------------------------------------------|
| `lib/features/home/data/daily_plan_dao.dart`                     | Cross-room join query and today's completion count    | 52    | VERIFIED  | innerJoin + customSelect; exports DailyPlanDao, TaskWithRoom |
| `lib/features/home/domain/daily_plan_models.dart`                | DailyPlanState data class for categorized data        | 31    | VERIFIED  | TaskWithRoom and DailyPlanState with all required fields |
| `lib/features/home/presentation/daily_plan_providers.dart`       | Riverpod provider combining task and completion stream | 56    | VERIFIED  | Manual StreamProvider.autoDispose with asyncMap  |
| `lib/features/home/presentation/home_screen.dart`                | Complete daily plan screen replacing placeholder      | 389   | VERIFIED  | ConsumerStatefulWidget, all 4 states implemented |
| `lib/features/home/presentation/daily_plan_task_row.dart`        | Task row with room name tag, optional checkbox        | 94    | VERIFIED  | StatelessWidget, GestureDetector for room tag, no row-tap |
| `lib/features/home/presentation/progress_card.dart`              | Progress banner card with linear progress bar         | 51    | VERIFIED  | Card + LinearProgressIndicator, localized text   |
| `test/features/home/data/daily_plan_dao_test.dart`               | Unit tests for DAO (min 80 lines)                     | 166   | VERIFIED  | 7 tests covering all specified behaviors         |
| `test/features/home/presentation/home_screen_test.dart`          | Widget tests for empty state, sections (min 40 lines) | 253   | VERIFIED  | 6 widget tests covering all state branches       |

---

## Key Link Verification

| From                                  | To                                      | Via                                             | Status     | Details                                                   |
|---------------------------------------|-----------------------------------------|-------------------------------------------------|------------|-----------------------------------------------------------|
| `daily_plan_dao.dart`                 | `database.dart`                         | @DriftAccessor registration                     | VERIFIED  | `database.dart` L48: `daos: [RoomsDao, TasksDao, DailyPlanDao]` |
| `daily_plan_providers.dart`           | `daily_plan_dao.dart`                   | db.dailyPlanDao.watchAllTasksWithRoomName()      | VERIFIED  | `daily_plan_providers.dart` L14: exact call present        |
| `home_screen.dart`                    | `daily_plan_providers.dart`             | ref.watch(dailyPlanProvider)                    | VERIFIED  | `home_screen.dart` L42: `ref.watch(dailyPlanProvider)`    |
| `home_screen.dart`                    | `task_providers.dart`                   | ref.read(taskActionsProvider.notifier).completeTask() | VERIFIED | `home_screen.dart` L35: exact call present            |
| `daily_plan_task_row.dart`            | `go_router`                             | context.go('/rooms/$roomId') on room tag tap     | VERIFIED  | `daily_plan_task_row.dart` L62: `context.go('/rooms/${taskWithRoom.roomId}')` |

---

## Requirements Coverage

| Requirement | Source Plan  | Description                                                            | Status     | Evidence                                                                    |
|-------------|--------------|------------------------------------------------------------------------|------------|-----------------------------------------------------------------------------|
| PLAN-01     | 03-01, 03-03 | User sees all tasks due today (grouped by room via inline tag)         | SATISFIED | `home_screen.dart` today section; room name tag on each DailyPlanTaskRow   |
| PLAN-02     | 03-01, 03-03 | Overdue tasks appear in separate highlighted section at top            | SATISFIED | `home_screen.dart` L236-244: conditional overdue section with coral header  |
| PLAN-03     | 03-01, 03-03 | User can preview upcoming tasks (tomorrow)                             | SATISFIED | `home_screen.dart` L308-328: collapsed ExpansionTile for tomorrow tasks     |
| PLAN-04     | 03-02, 03-03 | User can complete tasks via checkbox directly from daily plan view     | SATISFIED | `home_screen.dart` L31-36: onTaskCompleted calls taskActionsProvider; animation implemented |
| PLAN-05     | 03-01, 03-03 | User sees progress indicator showing completed vs total tasks          | SATISFIED | `progress_card.dart`: "X von Y erledigt" + LinearProgressIndicator          |
| PLAN-06     | 03-02, 03-03 | "All clear" empty state when no tasks due                              | SATISFIED | `home_screen.dart` L72-77, L138-177: two all-clear states implemented       |
| CLEAN-01    | 03-02, 03-03 | Room cards display cleanliness indicator (Phase 2 carry-over)          | SATISFIED | `room_card.dart` L79-85: LinearProgressIndicator with cleanlinessRatio      |

All 7 requirement IDs from plans are accounted for. No orphaned requirements found.

---

## Anti-Patterns Found

| File | Line | Pattern | Severity | Impact |
|------|------|---------|----------|--------|
| `home_screen.dart` | 18 | Comment mentioning "placeholder" -- describes what was replaced | Info | None -- documentation comment only, no code issue |

No blockers or warnings found. The single info item is a comment accurately describing the replacement of a prior placeholder.

---

## Human Verification Required

The following 7 items require the app to be running. All automated checks (72/72 tests pass, `dart analyze` clean) support that the code is correct; these confirm the live user experience.

### 1. Daily plan renders on Home tab

**Test:** Run `flutter run`. Switch to the Home tab.
**Expected:** Progress card ("X von Y erledigt" + progress bar) is the first thing visible, followed by task sections.
**Why human:** Visual layout and actual screen rendering cannot be verified programmatically.

### 2. Overdue section styling (PLAN-02)

**Test:** Ensure at least one task is overdue (nextDueDate in the past). Open the Home tab.
**Expected:** An "Uberfaellig" section header appears in warm coral color (0xFFE07A5F) above those tasks.
**Why human:** Color rendering and conditional section visibility require visual inspection.

### 3. Checkbox completion and animation (PLAN-04)

**Test:** Tap the checkbox on an overdue or today task.
**Expected:** The task row slides right and collapses in height over ~300ms, then disappears. Progress counter increments.
**Why human:** Animation timing and visual smoothness must be observed at runtime.

### 4. Tomorrow section collapse/expand (PLAN-03)

**Test:** Scroll to the "Demnaechst (N)" section. Observe it is collapsed. Tap it.
**Expected:** Section expands showing tomorrow's tasks with room name tags but NO checkboxes.
**Why human:** ExpansionTile interaction and the read-only state of tomorrow tasks require runtime observation.

### 5. All-clear empty state (PLAN-06)

**Test:** Complete all overdue and today tasks via checkboxes.
**Expected:** Screen transitions to the "Alles erledigt! (star emoji)" celebration state with the celebration icon.
**Why human:** Requires a complete task-completion flow with real data; state transition must be visually confirmed.

### 6. Room name tag navigation

**Test:** Tap the room name tag (small pill label) on any task row in the daily plan.
**Expected:** App navigates to that room's task list screen (`/rooms/:roomId`).
**Why human:** GoRouter navigation with the correct roomId requires runtime verification.

### 7. Cleanliness indicator on room cards (CLEAN-01)

**Test:** Switch to the Rooms tab and inspect room cards.
**Expected:** Each room card has a thin bar at the bottom, coloured from coral (dirty) to sage green (clean) based on the ratio of overdue tasks.
**Why human:** Visual indicator colour, rendering, and dynamic response to task state require live inspection.

---

## Summary

Phase 3 automated verification passes completely:

- All 14 must-have truths verified against actual code (not summary claims)
- All 8 artifacts exist, are substantive (ranging 31-389 lines), and are wired
- All 5 key links verified in the actual files
- All 7 requirement IDs (PLAN-01 through PLAN-06, CLEAN-01) satisfied with code evidence
- 72/72 tests pass; `dart analyze` reports zero issues
- No TODO/FIXME/stub anti-patterns in production code

Status is `human_needed` because the user experience goals (visual layout, animation feel, navigation flow, colour rendering) can only be fully confirmed by running the app. The code structure gives high confidence all 7 runtime items will pass.

---

_Verified: 2026-03-16T12:30:00Z_
_Verifier: Claude (gsd-verifier)_
