PD-84-specification-review.md
Story : PD-84 — Encadrement contractuel de l'offre gratuite pour dossiers probatoires mineurs Documents audités : PD-84-specification.md (v1.1.0), PD-84-tests.md (v1.1.0) Date d'audit : 2026-02-24 Auditeur : Auditeur technique indépendant Itération : v2 (après corrections v1.1.0)
Statut des écarts bloquants v1 (résolution)
| Écart v1 | Statut v1.1.0 | Référence correction |
| AMB-01 / NT-01 (SLA sans seuil) | RÉSOLU | Spec 3.2.2, 9 : p95 < 5s, borne 30s, état PLAN_STATE_INCONSISTENT |
| INC-01 / INC-02 / HYP-01 (concurrence non spécifiée) | RÉSOLU | Spec 3.4 : atomicité explicite, exemples mécanismes. Tests TC-LIM-01/02 : 30 itérations + barrière synchro |
| AMB-03 (PLAN_STATE_INCONSISTENT indéfini) | RÉSOLU | Spec 3.2.2, 9 : conditions de déclenchement à expiration borne 30s |
| AMB-04 (catégories invalides non testées) | RÉSOLU | F-84-19 ajouté + TC-16 couvre INVALID_FOLDER_CATEGORY |
| AMB-06 (CapabilityState mécanisme inconnu) | RÉSOLU | Spec 3.1 entité 4 : vue calculée à la volée, pas persistée |
| HYP-02 (idempotence clôture) | RÉSOLU | Spec 3.2.1 : 409 CONFLICT FOLDER_ALREADY_CLOSED + TC-17 |
| INC-03 (transition plan non spécifiée) | RÉSOLU | Spec 3.2.3 : PUT /account/plan stub + TC-10 aligné |
| INC-06 (INVALID_FOLDER_CATEGORY jamais testé) | RÉSOLU | TC-16 ajouté |
| INC-08 (audit export verrouillé non couvert) | RÉSOLU | TC-13 action 5 + Spec 8.2 |
AXE 1 — Ambiguïtés
Type : Ambiguïté
Référence : Spec section 2.3, section 3.3, section 7.3 (message utilisateur)
Description : La spec v1.1.0 ajoute en section 2.3 : "En plan PREMIUM, les quotas de dossiers actifs et de documents par dossier sont levés (pas de limite supérieure appliquée par PD-84)". La section 3.3 confirme : "aucune borne supérieure de cardinalité n'est appliquée par PD-84". Cependant, aucune règle fonctionnelle F-84-XX ne formalise explicitement le comportement PREMIUM (pas de F-84-XX "le système DOIT autoriser un utilisateur PREMIUM à créer un nombre illimité de dossiers actifs"). Le comportement se déduit des clarifications et contraintes de cardinalité, mais n'est pas exprimé comme exigence fonctionnelle testable.
Impact : Un implémenteur lisant uniquement les F-84-XX pourrait manquer le comportement PREMIUM. Le message "dossiers illimités" (section 7.3) concerne les dossiers mais pas explicitement les documents. La clarification structurelle (section 2.3) dit "quotas levés" ce qui couvre les deux, mais sans F-84-XX associée.
Gravité : Mineur
AMB-v2-02 — F-84-12 : "démontrer visuellement" sans critère observable
Type : Ambiguïté
Référence : Spec section 4, F-84-12
Description : L'exigence F-84-12 stipule que "l'utilisateur DOIT pouvoir démontrer visuellement l'existence et le contenu de ses dossiers depuis l'application". Aucun critère objectif n'est fourni : pas de format de rendu, pas de niveau de détail, pas de distinction fonctionnelle avec F-84-11 (consulter ses preuves). Aucun CA-84-XX ne couvre spécifiquement cette exigence. Aucun test ne l'adresse.
Impact : Exigence fonctionnelle orpheline. Non différenciable de F-84-11.
Gravité : Mineur
AMB-v2-03 — closed_reason : champ modélisé jamais peuplé
Type : Ambiguïté
Référence : Spec section 3.1 (ProbatoryFolder.closed_reason), endpoint POST /folders/{folderId}/close
Description : Le champ closed_reason est défini comme nullable dans le modèle de données mais aucune règle fonctionnelle ne spécifie quand il est renseigné, quelles valeurs sont possibles, ni s'il provient de l'utilisateur ou du système. L'endpoint de clôture ne le mentionne pas en entrée. Aucun test ne vérifie sa valeur.
Impact : Champ orphelin dans le schéma. L'implémentation peut l'ignorer ou l'inventer sans contrainte.
Gravité : Mineur
AMB-v2-04 — account_role : modélisé sans impact fonctionnel PD-84
Type : Ambiguïté
Référence : Spec section 3.1 (UserAccount.account_role), INV-84-09, INV-84-10
Description : Le champ account_role (MINOR, LEGAL_GUARDIAN, OTHER) est présent dans le modèle de données. INV-84-09 stipule que le plan est universel sans distinction d'âge. Aucune règle F-84-XX ne conditionne un comportement au account_role. TC-15 confirme l'absence de branchement par rôle.
Impact : Cohérent avec le périmètre PD-84 (le rôle est sans doute exploité par d'autres stories de l'epic PD-185). Clarification de modélisation suffisante; pas de risque d'implémentation.
Gravité : Mineur
AMB-v2-05 — SLA-84-01 : paramétrabilité runtime non tranchée
Type : Ambiguïté
Référence : Spec section 9.1 dernier point
Description : La spec note : "Le besoin ne précise pas si ce SLA est paramétrable runtime". Ce point reste ouvert en v1.1.0. Le seuil p95 < 5s est fixe dans la spec mais la question de sa configurabilité n'est pas tranchée.
Impact : Faible pour PD-84. Si le SLA doit être ajustable, l'architecture de configuration doit le prévoir. Si non, le point est clos.
Gravité : Mineur
AXE 2 — Contradictions
CTR-v2-01 — CA-84-08 : périmètre API vs opérations mentionnées
Type : Contradiction
Référence : Spec CA-84-08 (révisé) vs section 7.1 (endpoints)
Description : CA-84-08 mentionne que "les opérations de modification/suppression de documents individuels ne sont pas exposées par les endpoints PD-84; elles sont implicitement bloquées par l'absence d'API". Or le CA parle initialement d'un dossier CLOSED_READ_ONLY avec "ajout de document refusé" et "export complet verrouillé". La note de périmètre est une clarification bienvenue, mais le CA lui-même ne teste que des comportements sur dossier clôturé FREE, pas l'absence d'endpoints modification/suppression. La formulation reste ambiguë entre "comportement testé" et "comportement implicitement assuré par absence d'API".
Impact : Mineur car la note de périmètre lève l'ambiguïté pratique. Le cahier de tests (TC-08, TC-12) couvre correctement le périmètre API réel.
Gravité : Mineur
CTR-v2-02 — INV-84-12 à INV-84-15 : invariants ajoutés sans correspondance besoin
Type : Contradiction (spec étend le besoin)
Référence : Spec section 5 (INV-84-12 à INV-84-15) vs expression de besoin
Description : Les invariants INV-84-12 (chiffrement), INV-84-13 (UX adolescent), INV-84-14 (pas d'export gratuit), INV-84-15 (traçabilité) n'ont pas de correspondance directe dans l'expression de besoin. Ils sont pertinents pour l'epic PD-185 mais ont été ajoutés par le rédacteur de la spec.
Impact : Risque de sur-spécification. INV-84-14 et INV-84-15 sont des renforcements légitimes. INV-84-12 relève de PD-60/PD-79. INV-84-13 introduit une exigence UX non mesurable (cf. NT-v2-01).
Gravité : Mineur
AXE 3 — Règles non testables
NT-v2-01 — INV-84-13 : "compréhensible pour un adolescent" sans métrique
Type : Non testable
Référence : Spec INV-84-13, CA-84-14 / Tests section 6
Description : L'invariant exige un "parcours compréhensible pour un adolescent" et renvoie à une "mesure UX explicitée en CA". CA-84-14 définit "0 erreur bloquante sur scénario nominal" — ce qui mesure la fluidité technique, pas la compréhension. Aucun questionnaire SUS, indice de lisibilité ou taux de compréhension n'est défini. Le cahier de tests le reconnaît en section 6.
Impact : L'invariant est indémontrable objectivement. Le test TC-14 couvre le flux nominal sans erreur mais pas la compréhensibilité adolescente. Reconnu comme partiel par le cahier de tests.
Gravité : Majeur
Type : Non testable
Référence : Spec INV-84-12, SEC-84-04 / Tests TC-SEC-03, section 6
Description : "Le contenu des preuves reste chiffré et inaccessible à la plateforme". TC-SEC-03 vérifie que les API n'exposent pas de contenu en clair. Mais la couverture "inaccessible à la plateforme" (côté infra/backoffice) nécessite un protocole d'audit infra absent de la spécification PD-84. Le cahier de tests reconnaît cette limitation.
Impact : Couverture API uniquement. L'invariant relève largement de PD-60/PD-79 et de l'architecture cryptographique transverse. La couverture partielle dans PD-84 est acceptable si l'invariant est vérifié au niveau de l'epic.
Gravité : Mineur
Type : Non testable
Référence : Spec CA-84-14, Tests section 6
Description : CA-84-14 exige "sans vocabulaire ambigu". Le cahier de tests reconnaît l'absence de glossaire ou règle sémantique formelle. Le critère "0 erreur bloquante" est mesurable mais ne couvre pas la dimension linguistique.
Impact : L'aspect "vocabulaire" est subjectif. Le test TC-14 couvre la dimension fonctionnelle (aucune erreur bloquante).
Gravité : Mineur
AXE 4 — Incohérences Spec ↔ Tests
INC-v2-01 — TC-11 : équivalence "strictement identique" vs dépendance PD-60/PD-79
Type : Incohérence Spec↔Tests
Référence : Tests TC-11 résultat attendu vs Spec 8.3
Description : TC-11 v1.1.0 compare "algorithme de hash, format d'horodatage, mécanisme d'ancrage" et attend des attributs "strictement identiques". La spec 8.3 confirme l'équivalence algorithmique. Cependant, le scellement est géré par PD-60/PD-79. Pour que TC-11 soit exécutable, il faut que les métadonnées de scellement (algorithme, format horodatage, type d'ancrage) soient exposées par les API de documents. Les endpoints PD-84 (section 7.1) ne spécifient pas les champs retournés par POST /folders/{folderId}/documents ni GET /folders/{folderId}. Le modèle SealedDocument (section 3.1) liste probatory_seal_ref, integrity_state, anchoring_state — mais pas l'algorithme de hash ni le format d'horodatage.
Impact : TC-11 nécessite des champs qui ne sont pas explicitement dans le contrat de réponse API PD-84. L'implémenteur doit inférer qu'ils proviennent de PD-60/PD-79.
Gravité : Mineur
INC-v2-02 — TC-14-bis référencé dans matrice mais non défini en section 3
Type : Incohérence Spec↔Tests
Référence : Tests section 2 (matrice ECT-06) vs section 3 (scénarios)
Description : La matrice de couverture des ajouts v1.1.0 indique "ECT-06 -> TC-14-bis (CapabilityState calculé)". Mais TC-14-bis n'est pas défini dans la section 3 des scénarios de test. Aucune description, préconditions, actions ou résultat attendu.
Impact : Test manquant dans le cahier. La couverture ECT-06 (CapabilityState comme vue calculée) n'est pas objectivement vérifiable.
Gravité : Majeur
INC-v2-03 — TC-12-bis référencé dans matrice mais non défini en section 3
Type : Incohérence Spec↔Tests
Référence : Tests section 2 (matrice CA-84-12) vs section 3 (scénarios)
Description : La matrice de couverture des CA indique "CA-84-12 -> TC-12-bis". Mais TC-12-bis n'est pas défini dans la section 3. TC-12 couvre l'absence de remise à zéro mensuelle, mais TC-12-bis (potentiel approfondissement) n'existe pas.
Impact : Test fantôme dans la matrice. CA-84-12 est couvert par TC-12 existant, mais la référence TC-12-bis est trompeuse.
Gravité : Mineur
INC-v2-04 — TC-06 : test UI sans framework de test spécifié
Type : Incohérence Spec↔Tests
Référence : Tests TC-06 vs CA-84-06
Description : TC-06 manipule des éléments visuels ("contrôles d'export visibles mais désactivés", "CTA Premium visible et actionnable"). Les préconditions communes ne couvrent que les appels API. Aucune indication sur le type de test (E2E Playwright/Cypress, composant, snapshot, manuel).
Impact : Sans précision, l'automatisation de TC-06 en CI est incertaine. Un test E2E nécessite un frontend déployé.
Gravité : Mineur
INC-v2-05 — TC-15 mappé sur INV-84-05 sans pertinence
Type : Incohérence Spec↔Tests
Référence : Tests matrice de couverture INV-84-05 -> TC-15
Description : La matrice indique TC-15 couvre INV-84-05 ("La montée en Premium est possible immédiatement"). Or TC-15 teste le plan universel sans distinction d'âge (comptes MINOR vs OTHER, tous en FREE). Ce test ne touche pas la transition de plan. Le mapping est erroné.
Impact : Couverture INV-84-05 surévaluée dans la matrice. INV-84-05 est couvert par TC-10, TC-SLA-01, TC-LIM-04.
Gravité : Mineur
INC-v2-06 — TC-16 mappé sur INV-84-04 : couverture discutable
Type : Incohérence Spec↔Tests
Référence : Tests matrice de couverture INV-84-04 -> TC-16
Description : TC-16 teste le refus de catégorie invalide (INVALID_FOLDER_CATEGORY). La matrice le mappe sur INV-84-04 ("Le nombre de dossiers actifs (3) et de documents par dossier (100) est exact, déterministe et traçable"). La validation de catégorie n'a pas de rapport avec les quotas. Le mapping devrait référencer F-84-19 plutôt qu'INV-84-04.
Impact : Mapping inexact mais sans conséquence sur la couverture réelle des quotas (INV-84-04 est amplement couvert par TC-01 à TC-04, TC-LIM-01/02).
Gravité : Mineur
AXE 5 — Hypothèses dangereuses
HYP-v2-01 — Disponibilité PD-31 (audit log) : comportement en cas d'indisponibilité
Type : Hypothèse dangereuse (disponibilité)
Référence : Spec F-84-18, INV-84-15, SEC-84-03 / Tests TC-13, TC-SEC-04
Description : Les événements d'audit sont une exigence (INV-84-15). La spécification ne définit pas le comportement si le service PD-31 (audit log) est indisponible. L'opération métier (création dossier, clôture, etc.) doit-elle échouer si l'audit ne peut pas être journalisé ? Ou l'audit est-il asynchrone en best-effort ?
Impact : Si audit synchrone bloquant : l'indisponibilité PD-31 bloque toutes les opérations PD-84. Si audit asynchrone : des événements peuvent être perdus, affaiblissant INV-84-15. La spec ne tranche pas.
Gravité : Majeur
HYP-v2-02 — Dépendance horloge injectable pour TC-12
Type : Hypothèse dangereuse (horloge)
Référence : Tests TC-12, préconditions communes
Description : TC-12 "avance l'horloge de test d'un mois calendaire". Les préconditions indiquent "horloge système figée". Le test présuppose une horloge injectable. Ce n'est pas une exigence de la spec mais une contrainte d'architecture pour la testabilité.
Impact : Faible si l'architecture permet l'injection d'horloge (pattern Clock/TimeProvider). Mais si le système utilise Date.now() directement, TC-12 est non-déterministe.
Gravité : Mineur
HYP-v2-03 — Ordre des effets lors de la clôture
Type : Hypothèse dangereuse (ordonnancement)
Référence : Spec section 3.2.1 effets de transition
Description : La clôture a trois effets simultanés : (1) libération de slot, (2) blocage modifications, (3) conservation preuves. L'ordre n'est pas spécifié. Si la libération de slot précède le blocage, une fenêtre de race condition existe entre la libération et la finalisation.
Impact : Mitigé par la section 3.4 (atomicité des opérations de quota), mais la clôture elle-même n'est pas explicitement couverte par la contrainte d'atomicité de 3.4 (qui ne mentionne que "création de dossier" et "ajout de document").
Gravité : Mineur
HYP-v2-04 — TC-SLA-01 : taille d'échantillon N non spécifiée
Type : Hypothèse dangereuse (mesure statistique)
Référence : Tests TC-SLA-01 action 3
Description : TC-SLA-01 demande de "Répéter N fois pour calcul p95". La valeur de N n'est pas spécifiée. Pour un p95 statistiquement significatif, il faut un minimum d'environ 100 mesures (pour que le 95e percentile soit basé sur au moins 5 échantillons). Un N trop faible rend la mesure non fiable.
Impact : Avec N=20, le p95 repose sur 1 seul échantillon. Le test pourrait passer ou échouer de manière non reproductible.
Gravité : Mineur
SEC-v2-01 — Rate limiting absent sur les endpoints de quota
Type : Risque sécu/conformité
Référence : Spec section 7 (endpoints), F-84-18
Description : Aucune règle de rate limiting n'est définie. Chaque refus de quota génère un événement d'audit (F-84-18, INV-84-15). Un acteur malveillant pourrait envoyer des milliers de requêtes de création de dossier, provoquant autant de refus et d'événements d'audit — amplification de charge sur le service d'audit et la base.
Impact : Risque de denial-of-service par amplification audit. La spec ne définit pas de protection contre l'abus de volume sur les endpoints de quota.
Gravité : Majeur
SEC-v2-02 — RGPD mineurs : consentement parental non spécifié
Type : Risque sécu/conformité
Référence : Spec SEC-84-04, INV-84-09, HORS-PÉRIMÈTRE-COMPLIANCE-02
Description : SEC-84-04 mentionne "base légale, minimisation, droits des personnes" pour les données de mineurs. Mais la spec ne définit pas le mécanisme de consentement parental (article 8 RGPD pour < 16 ans / 15 ans en France). INV-84-09 (plan universel sans distinction d'âge) coexiste avec des obligations RGPD de traitement différencié. La spec délègue à HORS-PÉRIMÈTRE-COMPLIANCE-02.
Impact : La délégation est explicite et documentée. Le risque existe au niveau epic PD-185, pas spécifiquement PD-84. Tant que la gouvernance conformité transverse couvre ce point, la délégation est acceptable.
Gravité : Mineur
SEC-v2-03 — PUT /account/plan : endpoint stub sans garde-fou de sécurité
Type : Risque sécu/conformité
Référence : Spec section 3.2.3, section 7.1 (PUT /account/plan)
Description : L'endpoint PUT /account/plan est un stub de test/intégration. La spec indique qu'il permet de "simuler la transition de plan sans paiement réel". Aucune restriction d'environnement n'est définie : cet endpoint doit-il être désactivé en production ? Protégé par un feature flag ? Restreint à des rôles spécifiques ?
Impact : Si cet endpoint est accessible en production, tout utilisateur authentifié pourrait basculer son compte en PREMIUM sans paiement. La spec ne définit pas de garde-fou.
Gravité : Majeur
SEC-v2-04 — Couverture partielle test accès horizontal
Type : Risque sécu/conformité
Référence : SEC-84-02 / Tests TC-SEC-02
Description : TC-SEC-02 teste l'accès non autorisé sur GET, POST documents, POST close. Il ne couvre pas : tentative d'export sur dossier d'autrui, manipulation de paramètres sur GET /folders (listing), accès aux capabilities d'un autre compte.
Impact : Couverture partielle. Les endpoints d'export et de listing ne sont pas testés pour l'isolation de propriété.
Gravité : Mineur
SYNTHÈSE
| Axe | Bloquant | Majeur | Mineur | Total |
| 1. Ambiguïtés | 0 | 0 | 5 | 5 |
| 2. Contradictions | 0 | 0 | 2 | 2 |
| 3. Règles non testables | 0 | 1 | 2 | 3 |
| 4. Incohérences Spec↔Tests | 0 | 1 | 5 | 6 |
| 5. Hypothèses dangereuses | 0 | 1 | 3 | 4 |
| 6. Risques sécu/conformité | 0 | 2 | 2 | 4 |
| TOTAL | 0 | 5 | 19 | 24 |
Évolution v1 -> v2
| Métrique | v1 (spec 1.0.0) | v2 (spec 1.1.0) | Évolution |
| Bloquants | 6 | 0 | -6 |
| Majeurs | 19 | 5 | -14 |
| Mineurs | 13 | 19 | +6 (ajout de détails fins) |
| Total | 38 | 24 | -14 |
Écarts majeurs résiduels (5)
- NT-v2-01 : INV-84-13 (UX adolescent) reste non testable sans métrique UX définie.
- INC-v2-02 : TC-14-bis référencé dans la matrice mais non défini — test fantôme.
- HYP-v2-01 : Comportement en cas d'indisponibilité PD-31 non spécifié.
- SEC-v2-01 : Absence de rate limiting sur les endpoints de quota (amplification audit).
- SEC-v2-03 : PUT /account/plan sans restriction d'environnement production.
Appréciation globale
La v1.1.0 a résolu les 6 écarts bloquants de la v1 (SLA chiffré, concurrence explicite, endpoint stub, idempotence, catégorie invalide, CapabilityState). Les 5 majeurs résiduels sont significatifs mais non bloquants pour l'implémentation : 3 relèvent de la complétude (test fantôme, métrique UX, disponibilité service tiers) et 2 de la sécurité opérationnelle (rate limiting, garde-fou endpoint stub). Aucun ne remet en cause l'architecture fonctionnelle ni la testabilité globale du périmètre PD-84.