15 KiB
phase, verified, status, score, human_verification
| phase | verified | status | score | human_verification | |||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 03-daily-plan-and-cleanliness | 2026-03-16T12:30:00Z | human_needed | 14/14 automated must-haves verified |
|
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 analyzereports 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)