You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

17 KiB

Daily Notification Plugin - Implementation Roadmap

📝 SANITY CHECK IMPROVEMENTS APPLIED: This document has been updated to clarify current implementation status and distinguish between existing infrastructure and planned T–lead logic.

Status: Ready for implementation
Date: 2025-01-27
Author: Matthew Raymer
Assessment Date: 2025-01-27


Executive Summary

This document outlines the implementation roadmap to bring the current Daily Notification Plugin (65% complete) to full compliance with the Native-First Notification System specification. The implementation is organized into three phases, with Phase 1 containing critical infrastructure components required for core functionality.

Current State Assessment

  • Overall Completion: 65% of specification requirements
  • Critical Gaps: SQLite database sharing, TTL-at-fire enforcement, rolling window safety
  • Current Storage: SharedPreferences (Android) / UserDefaults (iOS) + in-memory cache
  • Background Infrastructure: Basic WorkManager (Android) exists, but lacks T–lead logic
  • Critical Path: Data persistence → Freshness enforcement → Platform completion

Current Implementation Status Clarification

Background Fetch Infrastructure

Current State: Basic infrastructure exists but lacks T–lead logic

  • Android: DailyNotificationFetchWorker.java (WorkManager) exists
  • Android: DailyNotificationFetcher.java with scheduling logic exists
  • Missing: T–lead calculation, TTL enforcement, ETag support
  • Status: Infrastructure ready, T–lead logic needs implementation

iOS Implementation Status

Current State: Basic plugin structure with power management

  • Implemented: Plugin skeleton, power management, UserDefaults storage
  • Missing: BGTaskScheduler, background tasks, T–lead prefetch
  • Status: Foundation exists, background execution needs implementation

Gate: No further freshness or scheduling work merges to main until shared SQLite (see Glossary → Shared DB) is in place and reading/writing under WAL (see Glossary → WAL), with UI hot-read verified.

Dependencies: None

1.1 SQLite Database Sharing Implementation

Priority: CRITICAL

Requirements

  • Migrate from SharedPreferences/UserDefaults to shared SQLite database (see Glossary → Shared DB)
  • WAL mode configuration for concurrent access (see Glossary → WAL)
  • Schema version checking and compatibility validation (see Glossary → PRAGMA user_version)
  • Required tables: notif_contents, notif_deliveries, notif_config
  • Migration Strategy: Gradual migration from current tiered storage (see Glossary → Tiered Storage)

Implementation Tasks

  • Migration from Current Storage

    • Create migration utilities from SharedPreferences to SQLite
    • Implement data migration from UserDefaults to SQLite (iOS)
    • Add backward compatibility during transition
    • Preserve existing notification data during migration
  • SQLite Setup (Android)

    • Create DailyNotificationDatabase.java with WAL mode (see Glossary → WAL)
    • Implement schema version checking (PRAGMA user_version) (see Glossary → PRAGMA user_version)
    • Add database connection management with proper error handling
  • Database Configuration

    • Add dbPath: string to ConfigureOptions interface
    • Implement database path resolution (absolute vs platform alias)
    • Add storage: 'shared' configuration option
    • Extend existing NotificationOptions with database settings
  • Database Schema

    -- notif_contents: keep history, newest-first reads
    CREATE TABLE IF NOT EXISTS notif_contents(
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      slot_id TEXT NOT NULL,
      payload_json TEXT NOT NULL,
      fetched_at INTEGER NOT NULL,  -- epoch ms
      etag TEXT,
      UNIQUE(slot_id, fetched_at)
    );
    CREATE INDEX IF NOT EXISTS notif_idx_contents_slot_time
      ON notif_contents(slot_id, fetched_at DESC);
    
    -- notif_deliveries: track many deliveries per slot/time
    CREATE TABLE IF NOT EXISTS notif_deliveries(
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      slot_id TEXT NOT NULL,
      fire_at INTEGER NOT NULL,     -- intended fire time (epoch ms)
      delivered_at INTEGER,         -- when actually shown (epoch ms)
      status TEXT NOT NULL DEFAULT 'scheduled',  -- scheduled|shown|error|canceled
      error_code TEXT, error_message TEXT
    );
    
    -- notif_config: generic configuration KV
    CREATE TABLE IF NOT EXISTS notif_config(
      k TEXT PRIMARY KEY,
      v TEXT NOT NULL
    );
    

