PD-82 — Scénarios de tests contractuels
1. Références
- Spécification source:
PD-82-specification.md (canonique contractuelle) - Epic: PD-189 — CRYPTO
- Portée test: conformité contractuelle, testabilité, non-régression, traçabilité probatoire
2. Matrice de couverture (INV → CA → TC)
| INV ID | Règle (résumé) | CA couverts | TC de couverture | Statut |
| INV-82-01 | 1 validation ne déclenche jamais PRE | CA-82-01, CA-82-09 | TC-NOM-01, TC-NOM-02, TC-ERR-01, TC-INV-01 | Couvert |
| INV-82-02 | Aucune validation implicite au timeout | CA-82-03 | TC-ERR-02, TC-INV-02 | Couvert |
| INV-82-03 | TTL strict 7 jours sinon EXPIRED | CA-82-03 | TC-ERR-02, TC-INV-03 | Couvert |
| INV-82-04 | Révocation explicite avant activation => REJECTED | CA-82-02, CA-82-10 | TC-NOM-04, TC-INV-04, TC-NR-03 | Couvert |
| INV-82-05 | Plateforme ne force pas activation sans 2 validations valides | CA-82-01, CA-82-07 | TC-ERR-01, TC-ERR-07, TC-INV-05 | Couvert |
| INV-82-06 | Validation horodatée probatoirement | CA-82-04 | TC-NOM-03, TC-INV-06 | Couvert |
| INV-82-07 | Validation liée à identité juridique explicite | CA-82-04, CA-82-07 | TC-NOM-03, TC-ERR-06, TC-INV-07 | Couvert |
| INV-82-08 | Ordre des validations indifférent | CA-82-06 | TC-NOM-01, TC-NOM-02, TC-INV-08 | Couvert |
| INV-82-09 | Validation authentifiée cryptographiquement | CA-82-05 | TC-ERR-05, TC-INV-09 | Couvert |
| INV-82-10 | Identité non contestable (X.509/eIDAS/équivalent opposable) | CA-82-04 | TC-ERR-06, TC-INV-10 | Couvert |
| INV-82-11 | Aucune clé PRE activée avant ACTIVATED | CA-82-01, CA-82-10 | TC-ERR-01, TC-INV-11, TC-NR-04 | Couvert |
| INV-82-12 | Journal append-only complet | CA-82-08, CA-82-09, CA-82-10 | TC-NOM-03, TC-ERR-08, TC-INV-12 | Couvert |
3. Scénarios de test — Flux nominaux (GIVEN/WHEN/THEN)
TC-NOM-01 — Parent puis autorité, activation 2-of-2
GIVEN une délégation PRE mineur en état PENDING_BOTH
AND parent P possède une identité opposable valide et une signature vérifiable
AND autorité A est pré-enregistrée, authentifiée fortement, identité opposable valide
AND horloge de test figée à T0
WHEN P soumet une validation explicite signée à T0+5m
AND A soumet une validation explicite signée à T0+1d
THEN l'état transite PENDING_BOTH -> PENDING_AUTHORITY -> ACTIVATED
AND activatePRE(delegationId) est appelé exactement 1 fois après la seconde validation
AND l'événement d'activation référence les IDs des 2 validations (P, A)
AND aucun événement de refus n'est présent
Couvre: INV-82-01, INV-82-08, INV-82-09, INV-82-11, INV-82-12; CA-82-01, CA-82-06, CA-82-09 TC-NOM-02 — Autorité puis parent, activation 2-of-2
GIVEN une délégation PRE mineur en état PENDING_BOTH
AND A et P ont des identités opposables et signatures vérifiables
AND horloge de test figée à T0
WHEN A valide explicitement à T0+10m
AND P valide explicitement à T0+2d
THEN l'état transite PENDING_BOTH -> PENDING_PARENT -> ACTIVATED
AND activatePRE(delegationId) est appelé exactement 1 fois après la seconde validation
AND l'issue finale est identique au scénario TC-NOM-01
Couvre: INV-82-08, INV-82-01, INV-82-11; CA-82-06, CA-82-01 TC-NOM-03 — Traçabilité probatoire complète
GIVEN un processus complet PD-82 mené jusqu'à ACTIVATED
WHEN un audit externe exporte le dossier de preuve
THEN chaque événement (création, validations, activation) est présent en append-only
AND chaque validation contient timestamp probatoire vérifiable
AND chaque validation contient identité juridique explicite vérifiable
AND l'ordre exact des événements est reconstructible sans ambiguïté
AND l'activation référence les deux validations source
Couvre: INV-82-06, INV-82-07, INV-82-12; CA-82-04, CA-82-08, CA-82-09 TC-NOM-04 — Révocation avant activation
GIVEN une délégation PRE mineur en état PENDING_AUTHORITY
AND la validation parent est présente et valide
WHEN le parent (auteur de la validation) soumet une révocation explicite signée avant seconde validation
THEN l'état devient REJECTED
AND activatePRE(delegationId) n'est jamais appelé
AND toute validation ultérieure sur cette délégation est refusée (état terminal)
AND la révocation est journalisée en append-only
Couvre: INV-82-04, INV-82-11, INV-82-12; CA-82-02, CA-82-10
4. Scénarios de test — Cas d'erreur (GIVEN/WHEN/THEN)
TC-ERR-01 — Activation avec une seule validation
GIVEN une délégation en PENDING_AUTHORITY avec une seule validation valide
WHEN une activation PRE est demandée
THEN la demande est refusée explicitement
AND l'état reste PENDING_AUTHORITY
AND un événement append-only de refus est créé
AND activatePRE(delegationId) n'est pas appelé
Couvre: ERR-82-01; INV-82-01, INV-82-11, INV-82-12; CA-82-01 TC-ERR-02 — Seconde validation après TTL > 7 jours
GIVEN une première validation valide horodatée à T0
AND aucune seconde validation jusqu'à T0+7j+1s
WHEN la seconde validation est soumise à T0+7j+1s
THEN la validation est refusée
AND l'état devient EXPIRED si non terminal
AND aucune activation implicite ni explicite n'a lieu
AND un nouveau processus est requis
Couvre: ERR-82-02; INV-82-02, INV-82-03; CA-82-03 TC-ERR-03 — Révocation par acteur non auteur
GIVEN une validation signée par le parent P
WHEN l'autorité A tente de révoquer la validation de P
THEN la révocation est refusée explicitement
AND l'état reste inchangé
AND un événement append-only de tentative invalide est journalisé
Couvre: ERR-82-03; INV-82-04, INV-82-12 TC-ERR-04 — Révocation après ACTIVATED
GIVEN une délégation en état ACTIVATED
WHEN P ou A soumet une révocation
THEN la révocation est refusée explicitement
AND l'état reste ACTIVATED (terminal irréversible)
AND l'événement de refus est journalisé
Couvre: ERR-82-04; INV-82-11, INV-82-12; CA-82-10 TC-ERR-05 — Signature invalide/non vérifiable
GIVEN une délégation en PENDING_BOTH
WHEN une validation est soumise avec signature invalide ou non vérifiable
THEN la validation est rejetée avec motif cryptographique explicite
AND l'état reste inchangé
AND l'échec est journalisé
Couvre: ERR-82-05; INV-82-09; CA-82-05 TC-ERR-06 — Identité non juridiquement qualifiable
GIVEN une délégation en PENDING_BOTH
WHEN une validation est soumise sans certificat/opposabilité juridique valable
THEN la validation est rejetée avec motif explicite d'identité non qualifiable
AND l'état reste inchangé
AND l'échec est journalisé
Couvre: ERR-82-06; INV-82-07, INV-82-10; CA-82-04 TC-ERR-07 — Parent tente de choisir l'autorité
GIVEN une délégation PRE mineur avec autorité déterminée par registre interne
WHEN le parent fournit/altère un identifiant d'autorité cible
THEN la demande est refusée avec motif métier explicite
AND l'autorité utilisée reste celle du registre interne
AND l'événement est journalisé
Couvre: ERR-82-07; INV-82-05, INV-82-07; CA-82-07 TC-ERR-08 — Tentative de modification/suppression append-only
GIVEN un journal contenant des événements PD-82
WHEN une opération de modification ou suppression historique est tentée
THEN l'opération est interdite
AND aucune mutation historique n'est observée
AND une alerte sécurité et un événement append-only sont enregistrés
Couvre: ERR-82-08; INV-82-12; CA-82-08
5. Tests d'invariants (non négociables)
| INV | TC dédié | Observable vérifié |
| INV-82-01 | TC-INV-01 (réf. TC-ERR-01) | Aucun appel activatePRE tant que 2 validations distinctes valides absentes |
| INV-82-02 | TC-INV-02 (réf. TC-ERR-02) | Aucun auto-approve au timeout; refus explicite requis |
| INV-82-03 | TC-INV-03 (réf. TC-ERR-02) | À T0+7j+1s, état EXPIRED et plus aucune complétion possible |
| INV-82-04 | TC-INV-04 (réf. TC-NOM-04) | Révocation explicite pré-activation => REJECTED |
| INV-82-05 | TC-INV-05 (réf. TC-ERR-01, TC-ERR-07) | Plateforme et parent ne peuvent pas contourner la règle 2-of-2/registre |
| INV-82-06 | TC-INV-06 (réf. TC-NOM-03) | Validation contient timestamp probatoire vérifiable |
| INV-82-07 | TC-INV-07 (réf. TC-NOM-03, TC-ERR-06) | Validation liée à identité juridique explicite et vérifiable |
| INV-82-08 | TC-INV-08 (réf. TC-NOM-01, TC-NOM-02) | Parent→autorité et autorité→parent aboutissent pareil |
| INV-82-09 | TC-INV-09 (réf. TC-ERR-05) | Signature invalide rejetée systématiquement |
| INV-82-10 | TC-INV-10 (réf. TC-ERR-06) | Identité non opposable rejetée systématiquement |
| INV-82-11 | TC-INV-11 (réf. TC-ERR-01, TC-ERR-04) | Aucune activation clé PRE avant ACTIVATED; terminal irréversible |
| INV-82-12 | TC-INV-12 (réf. TC-NOM-03, TC-ERR-08) | Journal complet append-only, tentatives invalides tracées |
6. Tests de non-régression
| TEST ID | Objectif de non-régression | Précondition | Observable attendu |
| TC-NR-01 | Stabilité du flux N1 | Build N et N+1 | Même transitions et mêmes événements probatoires qu'en baseline |
| TC-NR-02 | Stabilité du flux N2 | Build N et N+1 | Résultat ACTIVATED identique et même cardinalité d'événements |
| TC-NR-03 | Révocation avant activation toujours bloquante | Validation 1 présente | REJECTED systématique, zéro activation |
| TC-NR-04 | Fail-closed PRE | Cas 0/1 validation | Aucun appel activatePRE |
| TC-NR-05 | TTL strict inchangé | Horloge contrôlée | EXPIRED au-delà de 7 jours exacts, jamais avant |
| TC-NR-06 | Robustesse append-only | Journal prérempli | Aucune suppression/modification autorisée |
| TC-NR-07 | Contrôle identité juridique | Certificats variés | Rejet systématique des identités non opposables |
| TC-NR-08 | Contrôle signature crypto | Signatures valides/invalides | Acceptation uniquement des signatures vérifiables |
7. Tests négatifs et adversariaux
| TEST ID | Entrée invalide / abus | Résultat attendu | Références |
| TC-NEG-01 | Rejeu exact de la même validation signée (replay) | Pas de double-compte validation, journalisation tentative | INV-82-01, INV-82-12 |
| TC-NEG-02 | Validation avec horodatage altéré côté client | Rejet ou neutralisation via source probatoire serveur | INV-82-06, INV-82-09 |
| TC-NEG-03 | Collision d'identité (certificat expiré/usurpé) | Rejet avec motif identité non opposable | INV-82-10, ERR-82-06 |
| TC-NEG-04 | Tentative d'activation concurrente pendant transition | Une seule décision atomique, pas d'état incohérent | INV-82-01, INV-82-11 |
| TC-NEG-05 | Injection d'une autorité hors registre interne | Rejet métier + trace de sécurité | INV-82-05, ERR-82-07 |
| TC-NEG-06 | Suppression logique d'un événement via API admin | Interdiction + alerte + historique intact | INV-82-12, ERR-82-08 |
| TC-NEG-07 | Seconde validation à la frontière TTL (T0+7j exact) | Acceptée si règle inclusive explicitement définie, sinon cas ambigu | INV-82-03 (voir section 9) |
| TC-NEG-08 | Révocation et seconde validation soumises quasi simultanément | Résultat déterministe documenté (ordre causal auditable) | INV-82-04, INV-82-12 |
8. Observabilité requise pour les tests
État système
- État courant PD-82 (
PENDING_BOTH, PENDING_AUTHORITY, PENDING_PARENT, ACTIVATED, REJECTED, EXPIRED) - Horodatage de transition et cause métier/technique
Réponse API / service
- Code résultat déterministe (accepté/refusé)
- Motif explicite de refus (TTL, signature, identité, autorité, terminalité)
- Trace d'appel
activatePRE(delegationId) (présence/absence, cardinalité)
Journal d'audit append-only
- ID événement immuable, type événement, timestamp probatoire
- Référence
delegationId, acteur (parent/authority), identité opposable - Référence croisée des IDs de validations dans l'événement d'activation
- Journalisation des tentatives invalides et alertes sécurité
Export probatoire
- Export vérifiable par tiers
- Reconstructibilité chronologique complète
- Vérification indépendante des preuves (horodatage, signature, identité)
9. Règles non testables
| Élément | Statut | Raison | Impact |
| "Format probatoire RFC 3161 ou équivalent" (équivalent non défini) | NON TESTABLE (partiel) | Le terme "équivalent" n'a pas de critères d'acceptation normatifs explicites dans PD-82 | Mineur — Impossible d'écrire un oracle binaire complet sans liste/critères d'équivalence |
Frontière TTL à T0+7j (inclusif/exclusif non explicitement formalisé) | NON TESTABLE (partiel) | La spécification impose "au-delà de 7 jours" mais ne formalise pas explicitement le comportement au point exact de frontière | Mineur — Risque d'interprétation divergente inter-implémentations |
10. Verdict QA
⚠️ Partiellement testable
- Couverture complète obtenue sur les 12 invariants, 10 critères d'acceptation et 8 cas d'erreur.
- Deux points contractuels restent partiellement non testables sans précision normative supplémentaire:
- Définition de "format probatoire équivalent" à RFC 3161.
- Politique exacte de frontière TTL à
T0+7j (inclusif/exclusif). - Hors ces ambiguïtés, les scénarios sont déterministes, reproductibles, vérifiables et automatisables.
Document généré le 2026-02-17 Workflow de gouvernance ProbatioVault