Aller au contenu

PD-293 - Scenarios de tests contractuels (v2 corriges)

1. References

  • Specification : PD-293-specification.md
  • Epic : Reference epique non fournie dans l'entree (donnee manquante)

2. Matrice de couverture

ID Invariant ID Critere ID Test Couverture Commentaire
INV-293-01 CA-05 TC-NOM-05 Oui Les commandes hors scope sont refusees avec message explicite et sans action metier.
INV-293-02 CA-01 TC-NOM-01 Oui Les observations passent par broker/peers; aucun acces direct aux repos cibles.
INV-293-03 CA-08 TC-NOM-09 Oui Isolation stricte des stories et absence de contamination inter-story.
INV-293-04 CA-09 TC-NOM-02 Oui La limite de 5 sessions actives est appliquee strictement.
INV-293-05 CA-10 TC-NOM-10 Oui Validation stricte du schema canonique et rejet deterministe des invalides.
INV-293-06 CA-04 TC-NOM-03 Oui Une escalade bloque la progression jusqu'a reception d'une reponse PO valide.
INV-293-07 CA-08 TC-NR-01 Oui Le workflow /gov reste inchange et fonctionnel en execution Ringbearer.
INV-293-08 CA-07 TC-NOM-06 Oui Passage en CRASHED et alerte en <=2 cycles de polling.
INV-293-09 CA-04 TC-INV-01 Oui Toutes transitions hors machine d'etats sont refusees.
INV-293-10 CA-01 TC-INV-02 Oui Les etats terminaux sont immuables (aucune transition sortante).
INV-293-11 CA-01 TC-NOM-07 Oui Reconciliation periodique detecte et corrige les ecarts de vue consolidee.
INV-293-12 CA-02 TC-NOM-08 Oui Commandes start/stop/respond/pause/resume idempotentes par cle dediee.
INV-293-13 CA-11 TC-NOM-13 Oui Les escalades simultanees sont traitees en FIFO sans remplacement.
INV-293-14 CA-09 TC-INV-03 Oui L'ordre de gardes quota -> doublon -> format est respecte sur start.
INV-293-05 CA-03 TC-NOM-04 Oui Les messages d'escalade valides sont visibles dans la fenetre SLA P95.
INV-293-02 CA-06 TC-MAN-01 Manuel Le controle mobile utilise les memes commandes d'orchestration via One Ring.
INV-293-05 CA-12 TC-ERR-10 Oui Reconnexion broker geree en mode degrade explicite puis reprise automatique.

3. Scenarios de test - Flux nominaux

TEST-ID: TC-NOM-01
Reference spec: INV-293-02, CA-01

GIVEN
  - One Ring demarre avec broker disponible
  - 2 Ringbearers actifs enregistres via peers
WHEN
  - Le Sovereign execute `/gov-lord status`
THEN
  - La sortie contient la liste consolidee des 2 stories actives
  - Chaque entree contient au minimum `story_id`, etat contractuel, horodatage de derniere observation
AND
  - Le journal d'audit trace une consultation broker (listing peers)
  - Aucune operation sur repo cible n'est enregistree
TEST-ID: TC-NOM-02
Reference spec: INV-293-04, CA-09

GIVEN
  - 5 Ringbearers actifs (`max_ringbearers=5`)
WHEN
  - Le Sovereign execute un 6e `/gov-lord start PD-299 backend`
THEN
  - La commande est rejetee explicitement (quota atteint)
  - Aucun nouveau Ringbearer n'est cree
AND
  - Le nombre d'actifs reste strictement a 5
  - Le rejet est journalise
TEST-ID: TC-NOM-03
Reference spec: INV-293-06, CA-04

GIVEN
  - Une story est en etat `RUNNING`
  - Une escalade valide est emise (`message_type=ESCALADE`, `story_id` valide, `escalade_text` non vide)
WHEN
  - Le Sovereign execute `/gov-lord respond <story_id> <reponse>` avec payload valide
