PD-86-TESTS
1. Matrice de couverture
1.1 Couverture des invariants
| Invariant | Scénario(s) |
| INV-86-01 | TC-86-04, TC-86-18, TC-86-19, TC-86-20 |
| INV-86-02 | TC-86-17 |
| INV-86-03 | TC-86-05 |
| INV-86-04 | TC-86-14 |
| INV-86-05 | TC-86-01, TC-86-02, TC-86-03 |
| INV-86-06 | TC-86-13, TC-86-27 |
| INV-86-07 | TC-86-06 |
| INV-86-08 | TC-86-06 |
| INV-86-09 | TC-86-08, TC-86-09, TC-86-18, TC-86-19, TC-86-20, TC-86-26 |
| INV-86-10 | TC-86-16 |
| INV-86-11 | TC-86-07, TC-86-25 |
| INV-86-12 | TC-86-15 |
| INV-86-13 | TC-86-12 |
| INV-86-14 | TC-86-10 |
| INV-86-15 | TC-86-11 |
| INV-86-16 | TC-86-27 |
| INV-86-17 | TC-86-28, TC-86-30 |
| INV-86-18 | TC-86-29 |
| INV-86-19 | TC-86-31, TC-86-32 |
| INV-86-20 | TC-86-30 |
1.2 Couverture des critères d'acceptation
| Critère d'acceptation | Scénario(s) |
| CA-86-01 | TC-86-01 |
| CA-86-02 | TC-86-02 |
| CA-86-03 | TC-86-03 |
| CA-86-04 | TC-86-04 |
| CA-86-05 | TC-86-05 |
| CA-86-06 | TC-86-06 |
| CA-86-07 | TC-86-07 |
| CA-86-08 | TC-86-08 |
| CA-86-09 | TC-86-09 |
| CA-86-10 | TC-86-10 |
| CA-86-11 | TC-86-11 |
| CA-86-12 | TC-86-12 |
| CA-86-13 | TC-86-16 |
| CA-86-14 | TC-86-27 |
| CA-86-15 | TC-86-28 |
| CA-86-16 | TC-86-30 |
| CA-86-17 | TC-86-31, TC-86-32 |
| CA-86-18 | TC-86-03, TC-86-25, TC-86-26 |
| CA-86-19 | TC-86-29 |
2. Scénarios de test (TC-86-XX)
TC-86-01 — Image sensible: modal avant rendu
- Description : Vérifier qu'une image détectée sensible n'est jamais rendue avant consentement.
- Prérequis : Détection globale activée; document image de référence classé sensible; préférence document = WARN.
- Étapes :
- Ouvrir le document image dans le viewer.
- Observer la première sortie UI.
- Résultat attendu : Modal de consentement affiché avant tout pixel du média; rendu autorisé seulement après action explicite.
- Couvre : INV-86-05, CA-86-01.
TC-86-02 — Vidéo sensible: agrégation max + modal
- Description : Vérifier l'agrégation
max(score_categorie) sur 12 frames et le gate modal. - Prérequis : Détection activée; vidéo de référence dont une frame dépasse un seuil.
- Étapes :
- Ouvrir la vidéo.
- Vérifier que l'analyse porte sur 12 frames max (incluant les 2 premières secondes).
- Observer le comportement d'affichage.
- Résultat attendu :
isSensitive=true si au moins une frame dépasse un seuil; modal avant tout rendu vidéo. - Couvre : INV-86-05, CA-86-02.
TC-86-03 — PDF sensible: modal avant toute page
- Description : Vérifier le gate de consentement pour PDF sensible.
- Prérequis : Détection activée; PDF de référence classé sensible; préférence = WARN.
- Étapes :
- Ouvrir le PDF.
- Observer l'écran initial.
- Résultat attendu : Modal affiché avant toute page rendue.
- Couvre : INV-86-05, CA-86-03.
TC-86-04 — Zéro transmission réseau de contenu/scores
- Description : Vérifier l'absence d'émission réseau liée à l'analyse.
- Prérequis : Instrumentation réseau active; jeu de documents image/vidéo/PDF.
- Étapes :
- Ouvrir successivement les documents.
- Capturer l'ensemble des flux réseau pendant analyse et affichage.
- Résultat attendu : Aucun flux sortant contenant pixels, dérivés visuels, scores, catégories, statut d'analyse.
- Couvre : INV-86-01, CA-86-04.
TC-86-05 — Intégrité probatoire (hash inchangé)
- Description : Vérifier que l'analyse ne modifie jamais le fichier original.
- Prérequis : Hash probatoire calculé avant ouverture.
- Étapes :
- Ouvrir et analyser le document.
- Recalculer le hash après fermeture.
- Résultat attendu : Hash strictement identique avant/après.
- Couvre : INV-86-03, CA-86-05.
TC-86-06 — Cache minimal autorisé + chiffrement
- Description : Vérifier contenu et sécurité du cache de verdict.
- Prérequis : Au moins un document analysé en SUCCESS.
- Étapes :
- Inspecter l'entrée de cache associée au document.
- Contrôler les champs présents.
- Vérifier le chiffrement au repos.
- Résultat attendu : Présence uniquement des champs autorisés (
documentId, isSensitive, catégories, rawScores, roundedScores, modelVersion, analyzedAt, analysisStatus, thresholdsVersionAtDecision); aucune donnée visuelle/embedding/OCR/texte; cache chiffré. - Couvre : INV-86-07, INV-86-08, CA-86-06.
- Description : Vérifier qu'aucun fichier temporaire média clair n'est laissé.
- Prérequis : Inventaire initial du système de fichiers applicatif.
- Étapes :
- Exécuter une analyse SUCCESS.
- Exécuter une analyse en échec (ex: format invalide).
- Refaire l'inventaire.
- Résultat attendu : Aucun fichier image/frame/thumbnail/preview temporaire en clair après succès et échec.
- Couvre : INV-86-11, CA-86-07.
TC-86-08 — TIMEOUT: modal prudent
- Description : Vérifier le comportement prudent sur timeout.
- Prérequis : Condition de timeout reproductible (
durationMs > 5000). - Étapes :
- Ouvrir un document provoquant
TIMEOUT. - Observer UI et statut persistant.
- Résultat attendu : Modal "non analysé / potentiellement sensible" affiché; pas de crash; statut horodaté.
- Couvre : INV-86-09, CA-86-08.
TC-86-09 — MODEL_UNAVAILABLE: dégradation contrôlée
- Description : Vérifier le flux utilisateur quand le modèle est indisponible.
- Prérequis : Modèle absent/inaccessible.
- Étapes :
- Ouvrir un document supporté.
- Observer UI et persistance.
- Résultat attendu : Modal prudent affiché; possibilité utilisateur conservée; pas de crash; statut
MODEL_UNAVAILABLE horodaté. - Couvre : INV-86-09, CA-86-09.
TC-86-10 — Désactivation globale
- Description : Vérifier que
enabled=false bloque toute nouvelle classification. - Prérequis : Paramètre global désactivé.
- Étapes :
- Ouvrir un document non encore classifié.
- Contrôler absence de nouveau verdict.
- Réactiver puis rouvrir.
- Résultat attendu : Aucune classification quand désactivé; reprise immédiate à réactivation; aucun impact sur fichier/preuves.
- Couvre : INV-86-14, CA-86-10.
TC-86-11 — Préférence document réversible
- Description : Vérifier "ne plus me prévenir" par document et sa réversibilité.
- Prérequis : Deux documents sensibles A et B; préférence initiale WARN.
- Étapes :
- Mettre A en SUPPRESSED.
- Ouvrir A puis B.
- Revenir A en WARN et rouvrir A.
- Résultat attendu : Suppression du modal uniquement sur A en SUPPRESSED (hors règles mineur/prudence); B inchangé; retour immédiat du modal sur A après réactivation WARN.
- Couvre : INV-86-15, CA-86-11.
TC-86-12 — Changement modelVersion: invalidation + reclassification
- Description : Vérifier invalidation d'un verdict cache quand
modelVersion change. - Prérequis : Document déjà classifié en version V1.
- Étapes :
- Simuler disponibilité version V2.
- Ouvrir le même document.
- Résultat attendu : Verdict V1 invalidé; nouvelle classification exécutée; verdict persisté avec V2.
- Couvre : INV-86-13, CA-86-12.
TC-86-13 — Mineur: confirmation explicite additionnelle
- Description : Vérifier l'étape de confirmation supplémentaire pour mineur.
- Prérequis :
context.isMinor=true; document sensible; préférence WARN. - Étapes :
- Ouvrir le document.
- Choisir "Afficher quand même".
- Résultat attendu : Confirmation additionnelle obligatoire avant rendu effectif.
- Couvre : INV-86-06.
TC-86-14 — Whitelist stricte des catégories
- Description : Vérifier qu'aucune catégorie hors whitelist ne peut déclencher sensible.
- Prérequis : Jeu de sortie de classification de référence contenant catégories whitelist + hors whitelist.
- Étapes :
- Évaluer les verdicts.
- Contrôler la décision
isSensitive. - Résultat attendu : Seules
VIOLENCE, NUDITE, SEXUEL, CHOQUANT influencent le flag sensible. - Couvre : INV-86-04.
TC-86-15 — Hygiène des logs (whitelist/blacklist)
- Description : Vérifier la politique explicite de champs loggables.
- Prérequis : Capture complète des logs applicatifs pendant analyses variées.
- Étapes :
- Exécuter analyses SUCCESS et erreurs.
- Scanner les logs contre la whitelist autorisée.
- Vérifier l'absence des champs blacklistés.
- Résultat attendu : Uniquement champs autorisés; aucun pixel data, miniature, chemin de fichier média, EXIF, dump handle, métadonnée reconstructible.
- Couvre : INV-86-12.
TC-86-16 — Zeroization best-effort des buffers
- Description : Vérifier la libération/effacement best-effort en fin de flux via
try/finally. - Prérequis : Instrumentation mémoire activée; scénarios succès, timeout, annulation.
- Étapes :
- Exécuter chaque scénario.
- Observer les appels de cleanup sur tous chemins d'exécution.
- Vérifier non-réutilisabilité des buffers post-traitement.
- Résultat attendu : Buffers de rendu/analyse nettoyés/libérés sur succès/erreur/annulation.
- Couvre : INV-86-10, CA-86-13.
TC-86-17 — Détection uniquement au viewer
- Description : Vérifier absence d'analyse à l'import/upload.
- Prérequis : Journal d'événements d'application; document non consulté.
- Étapes :
- Importer/ajouter le document sans l'ouvrir.
- Contrôler les événements d'analyse.
- Ouvrir ensuite le document.
- Résultat attendu : Aucune classification avant ouverture viewer; classification possible à l'ouverture uniquement.
- Couvre : INV-86-02.
- Description : Vérifier comportement sur format non pris en charge.
- Prérequis : Fichier de format hors contrat; instrumentation réseau active.
- Étapes :
- Ouvrir le fichier.
- Observer UI.
- Capturer trafic réseau.
- Résultat attendu : Message clair format non supporté + modal prudent; pas de crash; statut
UNSUPPORTED_FORMAT horodaté; aucun envoi réseau de contenu/scores. - Couvre : INV-86-09, INV-86-01.
- Description : Vérifier dégradation contrôlée sur entrée corrompue.
- Prérequis : Média volontairement corrompu; instrumentation réseau active.
- Étapes :
- Ouvrir le média.
- Observer UI et statut.
- Capturer trafic réseau.
- Résultat attendu : Message non culpabilisant + modal prudent; pas de crash; statut
CORRUPTED_INPUT horodaté; pas d'envoi réseau. - Couvre : INV-86-09, INV-86-01.
TC-86-20 — INTERNAL_ERROR: dégradation + zéro réseau
- Description : Vérifier dégradation contrôlée en erreur interne inattendue.
- Prérequis : Injection d'erreur interne déterministe; instrumentation réseau active.
- Étapes :
- Ouvrir un document supporté.
- Observer UI et statut.
- Capturer trafic réseau.
- Résultat attendu : Contenu masqué par défaut; contrôle utilisateur conservé; pas de crash; statut
INTERNAL_ERROR horodaté; pas d'envoi réseau. - Couvre : INV-86-09, INV-86-01.
TC-86-21 — KEEP_HIDDEN / CANCEL
- Description : Vérifier les décisions de gate sans rendu non autorisé.
- Prérequis : Document sensible; modal affiché.
- Étapes :
- Choisir
KEEP_HIDDEN. - Refaire puis choisir
CANCEL. - Résultat attendu : Aucun rendu du contenu dans les deux cas; retour à l'état masqué.
- Couvre : Contrat gate viewer.
TC-86-22 — Warm-up à l'ouverture du coffre + lazy fallback
- Description : Vérifier stratégie warm-up puis fallback lazy.
- Prérequis : Session fraîche.
- Étapes :
- Ouvrir le coffre (sans ouvrir de document).
- Ouvrir un premier document immédiatement.
- Résultat attendu : Warm-up déclenché au coffre; si warm-up non prêt, fallback lazy appliqué au premier document sans rupture de flux.
- Couvre : Exigences performance.
TC-86-23 — Budget temps P95 et non-blocage UI
- Description : Vérifier budget d'analyse
<=700 ms au P95 et absence de blocage UI prolongé. - Prérequis : iPhone 12 (A14, iOS 16.0+); jeu de documents représentatifs; N=30 exécutions.
- Étapes :
- Mesurer
durationMs sur 30 ouvertures. - Calculer le P95.
- Mesurer réactivité UI durant analyse.
- Résultat attendu :
P95(durationMs) <= 700 ms (hors décodage viewer incompressible); UI reste interactive. - Couvre : Exigences performance.
TC-86-24 — Vidéo: échantillonnage 12 frames max
- Description : Vérifier absence de décodage intégral et plafond 12 frames.
- Prérequis : Vidéo longue de référence.
- Étapes :
- Ouvrir la vidéo.
- Relever le nombre de frames effectivement analysées.
- Résultat attendu : Maximum 12 frames; stratégie uniforme avec inclusion des 2 premières secondes.
- Couvre : Exigences performance.
TC-86-25 — PDF: rendu mémoire uniquement
- Description : Vérifier l'absence de persistance disque des rendus de pages.
- Prérequis : PDF multipage; surveillance I/O disque.
- Étapes :
- Ouvrir le PDF.
- Exécuter analyse puis fermeture.
- Contrôler traces disque.
- Résultat attendu : Rendu de pages en mémoire uniquement; aucun artefact persistant.
- Couvre : INV-86-11, CA-86-18.
TC-86-26 — PDF: stratégie d'échantillonnage déterministe
- Description : Vérifier la stratégie contractuelle "première + dernière + 3 intérieures uniformes" avec plafond 5.
- Prérequis : PDF de 20 pages avec instrumentation
pdfPageIndexes. - Étapes :
- Ouvrir le PDF.
- Capturer
pdfPagesAnalyzed et pdfPageIndexes. - Répéter l'ouverture.
- Résultat attendu :
pdfPagesAnalyzed <= 5; pages 1 et 20 présentes; 3 pages intérieures uniformément réparties; sélection stable/déterministe entre exécutions. - Couvre : CA-86-18.
TC-86-27 — Mineur + suppressWarning=true
- Description : Vérifier que
suppressWarning est ignoré pour mineur. - Prérequis :
isMinor=true; document sensible; préférence suppressWarning=true. - Étapes :
- Ouvrir le document.
- Choisir "Afficher quand même".
- Résultat attendu : Modal affiché malgré
suppressWarning; confirmation additionnelle obligatoire. - Couvre : INV-86-06, INV-86-16, CA-86-14.
TC-86-28 — Mineur: garde-fou seuils (pas de relaxation)
- Description : Vérifier que les seuils effectifs mineur sont plafonnés aux défauts.
- Prérequis :
isMinor=true; tentative de config seuils supérieurs aux défauts. - Étapes :
- Tenter de sauvegarder des seuils plus permissifs.
- Lire les seuils effectifs utilisés par le moteur.
- Résultat attendu : Rejet de la config ou clamp automatique aux seuils par défaut; aucune relaxation effective.
- Couvre : INV-86-17, CA-86-15.
TC-86-29 — Désactivation globale + document déjà sensible
- Description : Vérifier le comportement viewer quand verdict sensible existe déjà en cache et
enabled=false. - Prérequis : Document avec verdict cache
isSensitive=true; bascule globale sur enabled=false. - Étapes :
- Ouvrir le document.
- Observer modal/rendu.
- Résultat attendu : Aucun modal de détection affiché; contenu rendu directement; aucun nouveau run de classification.
- Couvre : INV-86-18, CA-86-19.
TC-86-30 — Changement de seuils post-classification
- Description : Vérifier réévaluation de
isSensitive à partir des rawScores sans ré-inférence. - Prérequis : Verdict SUCCESS en cache avec
rawScores et thresholdsVersionAtDecision=V1. - Étapes :
- Modifier les seuils utilisateur vers version V2.
- Rouvrir le même document.
- Vérifier traces exécution moteur.
- Résultat attendu :
isSensitive recalculé localement depuis rawScores; pas de nouvelle inférence; thresholdsVersionAtDecision mis à jour. - Couvre : INV-86-20, INV-86-17, CA-86-16.
TC-86-31 — Concurrence: sérialisation des classifications
- Description : Vérifier absence de race condition sur ouvertures concurrentes du même document.
- Prérequis : Deux ouvertures simultanées du même
(documentId, modelVersion). - Étapes :
- Déclencher deux demandes en parallèle.
- Capturer l'activité d'analyse et les écritures cache.
- Résultat attendu : Une seule inférence effective; deuxième demande attend/réutilise le résultat; pas de doublon persistant.
- Couvre : INV-86-19, CA-86-17.
TC-86-32 — Collision unicité (documentId, modelVersion)
- Description : Vérifier que l'unicité persistance empêche doublons en cas d'écriture concurrente.
- Prérequis : Injection de concurrence sur persistance du même couple clé.
- Étapes :
- Forcer deux tentatives d'insert simultanées.
- Inspecter état final du store.
- Résultat attendu : Une seule ligne finale pour
(documentId, modelVersion); second chemin géré en update/idempotence. - Couvre : INV-86-19, CA-86-17.
TC-86-33 — Bornes de seuils [0.50, 0.95]
- Description : Vérifier rejet hors bornes et acceptation aux bornes exactes.
- Prérequis : UI/API de configuration des seuils disponible.
- Étapes :
- Tenter
0.49 puis 0.96. - Sauvegarder
0.50 puis 0.95. - Résultat attendu : Rejet de
<0.50 et >0.95; acceptation stricte de 0.50 et 0.95. - Couvre : Règles de modèle de données.
TC-86-34 — Source isMinor non falsifiable localement
- Description : Vérifier que
isMinor provient du profil authentifié serveur et ne peut pas être overridé localement. - Prérequis : Session authentifiée B2C-MINEURS; outillage de tentative de patch local du contexte.
- Étapes :
- Tenter de forcer
isMinor=false côté client. - Ouvrir un document sensible.
- Résultat attendu : Valeur mineur issue du profil serveur conservée; garde-fous mineur appliqués.
- Couvre : Exigence source
isMinor.
3. Tests de sécurité (focus)
| ID | Contrôle sécurité | Résultat attendu |
| SEC-86-01 | Architecture zero-knowledge (capture réseau complète) | Aucune transmission de contenu/scores/catégories/statuts vers endpoint distant |
| SEC-86-02 | Chiffrement du cache local de verdict | Données de cache illisibles hors contexte applicatif autorisé |
| SEC-86-03 | Interdiction de médias dérivés persistants | Aucun frame/thumbnail/preview/embedding/OCR/texte stocké |
| SEC-86-04 | Zeroization best-effort (succès/timeout/annulation) | Buffers visuels nettoyés/libérés en fin de flux |
| SEC-86-05 | Hygiène des logs (whitelist/blacklist) | Aucun élément reconstructible du contenu visuel; uniquement champs autorisés |
| SEC-86-06 | Source isMinor authentifiée | Aucun contournement local du flag mineur |
| SEC-86-07 | Mécanismes iOS d'aperçu | Aucun snapshot/indexation/preview non maîtrisé (App Switcher, Spotlight, QuickLook) |
| ID | Scénario | Résultat attendu |
| PERF-86-01 | Budget analyse par ouverture sur iPhone 12 (A14, iOS 16+) | P95(durationMs) <= 700 ms (N=30, hors décodage viewer incompressible) |
| PERF-86-02 | Warm-up + lazy fallback | Warm-up au coffre; fallback au premier document si nécessaire |
| PERF-86-03 | Non-blocage UI | Aucune gel prolongé de l'interface pendant l'analyse |
| PERF-86-04 | Vidéo échantillonnée | 12 frames max, inclusion des 2 premières secondes, pas de décodage intégral |
| PERF-86-05 | PDF en mémoire + stratégie déterministe | <=5 pages, première+dernière+intérieures uniformes, sans persistance disque |
5. Tests de gestion d'erreurs (codes contractuels)
| ID | Code | Vérifications attendues |
| ERR-86-01 | MODEL_UNAVAILABLE | Modal prudent, pas de crash, statut horodaté, contrôle utilisateur conservé |
| ERR-86-02 | CORRUPTED_INPUT | Message non culpabilisant + modal prudent, pas de crash, statut horodaté |
| ERR-86-03 | UNSUPPORTED_FORMAT | Message clair + modal prudent, pas de crash, statut horodaté |
| ERR-86-04 | TIMEOUT | Modal "non analysé/potentiellement sensible", pas de crash, statut horodaté, timeout >5000 ms |
| ERR-86-05 | INTERNAL_ERROR | Dégradation contrôlée, contenu masqué par défaut, pas de crash, statut horodaté |
| ERR-86-06 | OUT_OF_MEMORY | Dégradation contrôlée + modal prudent, pas de crash, statut horodaté |
Règles transverses à vérifier dans chaque test d'erreur : aucun envoi réseau de contenu, maintien du contrôle utilisateur (Afficher quand même / Garder masqué), priorité de la politique prudente sur suppressWarning.
6. Tests UX / consentement
| ID | Scénario UX | Résultat attendu |
| UX-86-01 | Modal de gate sur contenu sensible | Modal visible avant tout rendu |
| UX-86-02 | Confirmation additionnelle mineur | Double confirmation requise pour "Afficher quand même" |
| UX-86-03 | "Ne plus me prévenir" par document | Effet strictement limité au document ciblé (hors règles mineur/prudence) |
| UX-86-04 | Réversibilité préférence document | Retour immédiat à WARN après réactivation |
| UX-86-05 | Désactivation globale | Aucune nouvelle classification tant que désactivé |
| UX-86-06 | KEEP_HIDDEN / CANCEL | Aucun rendu dans les deux cas |
| UX-86-07 | Mineur + suppressWarning=true | Modal maintenu et confirmation additionnelle obligatoire |
| UX-86-08 | Désactivation globale + verdict sensible existant | Rendu direct sans modal de détection |
7. Signalement (non testable / ambigu)
- ST-86-01 — INV-86-10 (zeroization best-effort) : preuve absolue d'effacement mémoire non démontrable en black-box stricte ; validation requiert instrumentation mémoire.
- ST-86-02 — Performance dépendante hardware : comparabilité stricte hors device de référence limitée ; protocole figé sur iPhone 12 pour verdict contractuel.