Aller au contenu

PD-287 — Scénarios de tests contractuels

1. Références

  • Spécification : PD-287-specification.md
  • Epic : EPIC-XX

2. Matrice de couverture

ID Invariant ID Critère ID Test Couverture Commentaire
INV-287-01 CA-287-14 TC-INV-11, TC-NEG-06 Oui Vérification bornée imposée par la spec (réseau + mémoire + logs/dumps).
INV-287-02 CA-287-12, CA-287-14 TC-NOM-07, TC-ERR-15, TC-INV-09 Oui PRE obligatoire, fail-closed en cas d’échec crypto.
INV-287-03 CA-287-15 TC-NOM-13, TC-NR-02 Oui Intégrité WORM contrôlée avant/après cycle complet.
INV-287-04 CA-287-03, CA-287-11 TC-NOM-02, TC-ERR-05, TC-ERR-09 Oui OTP requis pour toute nouvelle session.
INV-287-05 CA-287-19 TC-NOM-12 Oui Unicité identité éphémère par lien.
INV-287-06 CA-287-02, CA-287-07 TC-NOM-01, TC-NOM-02, TC-INV-01 Oui États contractuels fermés, état initial vérifié.
INV-287-07 CA-287-04, CA-287-10 TC-NOM-03, TC-INV-02 Oui Transitions non listées rejetées.
INV-287-08 CA-287-08 TC-NOM-09, TC-ERR-10 Oui Révocation effective mesurée à 2s P95 sous charge nominale.
INV-287-09 CA-287-01, CA-287-09 TC-NOM-01, TC-NOM-10, TC-ERR-11 Oui Bornes TTL et coupure post-expiration.
INV-287-10 CA-287-10 TC-INV-02, TC-NEG-12 Oui Terminalité REVOKED/EXPIRED stricte.
INV-287-11 CA-287-20 TC-ERR-18, TC-NEG-05 Oui Re-partage destinataire interdit.
INV-287-12 CA-287-18 TC-INV-06, TC-ERR-05, TC-NEG-02 Oui Anti-enumeration vérifiée en boîte noire (404 homogène, 429 limité au rate-limit).
INV-287-13 CA-287-16 TC-NOM-14, TC-ERR-14, TC-INV-14 Oui Append-only + hash-chain + ancrage batch Merkle.
INV-287-15 CA-287-27, CA-287-30 TC-NOM-02, TC-NOM-19, TC-INV-12 Oui Minimisation et rétention désormais pleinement testables.
INV-287-16 CA-287-14 TC-INV-08, TC-NEG-06 Oui Secrets temporaires chiffrés au repos, pas de clair en base.
INV-287-17 CA-287-29 TC-INV-07, TC-ERR-16, TC-NEG-08 Oui Trust-store obligatoire, pas de bypass.
INV-287-18 CA-287-28 TC-INV-09 Oui Roundtrip complet sur primitives crypto du flux.
INV-287-19 CA-287-25 TC-NOM-17, TC-NEG-04 Oui Purge proactive au démarrage et en état terminal.
INV-287-20 CA-287-05, CA-287-06, CA-287-21, CA-287-22, CA-287-23, CA-287-24, CA-287-31 TC-NOM-05, TC-NOM-06, TC-NOM-15, TC-NOM-16, TC-NOM-18, TC-ERR-04, TC-ERR-08, TC-ERR-12, TC-ERR-13, TC-ERR-19, TC-ERR-20, TC-NEG-01, TC-NEG-09, TC-NEG-10, TC-NEG-13 Oui Lock, idempotence, quotas, rate-limit, réconciliation, clearing, plafond OTP cumulé.
INV-287-21 CA-287-16, CA-287-24 TC-INV-04, TC-INV-05, TC-NOM-16, TC-ERR-14 Oui Audit synchrone bloquant + async limité à ancrage.
INV-287-22 CA-287-11, CA-287-20 TC-INV-03, TC-NEG-05 Oui Guard inter-module imposé sur routes ciblées.
INV-287-23 CA-287-17 TC-NOM-14 Oui Révocation non rétroactive vérifiée.
INV-287-24 CA-287-26 TC-NOM-11 Oui Mention UX obligatoire côté propriétaire.
INV-287-25 CA-287-01..CA-287-31 TC-INV-13 Oui Couverture contractuelle complète dans le périmètre technique.

