Skip to content

The daily reminder actually fires: scheduling behind the two Settings rows #443

Description

@maximsan

This was generated by AI during triage.

Triaged 8 September 2026 with the owner. Verified against lib/features/profile/domain/daily_reminder.dart, lib/features/profile/presentation/settings_screen.dart, prototype/settings.jsx:100-112, prototype/onboarding.jsx:68-82, pubspec.yaml (no notification package) and pub.dev (flutter_local_notifications 22.3.0; Swift Package Manager support since 19.0.0).

The ruling

Daily reminders are not part of the v1 launch, and are the next thing built after it. Recorded in docs/design/09-deferred-v2.md. Until they exist, the two Settings rows (the Notifications switch and the Daily reminder time row) are hidden: a switch that stores a wish nothing reads is the inert row the repo's rule forbids (#448, #531). The stored preference stays where it is.

Two rows because the design draws two controls for the one reminder: a switch to turn it on, and a row showing the time it arrives, dim and reading Off while the switch is off. They come back together when this ships.

What exists

#395 built both rows and the time sheet; DailyReminder holds the design's eight slots (6:30, 7:00, 7:30, 8:00, 8:30 AM · 12:30, 6:00, 8:30 PM) and the sheet's promise, One quiet reminder a day to keep your streak alive. Nothing schedules anything. The app is iOS only (ios/ is the only platform directory), so there is no Android half.

Scope of the build

  1. Scheduling. flutter_local_notifications (SPM-supported since 19.0.0, so it fits the SPM-only iOS project) behind a small ReminderScheduler seam with a no-op for tests, the way payments, ads and the share sheet are seamed. A daily repeating local notification at the chosen slot, in the device's local time; rescheduled when the time or the switch changes, and re-asserted on launch so a reboot, an upgrade or a timezone change cannot silently drop it.
  2. Permission. Turning the switch on asks the OS. A refusal leaves the switch off and the row's value telling the truth, with a way to system settings; the switch never shows on when the OS will not deliver.
  3. What it says. Title BrewPath, body Today's practice keeps your streak alive. Ruled 8 September 2026: no quantity in the sentence, because one lesson is not what keeps a streak — any qualifying activity does.
  4. When it fires. Only on a day with no qualifying activity yet (ruled 8 September 2026); a day already done gets no nudge.
  5. Tests. The seam's fake asserts what was scheduled and when; the permission-denied path has a widget test.

Acceptance criteria

  • The two rows are hidden until this ships; the stored preference is untouched — done, PR #559 (1cb7cbe4, 9 Sep), with the scope-doc entry; settings_screen_test asserts the rows are absent
  • With the switch on, a reminder arrives at the chosen slot daily and survives a reboot, an upgrade and a timezone change
  • Refusing the OS permission leaves the switch off with a way to system settings; nothing is scheduled
  • dart format, flutter analyze, the metrics gate and the suite pass, with a changelog bullet

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestfeature-buildA screen or mechanic the app does not have yetready-for-agentFully specified, ready for an AFK agent

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions