Files
rpa_vision_v3/docs/QW_SMOKE_TESTS_2026-05-06.md
Dom 0bcfddbbc4
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
docs(qw): plan de smoke tests manuels pour validation 2026-05-06
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>
2026-05-06 00:01:21 +02:00

344 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
```