Acceptance Criteria

  • App and plugin can open the same SQLite file
  • WAL mode enables concurrent reads during writes
  • Schema version checking prevents compatibility issues
  • All required tables exist and are accessible
  • Shared DB visibility: UI reads updated rows immediately
  • WAL overlap shows no UI blocking during background writes
  • UI can read a row written by a background job within the same second (WAL hot-read)
  • Plugin refuses to write if PRAGMA user_version < expected

1.2 TTL-at-Fire Enforcement

Priority: CRITICAL

Requirements

  • Skip arming notifications if (T - fetchedAt) > ttlSeconds (see Glossary → TTL)
  • Validate freshness before scheduling
  • Log TTL violations for debugging
  • Current State: Not implemented - needs to be added to existing scheduling logic
  • Shared DB (single file): App owns migrations (PRAGMA user_version) (see Glossary → PRAGMA user_version); plugin opens the same path; enable journal_mode=WAL (see Glossary → WAL), synchronous=NORMAL, busy_timeout=5000, foreign_keys=ON; background writes are short & serialized.

Implementation Tasks

  • TTL Validation Logic

    • Insert TTL check into the scheduler path before any arm/re-arm
    • Add log code TTL_VIOLATION
    • Implement freshness validation before arming
    • Before arming, if (T − fetchedAt) > ttlSeconds, skip arming and log TTL_VIOLATION
    • Add TTL configuration to NotificationOptions
  • Freshness Checking

    • Create isContentFresh() method
    • Implement TTL calculation logic
    • Add logging for TTL violations
  • Configuration Integration

    • Add ttlSeconds to NotificationOptions interface
    • Implement default TTL values (3600 seconds = 1 hour)
    • Add TTL validation in option validation

Acceptance Criteria

  • Notifications are skipped if content is stale
  • TTL violations are logged with timestamps
  • Default TTL values are applied when not specified
  • Freshness checking works across all platforms
  • No armed notification violates TTL-at-fire
  • No armed row violates TTL at T across platforms

1.3 Rolling Window Safety

Priority: CRITICAL

Requirements

  • Keep today's remaining notifications armed
  • Keep tomorrow's notifications armed (within iOS caps) (see Glossary → Rolling window)
  • Ensure closed-app delivery reliability
  • Current State: Basic scheduling exists, but no rolling window logic

Implementation Tasks

  • Rolling Window Logic (see Glossary → Rolling window)

    • Implement armRollingWindow() method
    • Calculate today's remaining slots
    • Calculate tomorrow's slots within iOS limits
    • Account for iOS pending-notification limits; arm tomorrow only if within cap
  • iOS Capacity Management

    • Implement iOS pending notification limit checking
    • Add capacity-aware scheduling logic
    • Handle capacity overflow gracefully
  • Window Maintenance

    • Create maintainRollingWindow() method
    • Implement automatic re-arming logic
    • Add window state persistence

Acceptance Criteria

  • Today's remaining notifications stay armed
  • Tomorrow's notifications are armed within iOS caps
  • Closed-app delivery works reliably
  • Window maintenance runs automatically
  • Today always armed; tomorrow armed when within iOS cap

1.4 Configuration API Enhancement

Priority: HIGH

Requirements

  • Add dbPath configuration option
  • Implement database path resolution
  • Add storage mode configuration
  • Current State: No database path configuration exists

Implementation Tasks

  • Interface Updates

    • Extend ConfigureOptions with dbPath: string
    • Add storage: 'shared' option
    • Update validation logic
  • Path Resolution

    • Implement absolute path handling
    • Add platform-specific path resolution
    • Create path validation logic

