# V1 Block 02 — Domain Model Status: Completed Purpose: Define the core data vocabulary for the scheduling app. This model should be UI-independent and testable. ## Chunk 2.1 — Define core enums Recommended Codex level: medium Status: Completed with environment blocker noted Tasks: Add or verify enums for: - `TaskType`: flexible, inflexible, critical, locked, surprise, freeSlot. - `TaskStatus`: planned, active, completed, missed, cancelled, noLongerRelevant, backlog. - `PriorityLevel`: veryLow, low, medium, high, veryHigh. - `RewardLevel`: veryLow, low, medium, high, veryHigh, notSet. - `DifficultyLevel`: veryEasy, easy, medium, hard, veryHard, notSet. - `ReminderProfile`: silent, gentle, persistent, strict. Rules: - Reward `notSet` is its own category and must not be treated as low. - Difficulty may have `notSet` for raw capture/default states. - Critical and inflexible are required visible items. - Locked blocks are hidden scheduling constraints, not ordinary tasks. Acceptance criteria: - Enums exist in the domain model. - Comments document the business meaning of each value. - Tests can import and use the enum values. Execution notes: - Verified all required enum values exist in `lib/src/models.dart`. - Added business-meaning documentation comments for status, priority, reward, difficulty, and reminder values. - Preserved `RewardLevel.notSet` and `DifficultyLevel.notSet` as neutral capture/default states. - Added a test that imports and references core enum values through the public package export. ## Chunk 2.2 — Define task identity and fields Recommended Codex level: high Status: Completed with environment blocker noted Tasks: Create or refine a `Task` model with fields for: - `id` - `title` - `projectId` - `type` - `status` - `priority` - `reward` - `difficulty` - `durationMinutes` - `scheduledStart` - `scheduledEnd` - `parentTaskId` - `createdAt` - `updatedAt` - `stats` Rules: - Use a copy/update pattern rather than mutating shared state unexpectedly. - Allow optional fields for quick capture. - Do not require every task to have reward/difficulty/time. - Include validation helper(s) only if needed. Acceptance criteria: - A task can represent backlog, planned, critical, locked, and surprise items. - A quick-capture task can be created with minimal fields. - Tests cover default/neutral quick-capture values. Execution notes: - Kept the immutable `Task` model and `copyWith` update pattern. - Added `Task.quickCapture` for minimal capture with neutral defaults and no required schedule details. - Added tests for quick-capture defaults, including `RewardLevel.notSet`, `DifficultyLevel.notSet`, and absent schedule/duration. BREAKPOINT: Stop here. The next chunk remains high but may expand model scope. ## Chunk 2.3 — Define project and project defaults Recommended Codex level: high Status: Completed with environment blocker noted Tasks: Create a minimal `ProjectProfile` or equivalent model with: - `id` - `name` - `colorKey` or theme token - default priority - default reward - default difficulty - default reminder profile - default duration minutes Rules: - Project defaults are suggestions/defaults, not hard requirements. - Individual tasks can override project defaults. - Learned usage statistics are future-facing; do not overbuild now. Acceptance criteria: - Tasks can reference a project. - Project defaults can be applied when creating a task. - Overrides remain possible. Execution notes: - Kept `ProjectProfile` minimal with id, name, color key, default priority, default reward, default difficulty, default reminder profile, and default duration. - Added `ProjectProfile.createTask` to apply project defaults while allowing explicit task overrides. - Added tests for default application and per-task overrides. ## Chunk 2.4 — Define task statistics model Recommended Codex level: medium Status: Completed with environment blocker noted Tasks: Add or verify a `TaskStatistics` model with counters for: - skippedDuringBurnoutCount - manuallyPushedCount - autoPushedCount - movedToBacklogCount - restoredFromBacklogCount - missedCount - cancelledCount - completedLateCount - completedDuringLockedHoursCount - completedDuringLockedHoursMinutes Rules: - Stats are internal metadata. - Stats should support future filtering/reporting. - Do not build report UI in V1. Acceptance criteria: - Statistics can be incremented through copy/update helpers. - Tests cover at least one increment path. Execution notes: - Verified all required statistics counters exist. - Added immutable increment helpers for remaining counters. - Added a test covering a statistics increment path and preservation of existing values. - Could not run `dart analyze` or `dart test` because neither `dart` nor `flutter` is installed on `PATH` in this environment. - Commit was deferred until the repository was initialized and repaired. Commit suggestion: ```text feat(domain): define scheduling task model ```