PD-240-PLAN-REVIEW-V1
Type : Non-conformité Spec Référence : (Spec §4 Périmètre / INV-240-05 / Plan §2.1 AuditController) Description : La spec inclut l’endpoint admin DELETE /admin/users/{userId}/audit (statut purge), mais le plan/code contracts ne définissent que GET /admin/audit/user/{userId}. Le endpoint DELETE requis par le périmètre n’est pas prévu. Impact : Non‑conformité contractuelle ; périmètre spec non couvert. Gravité : MAJEUR
Type : Non-conformité Spec Référence : (Spec §6 INV-240-05 / Plan §4 Mapping Invariants) Description : INV-240-05 contractualise un observable via GET /admin/audit/user/{userId} avec {status, purgedAt}. Le plan indique seulement une « audit entry » et ne garantit pas la présence de purgedAt dans la réponse de l’endpoint admin. Impact : Preuve d’anonymisation RGPD non démontrable selon la spec. Gravité : MAJEUR
Type : Non-conformité Spec Référence : (Spec §7 F-240-01 / Plan §3.2 Ordre transactionnel) Description : Le flux spec impose l’ordre : invalidation sessions → purge RGPD → suppression Keycloak. Le plan introduit un état « limbo » si purge/Keycloak échoue après invalidation des sessions (session mortes, Keycloak intact) et accepte cet état dégradé. Cela n’est pas spécifié. Impact : Comportement non spécifié introduit ; divergence contractuelle. Gravité : MAJEUR
Type : Risque sécu/conformité Référence : (Spec §8 ERR-240-SESSION-INVALIDATION-FAILED / Plan §3.2) Description : La spec exige rollback si invalidation sessions échoue (aucune suppression). Le plan indique « rollback complet » pour ce cas mais accepte ensuite un état dégradé si purge échoue. Cette coexistence crée un trou d’auditabilité et un risque de comptes semi‑supprimés non gérés par la spec. Impact : Risque RGPD/traçabilité ; état non défini en audit. Gravité : MAJEUR
Type : Couverture manquante Référence : (Spec §9 CA-240-05 / Tests T-240-POST-02 / Plan §4 Mapping Invariants) Description : Le plan ne fournit pas de mécanisme ou point d’observabilité explicite pour garantir l’endpoint admin retourne purgedAt. Les tests exigent {status,purgedAt}. Impact : Test potentiellement irréalisable ou non déterministe. Gravité : MAJEUR
Type : Code Contract — Invariant Référence : (Code Contracts module audit-controller) Description : Le code contract fixe une réponse { status: 'purged' | 'active', purgedAt?: ISO8601 } sans mention explicite de purgedAt obligatoire en cas purged, alors que la spec exige {status, purgedAt} pour la preuve. Impact : Contrat code potentiellement non conforme à la spec. Gravité : MINEUR
Type : Code Contract — Complétude Référence : (Spec §4 Périmètre / Code Contracts modules) Description : Aucun code contract ne couvre l’endpoint admin DELETE /admin/users/{userId}/audit requis par le périmètre. Impact : Incomplétude contractuelle ; risque d’implémentation manquante. Gravité : MAJEUR