# V1 Public API Baseline Status: Captured during Block 11.1. Starting commit: `775c2ed406f03a73a9b0ca621dea5b4482468616` Public import: ```dart import 'package:scheduler_core/scheduler_core.dart'; ``` The public library entry point is `lib/scheduler_core.dart`. It exports the following source files: - `src/models.dart` - `src/application_commands.dart` - `src/application_layer.dart` - `src/application_management.dart` - `src/application_recovery.dart` - `src/backlog.dart` - `src/child_tasks.dart` - `src/document_mapping.dart` - `src/free_slots.dart` - `src/locked_time.dart` - `src/occupancy_policy.dart` - `src/persistence_contract.dart` - `src/project_statistics.dart` - `src/quick_capture.dart` - `src/reminder_policy.dart` - `src/repositories.dart` - `src/scheduling_engine.dart` - `src/task_actions.dart` - `src/task_lifecycle.dart` - `src/task_statistics.dart` - `src/time_contracts.dart` - `src/today_state.dart` - `src/timeline_state.dart` This baseline is used by later chunks to distinguish intentional breaking changes from accidental API drift. ## Public enums | File | Enums | |---|---| | `src/application_commands.dart` | `ApplicationCommandCode` | | `src/application_management.dart` | `ApplicationManagementCommandCode`, `OwnerSettingsWarningCode` | | `src/application_recovery.dart` | `AppOpenRecoveryOutcome` | | `src/application_layer.dart` | `ApplicationFailureCode` | | `src/document_mapping.dart` | `DocumentMappingFailureCode` | | `src/models.dart` | `DomainValidationCode`, `TaskType`, `TaskStatus`, `PriorityLevel`, `RewardLevel`, `DifficultyLevel`, `ReminderProfile`, `BacklogTag` | | `src/backlog.dart` | `BacklogFilter`, `BacklogSortKey`, `BacklogStalenessMarker` | | `src/free_slots.dart` | `RequiredCommitmentScheduleStatus` | | `src/locked_time.dart` | `LockedWeekday`, `LockedBlockOverrideType` | | `src/occupancy_policy.dart` | `OccupancyCategory`, `OccupancySource` | | `src/project_statistics.dart` | `ProjectCompletionTimeBucket`, `ProjectSuggestionType`, `ProjectSuggestionConfidence` | | `src/quick_capture.dart` | `QuickCaptureStatus` | | `src/reminder_policy.dart` | `ReminderDirectiveAction`, `ReminderDirectiveReason`, `EffectiveReminderProfileSource` | | `src/scheduling_engine.dart` | `SchedulingNoticeType`, `SchedulingOperationCode`, `SchedulingOutcomeCode`, `SchedulingIssueCode`, `SchedulingMovementCode`, `SchedulingConflictCode` | | `src/task_actions.dart` | `FlexibleTaskQuickAction`, `RequiredTaskAction`, `PushDestination` | | `src/task_lifecycle.dart` | `TaskTransitionCode`, `TaskActivityCode`, `TaskTransitionOutcomeCode` | | `src/time_contracts.dart` | `LocalTimeResolution`, `NonexistentLocalTimePolicy`, `RepeatedLocalTimePolicy` | | `src/today_state.dart` | `TodayTimelineItemSource` | | `src/timeline_state.dart` | `TimelineItemCategory`, `TimelineBackgroundToken`, `TimelineRewardIconToken`, `TimelineDifficultyIconToken`, `TimelineQuickAction` | ## Public classes and top-level functions | File | Public API | |---|---| | `src/application_commands.dart` | `ApplicationChildTaskDraft`, `ApplicationCommandReadHint`, `ApplicationCommandResult`, `V1ApplicationCommandUseCases` | | `src/application_layer.dart` | `OwnerTimeZoneContext`, `ApplicationOperationContext`, `ApplicationFailure`, `ApplicationResult`, `ApplicationFailureException`, `ApplicationPersistenceException`, `ApplicationOperationRecord`, `NoticeAcknowledgementRecord`, `OwnerSettings`, `TaskActivityRepository`, `ProjectStatisticsRepository`, `OwnerSettingsRepository`, `NoticeAcknowledgementRepository`, `ApplicationOperationRepository`, `ApplicationUnitOfWorkRepositories`, `ApplicationUnitOfWork`, `ApplicationSchedulingLoader`, `InMemoryApplicationUnitOfWork` | | `src/application_management.dart` | `GetBacklogRequest`, `BacklogItemReadModel`, `BacklogQueryResult`, `GetProjectDefaultsRequest`, `ProjectDefaultsQueryResult`, `ProjectProfileDraft`, `ProjectProfileUpdate`, `LockedBlockDraft`, `LockedBlockUpdate`, `OwnerSettingsUpdateResult`, `OwnerSettingsUpdate`, `NoticeAcknowledgementResult`, `V1ApplicationManagementUseCases` | | `src/application_recovery.dart` | `RunAppOpenRecoveryRequest`, `AppOpenRecoveryResult`, `V1AppOpenRecoveryUseCases` | | `src/models.dart` | `DomainValidationException`, `Task`, `ProjectProfile`, `TimeInterval` | | `src/backlog.dart` | `BacklogStalenessSettings`, `BacklogView` | | `src/child_tasks.dart` | `ChildTaskEntry`, `ChildTaskBreakUpRequest`, `ChildTaskBreakUpResult`, `ChildTaskBreakUpService`, `ChildTaskView`, `ChildTaskCompletionResult`, `ChildTaskCompletionService`, `ChildTaskSummary` | | `src/document_mapping.dart` | `DocumentMappingException`, `DocumentMetadata`, `PersistenceEnumMapping`, `TaskDocumentMapping`, `TaskStatisticsDocumentMapping`, `ProjectDocumentMapping`, `ProjectStatisticsDocumentMapping`, `LockedBlockRecurrenceDocumentMapping`, `LockedBlockDocumentMapping`, `LockedBlockOverrideDocumentMapping`, `TaskActivityDocumentMapping`, `OwnerSettingsDocumentMapping`, `BacklogStalenessDocumentMapping`, `NoticeAcknowledgementDocumentMapping`, `ApplicationOperationDocumentMapping`, `SchedulingSnapshotDocumentMapping`, `SchedulingWindowDocumentMapping`, `TimeIntervalDocumentMapping`, `SchedulingNoticeDocumentMapping`, `SchedulingChangeDocumentMapping`, `SchedulingOverlapDocumentMapping`, `TaskDocumentExtension`, `TaskStatisticsDocumentExtension`, `ProjectStatisticsDocumentExtension` | | `src/free_slots.dart` | `ProtectedFreeSlotConflict`, `RequiredCommitmentScheduleResult`, `FreeSlotService` | | `src/locked_time.dart` | `ClockTime`, `LockedBlockRecurrence`, `LockedBlock`, `LockedBlockOccurrence`, `LockedBlockOverride`, `LockedScheduleExpansion`, `expandLockedBlocksForDay`, `lockedSchedulingIntervalsForDay`, `trackCompletedDuringLockedHours`, `completedDuringLockedHoursMinutes` | | `src/occupancy_policy.dart` | `OccupancyEntry`, `OccupancyPolicy` | | `src/persistence_contract.dart` | `v1SchemaVersion`, `PersistenceDateTimeConvention`, `PersistenceCivilDateConvention`, `PersistenceWallTimeConvention`, `PersistenceEnumName`, V1 document field-name classes | | `src/project_statistics.dart` | `ProjectStatistics`, `ProjectStatisticsApplicationResult`, `ProjectStatisticsAggregationService`, `ProjectSuggestionPolicy`, `ProjectSuggestion`, `ProjectSuggestionSet`, `ProjectDefaultResolution`, `ProjectSuggestionService` | | `src/quick_capture.dart` | `QuickCaptureRequest`, `QuickCaptureResult`, `QuickCaptureService` | | `src/reminder_policy.dart` | `EffectiveReminderProfile`, `ReminderDirective`, `ReminderPolicyService` | | `src/repositories.dart` | `SchedulingStateSnapshot`, `InMemoryTaskRepository`, `InMemoryProjectRepository`, `InMemoryLockedBlockRepository`, `InMemorySchedulingSnapshotRepository` | | `src/scheduling_engine.dart` | `SchedulingWindow`, `SchedulingInput`, `SchedulingChange`, `SchedulingOverlap`, `SchedulingNotice`, `SchedulingResult`, `SchedulingEngine` | | `src/task_actions.dart` | `FlexibleTaskActionResult`, `PushDestinationResult`, `RequiredTaskActionResult`, `SurpriseTaskLogRequest`, `SurpriseTaskLogResult`, `FlexibleTaskActionService`, `RequiredTaskActionService`, `SurpriseTaskLogService` | | `src/task_lifecycle.dart` | `TaskActivity`, `TaskActivityApplicationResult`, `TaskActivityAccountingService`, `TaskTransitionResult`, `TaskTransitionService` | | `src/task_statistics.dart` | `TaskStatistics` | | `src/time_contracts.dart` | `Clock`, `SystemClock`, `FixedClock`, `IdGenerator`, `SequentialIdGenerator`, `CivilDate`, `WallTime`, `TimeZoneResolutionOptions`, `ResolvedLocalDateTime`, `TimeZoneResolver`, `FixedOffsetTimeZoneResolver` | | `src/today_state.dart` | `GetTodayStateRequest`, `TodayTimelineItem`, `TodayCompactState`, `TodayPendingNotice`, `TodayState`, `GetTodayStateQuery` | | `src/timeline_state.dart` | `TimelineItem`, `CompactTimelineState`, `TimelineItemMapper` | ## Current model baseline `TaskType` values: - `flexible` - `inflexible` - `critical` - `locked` - `surprise` - `freeSlot` `TaskStatus` values: - `planned` - `active` - `completed` - `missed` - `cancelled` - `noLongerRelevant` - `backlog` Current notable model fields: - `Task`: `id`, `title`, `projectId`, `type`, `status`, `priority`, `reward`, `difficulty`, `durationMinutes`, `scheduledStart`, `scheduledEnd`, `actualStart`, `actualEnd`, `completedAt`, `parentTaskId`, `backlogTags`, `reminderOverride`, `createdAt`, `updatedAt`, `stats` - `ProjectProfile`: `id`, `name`, `colorKey`, default priority/reward/ difficulty/reminder profile/duration fields, `archivedAt` - `ProjectStatistics`: completion count, duration sample counts, completion-time buckets, pushes-before-completion totals, reward/difficulty distributions, and reminder-profile observations - `TimeInterval`: `start`, `end`, optional `label` - `TaskStatistics`: skip/push/backlog/missed/cancelled/late/locked-hour, completed-after-shield, and push-before-completion counters. Parent/child completion patterns are carried as activity metadata. Known baseline gaps to preserve as explicit later work: - `TaskStatus` does not include `pushed` or `skipped`; Chunk 11.2 resolves the status/event distinction. - `Task` does not yet have an explicit backlog-entered timestamp field. - Instant ranges still use `DateTime`; locked recurrence dates, wall-clock rules, clocks, IDs, and timezone resolution are explicit Chunk 11.4 contracts. ## Intentional API Changes After Baseline Chunk 11.3 intentionally changed the public API: - Added `DomainValidationCode` and `DomainValidationException`. - Added `Task.actualStart`, `Task.actualEnd`, and `Task.reminderOverride`. - Added explicit `copyWith` clear flags for nullable task fields. - Added `ProjectProfile.copyWith(clearDefaultDuration: true)`. - Changed several public value constructors from `const` to runtime-validating constructors. - Public collection fields now expose unmodifiable snapshots instead of caller mutable collections. Chunk 11.4 intentionally changed the public API: - Added clock, ID, civil-date, wall-time, timezone resolver, DST policy, and fixed-offset resolver contracts in `src/time_contracts.dart`. - Exported `src/time_contracts.dart` from `scheduler_core.dart`. - Added `nonexistentLocalTime` and `ambiguousLocalTime` validation codes. - Changed `ClockTime` to a backwards-compatible alias of `WallTime`. - Changed locked block dates and override dates from `DateTime` to `CivilDate`. - Changed locked-time expansion helpers and override interval conversion to require explicit `timeZoneId` and `TimeZoneResolver`. - Added injected `Clock` boundaries to scheduling/action/child completion services and optional `IdGenerator` convenience wrappers for quick capture and surprise logging. - Added civil-date and wall-time persistence conventions that store strings without timezone conversion. Chunk 12.1 intentionally changed the public API: - Added `src/occupancy_policy.dart` and exported it from `scheduler_core.dart`. - Added `OccupancyCategory`, `OccupancySource`, `OccupancyEntry`, and `OccupancyPolicy`. - Added policy-derived `SchedulingInput.occupancyEntries`, `SchedulingInput.movablePlannedFlexibleTasks`, and `SchedulingInput.conflictReportingOccupancies`. - Changed `SchedulingInput.blockedIntervals` to derive from the central occupancy policy rather than from duplicated task-type filters. Chunk 12.2 intentionally changed the public API: - Added `src/free_slots.dart` and exported it from `scheduler_core.dart`. - Added `RequiredCommitmentScheduleStatus`, `ProtectedFreeSlotConflict`, `RequiredCommitmentScheduleResult`, and `FreeSlotService`. - Added validated Free Slot create/update helpers and a typed explicit required commitment scheduling result for protected-rest conflicts. Chunk 12.3 intentionally changed the public API: - Added optional `revealHiddenLockedDetails` parameters to `SurpriseTaskLogService.log` and `SurpriseTaskLogService.logNew`. - Defined `SurpriseTaskLogRequest.id` as the idempotency key for retrying the same surprise log operation. - Surprise tasks with known time now populate `actualStart` and `actualEnd` in addition to the existing scheduled interval compatibility fields. Chunk 12.4 intentionally changed the public API: - Added stable scheduler code enums: `SchedulingOperationCode`, `SchedulingOutcomeCode`, `SchedulingIssueCode`, `SchedulingMovementCode`, and `SchedulingConflictCode`. - Added `SchedulingResult.operationCode` and `SchedulingResult.outcomeCode`. - Added `SchedulingNotice.issueCode`, `SchedulingNotice.movementCode`, `SchedulingNotice.conflictCode`, and immutable `SchedulingNotice.parameters`. - Changed `SchedulingNotice` from a `const` constructor to a runtime constructor so notice parameters can be defensively copied. - Added a `SchedulingResult` assertion that each notice uses at most one issue, movement, or conflict code. Chunk 13.1 intentionally changed the public API: - Added `src/task_lifecycle.dart` and exported it from `scheduler_core.dart`. - Added `TaskTransitionCode`, `TaskActivityCode`, `TaskTransitionOutcomeCode`, `TaskActivity`, `TaskTransitionResult`, and `TaskTransitionService`. - Added `Task.completedAt` and `Task.copyWith(clearCompletion: true)`. - Added `TaskActivityDocumentFields` and `TaskDocumentFields.completedAt`. - Added activity and transition outcome fields to flexible, push-destination, and required task action results. - Routed flexible/required direct action services through the canonical transition service while preserving existing scheduling helper compatibility. Chunk 13.2 intentionally changed the public API: - Added `TaskActivityApplicationResult` and `TaskActivityAccountingService`. - Added `TaskStatistics.completedAfterShieldCount`, `TaskStatistics.completedAfterPushCount`, and `TaskStatistics.totalPushesBeforeCompletion`. - Added `TaskStatistics.recordPushesBeforeCompletion`. - Added matching `TaskStatisticsDocumentFields` constants and document mapping. - Added `appliedActivityIds` and `lockedIntervals` parameters to `TaskTransitionService.apply`. - Added actual/locked interval parameters to flexible and required action completion paths. - Added `SurpriseTaskLogResult.activities` and routed surprise completion through the same accounting boundary. Chunk 13.3 intentionally changed the public API: - Added `ChildTaskBreakUpRequest`, `ChildTaskBreakUpResult`, and `ChildTaskBreakUpService`. - Added `activities` and `transitionOutcomeCodes` to `ChildTaskCompletionResult`. - Added `transitionService` injection to `ChildTaskCompletionService`. - Added `operationId`, existing-activity, and applied-activity parameters to child and parent completion methods. - Added `ChildTaskCompletionService.completeParentFromChild`. - Routed parent/child completion through canonical lifecycle transitions and parent/child completion metadata. Chunk 13.4 intentionally changed the public API: - Added `src/project_statistics.dart` and exported it from `scheduler_core.dart`. - Added project-statistics enums, aggregate model, exactly-once aggregation result/service, suggestion policy/result types, and configured-default resolution. - Added `ProjectStatisticsDocumentFields`, `ProjectStatisticsDocumentMapping`, and `ProjectStatisticsDocumentExtension`. - Added project-statistics field sets to the persistence field registry. - Expanded completion activity metadata with duration, reward, difficulty, and reminder-profile observations for project aggregation. Chunk 13.5 intentionally changed the public API: - Added `src/reminder_policy.dart` and exported it from `scheduler_core.dart`. - Added reminder directive action/reason enums and effective-profile source enum. - Added `EffectiveReminderProfile`, `ReminderDirective`, and `ReminderPolicyService`. - Added deterministic effective-profile resolution using task override, project configured default, then fallback. - Added typed reminder directives for normal delivery, suppression, deferral, and required-task acknowledgement, including protected Free Slot suppression. Chunk 14.1 intentionally changed the public API: - Added `src/application_layer.dart` and exported it from `scheduler_core.dart`. - Added application operation context, owner time-zone context, typed result/failure contracts, and expected application/persistence exceptions. - Added activity, project-statistics, owner-settings, operation-record, and unit-of-work repository contracts for application orchestration. - Added `OwnerSettings`, `ApplicationOperationRecord`, `ApplicationSchedulingLoader`, and `InMemoryApplicationUnitOfWork`. - Added in-memory staged transaction behavior with exactly-once operation records and rollback on typed failures or persistence failures. Chunk 14.2 intentionally changed the public API: - Added `src/today_state.dart` and exported it from `scheduler_core.dart`. - Added `GetTodayStateQuery`, `GetTodayStateRequest`, `TodayState`, `TodayTimelineItem`, `TodayCompactState`, and `TodayPendingNotice`. - Added `TodayTimelineItemSource` for stable task-vs-overlay source metadata. - Added `ApplicationUnitOfWork.read` so application queries can access repositories without creating operation records. - Added an optional `occurrenceDate` parameter to `TimelineItemMapper.fromLockedOccurrence` so Today read models can produce date-stable locked overlay IDs. - Updated compact next-flexible selection so the current flexible item is not also returned as `nextFlexibleItem`. Chunk 14.3 intentionally changed the public API: - Added `src/application_commands.dart` and exported it from `scheduler_core.dart`. - Added `ApplicationCommandCode`, `ApplicationChildTaskDraft`, `ApplicationCommandReadHint`, `ApplicationCommandResult`, and `V1ApplicationCommandUseCases`. - Added atomic V1 commands for quick capture, backlog scheduling, flexible push/backlog/completion, required task actions, surprise logging, protected Free Slot create/update/remove, child break-up, and parent/child completion. - Command results return changed tasks, persisted activities, project aggregate updates, scheduler notices/changes/overlaps, child ids, and read refresh hints. - Application command failures use stable `ApplicationFailureCode` values for not found, stale revision, no slot, validation, persistence, and duplicate operation outcomes. Chunk 14.4 intentionally changed the public API: - Added `src/application_management.dart` and exported it from `scheduler_core.dart`. - Added management query/command contracts for backlog, project defaults, project create/update/archive, locked-block create/update/archive, one-day locked overrides, owner settings updates, and notice acknowledgement. - Added `ProjectProfile.archivedAt` and `LockedBlock.archivedAt` soft-archive fields. - Added `NoticeAcknowledgementRecord` and `NoticeAcknowledgementRepository`. - Added stable notice IDs to `TodayPendingNotice` and Today-state filtering for acknowledged notices. Chunk 14.5 intentionally changed the public API: - Added `src/application_recovery.dart` and exported it from `scheduler_core.dart`. - Added `AppOpenRecoveryOutcome`, `RunAppOpenRecoveryRequest`, `AppOpenRecoveryResult`, and `V1AppOpenRecoveryUseCases`. - Added `InMemoryApplicationUnitOfWork.currentSchedulingSnapshots` for application/recovery contract tests. Chunk 15.2 intentionally changed the public API: - Replaced legacy enum `.name` document encoding in `document_mapping.dart` with explicit stable V1 code tables through `PersistenceEnumMapping`. - Added `DocumentMappingFailureCode`, `DocumentMappingException`, and `DocumentMetadata`. - Expanded document codecs to every V1 persisted entity: project profiles, project statistics, locked blocks/overrides, activities, owner settings, notice acknowledgements, operation records, scheduling snapshots, notices, changes, overlaps, windows, intervals, civil dates, and wall times. - Changed top-level document `toDocument` helpers/extensions to require owner scope and V1 metadata where the domain model does not carry it directly. - Expanded `persistence_contract.dart` with `v1SchemaVersion`, common document fields, and V1 field sets for every persisted repository entity. Chunk 15.3 intentionally changed the public API: - Added `src/document_migration.dart` and exported it from `scheduler_core.dart`. - Added `V1DocumentMigrationService` for pure Dart V0-to-V1 migration of task, project, locked block, and locked override documents. - Added typed migration surface area: `DocumentMigrationEntity`, `DocumentMigrationStatus`, `DocumentMigrationFailureCode`, `DocumentMigrationNoteCode`, `DocumentMigrationProvenance`, `DocumentMigrationNote`, `DocumentMigrationReport`, and `DocumentMigrationResult`. - Migration results expose `document`, `isSuccess`, and `shouldWrite` so persistence adapters can dry-run migrations and refuse to overwrite unreadable source documents. - Legacy backlog tasks now carry explicit provenance when `backlogEnteredAt` is approximated from `createdAt`. Chunk 15.4 intentionally changed the public API: - Added adapter-neutral repository conflict/paging/record contracts: `RepositoryFailureCode`, `RepositoryFailure`, `RepositoryMutationResult`, `RepositoryRecord`, `RepositoryPageRequest`, `RepositoryPage`, and `BacklogCandidateQuery`. - Expanded `TaskRepository` with owner, project, parent, backlog-candidate, local-day/window, record/revision, insert, and compare-and-set save methods. - Expanded `ProjectRepository` and `LockedBlockRepository` with owner-scoped paged queries, revision records, compare-and-set saves, duplicate insert failures, archive methods, and date-scoped locked override lookup. - Expanded application-layer repository interfaces for task activity owner queries/appends, project statistics/settings revision saves, notice acknowledgement insert/paging, and idempotent operation lookup/insert. - In-memory unit-of-work repositories now track owner/revision metadata in the staged transaction state. Chunk 15.5 intentionally changed the public API: - Added V1 collection/index contract types and constants: `PersistenceCollections`, `PersistenceIndexDirection`, `PersistenceIndexField`, `PersistenceIndexSpec`, `RepositoryQueryNames`, and `PersistenceIndexCatalog`. - Added bounded payload/retention guard surface: `PersistencePayloadLimits`, `PersistenceGuardResult`, and `PersistencePayloadGuard`. - Added repository integrity failure codes for invalid revisions and owner mismatches. - Added `V1_BLOCK_16_REPOSITORY_ADAPTER_CHECKLIST.md` for the former document adapter implementation prerequisites, archived after the SQLite-first pivot. Chunk 19.1 intentionally changed the public/package API: - Rehomed the core library under `packages/scheduler_core` with public import `package:scheduler_core/scheduler_core.dart`. - Added shared repository value objects exported from `scheduler_core`: `OwnerId`, `Revision`, `PageRequest`, and `Page`. - Added `packages/scheduler_persistence` with domain-only repository interfaces for tasks, projects, locked blocks, settings, and schedule snapshots. - Added `RepositoryFailure` variants, sealed `Either`, and `RepoResult` for expected repository success/failure paths. Chunk 19.2 intentionally changed the public/package API: - Added `packages/scheduler_persistence_memory` with `InMemoryTaskRepository`, `InMemoryProjectRepository`, `InMemoryLockedBlockRepository`, `InMemorySettingsRepository`, and `InMemoryScheduleSnapshotRepository`. - Added package entry points `package:scheduler_persistence_memory/persistence_memory.dart` and `package:scheduler_persistence_memory/memory.dart`. - Added shared adapter conformance test surface `runRepositoryComplianceTests()` and `RepositoryComplianceFactories` under `packages/scheduler_persistence/test/repo_conformance.dart`. Chunk 20.1 intentionally changed the public/package API: - Added `packages/scheduler_persistence_sqlite` with Drift-backed schema package entry point `package:scheduler_persistence_sqlite/sqlite.dart`. - Added `SchedulerDb` with schema version 1 and generated Drift table/data classes for `tasks`, `projects`, `locked_blocks`, `locked_overrides`, `settings`, and `snapshots`. - Added generated accessor classes: `TaskDao`, `ProjectDao`, `LockedBlockDao`, `SettingsDao`, and `SnapshotDao`. Chunk 20.2 intentionally changed the public/package API: - Added SQLite repository implementations exported from `package:scheduler_persistence_sqlite/sqlite.dart`: `SqliteTaskRepository`, `SqliteProjectRepository`, `SqliteLockedBlockRepository`, `SqliteSettingsRepository`, and `SqliteScheduleSnapshotRepository`. - Added SQLite adapter conformance and write-latency tests under `packages/scheduler_persistence_sqlite/test/`. Chunk 21.1 intentionally changed the public/package API: - Added `packages/scheduler_notifications` with package entry points `package:scheduler_notifications/notifications.dart` and `package:scheduler_notifications/scheduler_notifications.dart`. - Added notification abstraction types: `NotificationRequest`, `NotificationFeedbackType`, `NotificationFeedback`, `NotificationAdapter`, and `FakeNotificationAdapter`. Chunk 22.1 intentionally changed the public/package API: - Added `packages/scheduler_notifications_desktop` with package entry points `package:scheduler_notifications_desktop/desktop_notifications.dart` and `package:scheduler_notifications_desktop/scheduler_notifications_desktop.dart`. - Added desktop notification types: `DesktopNotificationPlatform`, `DesktopNotificationBackend`, `DesktopNotificationAdapter`, `StdoutNotificationBackend`, and the IO backends for Linux/macOS. Chunk 23.1 intentionally changed the public/package API: - Added `packages/scheduler_export` with package entry points `package:scheduler_export/export.dart` and `package:scheduler_export/scheduler_export.dart`. - Added readable export contracts and orchestration types: `ExportContext`, `ExportWriter`, `ExportWriterFactory`, `ExportWriterRegistry`, `ExportController`, `ExportException`, and `ExportRepositoryException`. - Added sink-backed writer implementations `JsonExportWriter` and `CsvExportWriter`. Chunk 24.1 intentionally changed the public/package API: - Added `packages/scheduler_backup` with package entry points `package:scheduler_backup/backup.dart` and `package:scheduler_backup/scheduler_backup.dart`. - Added encrypted backup functions `createEncryptedBackup`, `restoreEncryptedBackup`, `defaultSchedulerSqliteFile`, and `defaultSchedulerBackupDirectory`. - Added backup constants `defaultSchedulerDirectoryName`, `defaultSchedulerDatabaseFileName`, and `defaultSchedulerBackupDirectoryName`. - Added backup exceptions `BackupException` and `BackupDecryptionException`. Chunk 24.2 intentionally changed the public/package API: - Added `packages/scheduler_export_json` with package entry points `package:scheduler_export_json/export_json.dart` and `package:scheduler_export_json/scheduler_export_json.dart`. - Added readable writer factory `readableExportWriterRegistry`. - Added concrete readable export writers `JsonExportWriter` and `CsvExportWriter`. - Added CLI export command `bin/export.dart`. Chunk 25.1 intentionally changed the workspace test surface: - Added test-only package `packages/scheduler_integration_tests`. - Added integration harness `integration/scheduler_flow_test.dart` covering scheduler placement, fake notification scheduling, SQLite save, and reload. Chunk 26.1 intentionally changed the verification surface: - Added executable `scripts/test.sh` as the required analyze/test/coverage gate. - Added `tool/check_coverage.dart` for LCOV threshold enforcement. - Added shared notification adapter contract test helper `packages/scheduler_notifications/test/notification_adapter_contract.dart`. - Desktop notification adapter cancellation now normalizes ids before backend cancellation. Chunk 27.1 intentionally changed the dev/CI surface: - Added `scripts/dev.dart` for local build-runner watch plus Flutter desktop launch with a SQLite path define. - Added `scripts/test.dart` for cross-platform coverage collection and LCOV combination. - Added `scripts/bootstrap_dev.sh` and `scripts/dev.sh` shell entry points for agent-compatible setup and desktop development. - Added GitHub Actions test matrix in `.github/workflows/ci.yml`. Chunk 27.2 intentionally changed the packaging surface: - Added `scripts/build.dart` for platform-specific Flutter desktop packaging. - Added `scripts/package_release.sh` shell entry point for release packaging. - Added tagged CI release artifact upload steps. - Replaced README content with workspace test, dev, packaging, and prerequisite instructions. Chunk 28.1 intentionally changed the documentation verification surface: - Added `tool/check_docs.dart` to generate package docs and fail on warnings. - Added generated docs upload under the CI artifact step. - Added generated `doc/api/` output to `.gitignore`. - Fixed unresolved public API documentation references in core and export packages. Chunk 29.1 intentionally changed the UI surface: - Added provisional Flutter app `apps/focus_flow_flutter` outside the root Dart workspace. - Added app-local path dependency on `packages/scheduler_core`. - Added `FocusFlowApp`, `DemoSchedulerComposition`, `SchedulerHome`, `TodayPane`, and `BacklogPane` in the Flutter app. - Added widget test coverage for rendering Today and Backlog read-model data. Chunk 29.2 intentionally changed the UI surface: - Split the Flutter shell into `app.dart`, `composition/`, `controllers/`, `theme/`, and `widgets/`. - Added `UiReadController`, `ApplicationReadController`, and `SchedulerReadState` variants for loading, data, empty, and typed failure states. - Added `SchedulerVisualTokens` for centralized project/task/reward/difficulty and staleness visual mappings. - Added component widgets for Today, Backlog, compact panels, timeline rows, backlog rows, notice banners, empty states, and failure retry states. - Expanded Flutter widget coverage to 4 tests. ## Repository contracts The current repository surface is pure Dart and adapter-backed: - Core legacy repository fakes remain in `scheduler_core` for existing domain services and tests. - The Block 19 repository abstraction lives in `scheduler_persistence`. - The Block 19 conformance-tested memory adapter lives in `scheduler_persistence_memory`. - The Block 20 conformance-tested SQLite adapter lives in `scheduler_persistence_sqlite`. - Application transaction behavior is represented by `InMemoryApplicationUnitOfWork`. - Application read-query behavior uses `ApplicationUnitOfWork.read`, which stages repository access without committing operation records. Future SQLite adapter work must remain behind repository interfaces and must not import storage APIs into the scheduling core.