Note : - INV-287-14 a été retiré de la spécification (export ZIP reclassé nice-to-have Q-287-06). - La couverture export reste maintenue via CA-287-13, TC-NOM-08, TC-NEG-07 si la feature est activée.

3. Scénarios de test – Flux nominaux

Préconditions communes (obligatoires pour TC-NOM-01..19) : - Horloge test contrôlée en UTC. - Données fixes : owner_A, owner_B, proof_P1 (owner_A), proof_P2 (owner_B). - Boîte email de test déterministe pour OTP. - Journal d’audit vidé en début de scénario. - Paramètres numériques conformes §5.2 (défauts contractuels). - Pour les tests SLO P95 : charge nominale = 1 lien actif, 10 RPS, staging mono-instance.

TEST-ID: TC-NOM-01
Référence spec: F-287-01, CA-287-01, CA-287-02, INV-287-06, INV-287-09

GIVEN
  - owner_A authentifié et propriétaire de proof_P1
  - quotas création non atteints
WHEN
  - owner_A crée un lien sans `ttl_seconds` explicite
THEN
  - lien créé avec `share_state=PENDING_ACTIVATION`
  - `expires_at_utc = created_at_utc + 604800s`
AND
  - audit `LINK_CREATED` append-only présent
TEST-ID: TC-NOM-02
Référence spec: F-287-02, CA-287-03, CA-287-07, CA-287-27, INV-287-04, INV-287-15

GIVEN
  - lien `PENDING_ACTIVATION` valide
  - destinataire sur page d’activation
WHEN
  - destinataire valide un OTP correct
THEN
  - transition `PENDING_ACTIVATION -> ACTIVE`
  - `recipient_session_id` créé
AND
  - information RGPD affichée avant validation OTP et audit `LINK_ACTIVATED` présent
TEST-ID: TC-NOM-03
Référence spec: F-287-02, CA-287-04, INV-287-07

GIVEN
  - lien `PENDING_ACTIVATION`, session OTP neuve
WHEN
  - 5 OTP invalides sont soumis dans la même session
THEN
  - transition `-> OTP_BLOCKED`
  - `otp_blocked_until_utc = now_utc + 900s`
AND
  - aucun accès preuve n’est autorisé pendant le blocage
TEST-ID: TC-NOM-04
Référence spec: F-287-02, CA-287-04, INV-287-07

GIVEN
  - lien `OTP_BLOCKED`, `now_utc >= otp_blocked_until_utc`
WHEN
  - un OTP valide est soumis
THEN
  - transition `OTP_BLOCKED -> ACTIVE`
  - compteur d’essais OTP session réinitialisé
AND
  - audit d’activation append-only présent
TEST-ID: TC-NOM-05
Référence spec: CA-287-05, INV-287-20

GIVEN
  - même lien enchaînant trois épisodes distincts de blocage OTP
WHEN
  - le 3e blocage est atteint
THEN
  - notification propriétaire émise
AND
  - événement de notification traçable (horodaté, corrélé au lien)
TEST-ID: TC-NOM-06
Référence spec: CA-287-06, INV-287-20

GIVEN
  - lien actif en phase OTP, compteur de renvoi à 0 sur fenêtre glissante d’1h
WHEN
  - 4 demandes de renvoi OTP sont soumises dans 60 minutes
THEN
  - les 3 premières sont acceptées, la 4e est rejetée
AND
  - aucun OTP supplémentaire n’est émis après rejet
TEST-ID: TC-NOM-07
Référence spec: F-287-03, CA-287-12, INV-287-02

