# Protocole de test humain E2E — POC Aiva-vision **Date** : 2026-06-01 **Version** : 1.0 **Objet** : valider le POC en conditions réelles — apprentissage → restitution → correction → persistance → replay supervisé → verdict **Durée estimée** : 45-60 minutes --- ## 1. Checklist pré-test ### 1.1 Services à vérifier | Service | Port | Comment vérifier | GO/NO-GO | |---------|------|------------------|----------| | Ollama | 11434 | `curl http://localhost:11434/api/tags` — doit retourner la liste des modèles | ☐ | | Streaming server | 5005 | `curl http://localhost:5005/health` ou `./svc.sh status` | ☐ | | Web Dashboard | 5001 | `curl http://localhost:5001/health` ou ouvrir `http://localhost:5001` | ☐ | | Agent Chat | 5004 | `curl http://localhost:5004/health` ou ouvrir `http://localhost:5004` | ☐ | | VWB Backend | 5002 | `./svc.sh status` (optionnel si on ne teste pas via VWB) | ☐ | | VWB Frontend | 3002 | `curl http://localhost:3002` (optionnel) | ☐ | Commande rapide pour tout vérifier d'un coup : ```bash ./svc.sh status ``` ### 1.2 Modèles Ollama requis ```bash ollama list ``` Vérifier la présence de : - `qwen2.5vl:7b` (ou `qwen2.5vl:7b-rpa`) — grounding visuel - `qwen2.5:7b` — raisonnement texte - `qwen2.5:0.5b` — intent recognition léger (fallback) **Si un modèle manque** : `ollama pull ` avant de continuer. ### 1.3 Compétences existantes dans le catalogue Ouvrir le dashboard → onglet **Knowledge Base**. Vérifier la présence de : | Compétence | État attendu | |------------|-------------| | `key_win_r_wait_explorer_exe` | `candidate` | | `key_ctrl_s_wait_notepad_exe` | `candidate` | | `key_alt_f4_wait_windowsterminal_exe` | `candidate` | **Si le catalogue est vide** : les fichiers YAML doivent exister dans `data/competences/candidate/`. Vérifier : ```bash ls -la data/competences/candidate/ ``` Si les fichiers existent mais n'apparaissent pas dans le dashboard, redémarrer le streaming server (`./svc.sh restart streaming`). ### 1.4 Agent Windows connecté - Dans le dashboard, vérifier que la machine cible apparaît (ex: `DESKTOP-XXXXX_windows`). - Si l'agent n'est pas connecté : le lancer depuis le poste Windows (`Lea_v*.zip` → `lea_agent.exe`). - **Machine cible** : noter le `machine_id` exact (affiché dans le dashboard ou dans `data/agents/`). ### 1.5 État initial de la machine Windows Avant toute manipulation : - [ ] **Fermer tous les dialogues parasites** : boîtes de dialogue "Enregistrer", "Exécuter", confirmations, pop-up Windows Update - [ ] **Fermer les applications non nécessaires** : tout garder minimal (bureau + applications de test uniquement) - [ ] **Vérifier que le bureau est visible** : pas d'application plein écran - [ ] **Couper les notifications Windows** : mode "Ne pas déranger" activé (Win+A → activer) - [ ] **Noter la résolution écran** : `Win+I → Système → Écran` (utile si un problème de positionnement survient) ### 1.6 Dossier de collecte des preuves Créer un dossier de travail pour cette session de test : ```bash mkdir -p /home/dom/ai/rpa_vision_v3/docs/demo/e2e-poc-$(date +%Y%m%d) ``` Ce dossier recevra les screenshots, logs, et verdicts collectés pendant le test. --- ## 2. Protocole pas-à-pas ### Phase 1 — Démarrer Léa / agent Windows **Ce que l'opérateur fait** : 1. Vérifier que l'agent Windows est connecté (dashboard → page principale) 2. Noter le `machine_id` affiché 3. Ouvrir l'agent chat (`http://localhost:5004`) dans un navigateur **Ce que Léa fait** : Rien (état IDLE) **Ce qu'on doit voir** : - Dashboard : machine connectée, statut "online" - Agent chat : interface de conversation vide, bouton "Apprendre" visible **Critère GO/NO-GO** : - GO : agent chat accessible, machine connectée - NO-GO : relancer l'agent Windows, vérifier le réseau, vérifier que le streaming server tourne **Preuve à collecter** : - Screenshot du dashboard montrant la machine connectée - Copier le `machine_id` dans un fichier `preuves/machine_id.txt` --- ### Phase 2 — Déclencher l'apprentissage depuis agent-chat **Ce que l'opérateur fait** : 1. Dans l'agent chat, taper : `lea apprends-moi` ou cliquer le bouton "Apprendre" si disponible 2. Observer la réponse de Léa **Ce que Léa fait** : - Transition IDLE → LISTENING → WAITING_USER_STOP - Répond : *"Je te regarde. Fais ce que tu veux m'apprendre, et dis-moi « stop » ou « j'ai fini » quand c'est terminé."* - Appelle `shadow_start` côté streaming server **Ce qu'on doit voir** : - Message de Léa confirmant qu'elle observe - Side shadow actif côté streaming server (vérifiable via `curl http://localhost:5005/api/v1/shadow/sessions` si endpoint existe) **Critère GO/NO-GO** : - GO : Léa a répondu avec le message d'observation - NO-GO : si `shadow_start` échoue → vérifier streaming server, token API (`RPA_API_TOKEN`), relancer **Preuve à collecter** : - Screenshot de la conversation agent-chat - Copier le `session_id` (affiché dans la réponse ou dans les logs `agent_chat/state/`) --- ### Phase 3 — Observer une tâche courte **Tâche cible** : `Win+R` → ouverture de la boîte "Exécuter" **Ce que l'opérateur fait** (sur le poste Windows) : 1. **Basculer sur la session Windows** (via RDP ou directement) 2. Appuyer sur `Win+R` 3. Vérifier que la boîte "Exécuter" s'ouvre 4. **Ne pas fermer** la boîte "Exécuter" (elle servira de preuve visuelle) 5. Revenir à l'agent chat **Ce que Léa fait** : - Capture les événements clavier (`key_press` pour `win` + `r`) - Capture les screenshots avant/après - Enregistre la session brute **Ce qu'on doit voir** : - La boîte "Exécuter" apparaît à l'écran Windows - Dans les logs du streaming server, des événements `key_press` et des screenshots sont reçus **Critère GO/NO-GO** : - GO : la boîte "Exécuter" est visible à l'écran - NO-GO : si `Win+R` ne fonctionne pas → vérifier que le clavier Windows n'est pas bloqué, que RDP ne capture pas les touches **Preuve à collecter** : - Screenshot de la boîte "Exécuter" ouverte (depuis le poste Windows) - Noter l'heure exacte de l'action --- ### Phase 4 — Arrêter l'observation **Ce que l'opérateur fait** : 1. Dans l'agent chat, taper : `stop` ou `j'ai fini` **Ce que Léa fait** : - Reconnaît l'intent `USER_STOP_OBSERVE` (regex, confiance > 0.9) - Transition WAITING_USER_STOP → ANALYZING → PRESENTING - Appelle `shadow_stop` + `shadow_understanding` côté streaming server - Formate la restitution Option C **Ce qu'on doit voir** : - Léa répond avec un résumé de ce qu'elle a compris, par exemple : ``` Voilà ce que j'ai compris : 1. Touche → raccourci utilisé : « win + r » 2. Fenêtre « Exécuter » → ouverte C'est bien ça ou je me suis trompée quelque part ? ``` **Critère GO/NO-GO** : - GO : Léa a restitué au moins 1 étape correcte - NO-GO : si Léa dit "aucune étape comprise" → vérifier que les screenshots ont bien été capturés, que le shadow était actif **Preuve à collecter** : - Screenshot de la restitution Léa dans l'agent chat - Copier le contenu JSON de `understanding` depuis `curl http://localhost:5005/api/v1/shadow//understanding` --- ### Phase 5 — Restitution et correction (Option C — formateur) **Ce que l'opérateur fait** : 1. **Lire attentivement** la restitution de Léa 2. Si c'est correct : taper `oui` ou `c'est bon` ou `parfait` 3. Si c'est incorrect : taper `corrige l'étape 1 : [description correcte]` **Ce que Léa fait** : - Si validation : transition ITERATING_FEEDBACK → NAMING - Si correction : envoie le feedback au streaming server (`shadow_feedback`), reçoit la nouvelle compréhension, reformule - Compte les corrections par étape (max 3 → sortie d'urgence) **Ce qu'on doit voir** : - Si corrigée : Léa reformule avec la correction appliquée - Si validée : Léa demande le nom de la compétence **Critère GO/NO-GO** : - GO : Léa a soit validé soit corrigé avec reformulation - NO-GO : si Léa ne comprend pas la correction → vérifier l'intent parser (logs), le regex, le fallback Ollama **Preuve à collecter** : - Screenshot de l'échange de correction (si applicable) - Noter le nombre de corrections apportées --- ### Phase 6 — Nommer la compétence et marquer les paramètres **Ce que l'opérateur fait** : 1. Donner un nom : `ouverture executer` ou `lancer executer` 2. Si Léa demande si une valeur est un paramètre : répondre "toujours" ou "c'est l'exemple du jour" 3. Pour `Win+R`, il n'y a pas de valeur saisie → aucun paramètre à marquer **Ce que Léa fait** : - Enregistre le nom de la compétence - Cherche les steps avec des valeurs saisies → demande si ce sont des paramètres - Transition NAMING → PERSISTING quand tout est marqué **Ce qu'on doit voir** : - Léa confirme : *"C'est enregistré sous « ouverture executer » (slug `ouverture_executer`). Paramètres : aucun."* **Critère GO/NO-GO** : - GO : Léa a confirmé la persistance - NO-GO : si `shadow_build` ou `competence_persist` échoue → vérifier logs streaming server, endpoint `/api/v1/lea/competences/candidate/persist` **Preuve à collecter** : - Screenshot du message de confirmation - Vérifier que le YAML a été créé : `ls -la data/competences/candidate/` - Copier le contenu du YAML dans `preuves/competence_.yaml` --- ### Phase 7 — Tester via le dashboard (replay supervisé) **Ce que l'opérateur fait** : 1. Ouvrir le dashboard → onglet **Knowledge Base** 2. Trouver la compétence fraîchement créée 3. Cliquer **Tester** 4. Une modale s'ouvre : "Prépare le test supervisé..." 5. **Avant de cliquer "Continuer le test"** : - Fermer la boîte "Exécuter" si elle est encore ouverte (étape critique — voir section 5 sur les faux succès) - Vérifier que le bureau Windows est visible, aucune application parasite 6. Cliquer **Continuer le test** **Ce que Léa fait** : - Envoie `Win+R` automatiquement sur le poste Windows via l'agent - Attend que la boîte "Exécuter" apparaisse (wait_state) - Se met en pause après l'action **Ce qu'on doit voir** : - La boîte "Exécuter" s'ouvre sur le poste Windows (~1-2 secondes après le clic "Continuer") - La modale affiche "Valide le résultat de la compétence..." avec 3 boutons : **Valide**, **Invalide**, **Incertain** **Critère GO/NO-GO** : - GO : la boîte "Exécuter" apparaît et la modale de verdict est affichée - NO-GO : si rien ne se passe → vérifier que l'agent Windows est connecté, que le replay a bien été lancé (logs streaming server) **Preuve à collecter** : - Screenshot de la boîte "Exécuter" ouverte (depuis Windows) - Screenshot de la modale de verdict dans le dashboard --- ### Phase 8 — Enregistrer le verdict **Ce que l'opérateur fait** : 1. Évaluer le résultat selon les critères : - **Valide** ✅ : la boîte "Exécuter" apparaît, au premier plan, correcte - **Invalide** ❌ : rien ne se passe, ou une autre fenêtre s'ouvre - **Incertain** ⚠️ : la boîte apparaît mais n'est pas au premier plan 2. Cliquer le bouton correspondant 3. La modale se ferme, le dashboard se rafraîchit **Ce que Léa fait** : - Persiste le verdict dans `data/competence_verdicts/verdicts.jsonl` - Le replay reprend puis se termine **Ce qu'on doit voir** : - Le dashboard revient à la liste Knowledge Base - Un nouveau verdict est enregistré (vérifiable dans le fichier JSONL) **Critère GO/NO-GO** : - GO : le verdict est enregistré, le fichier JSONL contient une nouvelle entrée - NO-GO : si le verdict n'est pas persisté → vérifier logs dashboard, endpoint `/api/v1/lea/competences//verdict` **Preuve à collecter** : - Copier la dernière ligne du fichier `data/competence_verdicts/verdicts.jsonl` dans `preuves/verdict.jsonl` - Screenshot du dashboard après verdict --- ### Phase 9 — Nettoyer et recommencer (itération) Pour un test robuste, **répéter les phases 3-8 au moins 3 fois** avec des contextes différents : | Itération | Contexte | Tâche | |-----------|----------|-------| | 1 | Bureau propre | `Win+R` → Exécuter | | 2 | Avec Notepad ouvert + texte non sauvegardé | `Ctrl+S` → Enregistrer sous | | 3 | Avec Notepad ouvert au premier plan | `Alt+F4` → Fermer | **Ou** répéter 3 fois la même tâche avec des contextes légèrement différents (fenêtres ouvertes différentes, résolution modifiée, etc.) pour valider la robustesse. --- ## 3. Critères GO/NO-GO globaux ### 3.1 Qu'est-ce qui valide le POC ? | Critère | Seuil | |---------|-------| | **Apprentissage par observation** | ✅ Léa doit restituer correctement au moins **1 tâche sur 3** tentées | | **Restitution compréhensible** | ✅ Le texte Option C doit être lisible par un humain non-technique (phrases françaises, pas JSON) | | **Correction acceptée** | ✅ Léa doit accepter et appliquer au moins **1 correction** | | **Persistance** | ✅ Le YAML doit être créé dans `data/competences/candidate/` | | **Replay supervisé** | ✅ Au moins **2 replays réussis sur 3** (la tâche est rejouée automatiquement) | | **Verdict humain** | ✅ Les verdicts doivent être persistés dans le JSONL | **Le POC est validé si** : au moins **2 des 3 compétences** du batch 1 passent le cycle complet (apprentissage → restitution → persistance → replay → verdict) avec un verdict **Valide**. ### 3.2 Échecs acceptables | Échec | Acceptable ? | Condition | |-------|-------------|-----------| | `Alt+F4` → verdict Incertain | ✅ Oui | Le gap `alt_f4_confirmation_dialog_not_covered` est documenté | | Ollama fallback timeout | ✅ Oui | Si les regex passent quand même (confiance > 0.9) | | 1 correction sur 3 nécessaires | ✅ Oui | C'est dans le design (max 3 corrections/step) | | Wait_state timeout sur Alt+F4 | ✅ Oui | Le success_marker est trop spécifique (artefact de session) | ### 3.3 Échecs bloquants | Échec | Bloquant ? | Action | |-------|-----------|--------| | `shadow_start` échoue systématiquement | 🔴 BLOQUANT | L'agent Windows ne communique pas avec le streaming server | | Aucune restitution (understanding vide) | 🔴 BLOQUANT | Le pipeline shadow ne reconstruit pas les étapes | | `competence_persist` échoue | 🔴 BLOQUANT | La persistance ne fonctionne pas | | Replay ne déclenche aucune action | 🔴 BLOQUANT | L'agent Windows ne reçoit pas les ordres | | Verdict non persisté | 🔴 BLOQUANT | Le contrat de verdict n'est pas implémenté | --- ## 4. Preuves à collecter ### 4.1 Fichiers à vérifier après le test | Fichier | Contenu | Comment vérifier | |---------|---------|------------------| | `data/competences/candidate/*.yaml` | Compétences persistées | `ls -la` + `cat` pour vérifier le contenu | | `data/competence_verdicts/verdicts.jsonl` | Verdicts humains | `tail -n 5` pour voir les derniers verdicts | | `agent_chat/state/learn_*.json` | États des sessions d'apprentissage | `ls -la agent_chat/state/` | | `data/raw_sessions//` | Sessions brutes (screenshots + événements) | Vérifier la présence de screenshots | | Logs streaming server | `journalctl -u rpa-streaming` ou stdout du process | Chercher les erreurs HTTP 5xx | | Logs agent chat | stdout du process ou `logs/agent_chat.log` | Vérifier les transitions d'état | | Logs dashboard | stdout du process ou `logs/dashboard.log` | Vérifier les appels replay/verdict | ### 4.2 Comment documenter un succès Créer un fichier `preuves/succes_.md` avec : ```markdown # Succès — **Date** : 2026-06-01 **Session ID** : learn_xxx **Machine** : DESKTOP-XXXXX_windows ## Preuves - Screenshot restitution : `preuves/screenshot_restitution_.png` - Screenshot replay : `preuves/screenshot_replay_.png` - YAML : `data/competences/candidate/.yaml` - Verdict : dernière ligne de `data/competence_verdicts/verdicts.jsonl` ## Observations - Nombre de corrections : X - Temps d'apprentissage : ~X minutes - Temps de replay : ~X secondes ``` ### 4.3 Comment documenter un échec Créer un fichier `preuces/echec_.md` avec : ```markdown # Échec — **Date** : 2026-06-01 **Session ID** : learn_xxx **Phase d'échec** : apprentissage / restitution / persistance / replay / verdict ## Symptôme ## Logs pertinents ## Cause probable ## Reproduire <étapes pour reproduire> ``` --- ## 5. Risques de faux succès ### 5.1 Comment distinguer un vrai succès d'un faux positif | Risque | Comment le détecter | Mitigation | |--------|-------------------|------------| | **Dialogue déjà ouvert** avant le replay | Vérifier visuellement **avant** de cliquer "Continuer le test" | Fermer tous les dialogues parasites (checklist phase 1.5) | | **machine_id spoofé** ou wrong target | Vérifier que le `machine_id` dans le verdict correspond à la machine de test | Noter le `machine_id` en phase 1, le comparer dans le verdict JSONL | | **Léa envoie les touches mais une autre app les reçoit** | Vérifier que la fenêtre cible est **au premier plan** avant le replay | Mettre la fenêtre cible au premier plan avant de cliquer "Continuer" | | **Wait_state passe par chance** (la fenêtre était déjà là) | Le wait_state doit détecter un **changement d'état**, pas un état statique | Vérifier que le wait_state est bien un "appear" et pas un "already present" | | **Verdict enregistré mais replay non exécuté** | Vérifier que `step_results[]` dans le verdict contient des steps avec `status: success` | Lire le JSONL et vérifier le contenu de `step_results` | ### 5.2 Pièges spécifiques à éviter 1. **RDP et les touches Windows** : en session RDP, `Win+R` peut être capturé par la machine locale au lieu de la machine distante. - **Solution** : dans le client RDP, options → Clavier local → "Appliquer les combinaisons de touches Windows : Sur le serveur distant" 2. **Notifications Windows** : une notification pop-up peut voler le focus pendant le replay. - **Solution** : activer le mode "Ne pas distrub" avant le test 3. **Windows Update** : un redémarrage intempestif pendant le test. - **Solution** : suspendre Windows Update temporairement 4. **Agent Windows déconnecté** : le replay est envoyé mais l'agent ne le reçoit pas. - **Solution** : vérifier la connexion avant chaque replay (dashboard → statut machine) 5. **Session shadow non fermée** : si `shadow_stop` n'a pas été appelé correctement, la session reste ouverte et peut interférer. - **Solution** : vérifier `agent_chat/state/` — aucune session ne doit être dans un état non-terminal avant de recommencer --- ## 6. Bonus — Learning pack portable ### 6.1 Structurer les artefacts POC Le risque : se retrouver avec des milliers de fichiers éparpillés entre `data/raw_sessions/`, `data/competences/`, `data/competence_verdicts/`, `agent_chat/state/`, et les screenshots. **Structure recommandée** pour un POC exportable : ``` learning-poc-/ ├── manifest.json # Métadonnées : date, machine, opérateur, version du code ├── competences/ │ ├── .yaml # Compétences persistées │ └── .yaml ├── verdicts/ │ └── verdicts.jsonl # Verdicts humains (copie du JSONL) ├── sessions/ │ ├── / │ │ ├── events.jsonl # Événements bruts │ │ └── screenshots/ # Screenshots (compressés) │ └── / ├── audit/ │ ├── promotions.jsonl # Audit de promotion (si applicable) │ └── test-log.md # Journal du test humain └── proofs/ ├── screenshot_restitution_*.png ├── screenshot_replay_*.png └── succes_*.md / echec_*.md ``` ### 6.2 Script d'export rapide ```bash #!/bin/bash # export_learning_poc.sh — créer un zip portable du POC DATE=$(date +%Y%m%d) DEST="learning-poc-${DATE}" mkdir -p "$DEST"/{competences,verdicts,sessions,audit,proofs} # Compétences candidate cp data/competences/candidate/*.yaml "$DEST/competences/" 2>/dev/null # Verdicts cp data/competence_verdicts/verdicts.jsonl "$DEST/verdicts/" 2>/dev/null # Audit cp data/competences/promotions.jsonl "$DEST/audit/" 2>/dev/null # Sessions récentes (dernières 24h) find data/raw_sessions/ -maxdepth 1 -mtime -1 -type d -exec cp -r {} "$DEST/sessions/" \; 2>/dev/null # States agent chat cp agent_chat/state/learn_*.json "$DEST/audit/" 2>/dev/null # Manifest cat > "$DEST/manifest.json" </dev/null || echo 'unknown')", "competences_count": $(ls "$DEST/competences/"*.yaml 2>/dev/null | wc -l), "verdicts_count": $(wc -l < "$DEST/verdicts/verdicts.jsonl" 2>/dev/null || echo 0) } EOF # Zip zip -r "${DEST}.zip" "$DEST/" echo "Pack créé : ${DEST}.zip" ``` ### 6.3 Export vers DGX Spark Le learning pack ainsi structuré est **autonome** : 1. Transférer le zip vers le DGX Spark : `scp learning-poc-*.zip user@dgx-spark:/path/to/imports/` 2. Importer côté DGX : le script d'import lit le `manifest.json`, place les YAML dans `data/competences/candidate/`, les verdicts dans `data/competence_verdicts/`, et les sessions dans `data/raw_sessions/` 3. Vérifier l'import : `ls data/competences/candidate/` + `tail data/competence_verdicts/verdicts.jsonl` **Invariant** : le learning pack ne contient **pas** de modèles Ollama, pas de dépendances Python, pas de fichiers système. Uniquement des artefacts métier (YAML, JSONL, screenshots, events). --- ## Annexe — Résumé visuel du flux ``` [IDLE] ──(apprends-moi)──> [LISTENING] ──> [WAITING_USER_STOP] │ (stop / j'ai fini) │ v [DONE] <── [PERSISTING] <── [NAMING] <── [ITERATING_FEEDBACK] <── [ANALYZING] │ │ │ (oui / corrige étape N) │ │ +──> YAML + verdict JSONL <── Dashboard: Tester ──> Replay supervisé │ Valide/Invalide/Incertain ``` --- *Document créé le 2026-06-01. À suivre pas-à-pas pendant la démo.*