forked from eva/focus-flow
14 KiB
14 KiB
V1 Requirements Traceability Matrix
Status: Baseline captured during Block 11.1.
Review basis:
Human Documentation/Overall App Design Spec.docx, section 25, plus MVP requirements from sections 5-19.Human Documentation/Unified Product Design Summary.mdHuman Documentation/Starter Architecture Notes.md- Public exports from
lib/scheduler_core.dart - Tests under
test/
Starting commit: 775c2ed406f03a73a9b0ca621dea5b4482468616
Verification result on 2026-06-24:
dart pub get: passeddart format lib test: passed, 0 files changeddart analyze: passed, no issues founddart test: passed, 143 testsgit diff --check: passed
Latest Block 12 verification result on 2026-06-25:
dart format lib test: passed, 0 files changeddart analyze: passed, no issues founddart test: passed, 203 testsgit diff --check: passed
Latest Block 13.1 verification result on 2026-06-25:
dart format lib test: passed, 0 files changeddart analyze: passed, no issues founddart test: passed, 211 testsgit diff --check: passed
Latest Block 13.2 verification result on 2026-06-25:
dart format lib test: passed, 0 files changeddart analyze: passed, no issues founddart test: passed, 218 testsgit diff --check: passed
Latest Block 13.3 verification result on 2026-06-25:
dart format lib test: passed, 0 files changed after final formatdart analyze: passed, no issues founddart test: passed, 225 testsgit diff --check: passed
Latest Block 13.4 verification result on 2026-06-25:
dart format lib test: passed, 0 files changed after final formatdart analyze: passed, no issues founddart test: passed, 233 testsgit diff --check: passed
Latest Block 13.5 verification result on 2026-06-25:
dart format lib test: passed, 0 files changed after final formatdart analyze: passed, no issues founddart test: passed, 243 testsgit diff --check: passed
Latest Block 14.1 verification result on 2026-06-25:
dart format lib test: passed, 0 files changed after final formatdart analyze: passed, no issues founddart test: passed, 249 testsgit diff --check: passed
Status values:
complete: Current backend APIs and tests cover the requirement.incomplete: Some required backend, application, persistence, or UI-facing contract work remains.intentionally deferred: The human spec places this outside MVP, or the active plan explicitly defers it.contradictory: The human spec conflicts with the V1 backend direction and an active plan must resolve it without silently changing behavior.
Section 25 MVP acceptance criteria
| ID | Acceptance criterion | Production API surface | Representative tests | Status | Active-plan reference or issue |
|---|---|---|---|---|---|
| MVP-AC-01 | Create a task through quick capture with only a title. | Task.quickCapture, QuickCaptureRequest, QuickCaptureService.capture |
test/scheduling_engine_test.dart, test/edge_case_regression_test.dart |
complete | Keep constructor invariants under Chunk 11.3. |
| MVP-AC-02 | Store quick-capture tasks in Backlog with neutral defaults. | Task.quickCapture, QuickCaptureService.capture, TaskStatus.backlog, PriorityLevel.medium, RewardLevel.notSet, inbox project default |
test/scheduling_engine_test.dart, test/edge_case_regression_test.dart |
complete | Backlog-entered timestamp remains incomplete; see Blocks 11 and 15. |
| MVP-AC-03 | Optionally schedule a quick-capture task into the next available slot after entering duration. | QuickCaptureRequest.scheduleImmediately, QuickCaptureService.capture, SchedulingEngine.insertBacklogTaskIntoNextAvailableSlot |
test/scheduling_engine_test.dart, test/edge_case_regression_test.dart, test/scheduling_invariants_test.dart |
complete | Block 12 covers central occupancy, protected Free Slot avoidance, structured no-slot outcomes, and invariant coverage. |
| MVP-AC-04 | Create recurring hidden locked blocks and one-day overrides. | LockedBlock, LockedBlockRecurrence.weekly, LockedBlockOverride.remove, LockedBlockOverride.replace, LockedBlockOverride.add, expandLockedBlocksForDay |
test/scheduling_engine_test.dart, test/timeline_state_test.dart, test/edge_case_regression_test.dart |
complete | Date-only/time-zone hardening remains in Chunk 11.4 and Block 15. |
| MVP-AC-05 | Render Today as a timeline with project border, task-type background, task name, reward icon, and difficulty icon. | TimelineItemMapper, TimelineItem, timeline token enums |
test/timeline_state_test.dart |
incomplete | Backend read-model tokens exist; actual Flutter rendering is Block 18. |
| MVP-AC-06 | Use compact Today mode manually. | TimelineItemMapper.compactStateForTasks, CompactTimelineState |
test/timeline_state_test.dart |
complete | Complete at backend/read-model level; Flutter UI remains Block 18. |
| MVP-AC-07 | Push flexible tasks to next available slot, tomorrow, or backlog. | FlexibleTaskQuickAction.push, PushDestination, FlexibleTaskActionService.applyPushDestination, SchedulingEngine push methods, TaskActivityCode |
test/scheduling_engine_test.dart, test/required_task_actions_test.dart, test/task_lifecycle_test.dart |
complete | Chunk 13.1 adds internal activity records; exactly-once statistics/accounting continues in Chunk 13.2. |
| MVP-AC-08 | Move backlog items into the soonest flexible slot where they fit and shift later flexible tasks. | SchedulingEngine.insertBacklogTaskIntoNextAvailableSlot |
test/scheduling_engine_test.dart, test/edge_case_regression_test.dart, test/occupancy_policy_test.dart, test/free_slots_test.dart, test/scheduling_invariants_test.dart |
complete | Block 12 covers central occupancy, protected Free Slot blockers, structured outcomes, and invariant coverage. |
| MVP-AC-09 | Automatically roll unfinished flexible tasks to tomorrow/top of queue with a small notice. | SchedulingEngine.rolloverUnfinishedFlexibleTasks and SchedulingNotice |
test/scheduling_engine_test.dart, test/edge_case_regression_test.dart, test/scheduling_invariants_test.dart |
incomplete | Domain movement and structured rollover notices exist; durable next-open rollover notice/read model remains in Block 14. |
| MVP-AC-10 | Log unplanned completed tasks and push overlapping flexible tasks normally. | SurpriseTaskLogRequest, SurpriseTaskLogService.log, SurpriseTaskLogResult, Task.completedAt |
test/surprise_task_logging_test.dart, test/scheduling_invariants_test.dart, test/task_lifecycle_test.dart |
incomplete | Block 12 covers actual occupancy and idempotent retry; Chunks 13.1-13.2 add completion timestamps and surprise completion accounting/locked-hour statistics; application use cases remain in Block 14. |
| MVP-AC-11 | Break a large task into child tasks with row-level priority, reward, and duration. | ChildTaskEntry, ChildTaskBreakUpRequest, ChildTaskBreakUpResult, ChildTaskBreakUpService, ChildTaskView |
test/child_tasks_test.dart |
complete | Chunk 13.3 adds deterministic break-up mutation results; persistence transaction wiring remains in Block 14. |
| MVP-AC-12 | Auto-complete parent tasks when all children are done and allow force-completing all children from the parent or a child. | ChildTaskCompletionService, ChildTaskCompletionResult, parent-child helpers, TaskActivity |
test/child_tasks_test.dart |
complete | Chunk 13.3 routes parent/child completion through lifecycle activities and preserves already-terminal child facts. |
| MVP-AC-13 | Display backlog staleness icons without per-task stale prompts. | BacklogStalenessMarker, BacklogStalenessSettings, BacklogView |
test/scheduling_engine_test.dart, test/edge_case_regression_test.dart |
incomplete | Backend marker exists; settings persistence and UI display remain in Blocks 14, 15, and 18. |
| MVP-AC-14 | Track baseline internal statistics needed for later reports and filtering. | TaskStatistics, ProjectStatistics, TaskActivity, TaskActivityApplicationResult, TaskActivityAccountingService, ProjectStatisticsAggregationService, ApplicationUnitOfWork, selected action services |
test/scheduling_engine_test.dart, test/required_task_actions_test.dart, test/document_mapping_test.dart, test/task_lifecycle_test.dart, test/child_tasks_test.dart, test/project_statistics_test.dart, test/application_layer_test.dart |
incomplete | Chunks 13.1-13.4 add canonical activities, exactly-once task/project statistic accounting, parent/child completion metadata, and learned suggestion aggregates; Chunk 14.1 adds the atomic in-memory unit-of-work foundation; concrete command integration remains in Chunk 14.3. |
Additional MVP backend requirements
| ID | Requirement | Production API surface | Representative tests | Status | Active-plan reference or issue |
|---|---|---|---|---|---|
| MVP-SUP-01 | Flexible tasks move while locked, inflexible, and critical time does not move automatically. | OccupancyPolicy, SchedulingInput.blockedIntervals, SchedulingEngine placement methods |
test/scheduling_engine_test.dart, test/edge_case_regression_test.dart, test/occupancy_policy_test.dart, test/scheduling_invariants_test.dart |
complete | Block 12 centralizes occupancy and adds structured outcomes plus invariant coverage for immovable placements. |
| MVP-SUP-02 | Critical missed tasks are marked missed and moved to backlog. | RequiredTaskActionService, SchedulingEngine.markMissed, TaskTransitionService, TaskType.critical |
test/scheduling_engine_test.dart, test/required_task_actions_test.dart, test/task_lifecycle_test.dart |
complete | Chunk 13.1 records both missed and moved-to-backlog activities. |
| MVP-SUP-03 | Inflexible missed tasks are marked missed and left in place/history. | RequiredTaskActionService, SchedulingEngine.markMissed, TaskTransitionService, TaskType.inflexible |
test/scheduling_engine_test.dart, test/required_task_actions_test.dart, test/task_lifecycle_test.dart |
complete | Actual/historical interval semantics are formalized in Chunk 11.2 and Block 12. |
| MVP-SUP-04 | Cancelled and no-longer-relevant are separate calm lifecycle outcomes. | TaskStatus.cancelled, TaskStatus.noLongerRelevant, RequiredTaskAction, TaskActivityCode |
test/required_task_actions_test.dart, test/task_lifecycle_test.dart |
complete | Chunk 13.1 centralizes both transitions and emits distinct activity codes. |
| MVP-SUP-05 | Free Slot is intentional rest that blocks normal flexible placement and suppresses normal flexible reminders. | TaskType.freeSlot, OccupancyPolicy, FreeSlotService, ReminderPolicyService, timeline tokens |
test/timeline_state_test.dart, test/occupancy_policy_test.dart, test/free_slots_test.dart, test/scheduling_invariants_test.dart, test/reminder_policy_test.dart |
complete | Blocks 12 and 13 cover scheduling protection, explicit required conflicts, and reminder suppression/directives at the backend policy level. |
| MVP-SUP-06 | Project defaults apply, learned suggestions stay optional, and task reminder overrides are possible. | ProjectProfile, ProjectStatistics, ProjectSuggestionService, ProjectDefaultResolution, ReminderPolicyService, Task.reminderOverride, ReminderProfile |
test/scheduling_engine_test.dart, test/domain_invariants_test.dart, test/project_statistics_test.dart, test/reminder_policy_test.dart |
complete | Chunk 13.5 adds effective reminder resolution without using learned suggestions as silent configuration. |
| MVP-SUP-07 | Repository boundaries prepare for MongoDB without coupling the scheduler to MongoDB APIs. | Repository interfaces, in-memory repositories, ApplicationUnitOfWork, document mapping helpers |
test/repositories_test.dart, test/document_mapping_test.dart, test/persistence_edge_cases_test.dart, test/application_layer_test.dart |
incomplete | Chunk 14.1 adds pure Dart application transaction contracts and staged in-memory unit-of-work behavior; complete codecs, revisions, and runtime adapter remain in Blocks 15 and 16. |
| MVP-SUP-08 | Hidden locked time remains hidden by default, with explicit reveal as an overlay. | LockedBlockOccurrence.hiddenByDefault, TimelineItemMapper.fromLockedOccurrence |
test/timeline_state_test.dart, test/edge_case_regression_test.dart |
complete | Stable per-occurrence IDs and Today query read model remain in Block 14. |
| MVP-SUP-09 | Push/backlog/restore movement should be activity/stat data, not shame language. | TaskStatistics, ProjectStatistics, TaskActivity, TaskActivityCode, SchedulingChange, SchedulingMovementCode, ApplicationUnitOfWork, action result objects |
test/scheduling_engine_test.dart, test/required_task_actions_test.dart, test/scheduling_invariants_test.dart, test/task_lifecycle_test.dart, test/project_statistics_test.dart, test/application_layer_test.dart |
incomplete | Chunks 13.1-13.4 add canonical transition/activity records plus exactly-once task/project statistic accounting; Chunk 14.1 adds atomic transaction contracts; concrete action use-case persistence remains in Chunk 14.3. |
| MVP-SUP-10 | The human spec lists pushed and skipped as statuses. |
TaskStatus excludes both; movement and burnout compatibility are modeled as activity/stat metadata. |
test/domain_contracts_test.dart |
contradictory | Resolved by V1_ADR_001_Lifecycle_Metadata_Reminder_Semantics.md; the contradiction is kept visible so later chunks do not add movement labels as statuses. |
Intentionally deferred human-spec items
| ID | Requirement | Status | Deferred location |
|---|---|---|---|
| DEF-01 | Week view and month view. | intentionally deferred | V2/non-MVP. |
| DEF-02 | Weekly reports and dashboard. | intentionally deferred | V2/non-MVP; internal stats remain MVP baseline only. |
| DEF-03 | Overwhelm shield and burnout catch-up flow. | intentionally deferred | V2/non-MVP. |
| DEF-04 | Drag-and-drop reordering. | intentionally deferred | V2/non-MVP. |
| DEF-05 | Visible per-task history panel. | intentionally deferred | V2/non-MVP. |
| DEF-06 | Task dependencies and context tags. | intentionally deferred | Wishlist/non-MVP. |
| DEF-07 | Flexible-task overrun behavior. | intentionally deferred | Wishlist/non-MVP decision. |