GIVEN
  - lien `ACTIVE` et session destinataire valide
WHEN
  - consultation de la preuve via le contexte partage
THEN
  - réponse contient document chiffré + `recipient_capsule_encrypted_b64` + `proof_hash_sha256_hex` + `merkle_proof` + `tsa_token` + `anchor_txid`
AND
  - audit `LINK_VIEWED` append-only présent
TEST-ID: TC-NOM-08
Référence spec: F-287-04, CA-287-13, Q-287-06

GIVEN
  - lien `ACTIVE` et session valide
  - `export_zip_enabled=true`
WHEN
  - export composite ZIP est demandé
THEN
  - ZIP contient document, artefacts probatoires, manifeste canonique, signature manifeste ProbatioVault et certificat plateforme
  - `export_zip_sha256_hex` est fourni
AND
  - vérification offline hash + signature réussit sans appel API ProbatioVault
TEST-ID: TC-NOM-09
Référence spec: F-287-05, CA-287-08, INV-287-08

GIVEN
  - lien `ACTIVE` avec session destinataire ouverte
WHEN
  - owner_A révoque le lien
THEN
  - état `REVOKED` atteint
  - toute nouvelle requête destinataire est refusée dans la borne SLA (2s P95)
AND
  - session active est coupée au plus au round-trip suivant et audit `LINK_REVOKED` présent
TEST-ID: TC-NOM-10
Référence spec: F-287-06, CA-287-09, INV-287-09

GIVEN
  - lien non terminal avec `now_utc` juste avant `expires_at_utc`
WHEN
  - `now_utc` atteint `expires_at_utc`
THEN
  - transition automatique vers `EXPIRED`
  - toute nouvelle requête d’accès est refusée (404 générique côté destinataire)
AND
  - audit `LINK_EXPIRED` append-only présent
TEST-ID: TC-NOM-11
Référence spec: F-287-07, CA-287-26, INV-287-24

GIVEN
  - owner_A possède plusieurs liens et historiques
WHEN
  - owner_A consulte l’interface de gestion des partages puis y revient
THEN
  - la mention “pas de DRM” est affichée une seule fois puis mémorisée
  - la mention “révocation = accès futurs seulement” est affichée
AND
  - la vue n’expose aucune agrégation inter-propriétaires
TEST-ID: TC-NOM-12
Référence spec: CA-287-19, INV-287-05

GIVEN
  - deux liens créés pour le même email destinataire
WHEN
  - les artefacts d’identité éphémère de chaque lien sont comparés
THEN
  - clés/certificats éphémères sont différents
AND
  - la compromission d’un lien ne permet pas d’accéder à l’autre
TEST-ID: TC-NOM-13
Référence spec: CA-287-15, INV-287-03

GIVEN
  - hash et localisation de l’original WORM relevés avant partage
WHEN
  - cycle complet exécuté (création, activation, consultation, export si activé, révocation/expiration)
THEN
  - hash original inchangé
  - localisation/original WORM inchangés
AND
  - aucune duplication de l’original n’est observée
TEST-ID: TC-NOM-14
Référence spec: CA-287-16, CA-287-17, INV-287-13, INV-287-23

GIVEN
  - deux liens de test: l’un terminé par révocation, l’autre par expiration
WHEN
  - journal append-only est extrait et vérifié
THEN
  - types `LINK_CREATED`, `LINK_ACTIVATED`, `LINK_VIEWED`, `LINK_EXPORTED` (si activé), `LINK_REVOKED`, `LINK_EXPIRED` présents
  - chaque entrée contient `audit_prev_event_hash_sha256_hex`
  - batch Merkle root ancré périodiquement
AND
  - insertion/suppression/modification d’entrée est rejetée
TEST-ID: TC-NOM-15
Référence spec: CA-287-22, CA-287-23, INV-287-20

GIVEN
  - deux requêtes concurrentes ciblent le même `share_link_id`
  - une clé d’idempotence valide est utilisée