Acceptance Criteria

  • dbPath can be configured via API
  • Path resolution works on all platforms
  • Configuration validation prevents invalid paths

Phase 2: Platform Completion (High Priority)

Dependencies: Phase 1 completion - CRITICAL: Phase 2 cannot start until SQLite sharing + TTL enforcement are finished

2.1 iOS Background Tasks Implementation

Priority: HIGH

Requirements

  • BGTaskScheduler for T-lead prefetch (see Glossary → T–lead)
  • Silent push nudge support
  • Background execution budget management
  • Schedule prefetch at T–lead = T − prefetchLeadMinutes (see Glossary → T–lead)
  • On wake, perform one ETag-aware fetch with 12s timeout; never fetch at delivery
  • Optionally (re)arm if still within TTL-at-fire (see Glossary → TTL)
  • Single attempt at T–lead; 12s timeout; no delivery-time fetch; (re)arm only if within TTL-at-fire. (Planned)

Implementation Tasks

  • BGTaskScheduler Integration

    • Create DailyNotificationBackgroundTask.swift
    • Implement background task registration
    • Add task expiration handling
  • Silent Push Support

    • Add silent push notification handling
    • Implement push-to-background task bridge
    • Add push token management
  • Budget Management

    • Implement execution budget tracking
    • Add budget-aware scheduling
    • Handle budget exhaustion gracefully

Acceptance Criteria

  • Background tasks run at T-lead (see Glossary → T–lead)
  • Silent push can trigger background execution
  • Budget management prevents system penalties
  • Background execution works when app is closed
  • iOS BGTask best-effort at T–lead; closed-app still delivers via rolling window (see Glossary → Rolling window)

2.2 Android Fallback Completion

Priority: HIGH

Requirements

  • Complete ±10 minute windowed alarm implementation (see Glossary → Windowed alarm)
  • Finish reboot/time change recovery
  • Improve exact alarm fallback handling (see Glossary → Exact alarm)
  • Finalize ±10m windowed alarm; reboot/time-change recovery; deep-link to Exact Alarm permission. (Planned)

Implementation Tasks

  • Windowed Alarm Implementation

    • Complete scheduleInexactAlarm() method
    • Implement ±10 minute window targeting
    • Add window size configuration
  • Recovery Mechanisms

    • Complete BOOT_COMPLETED receiver
    • Implement TIMEZONE_CHANGED handling
    • Add TIME_SET recovery logic
  • Fallback Logic

    • Improve exact alarm permission checking
    • Add graceful degradation to windowed alarms
    • Implement fallback logging

Acceptance Criteria

  • Windowed alarms target ±10 minute windows
  • Reboot recovery re-arms next 24h
  • Time change recovery recomputes schedules
  • Fallback works seamlessly
  • Android exact permission path verified with fallback ±10m

2.3 Electron Platform Support

Priority: MEDIUM

Requirements

  • Notifications while app is running
  • Start-on-Login support
  • Best-effort background scheduling

Implementation Tasks

  • Electron Integration

    • Create DailyNotificationElectron.ts
    • Implement notification API
    • Add Start-on-Login support
  • Background Limitations

    • Document Electron limitations
    • Implement best-effort scheduling
    • Add fallback mechanisms

Acceptance Criteria

  • Notifications work while app is running
  • Start-on-Login enables post-reboot delivery
  • Limitations are clearly documented
  • Best-effort scheduling is implemented

Phase 3: Network Optimization (Medium Priority)

Dependencies: Phase 1 completion - CRITICAL: Phase 3 cannot start until SQLite sharing + TTL enforcement are finished

3.1 ETag Support Implementation

Priority: MEDIUM

Requirements

  • ETag headers in fetch requests
  • 304 response handling
  • Network efficiency optimization