THEN
  - La story passe `ESCALADED -> RUNNING`
  - La reprise est observable par un `STATUS_UPDATE` ulterieur
AND
  - La progression etait bloquee tant que `PO_RESPONSE` n'etait pas recue
TEST-ID: TC-NOM-04
Reference spec: CA-03, INV-293-05

GIVEN
  - Campagne de 100 escalades valides en conditions stables locales
  - Horodatages emission/reception RFC3339 UTC collectes pour chaque escalade
WHEN
  - Les 100 escalades sont traitees par One Ring
THEN
  - Le P95 du delai de visibilite est <= `escalade_visibility_sla` (defaut 5s)
AND
  - Les mesures horodatees sont exportees pour preuve
TEST-ID: TC-NOM-05
Reference spec: INV-293-01, CA-05

GIVEN
  - One Ring actif
WHEN
  - Le Sovereign soumet une commande hors scope (ex: lecture repo, build, Jira, GitLab, Vault)
THEN
  - One Ring retourne un message de blocage explicite et coherent
  - Aucune action metier/projet n'est executee
AND
  - Un evenement d'audit de refus est present
TEST-ID: TC-NOM-06
Reference spec: INV-293-08, CA-07

GIVEN
  - Une story en `RUNNING` avec peer precedemment observe
  - Le peer devient absent
WHEN
  - Deux cycles de polling successifs s'executent (`peer_poll_interval` defaut 10s)
THEN
  - L'etat passe en `CRASHED` en <= 2 cycles (<=20s par defaut)
  - Une alerte Sovereign est emise
AND
  - La transition est tracee avec timestamp
TEST-ID: TC-NOM-07
Reference spec: INV-293-11, CA-01

GIVEN
  - Etat consolide One Ring volontairement desynchronise (ex: peer present non reflechi localement)
WHEN
  - Une reconciliation periodique est declenchee
THEN
  - La vue consolidee est alignee avec les peers observes
  - Les ecarts detectes sont explicitement signales
AND
  - L'operation est journalisee sans modifier les stories terminales
TEST-ID: TC-NOM-08
Reference spec: INV-293-12, CA-02

GIVEN
  - Commande `start` valide avec `idempotency_key=K1`
WHEN
  - La meme commande est rejouee avec la meme cle dans la fenetre `idempotency_ttl`
THEN
  - Le second resultat est deterministe et identique au premier
  - Aucun Ringbearer supplementaire n'est cree
AND
  - Le dedoublonnage est trace en audit
TEST-ID: TC-NOM-09
Reference spec: INV-293-03, CA-08

GIVEN
  - 2 stories actives (`PD-293`, `PD-294`) avec contexts et credentials distincts
WHEN
  - Une escalade/reponse est emise pour `PD-293`
THEN
  - Seule `PD-293` change d'etat selon la machine contractuelle
  - `PD-294` conserve son etat et son contexte sans impact
AND
  - Aucun partage de credential ou message inter-story n'est observe
TEST-ID: TC-NOM-10
Reference spec: INV-293-05, CA-10

GIVEN
  - Un lot de messages valides couvrant tous les champs §5.1
WHEN
  - Le lot est ingere par One Ring
THEN
  - Tous les messages valides sont acceptes et traites selon leur type
  - Aucun rejet injustifie n'est observe
AND
  - Le journal d'audit associe type de message, story cible, timestamp
TEST-ID: TC-NOM-12
Reference spec: CA-02, INV-293-09

GIVEN
  - Story en `RUNNING`
WHEN
  - Le Sovereign execute `/gov-lord pause <story_id>` puis `/gov-lord resume <story_id>`
THEN
  - Transitions observees: `RUNNING -> PAUSED -> RUNNING`
  - Aucune perte de contexte n'est observee
AND
  - Les deux commandes sont journalisees avec idempotency_key
TEST-ID: TC-NOM-13
Reference spec: INV-293-13, CA-11