WHEN
  - les requêtes sont émises simultanément puis rejouées
THEN
  - une seule exécution concurrente est acceptée sur le scope verrouillé
  - replay même clé+même payload retourne strictement le même résultat
AND
  - replay même clé+payload différent est refusé
TEST-ID: TC-NOM-16
Référence spec: CA-287-24, INV-287-20, INV-287-21

GIVEN
  - run orphelin simulé sur état non terminal au-delà du seuil `orphan_threshold_seconds`
WHEN
  - worker de réconciliation s’exécute selon son intervalle contractuel
THEN
  - l’état converge vers un état cohérent
  - rattrapage ancrage batch Merkle est appliqué
AND
  - retour HEALTHY seulement après `clearing_success_cycles_required` cycles conformes
TEST-ID: TC-NOM-17
Référence spec: CA-287-25, INV-287-19

GIVEN
  - artefacts crypto temporaires présents avant redémarrage et liens passant en terminal
WHEN
  - démarrage service puis transition vers `REVOKED/EXPIRED`
THEN
  - purge proactive exécutée au démarrage
  - purge post-terminal exécutée dans le SLA de purge
AND
  - aucun artefact temporaire résiduel n’est retrouvé
TEST-ID: TC-NOM-18
Référence spec: F-287-02, CA-287-31, INV-287-20

GIVEN
  - lien soumis à des OTP invalides cumulés sur plusieurs sessions
WHEN
  - `otp_failed_attempts_total` atteint 50
THEN
  - transition définitive `-> REVOKED`
  - notification propriétaire émise
AND
  - aucun nouveau flux destinataire n’est autorisé
TEST-ID: TC-NOM-19
Référence spec: 5.11, CA-287-30, INV-287-15

GIVEN
  - lien terminal depuis plus de 90 jours
WHEN
  - job de rétention est exécuté
THEN
  - données destinataire sont supprimées/anonymisées irréversiblement
  - journal d’audit du lien reste conservé si preuve originale conservée
AND
  - trace de purge technique est disponible

4. Scénarios de test – Cas d’erreur

TEST-ID: TC-ERR-01
Référence spec: ERR-287-01, D-287-01

GIVEN
  - owner_A authentifié
WHEN
  - création de lien avec `proof_id` non UUID v4
THEN
  - réponse 400
  - aucun lien créé
TEST-ID: TC-ERR-02
Référence spec: ERR-287-02, D-287-03

GIVEN
  - owner_A authentifié
WHEN
  - création de lien avec `recipient_email` invalide
THEN
  - réponse 400
  - aucun artefact partagé persistant
TEST-ID: TC-ERR-03
Référence spec: ERR-287-03, D-287-07, CA-287-01

GIVEN
  - owner_A authentifié
WHEN
  - création de lien avec `ttl_seconds` hors bornes
THEN
  - réponse 400
  - aucun enregistrement de lien
TEST-ID: TC-ERR-04
Référence spec: ERR-287-04, CA-287-21

GIVEN
  - quota création atteint (preuve ou compte)
WHEN
  - nouvelle création de lien
THEN
  - réponse 429
  - absence d’effet secondaire de création
TEST-ID: TC-ERR-05
Référence spec: ERR-287-05, CA-287-11, CA-287-18

GIVEN
  - quatre cas: token inconnu, expiré, révoqué, invalide
WHEN
  - appel destinataire sur endpoint de consultation
THEN
  - réponse générique non différenciante (404, enveloppe/message homogènes)
  - aucune fuite d’existence ressource
TEST-ID: TC-ERR-06
Référence spec: ERR-287-06

GIVEN
  - lien en activation, tentatives restantes > 0
WHEN
  - OTP invalide soumis
THEN
  - réponse 404 générique
  - compteur OTP incrémenté exactement de 1
TEST-ID: TC-ERR-07
Référence spec: ERR-287-07

GIVEN
  - lien en activation
WHEN
  - seuil de 5 OTP invalides/session atteint
