Aller au contenu

PD-254 — Scenarios de tests contractuels

1. References

  • Specification : PD-254-specification.md
  • Epic : PD-217 — LEGAL & COMPLIANCE

2. Matrice de couverture

ID Invariant ID Critere ID Test Couverture Commentaire
INV-254-01-integrite-objet CA-03 TC-INV-01 Oui Toute divergence sha3_before/after force KO et rollback.
INV-254-02-merkle CA-04 TC-INV-02 Oui Egalite merkle_root_before/after verifiee objet par objet.
INV-254-03-global-root-hash CA-05 TC-INV-03 Oui hash_global_before == hash_global_after, tri lexicographique hex lowercase.
INV-254-04-blockchain-anchor CA-06 TC-INV-04 Oui Taux de verification ancrage = 100%.
INV-254-05-lisibilite CA-07 TC-INV-05 Oui Controle 3 criteres (I/O, MIME, decodage) + seuil contractuel.
INV-254-06-worm CA-10 TC-INV-06 Oui Violation WORM bloque la campagne, evenement WORM_VIOLATION_BLOCKED.
INV-254-07-rollback CA-11 TC-INV-07 Oui Rollback planifie et mesure <= rollback_target.
INV-254-08-attestation CA-09 TC-INV-08 Oui Attestation HSM produite et archivee apres VERIFIED, inclut protocol_version et manifest_hash.
INV-254-09-reproductibilite CA-12 TC-INV-09 Oui Replay idempotent renvoie verdict et artefacts logiques identiques.
INV-254-10-transitions CA-13 TC-INV-10A Oui Toute transition autorisee/interdite est explicitement testee.
INV-254-10-transitions CA-14 TC-INV-10B Oui Etats terminaux sans transition sortante.
INV-254-12-manifest-integrity CA-16 TC-INV-12 Oui Manifest protege par hash SHA-3 et signature HSM, verifie au postcheck.
N/A CA-01 TC-NOM-01 Oui Protocole Markdown present, sections migration support/provider/region presentes.
N/A CA-02 TC-NOM-02 Oui manifest.json valide contre schema contractuel §5.14.
N/A CA-08 TC-NOM-05 Oui --dry-run execute verifications source/source sans migration effective.
N/A CA-10 TC-NOM-06 Oui Pipeline CI echoue des invariant KO.
N/A CA-12 TC-NOM-07 Oui Lock/idempotence/reconciliation observables et verifiables.
N/A CA-15 TC-NOM-08 Oui Dossier de conformite complet et auditable (manifest + rapports + attestation).
N/A CA-17 TC-TOCTOU-01 Oui Revalidation source_object_count au postcheck.
N/A CA-18 TC-CLR-01 Oui Clearing conditionnel exige N cycles conformes consecutifs.

3. Scenarios de test — Flux nominaux

TEST-ID: TC-NOM-01
Reference spec: CA-01

GIVEN
  - Le depot documentaire de campagne est accessible en lecture
WHEN
  - Le fichier protocole de migration PD-254 est analyse
THEN
  - Le document est present en Markdown
  - Les sections couvrant explicitement migration de support, provider et region sont presentes
AND
  - La version du protocole est lisible et horodatee pour audit
TEST-ID: TC-NOM-02
Reference spec: §5.1, §5.6, §5.14, CA-02

GIVEN
  - Campagne en `DRAFT` avec `migration_id` UUID v4 valide
  - Jeu de donnees source fige sur fenetre de test
WHEN
  - Le precheck genere `manifest.json`
THEN
  - Chaque entree contient `doc_id`, `sha3`, `merkle_root`, `s3_object_key`, `size`, `timestamp`, `tx_hash`
  - Le manifest contient `protocol_version` au format semver
  - Le manifest contient `source_object_count` correspondant au nombre d'objets
  - Tous les champs respectent format, taille, casse et regex contractuels
AND
  - Une validation de schema JSON (§5.14) passe sans avertissement
  - `manifest_hash` et `manifest_signature` sont generes et stockes dans un registre independant
TEST-ID: TC-NOM-03
Reference spec: §5.6, §5.7, INV-254-01..05, INV-254-12, CA-03..07, CA-16

