PD-105 — Document d'Acceptabilité
Story: PD-105 — Implémenter push notifications iOS Date: 2026-02-10 Version: v1
Résumé exécutif
| Catégorie | Statut | Verdict |
| Reviews automatisées | ✅ 4/4 | CONFORME |
| Revue de code | ⚠️ 5 réserves | RÉSERVES |
| Revue des tests | ⚠️ 6 réserves | RÉSERVES |
| Revue sécurité | ⚠️ 5 vulnérabilités | RÉSERVES |
Verdict global : ⚠️ RÉSERVES — Implémentation fonctionnelle, améliorations recommandées
1. Reviews automatisées
| Outil | Résultat | Détail |
| ESLint | ✅ OK | Aucune erreur |
| Prettier | ✅ OK | Code formaté |
| TypeScript | ✅ OK | Aucune erreur de type |
| Tests | ✅ 83/83 | Tous les tests passent |
Couverture de code (modules PD-105)
| Module | Statements | Branches | Functions | Lines |
| services/notifications | 92.39% | 89.61% | 91.66% | 92.13% |
| store/notificationStore | 100% | 90% | 100% | 100% |
Seuil projet : 80% → ✅ Atteint
2. Revue de code (ChatGPT)
Verdict : ⚠️ RÉSERVES
Points positifs
- Bonne séparation des responsabilités (service, store, handlers)
- Pattern singleton correct
- Sérialisation badge via PQueue
- Déduplication multi-niveaux
- Logs structurés
Réserves
| ID | Description | Fichier | Gravité |
| R-01 | Listeners Expo non nettoyés après reset (fuite mémoire) | notificationService.ts | MAJEUR |
| R-02 | Listeners enregistrés avant validation permissions | notificationService.ts | MINEUR |
| R-03 | Cast as NotificationData sans validation runtime | handlers.ts | MAJEUR |
| R-04 | clearAll() sans try/catch sur setBadgeCountAsync | notificationStore.ts | MINEUR |
| R-05 | Handlers sans stratégie d'erreur explicite | handlers.ts | MINEUR |
3. Revue des tests (ChatGPT)
Verdict : ⚠️ RÉSERVES
Points positifs
- Bonne couverture des invariants métier
- Cas d'erreur testés
- Assertions spécifiques
- Séparation par responsabilité
Réserves
| ID | Description | Fichier | Gravité |
| T-01 | Isolation singleton/Platform.OS insuffisante | notificationService.spec.ts | MAJEUR |
| T-02 | Assertions nombre d'invocations manquantes | notificationService.spec.ts | MINEUR |
| T-03 | Test PQueue ne prouve pas l'ordonnancement | notificationStore.spec.ts | MAJEUR |
| T-04 | Test persistance sans cycle save/reload | notificationStore.spec.ts | MAJEUR |
| T-05 | Pas de test idempotence handleNotificationResponse | handlers.spec.ts | MINEUR |
| T-06 | Edge cases resolver incomplets | resolver.spec.ts | MINEUR |
4. Revue sécurité (ChatGPT)
Verdict : ⚠️ RÉSERVES
Points positifs
- Whitelist de routes (EVENT_SCREEN_MAP)
- Validation UUID en stockage
- Limitation rétention/volume
Vulnérabilités
| ID | Description | Gravité | Exploitabilité |
| SEC-01 | Validation payload insuffisante | MOYENNE | Facile |
| SEC-02 | Absence signature applicative du message | HAUTE | Moyenne |
| SEC-03 | Logging potentiellement sensible | MOYENNE | Facile |
| SEC-04 | DoS par flood notifications | MOYENNE | Moyenne |
| SEC-05 | Contrôle targetId/eventType insuffisant | MOYENNE | Moyenne |
Recommandations prioritaires
| ID | Recommandation | Priorité |
| REC-01 | Validation runtime stricte (Zod/Yup) | P1 |
| REC-02 | Signature applicative payload (HMAC/JWS) | P1 |
| REC-03 | Autorisation métier avant navigation | P1 |
| REC-04 | Masquage tokens dans logs | P1 |
| REC-05 | Throttling local + déduplication | P2 |
5. Couverture des invariants
| Invariant | Description | Testé | Implémenté |
| INV-105-01 | iOS uniquement | ✅ | ✅ |
| INV-105-02 | APNs token enregistré au 1er login | ✅ | ✅ |
| INV-105-03 | Token re-enregistré si expiré | ✅ | ✅ |
| INV-105-04 | Erreur token loggée sans blocage | ✅ | ✅ |
| INV-105-05 | Silent sans alerte | ✅ | ✅ |
| INV-105-06 | Badge = nombre non-lus | ✅ | ✅ |
| INV-105-07 | Classification 4 types | ✅ | ✅ |
| INV-105-08 | Historisation avec champs obligatoires | ✅ | ✅ |
| INV-105-09 | Badge strictement égal aux non-lus | ✅ | ✅ |
| INV-105-10 | Navigation contextuelle avec fallback | ✅ | ✅ |
| INV-105-11 | 90 jours rétention | ✅ | ✅ |
| INV-105-12 | Latence p95 < 5s | N/A | Backend |
| INV-105-13 | Classification déterministe | ✅ | Backend |
6. Décision
Option A : Corriger les réserves avant Gate 8
- Temps estimé : 2-4h
- Risque : Faible
- Recommandé si : Temps disponible
Option B : Procéder à Gate 8 avec réserves
- Les réserves identifiées sont des améliorations, pas des bloquants
- L'implémentation est fonctionnelle et testée
- Les recommandations sécurité P1 peuvent être traitées en story dédiée
Recommandation : Procéder à Gate 8 avec verdict RESERVE attendu. Les recommandations P1 (sécurité) doivent être planifiées dans une story de durcissement ultérieure.
Artefacts
| Artefact | Chemin |
| Revue de code | PD-105-review-code.md |
| Revue des tests | PD-105-review-tests.md |
| Revue sécurité | PD-105-review-security.md |
| Acceptabilité | PD-105-acceptability.md |