GIVEN
  - Trois escalades ouvertes pour la meme story avec timestamps t1 < t2 < t3
WHEN
  - Le Sovereign execute trois commandes `respond` successives valides
THEN
  - Les escalades sont cloturees dans l'ordre FIFO t1, puis t2, puis t3
  - Aucune escalade n'est remplacee ni perdue
AND
  - La file `escalade_queue` conserve une tracabilite complete

4. Scenarios de test - Cas d'erreur

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

GIVEN
  - 5 Ringbearers actifs
WHEN
  - Requete `start` additionnelle
THEN
  - Rejet explicite `quota atteint`
  - Aucun effet secondaire de creation
TEST-ID: TC-ERR-02
Reference spec: ERR-293-02

GIVEN
  - Story `PD-293` deja active
WHEN
  - Nouvelle commande `start PD-293` (cle differente)
THEN
  - Rejet explicite idempotent (`story deja active`)
  - Pas de second peer pour la meme story
TEST-ID: TC-ERR-03
Reference spec: ERR-293-03, §6.1

GIVEN
  - Message entrant sans `story_id` valide (absent ou non conforme regex)
WHEN
  - One Ring tente la validation de schema
THEN
  - Message rejete
  - Erreur journalisee au format JSONL obligatoire avec `timestamp`, `peer_id`, `message_type`, `reason`
  - Aucun changement d'etat story
TEST-ID: TC-ERR-04
Reference spec: ERR-293-04

GIVEN
  - Story cible non en `ESCALADED`
WHEN
  - Commande `respond` recue
THEN
  - Rejet explicite (`pas d'escalade active`)
  - Aucun changement d'etat
TEST-ID: TC-ERR-05
Reference spec: ERR-293-05

GIVEN
  - One Ring actif
WHEN
  - Demande hors scope de routage (ex: ecrire fichier, lancer tests)
THEN
  - Blocage explicite conforme INV-293-01
  - Absence totale d'effet de bord metier
TEST-ID: TC-ERR-06
Reference spec: ERR-293-06

GIVEN
  - Broker indisponible
WHEN
  - Commande de supervision (`status`) ou de routage est executee
THEN
  - Passage en mode degrade explicite
  - Alerte Sovereign emise
  - Aucune decision silencieuse non tracee
TEST-ID: TC-ERR-07
Reference spec: ERR-293-07

GIVEN
  - Story observee precedemment en `RUNNING` puis peer absent
WHEN
  - Deux cycles de polling expirent sans retour peer
THEN
  - Transition `-> CRASHED`
  - Alerte critique emise
  - Etat marque terminal
TEST-ID: TC-ERR-08
Reference spec: ERR-293-08, INV-293-12

GIVEN
  - Commande `stop` deja traitee avec `idempotency_key=K2`
WHEN
  - Reemission stricte de la meme commande avec `K2`
THEN
  - Retour deterministe identique
  - Aucun effet secondaire additionnel
TEST-ID: TC-ERR-09
Reference spec: ERR-293-10, §5.2

GIVEN
  - `start` accepte, peer enregistre au broker
WHEN
  - Aucun message de first liveness valide n'est recu avant `first_liveness_timeout`
THEN
  - Etat `STARTING -> START_FAILED`
  - Session partielle nettoyee et alerte emise
TEST-ID: TC-ERR-10
Reference spec: CA-12, §5.3

GIVEN
  - Broker indisponible pendant une periode puis retabli
WHEN
  - One Ring applique la strategie de reconnexion bornee (1s,2s,4s,8s,10s)
THEN
  - Mode degrade explicite durant indisponibilite
  - Reprise automatique des polls a la reconnexion
  - Reconciliation immediate de l'etat consolide
TEST-ID: TC-ERR-11
Reference spec: ERR-293-09, §5.1

GIVEN
  - Commande `respond` traitee avec `idempotency_key=K3` et payload P1
