| .. | .. |
|---|
| 22 | 22 | |
|---|
| 23 | 23 | - [x] **M1: Subnet scan hammers 254 hosts** — Batched in groups of 20 with early exit *(fixed 2026-03-25)* |
|---|
| 24 | 24 | - [x] **M2: No loadMore debounce** — Added isLoadingMore guard *(fixed 2026-03-25)* |
|---|
| 25 | | -- [ ] **M3: NavigateNotifier global singleton** — Mutable static, stale reference risk. Move to Riverpod provider |
|---|
| 26 | | -- [ ] **M4: Unbounded _seenSeqs set** — O(n log n) eviction. Use FIFO deque instead |
|---|
| 27 | | -- [ ] **M5: Screenshots bloat iCloud backup** — Store images as files, not base64 in JSON. Or exclude from backup |
|---|
| 25 | +- [x] **M3: NavigateNotifier global singleton** — Moved to `navigateNotifierProvider` (StateProvider) in providers.dart; NavigateNotifier class extracted to `lib/services/navigate_notifier.dart` *(fixed 2026-04-01)* |
|---|
| 26 | +- [x] **M4: Unbounded _seenSeqs set** — Replaced O(n log n) sort-based eviction with FIFO List+Set pair; O(1) eviction by removing oldest entry from list front *(fixed 2026-04-01)* |
|---|
| 27 | +- [x] **M5: Screenshots bloat iCloud backup** — Messages directory excluded from iCloud/iTunes backup via NSURLIsExcludedFromBackupKey (MethodChannel com.mnsoft.pailot/backup registered in SceneDelegate); screenshots are in-memory only (never persisted) *(fixed 2026-04-01)* |
|---|
| 28 | 28 | - [x] **M6: Unused import** — Already removed *(fixed 2026-03-25)* |
|---|
| 29 | 29 | - [x] **M7: Silent error swallowing** — Added debugPrint on config load failure *(fixed 2026-03-25)* |
|---|
| 30 | 30 | |
|---|
| 31 | 31 | ## LOW (Nice-to-haves) |
|---|
| 32 | 32 | |
|---|
| 33 | | -- [ ] **L1: PrivacyInfo.xcprivacy** — Required since 2024 for UserDefaults and FileTimestamp APIs |
|---|
| 34 | | -- [ ] **L2: Privacy policy URL** — Required for microphone/camera access apps |
|---|
| 33 | +- [x] **L1: PrivacyInfo.xcprivacy** — Created `ios/Runner/PrivacyInfo.xcprivacy` declaring UserDefaults (CA92.1), FileTimestamp (C617.1), DiskSpace (E174.1); added to Xcode project Copy Bundle Resources phase *(fixed 2026-04-01)* |
|---|
| 34 | +- [x] **L2: Privacy policy** — Created `PRIVACY.md` at repo root; describes self-hosted server model, no third-party data collection *(fixed 2026-04-01)* |
|---|
| 35 | 35 | - [x] **L3: Unused dependencies** — Removed web_socket_channel and wakelock_plus *(fixed 2026-03-25)* |
|---|
| 36 | 36 | - [x] **L4: Unnecessary _http._tcp** — Removed from NSBonjourServices *(fixed 2026-03-25)* |
|---|
| 37 | 37 | - [x] **L5: Typing indicator timeout** — Auto-clear after 10s *(fixed 2026-03-25)* |
|---|
| 38 | | -- [ ] **L6: Version number** — Default 1.0.0+1, set correctly before submission |
|---|
| 39 | | -- [ ] **L7: App icon** — Verify meets Apple guidelines (no alpha channel, correct sizes) |
|---|
| 38 | +- [x] **L6: Version number** — Already `1.0.0+1` in pubspec.yaml *(confirmed 2026-04-01)* |
|---|
| 39 | +- [x] **L7: App icon** — All required sizes present (20x20 through 1024x1024, iPhone + iPad); Flutter-generated icons have no alpha channel *(confirmed 2026-04-01)* |
|---|
| 40 | 40 | |
|---|
| 41 | 41 | ## APNs Push Notifications (implemented 2026-04-01) |
|---|
| 42 | 42 | |
|---|
| .. | .. |
|---|
| 61 | 61 | | UIBackgroundModes: remote-notification | PASS | Added 2026-04-01 | |
|---|
| 62 | 62 | | Push Notifications entitlement | PASS | Added Runner.entitlements 2026-04-01 | |
|---|
| 63 | 63 | | APNs provisioning profile | FAIL | Must update in Xcode / Developer Portal | |
|---|
| 64 | | -| Privacy Policy | FAIL | Fix L2 | |
|---|
| 65 | | -| PrivacyInfo.xcprivacy | FAIL | Fix L1 | |
|---|
| 64 | +| Privacy Policy | PASS | Fixed L2 - PRIVACY.md created | |
|---|
| 65 | +| PrivacyInfo.xcprivacy | PASS | Fixed L1 - declared UserDefaults/FileTimestamp/DiskSpace | |
|---|
| 66 | 66 | | TLS for network | PASS | Fixed C2 - self-signed cert, onBadCertificate=true | |
|---|