GIVEN
  - Campagne `PRECHECK_RUNNING` avec manifest immuable protege par `manifest_hash` et `manifest_signature`
  - Politique de sampling fixee (seed deterministe ou liste d'objets explicitee)
WHEN
  - Execution precheck puis postcheck sur lot sans alteration
THEN
  - Revalidation du manifest (hash + signature) reussie au debut du postcheck
  - `sha3`, `merkle_root`, `hash_global_before/after` sont egaux
  - Le GRH est calcule par tri lexicographique hex lowercase des merkle_root
  - Taux de verification ancrage blockchain = 100%
  - `readability_sample_count` applique, lisibilite evaluee sur 3 criteres (I/O, MIME, decodage 1024 octets), `pass_rate >= readability_pass_threshold`
AND
  - Transition finale `POSTCHECK_RUNNING -> VERIFIED`
  - Rapport differentiel JSON exploitable CI est produit
TEST-ID: TC-NOM-04
Reference spec: §5.8, INV-254-08, CA-09

GIVEN
  - Campagne en etat `VERIFIED`
  - HSM disponible avec cle de signature provisionnee
WHEN
  - L'etape d'attestation est executee dans le SLA configure
THEN
  - `migration_attestation.json` est genere, signe et valide contre schema §5.14
  - L'attestation contient `protocol_version` et `manifest_hash`
  - La campagne atteint l'etat `ATTESTED`
AND
  - L'attestation est archivee en stockage probatoire
  - Une notification DevOps/TechLead/PO est emise
TEST-ID: TC-NOM-05
Reference spec: §5.9, CA-08

GIVEN
  - Campagne prete a execution
WHEN
  - Execution en mode `--dry-run`
THEN
  - Les etapes F1/F2 et simulation F3 sont executees
  - Le postcheck en dry-run compare le dataset source avec lui-meme (source/source)
  - Aucune operation de migration/copie de donnees n'est declenchee
AND
  - Un verdict readiness `GO` ou `NO_GO` est emis avec code retour CI explicite
TEST-ID: TC-NOM-06
Reference spec: CA-10

GIVEN
  - Pipeline CI avec quality gate bloquant active
  - Un artefact de verification contenant un invariant KO
WHEN
  - Le job de gate est lance
THEN
  - Le job est en etat `failed`
  - La campagne ne peut pas atteindre `CUTOVER_AUTHORIZED`
AND
  - La cause de blocage est tracee dans le rapport CI
TEST-ID: TC-NOM-07
Reference spec: §5.10, CA-12

GIVEN
  - Configuration lock/idempotence/reconciliation valide
WHEN
  - Trois executions sont menees: concurrence, replay idempotent, reprise orphelin
THEN
  - Le lock refuse les lancements concurrents (code metier `CONCURRENT_EXECUTION_DENIED`)
  - Le replay renvoie meme verdict et memes artefacts logiques (verdict, ecarts, hash objets)
  - La reconciliation reprend une phase idempotente ou termine en `RECONCILIATION_FAILED`
AND
  - Les traces contiennent cles techniques (`migration_id`, `phase`, timestamps)
TEST-ID: TC-NOM-08
Reference spec: CA-15

GIVEN
  - Une campagne terminee avec succes (`ATTESTED`)
WHEN
  - Le dossier d'audit est exporte
THEN
  - Le dossier contient `manifest.json`, rapport precheck, rapport postcheck, rapport differentiel, attestation signee
  - Les artefacts sont correlables au `migration_id` unique
  - L'attestation contient `protocol_version` et `manifest_hash`
AND
  - La demonstration de conformite NF Z42-013 §12.1 est possible sur base de preuves objectives

4. Scenarios de test — Cas d'erreur

TEST-ID: TC-ERR-01
Reference spec: ERR-01

GIVEN
  - Manifest avec au moins un champ obligatoire absent
WHEN
  - Le precheck demarre
THEN
  - Rejet immediat avec code metier `INVALID_MANIFEST`
  - Aucune transition d'etat (campagne reste dans son etat courant)
  - Aucune autorisation de cutover
  - Aucun artefact de succes produit
TEST-ID: TC-ERR-02
Reference spec: ERR-02, INV-254-01

GIVEN
  - Campagne en `POSTCHECK_RUNNING`
WHEN
  - Au moins un objet a `sha3_after != sha3_before`
THEN
  - Verdict KO de migration
  - Transition vers `ROLLED_BACK`
  - Rapport differentiel identifie le `doc_id` fautif
TEST-ID: TC-ERR-03
Reference spec: ERR-03, INV-254-02

GIVEN
  - Donnees post-migration avec divergence de `merkle_root`
WHEN
  - Le postcheck compare pre/post
THEN
  - Verdict KO et rollback obligatoire
  - Journal d'audit mentionne mismatch Merkle
  - Aucun passage a `VERIFIED`
TEST-ID: TC-ERR-04
Reference spec: ERR-04, INV-254-04

GIVEN
  - `tx_hash` absent ou invalide pour au moins un objet
WHEN
  - Verification d'ancrage blockchain est executee
THEN
  - Campagne KO
  - Rollback obligatoire
  - Taux de verification ancrage < 100% signale explicitement
TEST-ID: TC-ERR-05
Reference spec: ERR-05, INV-254-05

GIVEN
  - `readability_sample_count` valide
  - Echantillon reproductible predefini
WHEN
  - `readability_sample_pass_rate < readability_pass_threshold`
THEN
  - Campagne KO avec rollback obligatoire
  - Rapport indique seuil attendu, pass_rate observe et delta
  - Aucune bascule autorisee
TEST-ID: TC-ERR-06
Reference spec: ERR-06, §5.10

GIVEN
  - Lock actif `migration:lock:{migration_id}`
WHEN
  - Une seconde execution est lancee sur le meme `migration_id`
THEN
  - Rejet avec code metier `CONCURRENT_EXECUTION_DENIED`
  - Aucune transition d'etat sur la seconde execution
  - Aucun artefact de precheck/postcheck cree pour la seconde execution
TEST-ID: TC-ERR-07
Reference spec: ERR-07, §5.3

GIVEN
  - Job de verification avec timeout configure
WHEN
  - Le traitement depasse `verification_timeout`
THEN
  - Job en echec explicite
  - Campagne entre en phase de reconciliation
  - Aucune attestation n'est generee
TEST-ID: TC-ERR-08
Reference spec: ERR-08, INV-254-08

GIVEN
  - Campagne `VERIFIED`
WHEN
  - Signature HSM indisponible ou `signature_hsm` invalide
THEN
  - Code metier `ATTESTATION_FAILED`
  - Rollback obligatoire ou incident majeur selon politique operationnelle
  - Attestation absente ou marquee invalide
TEST-ID: TC-ERR-09
Reference spec: ERR-09, INV-254-06

GIVEN
  - Objet sous retention WORM non expiree
WHEN
  - Une suppression/alteration est tentee durant la campagne
THEN
  - Operation refusee immediatement
  - Campagne stoppee
  - Evenement securite `WORM_VIOLATION_BLOCKED` emis, trace et horodate
TEST-ID: TC-ERR-10
Reference spec: ERR-10, §5.13

GIVEN
  - Donnee obligatoire inter-module absente (`sha3` ou `merkle_root` ou `tx_hash` ou signature requise)
WHEN
  - Le precheck/postcheck tente la correlation
THEN
  - Campagne KO
  - Correction prealable exigee avant relance
  - Aucune transition vers `CUTOVER_AUTHORIZED`
TEST-ID: TC-ERR-11
Reference spec: ERR-11, INV-254-12

GIVEN
  - Manifest dont le contenu a ete modifie apres le precheck (hash recalcule diverge)
WHEN
  - Le postcheck demarre et verifie `manifest_hash`
THEN
  - Campagne KO immediate
  - Rollback obligatoire
  - Journal d'audit trace la divergence de hash du manifest
TEST-ID: TC-ERR-12
Reference spec: ERR-12, §5.7, CA-17

GIVEN
  - Manifest avec `source_object_count = 1000`
  - 5 objets ajoutes en source entre le precheck et le postcheck
WHEN
  - Le postcheck revalide le nombre d'objets source
THEN
  - `source_object_count` actuel (1005) != enregistre (1000)
  - Campagne KO, code metier `MANIFEST_STALE`
  - Retour a `DRAFT` obligatoire pour relance avec nouveau manifest

5. Tests d'invariants (non negociables)

Invariant Test(s) dedies Observable Commentaire
INV-254-01-integrite-objet TC-INV-01, TC-ERR-02 sha3_before == sha3_after pour 100% des objets Un seul mismatch suffit a rendre la migration KO.
INV-254-02-merkle TC-INV-02, TC-ERR-03 merkle_root_before == merkle_root_after Verification objet par objet, sans tolerance.
INV-254-03-global-root-hash TC-INV-03 hash_global_before == hash_global_after Tri lexicographique hex lowercase. Controle macroscopique complementaire.
INV-254-04-blockchain-anchor TC-INV-04, TC-ERR-04 Verification ancrages a 100% Tout ancrage manquant/incoherent rend KO.
INV-254-05-lisibilite TC-INV-05, TC-ERR-05 pass_rate >= threshold, 3 criteres (I/O, MIME, decodage) Echantillon et seuil contractuels traces.
INV-254-06-worm TC-INV-06, TC-ERR-09 Aucune suppression/alteration WORM, evenement WORM_VIOLATION_BLOCKED Violation = arret immediat + incident securite.
INV-254-07-rollback TC-INV-07 Plan rollback executable avant cutover, delai <= cible Gate de readiness bloquant si non satisfait.
INV-254-08-attestation TC-INV-08, TC-ERR-08 Attestation HSM presente, valide, archivee, inclut protocol_version et manifest_hash Echec d'attestation interdit cloture en succes.
INV-254-09-reproductibilite TC-INV-09 Meme entree => memes artefacts logiques (verdict, ecarts, hash objets) Horloge, seed et dataset figes pour determinisme.
INV-254-10-transitions TC-INV-10A, TC-INV-10B Matrice d'etats respectee, codes metier distincts des etats Etats terminaux strictement fermes.
INV-254-12-manifest-integrity TC-INV-12, TC-ERR-11 manifest_hash et manifest_signature verifient l'integrite du manifest Toute alteration detectee rend campagne KO.
TEST-ID: TC-INV-01
Reference spec: INV-254-01, CA-03

GIVEN
  - Manifest pre-migration et dataset cible alignes
WHEN
  - Controle d'integrite objet est execute
THEN
  - Chaque objet retourne `sha3_before == sha3_after`
AND
  - Le rapport contient une preuve par `doc_id`
TEST-ID: TC-INV-02
Reference spec: INV-254-02, CA-04

GIVEN
  - Manifest pre-migration immuable, protege par `manifest_hash`
WHEN
  - Controle Merkle pre/post est execute
THEN
  - Chaque objet retourne `merkle_root_before == merkle_root_after`
AND
  - Zero divergence dans le rapport postcheck
TEST-ID: TC-INV-03
Reference spec: INV-254-03, CA-05

GIVEN
  - Liste de `merkle_root` pre et post connue
WHEN
  - Les `merkle_root` sont tries par ordre lexicographique hex lowercase
  - Calcul `SHA3-256(concat_triee(merkle_root))` est execute des deux cotes
THEN
  - Les deux GRH sont strictement egaux
AND
  - La valeur calculee est tracee dans les artefacts
  - L'ordre de tri applique est lexicographique sur chaine hex lowercase
TEST-ID: TC-INV-04
Reference spec: INV-254-04, CA-06

GIVEN
  - Lot de N objets avec N `tx_hash` de reference
WHEN
  - Verification d'ancrage est executee sur 100% du lot
THEN
  - Taux de verification = `N/N` et toutes preuves sont coherentes
AND
  - Aucun objet n'est marque `anchor_unverified`
TEST-ID: TC-INV-05
Reference spec: INV-254-05, CA-07

GIVEN
  - `readability_sample_count` et `readability_pass_threshold` configures dans bornes
WHEN
  - Controle de lisibilite est execute sur l'echantillon contractuel
THEN
  - Chaque objet est evalue sur les 3 criteres : (a) ouverture sans erreur I/O, (b) type MIME detecte == type MIME enregistre, (c) 1024 premiers octets decodables
  - `sample_count` observe correspond a la valeur appliquee (ou clamp max trace)
  - `pass_rate >= threshold`
AND
  - Les objets en echec lisibilite sont listes avec le critere en echec identifie
TEST-ID: TC-INV-06
Reference spec: INV-254-06

GIVEN
  - Objet WORM non expire present dans le perimetre
WHEN
  - Une action de suppression ou d'alteration est requise par erreur
THEN
  - L'action est rejetee sans effet secondaire sur l'objet
AND
  - Evenement securite `WORM_VIOLATION_BLOCKED` est consigne et horodate
TEST-ID: TC-INV-07
Reference spec: INV-254-07, CA-11

GIVEN
  - Runbook rollback declare avant cutover
WHEN
  - Exercice de rollback est execute en conditions controlees
THEN
  - Execution complete sans etape manquante
  - Duree observee <= `rollback_target` (P95)
AND
  - Preuve de mesure horodatee archivee
TEST-ID: TC-INV-08
Reference spec: INV-254-08, CA-09

GIVEN
  - Campagne en `VERIFIED` avec tous invariants valides
WHEN
  - Generation + signature + archivage attestation
THEN
  - Signature HSM valide et attestation archivee
  - Attestation contient `protocol_version` et `manifest_hash`
  - Attestation valide contre schema JSON §5.14
  - Transition `VERIFIED -> ATTESTED` effective
AND
  - Notification de verdict envoyee
TEST-ID: TC-INV-09
Reference spec: INV-254-09, §5.10 idempotence

GIVEN
  - Meme dataset, memes parametres, meme version protocole
  - Horloge et source d'alea controlees
WHEN
  - Deux executions independantes sont lancees
THEN
  - Verdict final identique (`GO/NO_GO` et etat final)
  - Artefacts logiques equivalents (verdict, ecarts, hash objets — hors timestamps et metadonnees d'execution)
AND
  - Aucune divergence non expliquee n'apparait dans les rapports
TEST-ID: TC-INV-10A
Reference spec: INV-254-10, CA-13

GIVEN
  - Matrice d'etats contractuelle chargee (10 etats formels + 5 codes metier)
WHEN
  - Chaque transition autorisee et interdite est sollicitee une fois
THEN
  - Toutes transitions autorisees passent
  - Toutes transitions interdites sont rejetees explicitement
  - Les codes metier (`INVALID_INPUT`, `INVALID_MANIFEST`, `CONCURRENT_EXECUTION_DENIED`, `ATTESTATION_FAILED`, `PRECHECK_EXPIRED`) ne creent aucune transition d'etat
AND
  - Aucun chemin implicite n'est accepte
TEST-ID: TC-INV-10B
Reference spec: INV-254-10, CA-14

GIVEN
  - Campagnes en etats `ATTESTED`, `ROLLED_BACK`, `RECONCILIATION_FAILED`
WHEN
  - Une transition sortante est demandee pour chacun
THEN
  - Rejet systematique
AND
  - Etat inchange + trace d'audit de refus
TEST-ID: TC-INV-12
Reference spec: INV-254-12, CA-16

GIVEN
  - Manifest genere au precheck avec `manifest_hash` (SHA3-256) et `manifest_signature` (HSM) stockes dans un registre independant
WHEN
  - Le postcheck charge le manifest et recalcule son hash
THEN
  - Le hash recalcule correspond a `manifest_hash` stocke
  - La `manifest_signature` est verifiee valide via HSM
AND
  - Si divergence de hash ou signature invalide -> campagne KO immediate

6. Tests de non-regression

Test ID Objet Observable Commentaire
TC-NR-01 Flux archivage probatoire existant Aucun changement de contrat sur les artefacts hors migration Verifie absence d'effet de bord sur les campagnes non PD-254.
TC-NR-02 Performance CI sur bornes nominales Job de verification reste dans verification_timeout en charge de reference Verifie ajout de controles sans regression majeure de delai.
TC-NR-03 Compatibilite modules tiers (Merkle, blockchain, HSM) Interfaces de donnees obligatoires inchangees Evite rupture cross-module lors de l'adoption PD-254.
TC-NR-04 Contraintes WORM preexistantes (PD-44) Comportement identique avant/apres activation protocole Verifie non-regression reglementaire.
TC-NR-05 Pipeline quality gate existant Blocage/notification toujours declenches selon regles historiques Verifie integration CI/CD sans regression d'observabilite.

7. Tests negatifs et adversariaux

Test ID Entree invalide / abus Resultat attendu Observable
TC-NEG-01 migration_id non UUID v4 ou casse non normalisee Rejet, code metier INVALID_INPUT, aucune transition Aucune creation de campagne, log de validation.
TC-NEG-02 doc_id invalide dans manifest Objet INVALID_METADATA puis migration KO si >0 Rapport precheck avec compteur objets invalides.
TC-NEG-03 sha3 ou merkle_root en uppercase / longueur invalide Objet KO, migration KO Erreurs regex/casse explicites par champ.
TC-NEG-04 tx_hash sans prefixe 0x ou longueur != 66 KO ancrage et migration KO Rapport ancrage liste objets rejetes.
TC-NEG-05 readability_sample_count hors bornes (<100 ou >10000) Clamp max trace ou rejet selon regle de borne Trace de normalisation/rejet dans rapport.
TC-NEG-06 4 lancements/heure par meme initiateur 4e lancement rejete (rate limit) Compteur quota + code de rejet explicite.
TC-NEG-07 Rejeu d'une meme phase avec meme cle d'idempotence Meme verdict et memes artefacts logiques (verdict, ecarts, hash objets) Aucun doublon d'artefact metier.
TC-NEG-08 Injection d'orphelin (last_activity > orphan_threshold) Reprise idempotente ou RECONCILIATION_FAILED Evenement reconciliation horodate.
TC-NEG-09 Tentative de transition interdite (PRECHECK_FAILED -> CUTOVER_AUTHORIZED) Rejet explicite Etat inchange + audit de refus.
TC-NEG-10 protocol_version absent ou format invalide (ex: v1.0, 1.0) Rejet campagne Validation regex semver ^\d+\.\d+\.\d+$.
TC-NEG-11 Manifest avec manifest_hash falsifie (hash valide en format mais ne correspondant pas au contenu) Campagne KO immediate au postcheck Hash recalcule diverge du hash stocke.

8. Tests specifiques (corrections Gate 3)

TEST-ID: TC-CLR-01
Reference spec: §5.10 clearing conditionnel, CA-18

GIVEN
  - Campagne en reconciliation avec compteur de cycles conformes a zero
  - `clearing_cycles` configure a 3
WHEN
  - 1 cycle de reconciliation conforme est execute
THEN
  - Clearing refuse, compteur = 1

WHEN
  - 1 cycle de reconciliation non conforme est execute
THEN
  - Clearing refuse, compteur remis a 0

WHEN
  - 3 cycles de reconciliation conformes consecutifs sont executes
THEN
  - Clearing autorise, retour a statut operationnel normal
  - Compteur persiste par `migration_id`
TEST-ID: TC-TOCTOU-01
Reference spec: §5.7 etape 3, ERR-12, CA-17

GIVEN
  - Manifest genere au precheck avec `source_object_count = 500`
  - 2 objets ajoutes en source apres le precheck
WHEN
  - Le postcheck revalide le nombre d'objets source
THEN
  - Nombre actuel (502) != enregistre (500)
  - Campagne KO, code metier `MANIFEST_STALE`
  - Retour a `DRAFT` pour relance avec nouveau manifest
TEST-ID: TC-GRH-SORT-01
Reference spec: §3, §5.1, INV-254-03

GIVEN
  - 3 objets avec merkle_root :
    - objet A : `ff00aabb...` (64 chars hex)
    - objet B : `0a1b2c3d...` (64 chars hex)
    - objet C : `0a2c3d4e...` (64 chars hex)
WHEN
  - Le GRH est calcule
THEN
  - L'ordre de concatenation est B, C, A (tri lexicographique hex lowercase)
  - Le GRH = SHA3-256("0a1b2c3d..." + "0a2c3d4e..." + "ff00aabb...")
AND
  - Le meme calcul post-migration produit un GRH identique si les merkle_root sont identiques
TEST-ID: TC-LISIB-01
Reference spec: §3, INV-254-05

GIVEN
  - Echantillon de 5 objets :
    - objet 1 : fichier accessible, MIME OK, decodage OK
    - objet 2 : fichier inaccessible (erreur I/O)
    - objet 3 : fichier accessible, MIME detecte != MIME enregistre
    - objet 4 : fichier accessible, MIME OK, 1024 premiers octets non decodables
    - objet 5 : fichier accessible, MIME OK, decodage OK
WHEN
  - Le controle de lisibilite est execute
THEN
  - Objets 1 et 5 : lisibles
  - Objet 2 : non lisible (critere a)
  - Objet 3 : non lisible (critere b)
  - Objet 4 : non lisible (critere c)
  - `pass_rate = 0.4000` (2/5)
AND
  - Le rapport identifie le critere en echec pour chaque objet non lisible
TEST-ID: TC-CODES-METIER-01
Reference spec: §3, §5.2

GIVEN
  - Campagne en etat `DRAFT`
WHEN
  - Un `migration_id` invalide est soumis (non UUID v4)
THEN
  - Code metier `INVALID_INPUT` retourne
  - La campagne reste en etat `DRAFT` (aucune transition)
AND
  - Le code metier est distinct d'un etat de la machine d'etats formelle

9. Observabilite requise pour les tests

  • Etat systeme : etat de campagne (DRAFT a ATTESTED/ROLLED_BACK/RECONCILIATION_FAILED), timestamps d'entree/sortie d'etape, compteur de cycles reconciliation, compteur clearing conditionnel.
  • Reponse API : code de statut, code metier (INVALID_INPUT, INVALID_MANIFEST, CONCURRENT_EXECUTION_DENIED, ATTESTATION_FAILED, PRECHECK_EXPIRED, MANIFEST_STALE), payload correle au migration_id.
  • Journal d'audit : acteur (initiateur — service account ou utilisateur authentifie), action, transition demandee, transition effective/refusee, motif, horodatage UTC RFC3339, hash de correlation.
  • Evenement signe / horodate : preuves de verification (hash_global_before/after, resultat ancrage, pass_rate lisibilite avec criteres detailles), notification gate CI, evenements securite WORM_VIOLATION_BLOCKED.
  • Export probatoire : manifest.json avec manifest_hash et manifest_signature, rapports pre/post/diff, attestation signee HSM (incluant protocol_version et manifest_hash), journal de gate CI, preuves d'archivage et d'integrite.
  • Schema validation : manifest.json et migration_attestation.json valides contre schemas JSON §5.14.

10. Regles non testables

Regle Raison Impact
Politique officielle de sampling lisibilite (Q-04) La specification impose un echantillon mais ne fige pas la methode (uniforme vs stratifiee), ce qui peut changer les resultats Majeur
Mapping normatif des codes retour CI (Q-06) Le besoin exige un code retour explicite sans table contractuelle des valeurs attendues Majeur
Endpoint/politique de disponibilite du registre blockchain (Q-03) Verification d'ancrage depend d'un referentiel externe non contractuellement fixe Majeur
Localisation d'archivage attestation cible (Q-07) Le principe d'archivage est testable, mais la destination probatoire contractuelle n'est pas definie Mineur
Exigence de co-signature attestation (Q-08) Signature HSM requise, mais la necessite d'une double signature reste indeterminee Mineur

11. Verdict QA

  • Testable partiellement (avec reserves listees)

Reserve principale : les invariants, transitions et erreurs sont objectivement testables et automatisables, mais la conformite contractuelle stricte reste partielle tant que les points Q-03/Q-04/Q-06 ne sont pas figes, car ils conditionnent la reproductibilite et l'interpretation uniforme des verdicts.