docs(qw): plan de smoke tests manuels pour validation 2026-05-06
Some checks failed
tests / Lint (ruff + black) (push) Successful in 15s
tests / Tests unitaires (sans GPU) (push) Failing after 15s
tests / Tests sécurité (critique) (push) Has been skipped

Plan exécutable seul par Dom : 9 sections (préflight, QW1 mono/multi-écran,
QW2 boucle, QW4 backward/déclaratif/medical_critical, bus events, kill-switches,
rollback) avec checklist OK/KO et procédures d'urgence en pleine démo.

Validation pour démo GHT (1ère sem mai 2026).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dom
2026-05-06 00:01:21 +02:00
parent aa47172f0f
commit 0bcfddbbc4

View File

@@ -0,0 +1,343 @@
# QW Suite Mai — Smoke tests pour validation manuelle
**Date d'exécution prévue** : 2026-05-06 (matin)
**Branche** : `feature/qw-suite-mai`
**Durée estimée** : ~1h20 si tout passe, +30 min de debug par test KO
> Coche au fur et à mesure. Si un test KO, applique le "Si KO" puis re-tente.
> Tout test critique en KO bloquant → kill-switch (procédure §10).
---
## §0. Préflight (5 min)
- [ ] **0.1** Vérifier branche : `git -C /home/dom/ai/rpa_vision_v3 branch --show-current`
Attendu : `feature/qw-suite-mai`
- [ ] **0.2** Vérifier les commits récents : `git -C /home/dom/ai/rpa_vision_v3 log --oneline -15`
Attendu : voir tous les commits du sprint (spec, plan, QW1×4, QW2×2, QW4×3, docs, fixes A/B/C éventuels)
- [ ] **0.3** Lancer la baseline rapide :
```bash
cd /home/dom/ai/rpa_vision_v3
.venv/bin/pytest tests/unit/test_monitor_router.py \
tests/unit/test_loop_detector.py \
tests/unit/test_safety_checks_provider.py \
tests/integration/test_grounding_offset.py \
tests/integration/test_loop_detector_replay.py \
tests/integration/test_replay_resume_acknowledgments.py \
-q
```
Attendu : `27 passed` (en ~5s).
Si KO : ne pas continuer, regarder l'erreur et m'appeler.
- [ ] **0.4** Vérifier les services systemd :
```bash
./svc.sh status
```
Attendu : `streaming`, `vwb-backend`, `vwb-frontend`, `dashboard` au minimum running.
Si KO : `./svc.sh start` puis re-vérifier.
- [ ] **0.5** Ouvrir un terminal dédié pour `journalctl` (sera utilisé tout le long) :
```bash
journalctl -u rpa-streaming -f
```
Le laisser ouvert dans un coin de l'écran.
---
## §1. Test QW1 mono-écran (10 min) — RÉGRESSION
**But** : prouver que le sprint n'a pas cassé un workflow Easily Assure existant.
- [ ] **1.1** Ouvrir VWB : `https://vwb.labs.laurinebazin.design` (ou `http://localhost:3002` en local)
- [ ] **1.2** Sélectionner un workflow validé le 30/04 sur Easily Assure (UHCD ou Forfait, le plus simple).
- [ ] **1.3** Cliquer "→ Windows" pour lancer le replay sur Agent V1.
- [ ] **1.4** Pendant l'exécution, dans le terminal `journalctl`, chercher la ligne :
```
[BUS] lea:monitor_routed source=focus|composite_fallback ...
```
Attendu : au moins 1 occurrence par action visuelle. Sur poste mono-écran, `source=composite_fallback` ou `source=focus` (les deux sont OK).
- [ ] **1.5** Le replay doit terminer **identique** à avant (mêmes clics aux mêmes endroits).
**Verdict** : ☐ OK ☐ KO
**Si KO** : noter l'écart visuel, kill-switch QW2/QW4 (§10) puis re-tester. Si encore KO → rollback (§11).
---
## §2. Test QW1 multi-écrans (15 min, optionnel) — VALEUR AJOUTÉE
**But** : prouver que le ciblage par écran fonctionne. **Skip si tu n'as qu'un seul écran sur le poste de démo.**
- [ ] **2.1** Brancher un 2ème écran sur le poste Windows (Agent V1).
- [ ] **2.2** Vérifier qu'Agent V1 voit les 2 écrans :
```bash
ssh dom@192.168.1.11
C:\rpa_vision\.venv\Scripts\python.exe -c "from screeninfo import get_monitors; print([(m.x, m.y, m.width, m.height) for m in get_monitors()])"
```
Attendu : 2 tuples affichés.
- [ ] **2.3** Lancer le même workflow Easily Assure (§1.2).
- [ ] **2.4** Dans `journalctl`, observer :
- Heartbeats Windows enrichis (cf. fix A) : la session reçoit `monitor_index` en continu.
- `[BUS] lea:monitor_routed source=focus idx=0` ou `idx=1` selon où Easily est ouvert.
- [ ] **2.5** Déplacer la fenêtre Easily Assure sur le 2ème écran avant un nouveau replay → relancer → vérifier que le clic atterrit sur le 2ème écran (pas sur le composite).
**Verdict** : ☐ OK ☐ KO ☐ Skipped (pas de 2ème écran)
---
## §3. Test QW2 LoopDetector — boucle artificielle (10 min)
**But** : prouver que Léa s'arrête seule quand elle tourne en rond.
- [ ] **3.1** Dupliquer un workflow simple (1-2 actions) dans VWB.
- [ ] **3.2** Modifier la 1ère action `click` pour qu'elle cible un `target_text` impossible (ex: `target_text="ZZZZZ_INEXISTANT_999"`).
- [ ] **3.3** Lancer le replay.
- [ ] **3.4** Dans `journalctl`, attendre l'apparition de :
```
LoopDetector: replay XXX mis en pause — signal=retry_threshold ...
[BUS] lea:loop_detected ...
```
Délai attendu : ~30-60s (3 retries × ~10s par retry visuel).
- [ ] **3.5** Côté VWB : la bulle `PauseDialog` doit apparaître avec `pause_reason=loop_detected`.
- [ ] **3.6** Cliquer "Annuler" pour arrêter le replay propre.
**Verdict** : ☐ OK ☐ KO
**Si KO** : vérifier `RPA_LOOP_DETECTOR_ENABLED=1` (défaut). Si toujours KO → log dans `journalctl` doit donner la raison.
---
## §4. Test QW4 backward — workflow legacy (5 min)
**But** : prouver qu'un `pause_for_human` existant continue à marcher exactement comme avant.
- [ ] **4.1** Sélectionner un workflow ayant déjà une action `pause_for_human` (sans `safety_level` ni `safety_checks`).
- [ ] **4.2** Lancer le replay.
- [ ] **4.3** Quand la pause apparaît : la bulle doit être **identique** à avant (juste le `message`, boutons Continuer/Annuler, **PAS** de checklist).
- [ ] **4.4** Dans `journalctl`, vérifier qu'**aucun** appel à Ollama `medgemma:4b` n'est lancé (pas de ligne avec ce modèle).
- [ ] **4.5** Cliquer Continuer → le replay doit reprendre sans erreur.
**Verdict** : ☐ OK ☐ KO
**Si KO** : régression. Kill-switch QW4 (§10) + re-test.
---
## §5. Test QW4 safety_checks déclaratifs (15 min)
**But** : prouver que la checklist s'affiche et bloque le Continue tant que les required ne sont pas cochés.
- [ ] **5.1** Dans VWB, créer ou modifier un workflow pour insérer une action `pause_for_human` avec :
- `message` : "Validation patient"
- `safety_level` : `standard` (PAS medical_critical, on isole le déclaratif)
- `safety_checks` : 2 entrées
- `{id: "check_ipp", label: "IPP correct ?", required: true}`
- `{id: "check_diag", label: "Diagnostic confirmé ?", required: true}`
- [ ] **5.2** Sauvegarder, lancer le replay.
- [ ] **5.3** Quand la pause apparaît :
- ☐ Bulle "Pause supervisée" affichée
- ☐ 2 cases à cocher visibles avec badges `[obligatoire]`
- ☐ Bouton "Continuer" désactivé (grisé)
- ☐ Aucun badge `[Léa]` (pas de medical_critical → pas de LLM)
- [ ] **5.4** Cocher 1 seule case → Continuer reste désactivé.
- [ ] **5.5** Cocher la 2ème case → Continuer s'active.
- [ ] **5.6** Cliquer Continuer → replay reprend.
- [ ] **5.7** Test de sécurité : forcer un POST `/api/v3/replay/resume` sans cocher (via curl) :
```bash
# Récupérer le replay_id en cours via VWB ou journalctl
curl -X POST http://localhost:5002/api/v3/replay/resume \
-H "Content-Type: application/json" \
-d '{"replay_id":"<replay_id>","acknowledged_check_ids":[]}'
```
Attendu : `400 {"detail": {"error": "required_checks_missing", "missing": ["check_ipp","check_diag"]}}`
**Verdict** : ☐ OK ☐ KO
---
## §6. Test QW4 medical_critical avec LLM (15 min)
**But** : prouver que Léa appelle medgemma:4b en moins de 5s et ajoute des checks contextuels.
- [ ] **6.1** Vérifier que `medgemma:4b` est dispo dans Ollama :
```bash
ollama list | grep medgemma
```
Attendu : `medgemma:4b` listé. Si absent : `ollama pull medgemma:4b` (3.3 GB).
- [ ] **6.2** Reprendre le workflow §5.1 et changer `safety_level: medical_critical`.
- [ ] **6.3** Lancer le replay.
- [ ] **6.4** Quand la pause apparaît :
- ☐ Bulle affichée
- ☐ 2 checks déclaratifs (badges `[obligatoire]`)
- ☐ 0 à 3 checks supplémentaires avec badge `[Léa]` bleu (tooltip = evidence)
- ☐ Délai d'apparition < 5s (sinon le timeout a sauvé)
- [ ] **6.5** Dans `journalctl`, vérifier la ligne :
```
[BUS] lea:safety_checks_generated count=N sources=['declarative', 'declarative', 'llm_contextual', ...]
```
- [ ] **6.6** Si Ollama timeout ou crash, vérifier la ligne :
```
[BUS] lea:safety_checks_llm_failed reason=... detail=...
```
Et la pause s'affiche tout de même avec les 2 checks déclaratifs (fallback safe).
**Verdict** : ☐ OK ☐ KO
---
## §7. Test bus events `lea:*` (5 min)
**But** : agréger les events vus pour audit démo.
- [ ] **7.1** Lancer un replay complet de A à Z (workflow §1 ou §6).
- [ ] **7.2** À la fin, extraire tous les events `[BUS]` du journal :
```bash
journalctl -u rpa-streaming --since "10 minutes ago" | grep "\[BUS\]" | tail -30
```
- [ ] **7.3** Vérifier la présence d'au moins :
- `lea:monitor_routed` (au moins 1 par action visuelle)
- `lea:safety_checks_generated` (si test §6 fait, au moins 1)
- `lea:loop_detected` (si test §3 fait)
**Verdict** : ☐ OK ☐ KO
---
## §8. Test kill-switches (10 min) — RÉFLEXE DÉMO
**But** : savoir désactiver QW2/QW4 en pleine démo si ça part en vrille.
- [ ] **8.1** Désactiver QW2 + QW4 :
```bash
sudo systemctl edit rpa-streaming
# Ajouter sous [Service] :
Environment=RPA_LOOP_DETECTOR_ENABLED=0
Environment=RPA_SAFETY_CHECKS_LLM_ENABLED=0
# Sauver, sortir
sudo systemctl restart rpa-streaming
```
- [ ] **8.2** Re-lancer un replay quelconque.
- [ ] **8.3** Dans `journalctl` : vérifier qu'**aucun** event `lea:loop_detected` ni `lea:safety_checks_generated` n'apparaît.
- [ ] **8.4** Réactiver (avant la démo réelle) :
```bash
sudo systemctl edit rpa-streaming
# Supprimer les 2 lignes Environment=...
sudo systemctl restart rpa-streaming
```
- [ ] **8.5** Re-vérifier qu'un replay normal réémet les bus events.
**Verdict** : ☐ OK ☐ KO
---
## §9. Test rollback complet (procédure) — RÉFLEXE D'URGENCE
**À NE PAS exécuter sauf vraie urgence**, juste connaître la commande :
```bash
cd /home/dom/ai/rpa_vision_v3
git checkout backup/pre-qw-suite-mai-2026-05-05
./svc.sh restart
```
Pour revenir au sprint après rollback :
```bash
git checkout feature/qw-suite-mai
./svc.sh restart
```
- [ ] **9.1** Lire la procédure, savoir où elle est documentée (`docs/QW_SUITE_MAI.md`).
---
## §10. Si problème en pleine démo
Ordre des réflexes :
1. **Kill-switch QW2 d'abord** (LoopDetector = couche passive, désactiver est sans risque) :
```bash
sudo systemctl set-environment RPA_LOOP_DETECTOR_ENABLED=0
sudo systemctl restart rpa-streaming
```
*(set-environment est plus rapide que `systemctl edit` mais ne survit pas au reboot — OK pour démo)*
2. **Kill-switch QW4 ensuite** si toujours problème :
```bash
sudo systemctl set-environment RPA_SAFETY_CHECKS_LLM_ENABLED=0
sudo systemctl restart rpa-streaming
```
3. **Rollback complet** si toujours KO (cf. §9).
---
## §11. Récap final
À cocher après tous les tests pour acter "prêt démo" :
- [ ] §1 mono-écran OK (régression zéro)
- [ ] §2 multi-écrans OK ou skip assumé
- [ ] §3 LoopDetector OK
- [ ] §4 backward QW4 OK
- [ ] §5 safety_checks déclaratifs OK
- [ ] §6 medical_critical + LLM OK
- [ ] §7 bus events visibles dans journalctl
- [ ] §8 kill-switches testés et fonctionnels
- [ ] §9 procédure rollback connue
**Si tout coché → démo GHT GO** 🟢
**Si §1 ou §3 ou §5 KO → démo NO-GO sans fix** 🔴
**Si §2 ou §6 KO → démo OK avec kill-switch QW correspondant** 🟡
---
## Annexes
- Spec : `docs/superpowers/specs/2026-05-05-qw-suite-mai-design.md`
- Plan d'exécution : `docs/superpowers/plans/2026-05-05-qw-suite-mai.md`
- Synthèse livraison : `docs/QW_SUITE_MAI.md`
- Backup distant : `backup/pre-qw-suite-mai-2026-05-05` (Gitea)
- Tests automatisés (référence 116 passed) :
```bash
.venv/bin/pytest tests/unit/test_monitor_router.py \
tests/unit/test_loop_detector.py \
tests/unit/test_safety_checks_provider.py \
tests/integration/test_grounding_offset.py \
tests/integration/test_loop_detector_replay.py \
tests/integration/test_replay_resume_acknowledgments.py \
tests/test_pipeline_e2e.py \
tests/test_phase0_integration.py \
tests/integration/test_stream_processor.py \
-q
```