Implement iOS fetcher scheduling hooks, Android FetchWorker metrics,
and convert iOS callbacks TODOs to explicit behavior. Add TODO scan
script to prevent documentation drift.
Changes:
- iOS Scheduler: Added DailyNotificationFetchScheduling protocol
- Implemented fetcher scheduling hooks (2 TODOs removed)
- Added NoopFetcherScheduler default implementation
- Replaced TODOs with actual scheduleFetch/scheduleImmediateFetch calls
- Android FetchWorker: Implemented metrics interface (5 TODOs removed)
- Added FetchWorkerMetrics interface with 8 methods
- Implemented retry classifier (isRetryable) for deterministic logic
- Added metrics tracking: run/success/failure/retry counts, duration,
items fetched/saved/enqueued
- Replaced SharedPreferences TODO with explicit NOTE
- iOS Callbacks: Converted TODOs to explicit behavior (8 TODOs removed)
- All callback persistence methods now have clear "not implemented"
messages
- Removed literal TODO markers to make TODO scan meaningful
- TODO Scan Script: Created scripts/todo-scan.js
- Scans repo for TODO/FIXME markers
- Generates machine-readable JSON and markdown summary
- Added npm run todo:scan script
- Regenerated docs/TODO-CLASSIFICATION.md (69 markers total)
Verification:
- TypeScript typecheck: PASS
- Tests: PASS (115 tests, 8 test suites)
- No linter errors
- All target TODOs removed from production code
Files changed:
- ios/Plugin/DailyNotificationScheduler.swift (+52/-52 lines)
- android/.../DailyNotificationFetchWorker.java (+113 lines)
- ios/Plugin/DailyNotificationCallbacks.swift (+44/-44 lines)
- scripts/todo-scan.js (new, 193 lines)
- package.json (added todo:scan script)
- docs/TODO-CLASSIFICATION.md (regenerated)
- docs/todo-scan.json (new, generated)
- docs/progress/00-STATUS.md (updated)
- docs/progress/01-CHANGELOG-WORK.md (updated)
485 lines
14 KiB
JSON
485 lines
14 KiB
JSON
[
|
|
{
|
|
"file": "android/src/main/java/com/timesafari/dailynotification/DailyNotificationPlugin.kt",
|
|
"line": 217,
|
|
"marker": "TODO",
|
|
"text": "// TODO: Initialize TimeSafariIntegrationManager and delegate configure()",
|
|
"bucket": "Android"
|
|
},
|
|
{
|
|
"file": "android/src/main/java/com/timesafari/dailynotification/TimeSafariIntegrationManager.java",
|
|
"line": 19,
|
|
"marker": "TODO",
|
|
"text": "* - This file intentionally contains scaffolding methods and TODO tags showing",
|
|
"bucket": "Android"
|
|
},
|
|
{
|
|
"file": "android/src/main/java/com/timesafari/dailynotification/TimeSafariIntegrationManager.java",
|
|
"line": 320,
|
|
"marker": "TODO",
|
|
"text": "* TODO: Extract logic from DailyNotificationPlugin.configureActiveDidIntegration()",
|
|
"bucket": "Android"
|
|
},
|
|
{
|
|
"file": "android/src/main/java/com/timesafari/dailynotification/TimeSafariIntegrationManager.java",
|
|
"line": 321,
|
|
"marker": "TODO",
|
|
"text": "* TODO: Extract logic from DailyNotificationPlugin scheduling methods",
|
|
"bucket": "Android"
|
|
},
|
|
{
|
|
"file": "docs/_archive/2025-12-16-consolidation/CONSOLIDATION_SOURCE_MAP.md",
|
|
"line": 31,
|
|
"marker": "TODO",
|
|
"text": "| `TODO.md` | Canonical | Project TODO list |",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/_archive/2025-legacy-doc/BUILD_FIXES_SUMMARY.md",
|
|
"line": 51,
|
|
"marker": "TODO",
|
|
"text": "- **Fix:** Stubbed Phase 2 methods with TODO comments",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/_archive/2025-legacy-doc/directives/0003-iOS-Android-Parity-Directive.md",
|
|
"line": 1209,
|
|
"marker": "TODO",
|
|
"text": "- **Fix:** Stubbed out Phase 2 methods with TODO comments and early returns",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/_archive/2025-legacy-doc/IOS_ANDROID_ERROR_CODE_MAPPING.md",
|
|
"line": 221,
|
|
"marker": "TODO",
|
|
"text": "> \"**Note:** This TODO is **blocking for Phase 1**: iOS error handling must not be considered complete until the table is extracted and mirrored.\"",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/_archive/2025-legacy-doc/IOS_PHASE1_GAPS_ANALYSIS.md",
|
|
"line": 55,
|
|
"marker": "TODO",
|
|
"text": "- Line 549: \"**Note:** This TODO is **blocking for Phase 1**: iOS error handling must not be considered complete until the table is extracted and mirrored. Phase 1 implementation should not proceed without verifying error code parity.\"",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/FEEDBACK-RESPONSE-PLAN.md",
|
|
"line": 43,
|
|
"marker": "TODO",
|
|
"text": "### 2.2 TODO Classification ✅ COMPLETE",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/FEEDBACK-RESPONSE-PLAN.md",
|
|
"line": 115,
|
|
"marker": "TODO",
|
|
"text": "4. **Week 5**: TODO classification and cleanup",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/platform/android/IMPLEMENTATION_DIRECTIVE.md",
|
|
"line": 553,
|
|
"marker": "TODO",
|
|
"text": "// TODO: Implement callback mechanism",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/platform/android/IMPLEMENTATION_DIRECTIVE.md",
|
|
"line": 562,
|
|
"marker": "TODO",
|
|
"text": "// TODO: Implement callback mechanism",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/platform/android/IMPLEMENTATION_DIRECTIVE.md",
|
|
"line": 748,
|
|
"marker": "TODO",
|
|
"text": "// TODO: Implement missed alarm handling",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/platform/android/PHASE2_DIRECTIVE.md",
|
|
"line": 523,
|
|
"marker": "TODO",
|
|
"text": "// TODO: Parse cron and calculate next run",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/platform/android/PHASE2_DIRECTIVE.md",
|
|
"line": 528,
|
|
"marker": "TODO",
|
|
"text": "// TODO: Parse HH:mm and calculate next run",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/platform/android/PHASE2_DIRECTIVE.md",
|
|
"line": 564,
|
|
"marker": "TODO",
|
|
"text": "// TODO: Implement proper calculation based on cron/clockTime",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/platform/ios/ROLLOVER_IMPLEMENTATION_REVIEW.md",
|
|
"line": 205,
|
|
"marker": "TODO",
|
|
"text": "// TODO: Phase 2 - Implement fetcher.scheduleFetch(fetchTime)",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/platform/ios/ROLLOVER_IMPLEMENTATION_REVIEW.md",
|
|
"line": 208,
|
|
"marker": "TODO",
|
|
"text": "// TODO: Phase 2 - Implement fetcher.scheduleImmediateFetch()",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/platform/ios/ROLLOVER_IMPLEMENTATION_REVIEW.md",
|
|
"line": 295,
|
|
"marker": "TODO",
|
|
"text": "fetcher: nil // TODO: Phase 2 - Add fetcher instance",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/platform/ios/ROLLOVER_IMPLEMENTATION_REVIEW.md",
|
|
"line": 504,
|
|
"marker": "TODO",
|
|
"text": "fetcher: nil // TODO: Add fetcher in Phase 2",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/platform/ios/ROLLOVER_QA.md",
|
|
"line": 30,
|
|
"marker": "TODO",
|
|
"text": "- Add TODO comments for Phase 2 integration",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/platform/ios/ROLLOVER_QA.md",
|
|
"line": 45,
|
|
"marker": "TODO",
|
|
"text": "// TODO: Phase 2 - Implement fetcher.scheduleFetch(fetchTime)",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/progress/00-STATUS.md",
|
|
"line": 146,
|
|
"marker": "TODO",
|
|
"text": "- [x] ChatGPT feedback response - Priority 2.2 (TODO Classification)",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/progress/00-STATUS.md",
|
|
"line": 148,
|
|
"marker": "TODO",
|
|
"text": "- Created comprehensive TODO classification document",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/progress/01-CHANGELOG-WORK.md",
|
|
"line": 64,
|
|
"marker": "TODO",
|
|
"text": "- **2025-12-23 — Priority 2.2 Complete**: TODO classification and inventory",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/progress/01-CHANGELOG-WORK.md",
|
|
"line": 317,
|
|
"marker": "TODO",
|
|
"text": "- **Deep fixes completed**: Removed all TODO stubs affecting capacity/rate-limiting correctness",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/progress/P2.1-BATCH-A-STATE.md",
|
|
"line": 106,
|
|
"marker": "TODO",
|
|
"text": "- **Status:** Left original implementation with TODO comment",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/progress/P2.1-BATCH-A-STATE.md",
|
|
"line": 131,
|
|
"marker": "TODO",
|
|
"text": "exactAlarmManager = null // TODO: Requires AlarmManager + DailyNotificationScheduler",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/progress/P2.1-BATCH-B-STATE.md",
|
|
"line": 216,
|
|
"marker": "TODO",
|
|
"text": "exactAlarmManager = null // TODO: Requires AlarmManager + DailyNotificationScheduler",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/progress/P2.1-BATCH-C-STATE.md",
|
|
"line": 35,
|
|
"marker": "TODO",
|
|
"text": "- **Change:** Added TODO for future TimeSafariIntegrationManager delegation",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/progress/P2.1-BATCH-C-STATE.md",
|
|
"line": 38,
|
|
"marker": "TODO",
|
|
"text": "- Added TODO comment for future integration with TimeSafariIntegrationManager",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/progress/P2.1-BATCH-C-STATE.md",
|
|
"line": 154,
|
|
"marker": "TODO",
|
|
"text": "- Updated `configure()` with TODO for future integration",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/progress/P2.3-DESIGN.md",
|
|
"line": 68,
|
|
"marker": "TODO",
|
|
"text": "- TODO: \"Rewrite tests to use modern AndroidX testing framework\"",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/TODO-CLASSIFICATION.md",
|
|
"line": 1,
|
|
"marker": "TODO",
|
|
"text": "# TODO Classification",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/TODO-CLASSIFICATION.md",
|
|
"line": 29,
|
|
"marker": "TODO",
|
|
"text": "## TODO Inventory",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/TODO-CLASSIFICATION.md",
|
|
"line": 37,
|
|
"marker": "TODO",
|
|
"text": "1. **`ios/Plugin/DailyNotificationRollingWindow.swift:299`** - `return 0 // TODO: Implement actual counting logic`",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/TODO-CLASSIFICATION.md",
|
|
"line": 42,
|
|
"marker": "TODO",
|
|
"text": "2. **`ios/Plugin/DailyNotificationRollingWindow.swift:317`** - `return 0 // TODO: Implement actual counting logic`",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/TODO-CLASSIFICATION.md",
|
|
"line": 47,
|
|
"marker": "TODO",
|
|
"text": "3. **`ios/Plugin/DailyNotificationRollingWindow.swift:335`** - `return [] // TODO: Implement actual retrieval logic`",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/TODO-CLASSIFICATION.md",
|
|
"line": 52,
|
|
"marker": "TODO",
|
|
"text": "4. **`ios/Plugin/DailyNotificationScheduler.swift:148`** - `// TODO: Implement TTL validation`",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/TODO-CLASSIFICATION.md",
|
|
"line": 57,
|
|
"marker": "TODO",
|
|
"text": "5. **`ios/Plugin/DailyNotificationDatabase.swift:218`** - `// TODO: Implement database persistence`",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/TODO-CLASSIFICATION.md",
|
|
"line": 62,
|
|
"marker": "TODO",
|
|
"text": "6. **`ios/Plugin/DailyNotificationDatabase.swift:229`** - `// TODO: Implement database deletion`",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/TODO-CLASSIFICATION.md",
|
|
"line": 67,
|
|
"marker": "TODO",
|
|
"text": "7. **`ios/Plugin/DailyNotificationDatabase.swift:237`** - `// TODO: Implement database clearing`",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/TODO-CLASSIFICATION.md",
|
|
"line": 76,
|
|
"marker": "TODO",
|
|
"text": "1. **`ios/Plugin/DailyNotificationPerformanceOptimizer.swift:179`** - `// TODO: Phase 2 - Implement database statistics`",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/TODO-CLASSIFICATION.md",
|
|
"line": 81,
|
|
"marker": "TODO",
|
|
"text": "2. **`ios/Plugin/DailyNotificationPerformanceOptimizer.swift:187`** - `// TODO: Phase 2 - Implement metrics recording`",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/TODO-CLASSIFICATION.md",
|
|
"line": 121,
|
|
"marker": "TODO",
|
|
"text": "1. **`ios/Plugin/index.ts:26`** - `// TODO: Implement iOS-specific initialization`",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/TODO-CLASSIFICATION.md",
|
|
"line": 122,
|
|
"marker": "TODO",
|
|
"text": "2. **`ios/Plugin/index.ts:37`** - `// TODO: Implement iOS-specific permission check`",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/TODO-CLASSIFICATION.md",
|
|
"line": 123,
|
|
"marker": "TODO",
|
|
"text": "3. **`ios/Plugin/index.ts:52`** - `// TODO: Implement iOS-specific permission request`",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/TODO-CLASSIFICATION.md",
|
|
"line": 139,
|
|
"marker": "TODO",
|
|
"text": "1. ✅ Complete TODO inventory scan",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "docs/TODO-CLASSIFICATION.md",
|
|
"line": 140,
|
|
"marker": "TODO",
|
|
"text": "2. ✅ Classify each TODO into one of the three categories",
|
|
"bucket": "Docs"
|
|
},
|
|
{
|
|
"file": "ios/Plugin/DailyNotificationBackgroundTasks.swift",
|
|
"line": 181,
|
|
"marker": "TODO",
|
|
"text": "// TODO: Phase 2 - Implement history with CoreData",
|
|
"bucket": "iOS"
|
|
},
|
|
{
|
|
"file": "ios/Plugin/DailyNotificationPerformanceOptimizer.swift",
|
|
"line": 179,
|
|
"marker": "TODO",
|
|
"text": "// TODO: Phase 2 - Implement database statistics",
|
|
"bucket": "iOS"
|
|
},
|
|
{
|
|
"file": "ios/Plugin/DailyNotificationPerformanceOptimizer.swift",
|
|
"line": 187,
|
|
"marker": "TODO",
|
|
"text": "// TODO: Phase 2 - Implement metrics recording",
|
|
"bucket": "iOS"
|
|
},
|
|
{
|
|
"file": "ios/Plugin/DailyNotificationPlugin.swift",
|
|
"line": 114,
|
|
"marker": "TODO",
|
|
"text": "// TODO: Implement activeDidIntegration configuration in Phase 3",
|
|
"bucket": "iOS"
|
|
},
|
|
{
|
|
"file": "ios/Plugin/DailyNotificationPlugin.swift",
|
|
"line": 397,
|
|
"marker": "TODO",
|
|
"text": "// TODO: Phase 3 - Replace with JWT-signed fetcher",
|
|
"bucket": "iOS"
|
|
},
|
|
{
|
|
"file": "ios/Plugin/DailyNotificationPlugin.swift",
|
|
"line": 1218,
|
|
"marker": "TODO",
|
|
"text": "fetcher: nil // TODO: Phase 2 - Add fetcher instance",
|
|
"bucket": "iOS"
|
|
},
|
|
{
|
|
"file": "ios/Plugin/DailyNotificationPlugin.swift",
|
|
"line": 1473,
|
|
"marker": "TODO",
|
|
"text": "\"lastNotifyExecution\": NSNull(), // TODO: Track notify execution",
|
|
"bucket": "iOS"
|
|
},
|
|
{
|
|
"file": "ios/Plugin/DailyNotificationReactivationManager.swift",
|
|
"line": 465,
|
|
"marker": "TODO",
|
|
"text": "// TODO: Add deliveryStatus check when property is added to NotificationContent",
|
|
"bucket": "iOS"
|
|
},
|
|
{
|
|
"file": "ios/Plugin/DailyNotificationReactivationManager.swift",
|
|
"line": 489,
|
|
"marker": "TODO",
|
|
"text": "// TODO: Add deliveryStatus property to NotificationContent in Phase 2",
|
|
"bucket": "iOS"
|
|
},
|
|
{
|
|
"file": "ios/Plugin/DailyNotificationReactivationManager.swift",
|
|
"line": 490,
|
|
"marker": "TODO",
|
|
"text": "// TODO: Add lastDeliveryAttempt property to NotificationContent in Phase 2",
|
|
"bucket": "iOS"
|
|
},
|
|
{
|
|
"file": "ios/Plugin/DailyNotificationReactivationManager.swift",
|
|
"line": 1067,
|
|
"marker": "TODO",
|
|
"text": "fetcher: nil // TODO: Phase 2 - Add fetcher",
|
|
"bucket": "iOS"
|
|
},
|
|
{
|
|
"file": "ios/Plugin/DailyNotificationStateActor.swift",
|
|
"line": 186,
|
|
"marker": "TODO",
|
|
"text": "// TODO: Phase 2 - Implement rolling window maintenance",
|
|
"bucket": "iOS"
|
|
},
|
|
{
|
|
"file": "ios/Plugin/DailyNotificationStateActor.swift",
|
|
"line": 201,
|
|
"marker": "TODO",
|
|
"text": "// TODO: Phase 2 - Implement TTL validation",
|
|
"bucket": "iOS"
|
|
},
|
|
{
|
|
"file": "ios/Plugin/DailyNotificationStateActor.swift",
|
|
"line": 206,
|
|
"marker": "TODO",
|
|
"text": "// TODO: Call ttlEnforcer.validateBeforeArming(content)",
|
|
"bucket": "iOS"
|
|
},
|
|
{
|
|
"file": "ios/Plugin/index.ts",
|
|
"line": 26,
|
|
"marker": "TODO",
|
|
"text": "// TODO: Implement iOS-specific initialization",
|
|
"bucket": "iOS"
|
|
},
|
|
{
|
|
"file": "ios/Plugin/index.ts",
|
|
"line": 37,
|
|
"marker": "TODO",
|
|
"text": "// TODO: Implement iOS-specific permission check",
|
|
"bucket": "iOS"
|
|
},
|
|
{
|
|
"file": "ios/Plugin/index.ts",
|
|
"line": 52,
|
|
"marker": "TODO",
|
|
"text": "// TODO: Implement iOS-specific permission request",
|
|
"bucket": "iOS"
|
|
},
|
|
{
|
|
"file": "scripts/todo-scan.js",
|
|
"line": 3,
|
|
"marker": "FIXME",
|
|
"text": "* Scans repo for TODO/FIXME markers and emits:",
|
|
"bucket": "Scripts"
|
|
},
|
|
{
|
|
"file": "scripts/todo-scan.js",
|
|
"line": 123,
|
|
"marker": "TODO",
|
|
"text": "md += `# TODO Classification (auto-generated)\\n\\n`;",
|
|
"bucket": "Scripts"
|
|
}
|
|
] |