PD-299 — Scénarios de tests contractuels
1. Références
- Spécification : PD-299-specification.md
- Epic : EPIC-XX
2. Matrice de couverture
| ID Invariant | ID Critère | ID Test | Couverture | Commentaire |
| INV-299-01 | CA-299-01 | TC-NOM-01, TC-NR-01 | Oui | Vérifie exactement 45 tests contractuels sharing. |
| INV-299-02 | CA-299-02 | TC-NOM-02, TC-NR-01 | Oui | Vérifie la couverture src/sharing/ dans [80,100]. |
| INV-299-03 | CA-299-03 | TC-NOM-03, TC-ERR-02, TC-NEG-06 | Oui | CTA visible uniquement si propriétaire valide. |
| INV-299-04 | CA-299-04 | TC-NOM-04, TC-ERR-03, TC-ERR-04, TC-NEG-02 | Oui | Header Authorization requis et valide, regex durcie sans CR/LF. |
| INV-299-05 | CA-299-05 | TC-NOM-05, TC-ERR-05, TC-NEG-01 | Oui | Allowlist metadata stricte, rejet hors schéma. |
| INV-299-06 | CA-299-06 | TC-NOM-06, TC-ERR-06, TC-NEG-03 | Oui | Fallback maskIp exact et fail-closed. |
| INV-299-07 | CA-299-07 | TC-NOM-07, TC-ERR-07 | Oui | Blocage hors ligne sur toutes actions sharing. |
| INV-299-08 | CA-299-08 | TC-NOM-08, TC-ERR-02 | Oui | useProofShares jamais appelé avec proof_id vide/undefined. |
| INV-299-09 | CA-299-16 | TC-NOM-18, TC-ERR-12 | Oui | Validation A8 uniquement si preuve PO+LEGAL signée, horodatée, traçable Jira. |
| INV-299-10 | CA-299-09 | TC-NOM-09, TC-ERR-09 | Oui | Exécution de 6c.bis après 6c avec traçabilité. |
| INV-299-11 | CA-299-09 | TC-NOM-10, TC-ERR-09 | Oui | Blocage step 7 si point cross-module manquant. |
| INV-299-12 | CA-299-10 | TC-NOM-11, TC-ERR-08, TC-NR-03, TC-NEG-09 | Oui | Cap Gate 8 forcé à 6.0 exact, comptage sur *.{test,spec}.{ts,tsx}. |
| INV-299-13 | CA-299-11 | TC-NOM-12, TC-ERR-08, TC-NR-03 | Oui | Transition forcée CHECKING -> NON_CONFORME, même si moyenne >= 7. |
| INV-299-14 | CA-299-12 | TC-NOM-13, TC-ERR-11, TC-NR-04 | Oui | Prompt companion enrichi depuis source canonique avec source_story_id. |
| INV-299-15 | CA-299-13 | TC-NOM-14, TC-NR-06 | Oui | Présence de la règle telemetry dans learnings universels. |
| INV-299-16 | CA-299-14 | TC-NOM-15, TC-NR-06 | Oui | Bloc obligatoire 6a “Données résolues” présent et traçable. |
| INV-299-17 | CA-299-15 | TC-NOM-16, TC-NOM-17, TC-ERR-10, TC-ERR-15, TC-NR-05 | Oui | Détection plan→spec bloque UNRATIFIED et rejette kind invalide explicitement. |
| INV-299-18 | — | TC-NOM-19, TC-NOM-20, TC-NOM-21, TC-ERR-14, TC-NR-07, TC-NR-08 | Oui | FSM Gate 8 fermée, scope explicite, réévaluation séquentielle non atomique. |
3. Scénarios de test – Flux nominaux
TEST-ID: TC-NOM-01
Référence spec: F-299-01, INV-299-01, CA-299-01
GIVEN
- Révision candidate figée
- Module cible: src/sharing/
- Référentiel PD-298-tests figé
WHEN
- Le contrôle contractuel de présence des tests sharing est exécuté
THEN
- Le nombre de cas de test contractuels détectés est exactement 45
AND
- Aucun cas manquant et aucun cas additionnel hors référentiel n’est détecté
TEST-ID: TC-NOM-02
Référence spec: F-299-01, INV-299-02, CA-299-02
GIVEN
- Révision candidate figée
- Scope coverage limité à src/sharing/
WHEN
- Le calcul de couverture du module sharing est exécuté
THEN
- La couverture mesurée est >= 80%
AND
- La couverture mesurée est <= 100%
TEST-ID: TC-NOM-03
Référence spec: F-299-02, INV-299-03, CA-299-03, D-299-05
GIVEN
- Cas A: ownerUserId == currentUser.id (UUID v4 valides)
- Cas B: ownerUserId != currentUser.id
WHEN
- L’écran preuve est rendu
THEN
- Cas A: le CTA “Partager” est visible
- Cas B: le CTA “Partager” est absent
AND
- Aucun fallback permissif ne rend le CTA visible en Cas B
TEST-ID: TC-NOM-04
Référence spec: F-299-03, INV-299-04, CA-299-04, D-299-06, D-299-07
GIVEN
- auth_access_token valide (sans espace)
- Action sharing déclenchée (create/revoke/list/detail/events)
WHEN
- La requête réseau sharing est préparée puis émise
THEN
- Le header Authorization respecte ^Bearer [ ]+[!-~]+$
AND
- La valeur du token du header correspond exactement au token d’auth courant
TEST-ID: TC-NOM-05
Référence spec: F-299-04, INV-299-05, D-299-08, D-299-09
GIVEN
- telemetry_action valide (ex: share_create)
- telemetry_metadata = {}
WHEN
- logShareEvent est invoqué
THEN
- L’événement est accepté
AND
- Le payload logué ne contient aucune clé hors allowlist
TEST-ID: TC-NOM-06
Référence spec: F-299-05, INV-299-06, CA-299-06, D-299-10, D-299-11
GIVEN
- ip_input invalide déterministe: "999.999.999.999"
WHEN
- maskIp(ip_input) est exécuté
THEN
- La sortie vaut exactement "IP masquée indisponible"
AND
- La sortie ne contient aucun fragment de l’entrée brute
TEST-ID: TC-NOM-07
Référence spec: F-299-06, INV-299-07, CA-299-07, D-299-12
GIVEN
- netinfo_is_connected=false
WHEN
- L’utilisateur tente create/revoke/load sharing
THEN
- L’action est refusée avec message explicite
AND
- Aucun appel API sharing n’est émis
TEST-ID: TC-NOM-08
Référence spec: INV-299-08, CA-299-08, D-299-13
GIVEN
- Cas A: proof_id UUID v4 valide
- Cas B: proof_id undefined
WHEN
- L’écran détail sharing est initialisé
THEN
- Cas A: useProofShares est invoqué avec un proof_id valide
- Cas B: useProofShares n’est pas invoqué
AND
- Cas B produit un rejet explicite de l’action
TEST-ID: TC-NOM-09
Référence spec: F-299-07, INV-299-10, D-299-16, D-299-17, D-299-22
GIVEN
- Plan contenant 2 cross_module_point_path valides
- Diff contenant les 2 chemins exacts
WHEN
- /gov-impl exécute step 6c puis 6c.bis
THEN
- Step 7 est autorisé
AND
- Le journal d’audit trace l’ordre 6c puis 6c.bis avec correlation_id valide
TEST-ID: TC-NOM-10
Référence spec: F-299-07, INV-299-11, CA-299-09, ERR-299-09
GIVEN
- Plan contenant 2 cross_module_point_path valides
- Diff ne contenant qu’un seul chemin
WHEN
- 6c.bis compare plan vs diff
THEN
- La transition vers step 7 est refusée
AND
- Le motif de blocage mentionne explicitement le chemin manquant
TEST-ID: TC-NOM-11
Référence spec: F-299-08, INV-299-12, CA-299-10, D-299-14, D-299-15
GIVEN
- Gate 8 en état CHECKING
- project_code=app
- test_file_count=0 (comptage sur glob *.{test,spec}.{ts,tsx})
- Cas A: raw test_coverage_score=8.7
- Cas B: raw test_coverage_score=4.2
WHEN
- Le pré-verdict Gate 8 est exécuté
THEN
- Cas A: test_coverage_score final est exactement 6.0
- Cas B: test_coverage_score final est exactement 6.0
AND
- Le rapport de scoring mentionne le forçage exact cap zéro test (pas de min)
TEST-ID: TC-NOM-12
Référence spec: F-299-08, INV-299-13, CA-299-11, §5.4
GIVEN
- Conditions de zéro test satisfaites (INV-299-12)
- La moyenne arithmétique des autres critères est >= 7.0
WHEN
- La transition FSM est évaluée
THEN
- La transition appliquée est CHECKING -> NON_CONFORME
AND
- Aucune transition CHECKING -> GO ou CHECKING -> RESERVE n’est autorisée
TEST-ID: TC-NOM-13
Référence spec: F-299-09, INV-299-14, CA-299-12, D-299-18, D-299-19
GIVEN
- companion_story_id valide
- Fichier source canonique <story_source_id>-specification.md disponible
- Sections "## 4. Invariants" et "## Arbitrages — Vérification formelle post-step 1" présentes
WHEN
- assemble-prompt construit le reviewer prompt
THEN
- Le bloc stable inclut arbitrages PO et invariants source
- Le bloc inclut source_story_id traçable
AND
- L’addition de contexte companion est <= 2 KiB
TEST-ID: TC-NOM-14
Référence spec: INV-299-15, CA-299-13
GIVEN
- Fichier learnings-universal.md disponible
WHEN
- Le contrôle documentaire telemetry est exécuté
THEN
- La règle "allowlist Zod stricte" est présente
AND
- Une interdiction explicite de "Record<string, unknown>" est détectée
TEST-ID: TC-NOM-15
Référence spec: INV-299-16, CA-299-14
GIVEN
- Template "6a Decomposition.md" disponible
WHEN
- Le contrôle de sections obligatoires est exécuté
THEN
- Le bloc "Données résolues (pré-implémentation)" est présent
AND
- Le bloc contient un champ de source humaine explicite
TEST-ID: TC-NOM-16
Référence spec: F-299-10, INV-299-17, CA-299-15, D-299-20
GIVEN
- detect-plan-extensions retourne >=1 item UNRATIFIED
- Tous les items ont kind valide ∈ {endpoint,header,timeout}
WHEN
- /gov-check-plan phase 4 est exécuté
THEN
- Gate 5 est bloquée
AND
- Une ratification PO est exigée dans le motif de blocage
TEST-ID: TC-NOM-17
Référence spec: F-299-10, INV-299-17, D-299-20
GIVEN
- detect-plan-extensions retourne uniquement des items RATIFIED
- Tous les kinds sont valides
WHEN
- /gov-check-plan phase 4 est exécuté
THEN
- Gate 5 est autorisée
AND
- Le rapport indique 0 extension UNRATIFIED
TEST-ID: TC-NOM-18
Référence spec: F-299-11, INV-299-09, CA-299-16, D-299-21
GIVEN
- legal_validation_entry contient ARB-7, ARB-8, RGPD-90J
- Pour chaque text_id: approvals.PO et approvals.LEGAL présents
- Chaque approval contient approver_id (email ou Jira username), approved_at ISO8601, jira_comment_id
WHEN
- La validation de clôture A8 est exécutée
THEN
- A8 est marquée conforme
AND
- L’artefact probatoire relie text_id, approver_id, rôles, timestamps et jira_comment_id
TEST-ID: TC-NOM-19
Référence spec: INV-299-18, §5.4 (FSM Gate 8)
GIVEN
- FSM Gate 8 initialisée dans chacun des états non terminaux
WHEN
- Chaque transition explicitement AUTORISÉE en §5.4 est demandée
THEN
- Chaque transition autorisée est acceptée vers l’état attendu
AND
- Chaque changement d’état est journalisé avec timestamp et raison
TEST-ID: TC-NOM-20
Référence spec: INV-299-18, §5.4 (États terminaux Gate 8)
GIVEN
- FSM Gate 8 en état GO, puis RESERVE, puis ESCALADE
WHEN
- Une transition sortante quelconque est demandée
THEN
- La transition est rejetée dans les 3 cas
AND
- L’état reste inchangé (état terminal)
TEST-ID: TC-NOM-21
Référence spec: INV-299-18, §5.4 (Comportement NON_CONFORME -> PENDING)
GIVEN
- FSM Gate 8 en état NON_CONFORME
- Re-gate demandé (transition NON_CONFORME -> PENDING)
- Échec sur le premier check séquentiel (zéro-test)
- Les autres critères arithmétiques seraient compatibles GO
WHEN
- La réévaluation est exécutée
THEN
- L’ordre PENDING -> CHECKING puis check zéro-test est respecté
AND
- Le premier échec maintient NON_CONFORME sans validation atomique globale
4. Scénarios de test – Cas d’erreur
TEST-ID: TC-ERR-01
Référence spec: ERR-299-01, D-299-01
GIVEN
- story_id invalide: "pd-299"
WHEN
- Le traitement est soumis
THEN
- Rejet immédiat du traitement
AND
- Aucun effet secondaire (pas de transition, pas d’écriture)
TEST-ID: TC-ERR-02
Référence spec: ERR-299-02, D-299-03, D-299-13, INV-299-03, INV-299-08
GIVEN
- proof_id absent ou invalide
WHEN
- L’écran preuve/sharing est chargé
THEN
- CTA partage absent ou action rejetée
AND
- Aucun appel hook/API avec proof_id vide/undefined
TEST-ID: TC-ERR-03
Référence spec: ERR-299-03, D-299-06, INV-299-04
GIVEN
- auth_access_token absent ou invalide
WHEN
- Une action sharing est demandée
THEN
- L’appel est annulé
AND
- Une erreur d’auth explicite est exposée
TEST-ID: TC-ERR-04
Référence spec: ERR-299-04, D-299-07, INV-299-04
GIVEN
- authorization_header invalide (ex: "Bearer
X-Test:1")
WHEN
- Une requête sharing est préparée
THEN
- La requête n’est pas émise
AND
- Le rejet est tracé avec motif "authorization_header invalid"
TEST-ID: TC-ERR-05
Référence spec: ERR-299-05, D-299-09, INV-299-05, CA-299-05
GIVEN
- telemetry_metadata = {"recipientEmail":"x@example.com"}
WHEN
- logShareEvent est invoqué
THEN
- Une erreur de validation (Zod) est levée
AND
- Aucun événement telemetry n’est logué
TEST-ID: TC-ERR-06
Référence spec: ERR-299-06, D-299-10, D-299-11, INV-299-06
GIVEN
- ip_input invalide: "invalid_ip"
WHEN
- maskIp est exécuté
THEN
- Retour exact "IP masquée indisponible"
AND
- Aucune restitution d’IP brute
TEST-ID: TC-ERR-07
Référence spec: ERR-299-07, D-299-12, INV-299-07
GIVEN
- netinfo_is_connected=null
WHEN
- Une action sharing est déclenchée
THEN
- Action bloquée avec message explicite
AND
- Zéro appel sortant sharing
TEST-ID: TC-ERR-08
Référence spec: ERR-299-08, D-299-14, D-299-15, INV-299-12, INV-299-13
GIVEN
- project_code=backend
- test_file_count=0 (glob *.{test,spec}.{ts,tsx})
- raw test_coverage_score=2.3
WHEN
- Gate 8 CHECKING est exécuté
THEN
- test_coverage est forcé à 6.0
- Transition CHECKING -> NON_CONFORME appliquée
AND
- Aucun verdict GO/RESERVE n’est possible
TEST-ID: TC-ERR-09
Référence spec: ERR-299-09, D-299-16, D-299-17, INV-299-11
GIVEN
- Au moins un cross_module_point_path absent du git diff
WHEN
- Contrôle 6c.bis est exécuté
THEN
- Step 7 est bloqué
AND
- Le rapport liste précisément les points manquants
TEST-ID: TC-ERR-10
Référence spec: ERR-299-10, D-299-20, INV-299-17
GIVEN
- extension_items contient au moins un status=UNRATIFIED
- Tous les kinds sont valides
WHEN
- /gov-check-plan phase 4 s’exécute
THEN
- Gate 5 est bloquée
AND
- La sortie exige explicitement une ratification PO
TEST-ID: TC-ERR-11
Référence spec: ERR-299-11, D-299-18, D-299-19, INV-299-14
GIVEN
- story companion déclarée sans source canonique exploitable
- Sections source invariants/arbitrages absentes
WHEN
- Construction du reviewer prompt
THEN
- Prompt companion rejeté
AND
- Motif de rejet: source companion indisponible/incomplète
TEST-ID: TC-ERR-12
Référence spec: ERR-299-12, D-299-21, INV-299-09
GIVEN
- Artefact A8 incomplet (text_id manquant, ou approval PO/LEGAL manquante, ou approver_id/approved_at/jira_comment_id manquant)
WHEN
- Vérification de clôture A8
THEN
- A8 non validé
AND
- Le rapport indique précisément les entrées manquantes
TEST-ID: TC-ERR-13
Référence spec: ERR-299-13, F-299-08
GIVEN
- project_code=ia-governance
- test_file_count=0
WHEN
- Gate 8 CHECKING est exécuté
THEN
- La règle cap zéro-test (6.0) n’est pas appliquée
AND
- Le verdict suit uniquement le scoring arithmétique standard
TEST-ID: TC-ERR-14
Référence spec: ERR-299-14, INV-299-18, §5.4
GIVEN
- FSM Gate 8 dans un état quelconque
WHEN
- Une transition non listée en §5.4 est demandée
THEN
- La transition est rejetée
AND
- L’état courant reste inchangé
TEST-ID: TC-ERR-15
Référence spec: ERR-299-15, D-299-20, INV-299-17
GIVEN
- plan_extension_item.kind="cookie" (hors enum)
WHEN
- Validation de sortie de detect-plan-extensions
THEN
- Le check est rejeté explicitement
AND
- Gate 5 est bloquée avec erreur "invalid plan_extension_item.kind"
5. Tests d’invariants (non négociables)
| Invariant | Test(s) dédiés | Observable | Commentaire |
| INV-299-01 | TC-NOM-01, TC-NR-01 | count(test_cases)=45 | Seuil exact, pas de tolérance. |
| INV-299-02 | TC-NOM-02, TC-NR-01 | coverage(src/sharing/)>=80 | Bornes contractuelles contrôlées. |
| INV-299-03 | TC-NOM-03, TC-ERR-02 | Visibilité CTA conditionnée à D-299-05 | Black-box UI déterministe. |
| INV-299-04 | TC-NOM-04, TC-ERR-03, TC-ERR-04 | Header Authorization présent/valide | Contrôle réseau strict sans CR/LF. |
| INV-299-05 | TC-NOM-05, TC-ERR-05 | Rejet Zod hors allowlist | Zéro PII en telemetry. |
| INV-299-06 | TC-NOM-06, TC-ERR-06 | Retour exact D-299-11 | Assertion stricte de chaîne. |
| INV-299-07 | TC-NOM-07, TC-ERR-07 | Blocage offline + message | Vérifie fail-closed. |
| INV-299-08 | TC-NOM-08, TC-ERR-02 | Absence de useProofShares(undefined) | Traces d’appel hook. |
| INV-299-09 | TC-NOM-18, TC-ERR-12 | Preuve PO+LEGAL signée et traçable Jira | Validation A8 objectivable. |
| INV-299-10 | TC-NOM-09 | 6c.bis exécuté après 6c | Ordre de contrôles auditables. |
| INV-299-11 | TC-NOM-10, TC-ERR-09 | Step 7 bloqué si fichier manquant | Tolérance = 0. |
| INV-299-12 | TC-NOM-11, TC-ERR-08, TC-NEG-09 | test_coverage=6.0 forcé exactement | Règle déterministe app/backend avec glob de comptage explicite. |
| INV-299-13 | TC-NOM-12, TC-ERR-08 | CHECKING->NON_CONFORME forcé | Empêche bypass GO/RESERVE même si moyenne >=7. |
| INV-299-14 | TC-NOM-13, TC-ERR-11 | Bloc source canonique companion présent | Vérifie présence, sections et traçabilité source_story_id. |
| INV-299-15 | TC-NOM-14, TC-NR-06 | Règle telemetry détectable | Contrôle documentaire obligatoire. |
| INV-299-16 | TC-NOM-15, TC-NR-06 | Bloc 6a “Données résolues” présent | Traçabilité source humaine. |
| INV-299-17 | TC-NOM-16, TC-NOM-17, TC-ERR-10, TC-ERR-15 | Blocage Gate 5 si UNRATIFIED ou kind invalide | Ratification PO requise, rejet explicite. |
| INV-299-18 | TC-NOM-19, TC-NOM-20, TC-NOM-21, TC-ERR-14 | Rejet transitions hors table + réapplication séquentielle | FSM Gate 8 fermée et non atomique sur re-gate. |
6. Tests de non-régression
| Test ID | Objet | Observable | Commentaire |
| TC-NR-01 | Stabilité qualification sharing (A1) | 45 tests et coverage>=80 maintenus après rerun | Détecte régression sur comptage/couverture. |
| TC-NR-02 | Guard propriétaire cross-module | CTA reste strictement lié à D-299-05 après évolutions écran preuve | Évite réouverture de partage hors propriété. |
| TC-NR-03 | Déterminisme Gate 8 zéro test | Avec raw élevé ou bas, score final reste 6.0 et verdict NON_CONFORME | Valide forçage exact et priorité de la règle cap. |
| TC-NR-04 | Injection companion stable | Bloc arbitrages/invariants source toujours présent après update template prompt | Réduit faux positifs Pattern 3. |
| TC-NR-05 | Détection plan→spec | Toute présence d’un UNRATIFIED ou d’un kind invalide bloque toujours Gate 5 | Préserve garde-fou Pattern ½. |
| TC-NR-06 | Règles documentaires gouvernance | Règle telemetry (learnings) et bloc 6a restent présents après synchronisation docs | Prévient dérive documentaire. |
| TC-NR-07 | Fermeture FSM Gate 8 | États terminaux restent sans sortie après cycles de re-gate | Auditabilité durable. |
| TC-NR-08 | Réapplication séquentielle NON_CONFORME->PENDING | Le premier check en échec maintient NON_CONFORME, sans évaluation atomique globale | Prévient régression de logique d’ordre §5.4. |
7. Tests négatifs et adversariaux
| Test ID | Entrée invalide / abus | Résultat attendu | Observable |
| TC-NEG-01 | metadata avec PII + clés non autorisées (recipientEmail, ip) | Rejet Zod, aucun log émis | Erreur validation + compteur logs inchangé |
| TC-NEG-02 | Header avec espaces non conformes ou CR/LF ("Bearer abc def", `"Bearer | | |
| X-Test:1"`) | Header invalide, requête non émise | Trace réseau vide + motif invalid header | |
| TC-NEG-03 | ip_input contenant caractères hors format ("<script>") | Fallback exact D-299-11 | Sortie exacte, aucune donnée brute |
| TC-NEG-04 | companion_injected_block > 2 KiB | Prompt invalide/rejeté | Motif de rejet "size limit exceeded" |
| TC-NEG-05 | plan_extension_item.kind="cookie" | Rejet explicite du check + blocage Gate 5 | Rapport d’erreur invalid plan_extension_item.kind |
| TC-NEG-06 | ownerUserId UUID invalide | CTA caché | Snapshot UI sans CTA |
| TC-NEG-07 | Liste extensions mixte RATIFIED + UNRATIFIED | Gate 5 bloquée | Décision blocage + item fautif listé |
| TC-NEG-08 | Demande de transition terminale GO->CHECKING | Rejet strict | État GO inchangé |
| TC-NEG-09 | Module contenant uniquement foo.spec.tsx | test_file_count=1, cap zéro-test non déclenché | Rapport de comptage du glob *.{test,spec}.{ts,tsx} |
8. Observabilité requise pour les tests
- État système : état FSM Gate 8 courant/précédent, décision Gate 5/Gate 8, statut step 7.
- Réponse API : présence/validité des headers, annulation d’appel, code d’erreur explicite.
- Journal d’audit : enregistrement horodaté des contrôles 6c/6c.bis, detect-plan-extensions, transitions FSM, motifs de blocage.
- Journal d’audit corrélé : chaque entrée inclut
story_id, project_code, correlation_id (D-299-22), timestamp ISO8601. - Preuve Legal A8 : chaque approbation expose
text_id, approver_role, approver_id, approved_at, jira_comment_id. - Export probatoire : bundle regroupant rapport coverage sharing, comptage tests, traces Gate 8, rapport 6c.bis, rapport plan→spec, artefact A8 PO+LEGAL.
9. Points hors périmètre vérification automatique
| Point hors périmètre vérification automatique | Raison | Impact |
| Validité juridique substantielle des contenus ARB-7 / ARB-8 / RGPD-90j | Le système vérifie la preuve d’approbation humaine, pas l’analyse juridique de fond | Majeur |
| Intention réelle des approbateurs (au-delà de la trace Jira) | La non-répudiation couverte est minimale (traçabilité Atlassian), pas une preuve cryptographique d’intention | Majeur |
| Pertinence métier des arbitrages PO et décisions de ratification | L’automatisation vérifie présence, format et traçabilité, pas la qualité métier du choix | Majeur |
10. Verdict QA
- Testable avec réserves documentées (3 points hors périmètre vérification automatique listés en §9).