forked from eva/focus-flow
12 KiB
12 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
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 |
incomplete | Block 12 covers actual occupancy and idempotent retry; Chunk 13.1 adds completion timestamps; statistics/application use cases remain in Blocks 13 and 14. |
| MVP-AC-11 | Break a large task into child tasks with row-level priority, reward, and duration. | ChildTaskEntry, ChildTaskView, child creation helpers |
test/child_tasks_test.dart |
complete | Atomic application use case 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 |
test/child_tasks_test.dart |
complete | Activity/stat updates remain in Block 13. |
| 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, TaskActivity, statistics increment helpers, selected action services |
test/scheduling_engine_test.dart, test/required_task_actions_test.dart, test/document_mapping_test.dart, test/task_lifecycle_test.dart |
incomplete | Chunk 13.1 adds canonical activities; exactly-once counter accounting remains in Chunk 13.2. |
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, timeline tokens |
test/timeline_state_test.dart, test/occupancy_policy_test.dart, test/free_slots_test.dart, test/scheduling_invariants_test.dart |
incomplete | Block 12 covers scheduling protection, helpers, explicit required conflicts, and typed outcomes; reminder directives remain in Block 13. |
| MVP-SUP-06 | Project defaults apply, learned suggestions stay optional, and task reminder overrides are possible. | ProjectProfile, Task.reminderOverride, ReminderProfile |
test/scheduling_engine_test.dart, test/domain_invariants_test.dart |
incomplete | Task override storage exists; effective resolver, learned suggestions, and reminder directives remain in Block 13. |
| MVP-SUP-07 | Repository boundaries prepare for MongoDB without coupling the scheduler to MongoDB APIs. | Repository interfaces, in-memory repositories, document mapping helpers | test/repositories_test.dart, test/document_mapping_test.dart, test/persistence_edge_cases_test.dart |
incomplete | Complete codecs, revisions, unit of work, 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, TaskActivity, TaskActivityCode, SchedulingChange, SchedulingMovementCode, action result objects |
test/scheduling_engine_test.dart, test/required_task_actions_test.dart, test/scheduling_invariants_test.dart, test/task_lifecycle_test.dart |
incomplete | Chunk 13.1 adds canonical transition/activity records; exactly-once statistic accounting remains in Chunk 13.2. |
| 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. |