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.