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 ```