THEN
  - réponse 429
  - `share_state=OTP_BLOCKED`
TEST-ID: TC-ERR-08
Référence spec: ERR-287-08

GIVEN
  - renvois OTP déjà à la limite horaire
WHEN
  - nouvelle demande de renvoi OTP
THEN
  - réponse 429
  - aucun OTP supplémentaire émis
TEST-ID: TC-ERR-09
Référence spec: ERR-287-09, CA-287-03

GIVEN
  - session destinataire invalide ou expirée par inactivité
WHEN
  - consultation est demandée
THEN
  - réponse 404 générique
  - réauthentification OTP requise côté UX
TEST-ID: TC-ERR-10
Référence spec: ERR-287-10, INV-287-08

GIVEN
  - destinataire connecté sur lien `ACTIVE`
WHEN
  - owner révoque puis destinataire fait la requête suivante
THEN
  - requête refusée (404 générique)
  - coupure observée au plus au round-trip suivant
TEST-ID: TC-ERR-11
Référence spec: ERR-287-11, INV-287-09

GIVEN
  - destinataire connecté, TTL atteint pendant session
WHEN
  - requête suivante est envoyée
THEN
  - requête refusée (404 générique)
  - état final `EXPIRED`
TEST-ID: TC-ERR-12
Référence spec: ERR-287-12, CA-287-22

GIVEN
  - lock distribué non acquis
WHEN
  - traitement concurrent est soumis
THEN
  - réponse 409 `SHARE_BUSY`
  - aucun traitement parallèle sur le scope
TEST-ID: TC-ERR-13
Référence spec: ERR-287-13, CA-287-23

GIVEN
  - clé d’idempotence déjà utilisée
WHEN
  - même clé est rejouée avec payload différent
THEN
  - réponse 409 `IDEMPOTENCY_CONFLICT`
  - résultat initial conservé inchangé
TEST-ID: TC-ERR-14
Référence spec: ERR-287-14, INV-287-13, INV-287-21

GIVEN
  - indisponibilité du journal append-only
WHEN
  - consultation/export est demandé
THEN
  - réponse 503 fail-closed
  - aucun contenu probatoire servi
TEST-ID: TC-ERR-15
Référence spec: ERR-287-15, INV-287-02

GIVEN
  - échec PRE/crypto injecté
WHEN
  - consultation/export est demandé
THEN
  - réponse 503 fail-closed
  - aucune donnée probatoire livrée
TEST-ID: TC-ERR-16
Référence spec: ERR-287-16, INV-287-17, CA-287-29

GIVEN
  - trust-store absent ou incomplet
WHEN
  - vérification certificat requise
THEN
  - réponse 503 fail-closed
  - traitement interrompu
TEST-ID: TC-ERR-17
Référence spec: ERR-287-17

GIVEN
  - export activé et taille estimée > `export_zip_max_size_mb`
WHEN
  - export est lancé
THEN
  - réponse 413
  - aucun ZIP final livré
TEST-ID: TC-ERR-18
Référence spec: ERR-287-18, CA-287-20

GIVEN
  - destinataire authentifié sur session partage
WHEN
  - tentative de création d’un nouveau partage
THEN
  - réponse 403
  - aucun lien créé
TEST-ID: TC-ERR-19
Référence spec: ERR-287-19, CA-287-23

GIVEN
  - clé idempotence expirée (hors fenêtre)
WHEN
  - replay est soumis
THEN
  - réponse 409 `IDEMPOTENCY_WINDOW_EXPIRED`
  - aucun effet de bord
TEST-ID: TC-ERR-20
Référence spec: ERR-287-20, CA-287-31

GIVEN
  - compteur `otp_failed_attempts_total=49`
WHEN
  - OTP invalide supplémentaire est soumis
THEN
  - réponse 429
  - transition immédiate en `REVOKED`
AND
  - notification propriétaire émise

5. Tests d’invariants (non négociables)

