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>
12 KiB
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-currentAttendu :feature/qw-suite-mai -
0.2 Vérifier les commits récents :
git -C /home/dom/ai/rpa_vision_v3 log --oneline -15Attendu : 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 :
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 \ -qAttendu :
27 passed(en ~5s). Si KO : ne pas continuer, regarder l'erreur et m'appeler. -
0.4 Vérifier les services systemd :
./svc.sh statusAttendu :
streaming,vwb-backend,vwb-frontend,dashboardau minimum running. Si KO :./svc.sh startpuis re-vérifier. -
0.5 Ouvrir un terminal dédié pour
journalctl(sera utilisé tout le long) :journalctl -u rpa-streaming -fLe 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(ouhttp://localhost:3002en 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_fallbackousource=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 :
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_indexen continu. [BUS] lea:monitor_routed source=focus idx=0ouidx=1selon où Easily est ouvert.
- Heartbeats Windows enrichis (cf. fix A) : la session reçoit
-
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
clickpour qu'elle cible untarget_textimpossible (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
PauseDialogdoit apparaître avecpause_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(sanssafety_levelnisafety_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 à Ollamamedgemma:4bn'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_humanavec :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/resumesans cocher (via curl) :# 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:4best dispo dans Ollama :ollama list | grep medgemmaAttendu :
medgemma:4blisté. 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 :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 :
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 eventlea:loop_detectednilea:safety_checks_generatedn'apparaît. -
8.4 Réactiver (avant la démo réelle) :
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 :
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 :
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 :
-
Kill-switch QW2 d'abord (LoopDetector = couche passive, désactiver est sans risque) :
sudo systemctl set-environment RPA_LOOP_DETECTOR_ENABLED=0 sudo systemctl restart rpa-streaming(set-environment est plus rapide que
systemctl editmais ne survit pas au reboot — OK pour démo) -
Kill-switch QW4 ensuite si toujours problème :
sudo systemctl set-environment RPA_SAFETY_CHECKS_LLM_ENABLED=0 sudo systemctl restart rpa-streaming -
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) :
.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