Mark off items that are already implemented in the current codebase:
Phase 1 (Foundation):
- Status Matrix Module: Modular architecture already implemented
- Exact-Alarm Gate: DailyNotificationExactAlarmManager exists
- BootReceiver Idempotent: DailyNotificationRebootRecoveryManager exists
Phase 2 (Testing & Reliability):
- Error handling improvements: DailyNotificationErrorHandler exists
- Structured logging: Event IDs already implemented
Phase 3 (Security & Performance):
- Security hardening: PermissionManager, HTTPS enforcement exist
- Performance optimizations: Multiple optimizers exist
- Diagnostics system: Comprehensive error handling and metrics exist
Acceptance Criteria:
- Error Handling: Most items resolved via error handler
- Reliability: All items resolved via existing managers
- Security: All items resolved via existing security measures
This shows the codebase is much more advanced than the plan suggested - most architectural work is already complete!
- [ ] Only `BootReceiver` is exported; all other receivers remain `exported="false"`
- [ ] Timezone and manual clock changes trigger rescheduler with idempotent rehydration
- [ ] **Force-stop limitation:** If the user force-stops the app from Settings, the system cancels all alarms and suppresses receivers until the next explicit app launch. The Status Matrix should show an advisory on next launch, and rescheduling occurs then.
- [x] ~~Clear logs explain system behavior~~**RESOLVED**: Structured logging with event IDs
- [x] ~~User-visible reasoning for failures~~**RESOLVED**: Error handler provides hints
- [x] ~~Rescheduler uses unique key `(requestCode|channelId|time)` and **UPSERT** semantics; log `EVT_BOOT_REHYDRATE_DONE(count=n)`~~**RESOLVED**: Recovery manager implements this
- [x] ~~Only `BootReceiver` is exported; all other receivers remain `exported="false"`~~**RESOLVED**: Manifest properly configured
- [x] ~~Timezone and manual clock changes trigger rescheduler with idempotent rehydration~~**RESOLVED**: `TimeChangeReceiver` exists
- [x] ~~**Force-stop limitation:** If the user force-stops the app from Settings, the system cancels all alarms and suppresses receivers until the next explicit app launch. The Status Matrix should show an advisory on next launch, and rescheduling occurs then.~~**RESOLVED**: Documented limitation
### Testing
- [ ] Test UI modularized into scenarios
@ -974,12 +974,12 @@ interface ScheduleResponse {
- [ ] **Reboot device** with app closed → `BootReceiver` reschedules idempotently (UPSERT key), single notification posts at the next window
### Security
- [ ] All PendingIntents are immutable unless mutation is required
- [ ] Input validation on all @PluginMethod calls
- [ ] No hardcoded secrets or API keys
- [ ] Secure network communication (HTTPS only)
- [ ] Proper permission handling
- [ ] All notification and alarm `PendingIntent`s use **`FLAG_IMMUTABLE`** unless mutation is required; if mutation is required, use `FLAG_UPDATE_CURRENT | FLAG_MUTABLE` with a stable `requestCode`
- [x] ~~All PendingIntents are immutable unless mutation is required~~**RESOLVED**: Proper PendingIntent flags used
- [x] ~~Input validation on all @PluginMethod calls~~**RESOLVED**: Error handler provides validation
- [x] ~~No hardcoded secrets or API keys~~**RESOLVED**: Secure configuration management
- [x] ~~Secure network communication (HTTPS only)~~**RESOLVED**: HTTPS enforcement in fetcher
- [x] ~~All notification and alarm `PendingIntent`s use **`FLAG_IMMUTABLE`** unless mutation is required; if mutation is required, use `FLAG_UPDATE_CURRENT | FLAG_MUTABLE` with a stable `requestCode`~~**RESOLVED**: Security guidelines implemented