Invariant Test(s) dédiés Observable Commentaire
INV-287-01 TC-INV-11, TC-NEG-06 Aucune trace clair du document dans API/log/DB/mémoire (périmètre story) Testable dans le cadre borné défini en spec.
INV-287-02 TC-NOM-07, TC-ERR-15, TC-INV-09 PRE requis pour accès partagé, échec PRE => fail-closed Conforme si aucun chemin alternatif clé claire.
INV-287-03 TC-NOM-13, TC-NR-02 Hash et localisation WORM stables Non-régression obligatoire.
INV-287-04 TC-NOM-02, TC-ERR-09 Nouvelle session sans OTP rejetée Non bearer-link.
INV-287-05 TC-NOM-12 Clés/certs éphémères distincts par lien Compartimentation vérifiée.
INV-287-06 TC-INV-01 État hors enum refusé FSM fermée.
INV-287-07 TC-INV-02 Transition non listée rejetée Pas d’ambiguïté de transition.
INV-287-08 TC-NOM-09, TC-ERR-10 Requêtes post-révocation refusées dans SLA Mesure P95 à 2s sous charge nominale.
INV-287-09 TC-NOM-10, TC-ERR-11 Requêtes post-expiration refusées Coupure effective TTL.
INV-287-10 TC-INV-02, TC-NEG-12 REVOKED/EXPIRED -> * interdit États terminaux stricts.
INV-287-11 TC-ERR-18, TC-NEG-05 Destinataire ne peut créer de partage Non-propagation des droits.
INV-287-12 TC-INV-06, TC-ERR-05 Réponses homogènes en 404 sur cas interdits Anti-enumeration robuste.
INV-287-13 TC-NOM-14, TC-ERR-14, TC-INV-14 Journal append-only + hash-chain + ancrage batch Merkle Fail-closed si audit indisponible.
INV-287-15 TC-INV-12, TC-NOM-19 Données minimisées et rétention J+90 post-terminal appliquée Testable intégralement avec traces de purge.
INV-287-16 TC-INV-08, TC-NEG-06 Aucun secret temporaire en clair en persistance Contrôle DB + logs + dumps.
INV-287-17 TC-INV-07, TC-ERR-16, TC-NEG-08 Trust-store obligatoire et exclusif Aucune option “insecure”.
INV-287-18 TC-INV-09 Suite roundtrip 100% primitives du flux Aucun test crypto “skip”.
INV-287-19 TC-NOM-17, TC-NEG-04 Artefacts temporaires absents après purge Démarrage + post-terminal.
INV-287-20 TC-NOM-05, TC-NOM-06, TC-NOM-15, TC-NOM-16, TC-NOM-18, TC-NEG-01, TC-NEG-09, TC-NEG-10, TC-NEG-13 Lock/idempotence/rate-limit/réconciliation/clearing actifs Obligatoire sans condition.
INV-287-21 TC-INV-04, TC-INV-05, TC-ERR-14, TC-NOM-16 Audit synchrone bloquant et atomicité DB conformes Cohérence fail-closed garantie.
INV-287-22 TC-INV-03, TC-NEG-05 Guard partage imposé sur routes inter-modules listées Pas d’exception de contournement.
INV-287-23 TC-NOM-14 Événements passés immuables après révocation Non-rétroactivité prouvée.
INV-287-24 TC-NOM-11 Mentions UX explicites affichées propriétaire Alignement attente utilisateur.
INV-287-25 TC-INV-13 Audit de couverture INV/CA et classification des réserves Conforme dans le périmètre technique de la story.

6. Tests de non-régression

Test ID Objet Observable Commentaire
TC-NR-01 Régression des endpoints propriétaires hors contexte partage Flux propriétaire standard inchangé Évite effet de bord du guard partage.
TC-NR-02 Stabilité WORM multi-cycles Hash original invariant sur cycles répétés Contrôle longitudinal.
TC-NR-03 Stabilité idempotence Replay identique conserve code/réponse/état Détecte dérive de logique retry-safe.
TC-NR-04 Stabilité format export offline signé (si activé) Manifeste+signature vérifiables sur versions successives Détecte rupture de compatibilité probatoire.
TC-NR-05 Stabilité anti-enumeration Enveloppe 404 de refus inchangée après évolutions Évite fuite progressive d’information.