Implementation Tasks

  • ETag Headers

    • Add ETag to fetch requests
    • Implement ETag storage in database
    • Add ETag validation logic
  • 304 Response Handling

    • Implement 304 response processing
    • Add conditional request logic
    • Handle ETag mismatches
  • Network Optimization

    • Add request caching
    • Implement conditional fetching
    • Add network efficiency metrics

Acceptance Criteria

  • ETag headers are sent with requests
  • 304 responses are handled correctly
  • Network efficiency is improved
  • Conditional requests work reliably

3.2 Advanced Error Handling

Priority: MEDIUM

Requirements

  • Comprehensive error categorization
  • Retry logic with exponential backoff
  • Error reporting and telemetry

Implementation Tasks

  • Error Categories

    • Define error types and codes
    • Implement error classification
    • Add error severity levels
  • Retry Logic

    • Implement exponential backoff
    • Add retry limit configuration
    • Create retry state management
  • Telemetry

    • Add error reporting
    • Implement success/failure metrics
    • Create debugging information

Acceptance Criteria

  • Errors are properly categorized
  • Retry logic works with backoff
  • Telemetry provides useful insights
  • Debugging information is comprehensive

3.3 Performance Optimization

Priority: LOW

Requirements

  • Database query optimization
  • Memory usage optimization
  • Battery usage optimization

Implementation Tasks

  • Database Optimization

    • Add database indexes
    • Optimize query performance
    • Implement connection pooling
  • Memory Optimization

    • Reduce memory footprint
    • Implement object pooling
    • Add memory usage monitoring
  • Battery Optimization

    • Minimize background CPU usage
    • Optimize network requests
    • Add battery usage tracking

Acceptance Criteria

  • Database queries are optimized
  • Memory usage is minimized
  • Battery usage is optimized
  • Performance metrics are tracked

Implementation Guidelines

Development Standards

  • Code Quality: Follow existing code style and documentation standards
  • Testing: Write unit tests for all new functionality
  • Documentation: Update documentation for all API changes
  • Logging: Add comprehensive logging with proper tagging
  • Security: Follow security best practices for database access

Testing Requirements

  • Unit Tests: All new methods must have unit tests
  • Integration Tests: Test database sharing functionality
  • Platform Tests: Test on Android, iOS, and Electron
  • Edge Cases: Test TTL violations, network failures, and recovery scenarios

Documentation Updates

  • API Documentation: Update TypeScript definitions
  • Implementation Guide: Update implementation documentation
  • Troubleshooting: Add troubleshooting guides for common issues
  • Examples: Create usage examples for new features

Success Metrics

Phase 1 Success Criteria

  • SQLite database sharing works reliably
  • TTL-at-fire enforcement prevents stale notifications
  • Rolling window ensures closed-app delivery
  • Configuration API supports all required options

Phase 2 Success Criteria

  • iOS background tasks run at T-lead
  • Android fallback works seamlessly
  • Electron notifications work while running
  • All platforms support the unified API

Phase 3 Success Criteria

  • ETag support improves network efficiency
  • Error handling is comprehensive and robust
  • Performance is optimized across all platforms
  • System meets all specification requirements

Risk Mitigation

Technical Risks

  • Database Compatibility: Test schema version checking thoroughly
  • Platform Differences: Implement platform-specific fallbacks
  • Background Execution: Handle iOS background execution limitations
  • Permission Changes: Monitor Android permission policy changes

Implementation Risks

  • Scope Creep: Stick to specification requirements
  • Testing Coverage: Ensure comprehensive testing
  • Documentation: Keep documentation up-to-date
  • Performance: Monitor performance impact

Conclusion

This roadmap provides a structured approach to completing the Daily Notification Plugin implementation. Phase 1 addresses the critical infrastructure gaps, Phase 2 completes platform-specific functionality, and Phase 3 optimizes the system for production use.

The implementation should follow the existing code patterns and maintain the high quality standards established in the current codebase. Regular testing and documentation updates are essential for success.

Next Steps:

  1. Review and approve this roadmap
  2. Begin Phase 1 implementation
  3. Set up testing infrastructure
  4. Create implementation tracking system