P2.1: iOS Schema Versioning Strategy
- Added SCHEMA_VERSION constant and checkSchemaVersion() method in PersistenceController
- Version stored in NSPersistentStore metadata (observability contract, not migration gate)
- CoreData auto-migration remains authoritative; version mismatches logged, not blocked
- Documentation added to ios/Plugin/README.md with migration contract
P2.2: Combined Edge Case Tests
- Added 3 resilience test scenarios to DailyNotificationRecoveryTests.swift:
- test_combined_dst_boundary_duplicate_delivery_cold_start()
- test_combined_rollover_duplicate_delivery_cold_start()
- test_combined_schema_version_cold_start_recovery()
- All tests labeled with @resilience @combined-scenarios comments
- Tests verify idempotency and correctness under combined stressors
P2.3: Android Combined Tests Design
- Created P2.3-DESIGN.md with scope, invariants, and acceptance criteria
- Created P2.3-IMPLEMENTATION-CHECKLIST.md with step-by-step execution plan
- Design ready for implementation to achieve parity with iOS P2.2
Documentation Updates
- Fixed parity matrix: iOS invalid data handling now correctly shows "✅ Recovery tested" with test references
- Updated progress docs (00-STATUS.md, 01-CHANGELOG-WORK.md, 03-TEST-RUNS.md, 04-PARITY-MATRIX.md)
- Updated P2-DESIGN.md to reflect P2.3 scope (Android combined tests)
- Updated SYSTEM_INVARIANTS.md baseline tag references
Baseline Tag
- Created and pushed v1.0.11-p2-complete tag
- Tag represents P2.x completion (schema versioning + combined resilience tests)
All invariants preserved. CI passes. Tests runnable via xcodebuild on macOS.
8.1 KiB
ChatGPT Feedback Package
Purpose: Minimal, structured package for efficient ChatGPT collaboration.
Owner: Development Team
Last Updated: 2025-12-22
Status: active
Usage: Copy this entire document + changed files only (not the whole repo).
What Changed Since Last Review
Date: 2025-12-22
Files Changed
- P1.4 COMPLETE: Created shared core types module (
src/core/)errors.ts: ErrorCode enum, DailyNotificationError classenums.ts: PermissionState, ScheduleKind, HistoryKind, etc.contracts.ts: Schedule, ContentCache, Config, Callback, History interfacesevents.ts: EventLog with schemaVersion, EVENT_CODES constantsguards.ts: Runtime validatorsindex.ts: Curated public exports
- P1.4 COMPLETE: Migrated consumers to use core types
observability.ts: Now imports EVENT_CODES/EventLog from./core/eventsdefinitions.ts: Re-exports core contracts/enums instead of duplicatingweb.ts: Uses canonical types from./coreviadefinitions.ts
- P1.4 COMPLETE: Core module purity enforcement
- Platform import blocking: comprehensive regex detects Node builtins + Capacitor/React
- Export validation: Node-based check for
package.json.exports['./core'] - Source checks (pre-build) + artifact checks (post-build) in
verify.sh
- P0.5 COMPLETE: Fixed packaging issues (exports["./web"] paths, tightened "files" field)
- P0.6 COMPLETE: Enhanced verify.sh with forbidden files check (hard-fail on xcuserdata/xcuserstate/DerivedData/ios/App/)
- Packaging:
npm pack --dry-run | grep -E "xcuserdata|xcuserstate|DerivedData|ios/App/"now returns empty - Exports: Fixed
exports["./web"]to point to actual build artifacts (dist/esm/web.{js,d.ts}) - Files field: Tightened from
"ios/"to specific subpaths (ios/Plugin/,ios/Tests/,ios/*.podspec, etc.)
Date: 2025-12-16
Files Changed
- Created progress tracking system (
docs/progress/*) - Documentation consolidation completed
- PHASE 1 COMPLETE: Removed 21 Java files from
src/android/ - PHASE 3 COMPLETE: Created
scripts/verify.shand local CI (ci/run.sh) - P0 COMPLETE: Fixed build breakage (
src/web.ts), podspec reference, markdown lint paths - P1 COMPLETE: Added build + pack checks to verify.sh
- P3 COMPLETE: Updated parity matrix (iOS has persistence: CoreData + SQLite)
- P0.4 COMPLETE: Added
.npmignoreas belt-and-suspenders safety net - PARITY FIX: iOS rollover is actually implemented - updated parity matrix
- RECOVERY TESTS COMPLETE: Added iOS recovery tests (
DailyNotificationRecoveryTests.swift) + test helper (TestDBFactory.swift)
Commits
c39bd7c- docs: Consolidate documentation structure3f15352- chore: Add zip and gz files to .gitignore- (Pending) - refactor: Remove native code from src/ directories
- (Pending) - feat: Add verification script and CI workflow
Current Blockers / Questions
None currently. See 02-OPEN-QUESTIONS.md for details.
Files to Review (Short List)
Priority Files (Changed/New)
docs/progress/00-STATUS.md- Current status (PHASE 1 & 3 complete)docs/progress/04-PARITY-MATRIX.md- Feature parity trackingscripts/verify.sh- ✅ Created (verification entrypoint)ci/run.sh- ✅ Created (local CI entrypoint)ci/README.md- ✅ Created (local CI documentation)
Context Files (If Needed)
src/android/- Check for native code (PHASE 1)src/ios/- Check for native code (PHASE 1)ios/Plugin/- iOS persistence implementation (PHASE 2)
Verify Output Summary
Last Run: 2025-12-22
Status: ✅ PUBLISH-SAFE + CORE MODULE VALIDATED
Commands: ./ci/run.sh (wraps ./scripts/verify.sh) + npm pack --dry-run | grep -E "xcuserdata|xcuserstate|DerivedData|ios/App/"
Results:
- ✅ Build:
npm run buildsucceeds - ✅ Package:
npm pack --dry-runincludesCapacitorDailyNotification.podspec - ✅ Forbidden files check: Empty (no xcuserdata, xcuserstate, DerivedData, ios/App/)
- ✅ Exports:
exports["./web"]andexports["./core"]paths fixed to match actual build artifacts - ✅ Files field: Tightened from
"ios/"to specific subpaths - ✅ TypeScript: All types compile correctly
- ✅ Web implementation:
src/web.tsimplements all interface methods - ✅ Core module: Source checks pass (no platform imports), artifact checks pass (build outputs exist)
- ✅ Core module: Export validation passes (
package.json.exports['./core']exists and valid)
All P0 + P1.4 checks passed. Package is publish-safe with correct exports, no forbidden files, and core module is pure.
Current Phase
PHASE 1 - ✅ COMPLETE
PHASE 2 - ✅ COMPLETE (iOS persistence confirmed)
PHASE 3 - ✅ COMPLETE
PHASE 4 (P1.4) - ✅ COMPLETE (Shared core types module)
Next Phase: PHASE 5 - Docs Consolidation
Completed Tasks:
- ✅ Removed 21 Java files from
src/android/(duplicates) - ✅ Verified npm packaging (package.json "files" field tightened)
- ✅ Created
scripts/verify.shverification entrypoint - ✅ Created
ci/run.shlocal CI entrypoint (wraps verify.sh) - ✅ Moved GitHub Actions template to
docs/_reference/(reference only, not used) - ✅ Fixed
exports["./web"]paths (P0.6) - ✅ Tightened
package.json"files" field to exclude test app and Xcode user state (P0.5) - ✅ Enhanced verify.sh with forbidden files check (hard-fail on xcuserdata/xcuserstate/DerivedData/ios/App/)
- ✅ Created shared core types module (
src/core/) with errors/enums/contracts/events/guards (P1.4) - ✅ Migrated consumers (observability.ts, definitions.ts, web.ts) to use core types (P1.4)
- ✅ Core module purity enforcement (platform import blocking, export validation) (P1.4)
Next Actions
- PHASE 5 - Reduce doc overlap (archive duplicates)
- P1.5 - Move iOS/App test harness out of published tree (optional)
- P2.6 - Replace TS
anywithunknown/generics - P2.7 - Create SYSTEM_INVARIANTS.md
- P2 Enhancement - Combined edge case tests (DST + duplicate + cold start)
iOS Rollover Implementation Status
Status: ✅ IMPLEMENTED (was incorrectly marked as missing)
Mechanism:
- iOS uses
NotificationCenterpattern for decoupled rollover AppDelegate.userNotificationCenter(_:willPresent:)postsDailyNotificationDeliveredevent- Plugin listens via
NotificationCenter.default.addObserver()inload() handleNotificationDelivery()→processRollover()→scheduler.scheduleNextNotification()- Notifications include
notification_idandscheduled_timeinuserInfo(line 161-165 inDailyNotificationScheduler.swift)
Why it was marked as missing:
- Parity matrix was outdated
- Rollover uses different pattern than Android (NotificationCenter vs direct call)
- Implementation exists but wasn't verified in parity doc
iOS Recovery Testing Status
Status: ✅ IMPLEMENTED
Test Coverage:
test_recovery_ignores_invalid_records_and_continues()- Invalid/corrupt records don't crash recoverytest_recovery_handles_null_fields()- Null/empty required fields handled gracefullytest_recovery_dedupes_duplicate_delivery_events()- Duplicate delivery events result in single rollovertest_recovery_rollover_idempotent_when_called_twice()- Rollover is idempotent (can be called multiple times)test_recovery_after_cold_start_reconciles_state()- Cold start recovery reconciles state correctlytest_recovery_migration_safety_unknown_fields()- Unknown/missing fields don't crash decode paths
Test Infrastructure:
TestDBFactory.swift- Helper for creating test databases and injecting invalid data- Tests use temporary databases for isolation
- Tests verify no crashes and graceful error handling
Equivalent to Android TEST 4:
- Both platforms now have automated recovery testing
- Both test invalid data handling, duplicate prevention, and idempotency
Last Updated: 2025-12-22
Package Version: 1.0.11
Baseline Tag: v1.0.11-p0-p1.4-p1.5-p2.6-p2.7-complete (P0 + P1.4 + P1.5 + P2.6 + P2.7 milestone)