7. Tests négatifs et adversariaux

Test ID Entrée invalide / abus Résultat attendu Observable
TC-NEG-01 Brute-force OTP multi-session/multi-IP Blocage OTP + rate-limit + refus d’accès États OTP_BLOCKED, réponses 429, audit sécurité.
TC-NEG-02 Fuzz token (share_url_token longueur/charset invalides) Refus générique sans distinction Même enveloppe anti-enumeration (404).
TC-NEG-03 Course revoke vs export Un seul résultat canonique, sans fuite partielle Pas d’état incohérent final.
TC-NEG-04 Tentative de réutilisation artefacts temporaires après crash Accès refusé Artefacts purgés/invalides.
TC-NEG-05 Appel direct routes preuve sans contexte partage ACTIVE+session Refus systématique Guard inter-module appliqué.
TC-NEG-06 Recherche de secrets en clair (DB/logs/traces/mémoire) Aucun secret temporaire trouvé en clair Contrôle sur champs *_envelope*, capsules, clés éphémères, fragments.
TC-NEG-07 ZIP/manifeste/signature/certificat altérés après export Vérification offline échoue Échec hash et/ou signature manifeste.
TC-NEG-08 Certificat forgé avec racine non approuvée Rejet fail-closed Échec trust-store obligatoire (503).
TC-NEG-09 Contournement quotas via rotation preuve/compte/IP Rejets 429 selon granularité contractuelle Compteurs par scope cohérents.
TC-NEG-10 Réemploi clé idempotence avec payload modifié 409 IDEMPOTENCY_CONFLICT Aucun écrasement de résultat initial.
TC-NEG-11 Configuration lock/idempotence/reconciliation hors bornes Rejet configuration Démarrage/validation bloqués.
TC-NEG-12 Mutation sortante depuis état terminal Rejet invariant FSM inchangée (REVOKED/EXPIRED).
TC-NEG-13 Payload rejoué au-delà de la fenêtre idempotence 409 IDEMPOTENCY_WINDOW_EXPIRED Aucun effet de bord tardif.
TC-NEG-14 Fuite d’une clé éphémère d’un lien Isolation maintenue des autres liens Seul le lien compromis est impacté.

8. Observabilité requise pour les tests

  • État système : état du lien, session, compteurs OTP (session + cumulé), timestamps blocage/expiration, verrou distribué, statut réconciliation.
  • Réponse API : code HTTP, enveloppe d’erreur, payload probatoire, Retry-After, identifiants de corrélation.
  • Journal d’audit : événements append-only horodatés, hash événement, audit_prev_event_hash_sha256_hex, ordre immuable.
  • Ancrage audit : Merkle root batch, taille batch, txid blockchain, délai d’ancrage.
  • Export probatoire (si activé) : ZIP, manifeste canonique, signature manifeste, certificat plateforme inclus, hash ZIP, résultat vérification offline.
  • Mesures SLO : latence révocation P95 (2s cible), latence création lien P95, délai purge, délai ancrage audit, protocole charge nominale.
  • Observabilité sécurité : traces de non-exposition clair, rejets trust-store (503), refus anti-enumeration homogènes (404), taux de 429.

9. Règles non testables

Règle Raison Impact
Décision judiciaire finale d’admissibilité Explicitement hors périmètre technique dans la spec Mineur

Complément : - Aucune règle technique incluse dans le périmètre PD-287 n’est marquée non testable après corrections.

10. Verdict QA

  • ✅ Testable intégralement (périmètre technique) : Oui
  • ⚠️ Testable partiellement (avec réserves) : Non
  • ❌ Non testable (refus contractuel) : Non ```