WHEN
  - Rejeu avec meme cle `K3` mais payload P2 different
THEN
  - Rejet deterministe de conflit idempotence
  - Aucun effet secondaire additionnel

5. Tests d'invariants (non negociables)

Invariant Test(s) dedies Observable Commentaire
INV-293-01 TC-NOM-05, TC-ERR-05 Rejet explicite des actions hors scope, zero action metier Separation des pouvoirs preservee.
INV-293-02 TC-NOM-01, TC-MAN-01 Traces d'usage broker/peers uniquement Pas d'acces direct aux repos cibles.
INV-293-03 TC-NOM-09, TC-NR-03 Absence de contamination et de partage credentials entre stories Isolation contractuelle verifiee.
INV-293-04 TC-NOM-02, TC-ERR-01 6e start rejete sans creation Limite capacitaire stricte.
INV-293-05 TC-NOM-10, TC-ERR-03, TC-NEG-01..TC-NEG-10 Validation schema stricte, rejet deterministe des invalides Contrat de message testable.
INV-293-06 TC-NOM-03, TC-ERR-04 Blocage en ESCALADED jusqu'a PO_RESPONSE valide Gouvernance humaine effective.
INV-293-07 TC-NR-01 Comportement /gov identique baseline/post-orchestration Non-regression fonctionnelle du workflow.
INV-293-08 TC-NOM-06, TC-ERR-07 Detection crash en <=2 polls + alerte Resilience operationnelle.
INV-293-09 TC-INV-01 Toute transition non listee est refusee Cohesion machine d'etats.
INV-293-10 TC-INV-02 Aucun DONE/ABORTED/CRASHED/START_FAILED -> * accepte Terminaux verrouilles.
INV-293-11 TC-NOM-07 Reconciliation periodique aligne la vue consolidee Tolerance aux ecarts/crashes.
INV-293-12 TC-NOM-08, TC-ERR-08, TC-ERR-11 Rejeu avec meme cle sans double effet / conflit bloque Retry-safe en distribue.
INV-293-13 TC-NOM-13 FIFO strict multi-escalades Pas de remplacement d'escalade.
INV-293-14 TC-INV-03 Gardes quota -> doublon -> format Ordre contractuel stable.
TEST-ID: TC-INV-01
Reference spec: INV-293-09

GIVEN
  - Jeu complet des etats (`STARTING`, `RUNNING`, `ESCALADED`, `PAUSED`, `DONE`, `ABORTED`, `CRASHED`, `START_FAILED`)
WHEN
  - Chaque transition non listee en §5.2 est tentee
THEN
  - Chaque transition non autorisee est rejetee explicitement
  - Aucune mutation d'etat n'est appliquee
AND
  - Les rejets sont journalises de facon deterministe
TEST-ID: TC-INV-02
Reference spec: INV-293-10

GIVEN
  - Stories placees dans chacun des etats terminaux (`DONE`, `ABORTED`, `CRASHED`, `START_FAILED`)
WHEN
  - Une tentative de transition sortante est emise pour chaque etat terminal
THEN
  - Rejet explicite `etat terminal`
  - Etat reste strictement inchange
AND
  - Le dossier de preuve montre resolution manuelle requise
TEST-ID: TC-INV-03
Reference spec: INV-293-14

GIVEN
  - `max_ringbearers=5` et 5 stories deja actives
  - Commande `start` avec payload invalide (`story_id=pd-001`) et `idempotency_key` nouvelle
WHEN
  - Le Sovereign execute la commande
THEN
  - Le premier rejet observe est `quota atteint` (garde 1)
  - Aucune evaluation bloquante ulterieure ne change le motif principal
AND
  - Le journal trace explicitement l'ordre des gardes appliquees

6. Tests de non-regression

