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.