Test ID Objet Observable Commentaire
TC-NR-01 Workflow /gov consomme tel quel Baseline vs run orchestre: memes etapes/gates/verdicts pour une story identique Couvre INV-293-07 et CA-08.
TC-NR-02 Separation One Ring / execution metier Aucune commande One Ring n'effectue lecture/ecriture/build/test/Jira/GitLab/Vault Couvre perimetre exclu et INV-293-01.
TC-NR-03 Isolation inter-story Action sur story A sans impact sur story B (etat, contexte, credentials) Couvre INV-293-03.
TC-NR-04 Etats terminaux stables dans le temps Reconciliation et polling n'ouvrent jamais les etats terminaux Couvre INV-293-10.

7. Tests negatifs et adversariaux

Test ID Entree invalide / abus Resultat attendu Observable
TC-NEG-01 story_id=pd-293 (mauvaise casse) Rejet validation Erreur regex ^PD-[0-9]{1,4}$, aucun effet de bord
TC-NEG-02 story_id=PD-12345 (hors regex) Rejet validation Log de rejet, aucun changement d'etat
TC-NEG-03 project_code=backend-prod (hors enum) Rejet validation Message explicite project_code invalide
TC-NEG-04 project_code=ia-gov (alias interdit) Rejet validation Seule valeur valide: ia-governance
TC-NEG-05 message_type=ESCALATE (valeur non enum) Rejet validation Journal d'erreur schema, etat inchange
TC-NEG-06 timestamp non RFC3339 UTC Rejet validation Motif parse timestamp invalide
TC-NEG-07 idempotency_key <16 chars Rejet validation Commande non traitee
TC-NEG-08 escalade_text vide Rejet validation Escalade non creee
TC-NEG-09 peer_id vide ou controle Unicode Rejet validation Message ignore, erreur audit tracee
TC-NEG-10 Injection message inter-story (story_id A dans canal B) Rejet routage Aucun impact sur A ni B

8. Observabilite requise pour les tests

  • Etat systeme : snapshot consolide des stories (etat contractuel, derniere observation peer, file d'escalades FIFO, statut broker).
  • Reponse API/commande : sortie normalisee des commandes /gov-lord start/status/escalade/respond/pause/resume/stop avec statut success/rejet et motif.
  • Journal d'audit : trace horodatee de validation schema, transitions d'etat, rejets, dedoublonnage idempotence, alertes SLA, ordre des gardes.
  • Evenement signe/horodate : emission/reception des messages critiques (ESCALADE, PO_RESPONSE, WORKFLOW_DONE, CRASHED) en RFC3339 UTC.
  • Export probatoire : lot versionne contenant logs, mesures SLA (P95), matrice de transitions testees, preuves de non-regression et verdict final.

9. Regles non testables / test manuel

Regle Statut de test Raison Impact
CA-06 (controle mobile) Test manuel obligatoire (TC-MAN-01) Contrat mobile depend d'un environnement iPhone/Safari reel ; automatisation exhaustive non normative en v1 Majeur
Validation syntaxique fine de peer_id au-dela de printable UTF-8 Non applicable en v1 Format opaque, contrainte contractuelle limitee a non-vacuite + exclusion caracteres de controle Mineur
TEST-ID: TC-MAN-01
Reference spec: CA-06

Type: Manuel
Preconditions:
  - iPhone + Safari
  - Session `/remote-control` authentifiee

GIVEN
  - One Ring actif et stories existantes
WHEN
  - Le Sovereign execute `status`, `escalade`, `respond`, `pause`, `resume` depuis mobile
THEN
  - Resultats fonctionnels identiques a desktop
  - Aucune action hors scope One Ring n'est possible

10. Verdict QA

  • Testable majoritairement de facon deterministe (avec un lot manuel explicite pour CA-06)

Le contrat PD-293 est testable de facon deterministe pour invariants, machine d'etats, SLA, idempotence, ordre des gardes, FIFO d'escalades et non-regression. La couverture mobile CA-06 est maintenue via test manuel obligatoire (TC-MAN-01), clairement identifie dans la matrice.