backup: snapshot post-démo GHT 2026-05-19
Backup état complet après enregistrement vidéo démo de bout en bout. À utiliser comme point de référence pour la consolidation post-démo. Changements majeurs de la session 18-19 mai : - AIVA-URGENCE : page autonome avec preset URL + auto-focus chain - Workflow Demo_urgence_3_db : merge linux_db + steps AIVA + pause humaine NoMachine - Bypass LLM (static_result / static_text) dans replay_engine pour démos déterministes sans appel Ollama - Fix api_stream:3013 — replay_paused au premier polling /next - dag_execute : lift duration_ms vers top-level pour wait runtime - NPM bypass auth /aiva-urgence/ via location ^~ (proxy_host/10.conf hors git) - scripts/cancel-replays.sh — workaround Stop VWB qui ne purge pas la queue Anchors visuels (468) forcés dans le commit pour garantir restorabilité. DB workflows actuelle + ~12 .bak DB de la journée incluses. Sujets identifiés pour consolidation post-démo (TODO) : 1. Bug VWB recapture anchor ne régénère pas le PNG 2. Léa client accumule état mémoire (restart périodique requis) 3. Stop VWB ne purge pas la queue serveur (lien manquant vers /replay/cancel) 4. Bug coord client mss tronqué 2560x60 → mapping Y cassé 5. delay_before/delay_after ignorés au runtime (fix partiel duration_ms) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
283
docs/handoffs/2026-05-16_handoff_demo3_workflow.md
Normal file
283
docs/handoffs/2026-05-16_handoff_demo3_workflow.md
Normal file
@@ -0,0 +1,283 @@
|
||||
# Handoff session 15-16 mai 2026 — Workflow Demo_urgence_3_db + linux_db
|
||||
|
||||
**Auteur** : Claude (session du 15 mai 22h jusqu'au 16 mai 2h)
|
||||
**Objectif** : permettre la reprise propre du travail (même session ou nouvelle session) jusqu'à la démo vidéo "demo 95" prévue **jeudi 21 mai 2026 (J-5)**.
|
||||
|
||||
---
|
||||
|
||||
## 1. Contexte démo
|
||||
|
||||
**Démo "95" / GHT Sud 95 — Paris 21 mai 2026** — format **vidéo enregistrée** (pas live).
|
||||
Périmètre recentré : **requalification forfait / hospitalisation** uniquement (Demo_urgence_2 v2 Excel abandonnée — Excel inadapté pour textes longs).
|
||||
|
||||
**Différenciateurs vidéo** :
|
||||
- 100 % vision (pas de DOM, pas d'API)
|
||||
- Multi-OS Windows ↔ Linux (NoMachine)
|
||||
- Bureau (Word) ET base (DBeaver/SQLite VM Ubuntu)
|
||||
|
||||
**Patient démo** : MOREL Catherine, IPP 25003284 (hardcodé partout)
|
||||
**Date démo** : 15/05/2026 (hardcodée)
|
||||
**Décision démo** : REQUALIFICATION_HOSPITALISATION
|
||||
**Somme récupérée** : 1750 € (hardcodée)
|
||||
|
||||
---
|
||||
|
||||
## 2. Workflows en base
|
||||
|
||||
DB : `/home/dom/ai/rpa_vision_v3/visual_workflow_builder/backend/instance/workflows.db`
|
||||
|
||||
### Demo_urgence_3_db — `wf_483910cdd851_1778750587` (workflow complet)
|
||||
|
||||
40 steps (ord 0-39). Source = Demo_urgence_2_interop (wf_56bf8fa2d332_1778666923, intact).
|
||||
|
||||
| ord | action | rôle |
|
||||
|---|---|---|
|
||||
| 0-14 | DPI extraction + t2a_decision + 2× llm_generate | Génère `t_*`, `dec`, `resume_patient`, `justification_t2a` |
|
||||
| 15 | Win+D | Basculer bureau Windows |
|
||||
| 16-28 | Word | Ouvre template `rapport_T2A_template.docx`, saisit IPP/date/décision/somme via Tab |
|
||||
| 29 | double_click LINUX_demo.nxs | Ouvre NoMachine vers VM Ubuntu (auto-login configuré par Dom) |
|
||||
| 30 | type_text "loli" | Mot de passe Linux (skippé si auto-login actif) |
|
||||
| 31 | Enter | Valider login |
|
||||
| 32-39 | DBeaver dans VM | Ouvre demo_95 2, console SQL, INSERT, exécute |
|
||||
|
||||
**Note** : ord 35 a `by_text="Tables"`, ord 36 a `by_text="demo_95"` (ajoutés en cours de session).
|
||||
|
||||
### linux_db — `wf_0786343fb2b7_1778879244` (sous-workflow de test rapide)
|
||||
|
||||
**Créé spécifiquement** pour itérer rapidement sur la partie NoMachine + DBeaver sans rejouer le DPI+LLM (5-10 min). Initialement 11 steps = ord 29-39 du Demo_urgence_3_db.
|
||||
|
||||
État actuel après nombreuses modifs Dom : **10 ou 11 steps** (à vérifier en début de session). Dom a notamment :
|
||||
- Supprimé certains steps
|
||||
- Ajouté un click sur menu "Éditeur SQL" + sous-menu (passage à 3 clics au lieu de Ctrl+Alt+Enter, plus robuste)
|
||||
- Réordonné via UPDATE SQL (les edges DAG visuelles VWB ne se sauvegardent pas)
|
||||
|
||||
**Commande pour voir l'état** :
|
||||
```bash
|
||||
sqlite3 /home/dom/ai/rpa_vision_v3/visual_workflow_builder/backend/instance/workflows.db \
|
||||
"SELECT \"order\" AS ord, action_type, COALESCE(label,'') AS label, json_extract(parameters_json, '\$.visual_anchor.bounding_box') AS bbox, json_extract(parameters_json, '\$.by_text') AS by_text FROM steps WHERE workflow_id='wf_0786343fb2b7_1778879244' ORDER BY \"order\";"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Modifs code appliquées (NON COMMITÉES côté Linux)
|
||||
|
||||
### `agent_v0/agent_v1/ui/chat_window.py` (Léa Windows)
|
||||
|
||||
Trois modifs UX (validées Dom : Q1=oui minimiser sur Annuler, Q2=500ms, Q3=clear visuel uniquement, Q4=bulle accueil effaçable) :
|
||||
|
||||
1. **Nouvelle méthode `_clear_chat_history()`** (vers ligne 870) : détruit les widgets enfants de `_msg_frame` à chaque pause. Ne touche pas à `self._messages` (RAM conservée pour debug).
|
||||
2. **Appel dans `_show_and_render`** : `self._clear_chat_history()` AVANT `_render_paused_bubble(payload)`.
|
||||
3. **Minimisation 500 ms** sur `_on_paused_resume` ET `_on_paused_abort` : `self._root.after(500, self._do_hide)`.
|
||||
|
||||
### `agent_v0/agent_v1/core/executor.py` (Léa Windows)
|
||||
|
||||
1. **Délai paste** (ligne 2579) : `time.sleep(0.05)` → `time.sleep(0.5)` pour laisser NoMachine sync le clipboard Windows → VM Ubuntu. **NE FONCTIONNE TOUJOURS PAS** — clipboard probablement non propagé du tout par NoMachine.
|
||||
|
||||
### `agent_v0/server_v1/resolve_engine.py` (serveur Linux)
|
||||
|
||||
1. **Constante drift** (ligne 2110) : `_RESOLUTION_MAX_DRIFT: 0.20` → `0.95`. Permet à l'élément d'être trouvé n'importe où à l'écran (esprit "100 % vision"). Service `rpa-streaming` redémarré, nouveau PID au démarrage (vérifier `systemctl --user status rpa-streaming`).
|
||||
|
||||
### Déploiements Windows effectués via SCP
|
||||
|
||||
- `chat_window.py` → `dom@192.168.1.11:C:/rpa_vision/agent_v1/ui/chat_window.py` ✓
|
||||
- `executor.py` → `dom@192.168.1.11:C:/rpa_vision/agent_v1/core/executor.py` ✓
|
||||
- Léa Windows **a été redémarrée** après les SCP (à confirmer pour la session du 16 mai)
|
||||
|
||||
**Convention notée** : à chaque modif d'un fichier client Windows, Claude fait le SCP automatiquement (mot de passe SSH `loli` cf. `reference_credentials.md`).
|
||||
|
||||
---
|
||||
|
||||
## 4. Modifs DB appliquées (workflows.db)
|
||||
|
||||
Liste exhaustive des UPDATE de la session :
|
||||
|
||||
1. **ord 29 source** (`step_5c81e5bdd20f_1778879250` historique) : `by_text="LINUX_demo"` (ne plus retrouver via faux positifs)
|
||||
2. **ord 35 source + ord 4 linux_db (anc.)** : `by_text="Tables"`
|
||||
3. **ord 36 source + ord 5 linux_db (anc.)** : `by_text="demo_95"`
|
||||
4. **ord 40 source — INSERT SQL** (`step_9cf99c5f2420_1778862183`) : ajout `"paste": true` au parameters_json
|
||||
5. **ord 5 linux_db (Ctrl+Alt+Enter)** : ajout `delay_before: 1500` ms pour laisser le focus s'établir après le clic demo_95 2 (peut être inutile maintenant que Dom passe par le menu)
|
||||
6. **Réordonnancement linux_db** : déplacement du clic demo_95 2 (ord 7) à ord 4 + décalage des suivants
|
||||
7. **Réordonnancement linux_db après ajout menu** : 3 nouveaux clic_anchor menu (ord 8/9/10 → 5/6/7), type_text + Ctrl+Enter décalés à 8/9
|
||||
8. **Retrait `paste`** sur le step type_text INSERT (paste:true ne fonctionnait pas → fallback frappe char-by-char)
|
||||
9. **Retrait `by_text="demo_95"`** sur le nouveau click demo_95 2 (ord 4 linux_db) car OCR matchait l'onglet `<demo_95 2> Script-1` en haut au lieu du Navigator à gauche
|
||||
|
||||
**Backups disponibles** dans `visual_workflow_builder/backend/instance/workflows.db.backup_*` :
|
||||
- `..._avant_dup_demo3` (création Demo_urgence_3_db)
|
||||
- `..._avant_paste_true` (avant UPDATE paste:true)
|
||||
- `..._avant_bytext_ord29` (avant by_text LINUX_demo)
|
||||
- `..._avant_bytext_demo95` (avant by_text demo_95 + Tables)
|
||||
- `..._avant_suppr_vwb31` (avant suppression Dom)
|
||||
- `..._avant_linux_db` (avant création linux_db)
|
||||
- `..._avant_reorder_linux_db` (avant 1er réordonnancement)
|
||||
- `..._avant_reorder_menu` (avant 2e réordonnancement)
|
||||
|
||||
---
|
||||
|
||||
## 5. Bugs / dette technique identifiés (À TRAITER POST-DÉMO)
|
||||
|
||||
### Critiques pour la démo vidéo
|
||||
|
||||
1. **paste:true ne fonctionne pas** entre Léa Windows et VM Ubuntu via NoMachine
|
||||
- Soit `win32clipboard.SetClipboardText()` plante silencieusement
|
||||
- Soit NoMachine ne propage pas le clipboard Windows → Ubuntu (probable)
|
||||
- **Investiguer** : vérifier NoMachine settings (Devices → Clipboard → cocher "Both directions")
|
||||
- **Fallback** : char-by-char (lent mais peut-être suffisant pour 1859 chars)
|
||||
|
||||
2. **Clics Léa n'atteignent pas toujours la VM Ubuntu** via NoMachine
|
||||
- Pattern : Léa clique côté Windows, l'agent reporte `success=True` mais `no_screen_change`
|
||||
- Chaque clic prend **2 min** côté agent (retries internes silencieux)
|
||||
- À ce rythme, le replay complet est inutilisable pour vidéo (25+ min)
|
||||
- **Hypothèse** : focus de fenêtre NoMachine instable, ou mode input non passthrough
|
||||
- **Workaround temporaire** : Dom intervient en supervision humaine (chaque step → bulle Léa → clic manuel + Continuer)
|
||||
|
||||
3. **Faux négatifs détecteur screen_change** : seuil `global=0.002%` considéré "aucun changement" sur les clics de menu qui pourtant ouvrent quelque chose visuellement. Déclenche retries inutiles.
|
||||
|
||||
4. **Bug `get_target_memory_store` import** dans `replay_memory.py` :
|
||||
```
|
||||
Learning: échec stockage target_memory: cannot import name 'get_target_memory_store'
|
||||
```
|
||||
Non bloquant mais empêche l'apprentissage des corrections humaines.
|
||||
|
||||
5. **VLM Quick Find exception** : `'int' object has no attribute 'get'` — fallback OK mais à corriger.
|
||||
|
||||
### Bugs UX VWB
|
||||
|
||||
6. **Bouton "Stop" disparaît** côté VWB UI quand le replay reste actif côté serveur (désynchro). Confondant.
|
||||
|
||||
7. **Bouton vert "Exécuter"** appelle un mini-runtime legacy (`real_demo.py`) qui ne supporte que click/type/wait. Pour le replay complet, **toujours cliquer le bouton bleu "→ Windows"**.
|
||||
|
||||
8. **DAG edges visuelles** dans VWB ne se sauvegardent pas → l'ordre visuel des flèches ne reflète pas l'ordre réel (basé sur `steps.order`). Confusing pour l'utilisateur.
|
||||
|
||||
9. **Bannière Windows 11 "Aucun périphérique audio disponible"** (grise) persistante en haut → VLM la décrit comme "popup, dialog box, confirmation, or erro..." (faux). Pollue les diagnostics.
|
||||
|
||||
### Bugs Léa
|
||||
|
||||
10. **Démarrage Léa très lent** : 3-6 minutes au lancement (chargement modèles ML probablement). À investiguer.
|
||||
|
||||
11. **Capture VWB** : si Léa Windows n'est pas lancée, le fallback `mss` sur Wayland échoue (`XGetImage failed`). Le bouton "Capturer" dans CapturePanel a un fallback local Linux qui ne marche plus sur Wayland natif (Chrome moderne).
|
||||
|
||||
---
|
||||
|
||||
## 6. État infra runtime (vérifications à faire en début de session)
|
||||
|
||||
- **Service `rpa-streaming`** (port 5005) : `systemctl --user status rpa-streaming` → doit être active. Si redémarré entre temps, PID différent du 308418 mentionné.
|
||||
- **VWB backend** : port 5002, lancé via `app.py` (PID ≈ 140052 au moment du handoff).
|
||||
- **VWB frontend** : port 3002, Vite/React.
|
||||
- **Léa Windows** : sur `192.168.1.11`, tray icon visible si lancée. Pour confirmer connexion = polls `/api/v1/traces/stream/replay/next` depuis 192.168.1.11 dans les logs serveur.
|
||||
- **NoMachine** : configuré avec auto-login Ubuntu activé (skip lock screen). Clipboard partage **probablement non bidirectionnel** — à vérifier.
|
||||
|
||||
---
|
||||
|
||||
## 7. Reprise demain — checklist proposée
|
||||
|
||||
### Étape 0 — Vérification état
|
||||
|
||||
```bash
|
||||
# Vérifier services
|
||||
systemctl --user status rpa-streaming
|
||||
ps aux | grep -E "app.py|api_stream" | grep -v grep
|
||||
|
||||
# Vérifier état workflows
|
||||
sqlite3 /home/dom/ai/rpa_vision_v3/visual_workflow_builder/backend/instance/workflows.db \
|
||||
"SELECT id, name, updated_at FROM workflows WHERE name LIKE 'Demo_urgence_3%' OR name LIKE 'linux_db';"
|
||||
|
||||
# Vérifier modifs code non commitées
|
||||
cd /home/dom/ai/rpa_vision_v3 && git status --short | grep -E "chat_window|executor|resolve_engine"
|
||||
```
|
||||
|
||||
### Étape 1 — Résoudre le bug "clics ne traversent pas NoMachine"
|
||||
|
||||
C'est le bloqueur n°1. Sans ça, pas de démo vidéo possible.
|
||||
|
||||
**Diagnostic Dom (16 mai 2h)** : « C'est NoMachine côté Windows qui ne répond plus comme il faut. » À investiguer en priorité demain (mise à jour NoMachine récente ? Config qui a sauté ? Process zombi ? Réinstall ?).
|
||||
|
||||
**Pistes** :
|
||||
- Activer le partage clipboard NoMachine bidirectionnel (Settings → Devices → Clipboard)
|
||||
- Vérifier que la fenêtre NoMachine reste plein écran tout au long
|
||||
- Tester un autre client display (RDP natif Windows ?)
|
||||
- Configurer Léa pour focus la fenêtre NoMachine avant chaque action (mécanisme à ajouter dans executor.py ?)
|
||||
|
||||
### Étape 2 — Si NoMachine OK : tester linux_db de bout en bout
|
||||
|
||||
Cible : run linux_db en ≤ 2 min sans intervention manuelle.
|
||||
|
||||
### Étape 3 — Run complet Demo_urgence_3_db
|
||||
|
||||
Cible : 1 run propre du DPI au INSERT SQL. Enregistrer cette session pour la vidéo.
|
||||
|
||||
### Étape 4 — Post-démo
|
||||
|
||||
Traiter la dette listée section 5 dans l'ordre d'importance.
|
||||
|
||||
---
|
||||
|
||||
## 8. Annexes
|
||||
|
||||
### IDs critiques
|
||||
|
||||
- **Workflow Demo_urgence_3_db** : `wf_483910cdd851_1778750587`
|
||||
- **Workflow linux_db** : `wf_0786343fb2b7_1778879244`
|
||||
- **Workflow source Demo_urgence_2_interop** (intact) : `wf_56bf8fa2d332_1778666923`
|
||||
- **IPP démo** : `25003284`
|
||||
- **Step INSERT SQL Demo_urgence_3_db** : `step_9cf99c5f2420_1778862183` (ord 40, paste:true)
|
||||
- **Service streaming** : `rpa-streaming` user systemd
|
||||
|
||||
### Variables runtime produites par le workflow
|
||||
|
||||
- `t_extraction_liste` (extract_table ord 0)
|
||||
- `t_motif_admission`, `t_examen_clinique`, `t_imagerie`, `t_notes_medicales`, `t_synthese_urgences` (extract_text_scroll)
|
||||
- `dec` (objet) : `dec.decision`, `dec.decision_court`, `dec.preuve_critere1/2/3` (t2a_decision ord 12, model `gemma4:31b-cloud`)
|
||||
- `resume_patient` (llm_generate ord 13)
|
||||
- `justification_t2a` (llm_generate ord 14)
|
||||
|
||||
### Fichiers source modifiés (non commités)
|
||||
|
||||
```
|
||||
modified: agent_v0/agent_v1/ui/chat_window.py # clear+minimize Léa
|
||||
modified: agent_v0/agent_v1/core/executor.py # paste delay 0.5s
|
||||
modified: agent_v0/server_v1/resolve_engine.py # drift 0.95
|
||||
```
|
||||
|
||||
### Schema DB rapide
|
||||
|
||||
- Table `steps` : `id, workflow_id, action_type, "order" (réservé), position_x, position_y, parameters_json (JSON), anchor_id (FK), label, created_at, updated_at`
|
||||
- Table `workflows` : `id, name, description, tags_json, trigger_examples_json, created_at, updated_at, is_active, source, review_status, review_feedback, reviewed_at`
|
||||
- VWB affiche `order` en 1-indexed (VWB N = DB N-1)
|
||||
|
||||
### Commandes utiles
|
||||
|
||||
```bash
|
||||
# Logs streaming (filtrés)
|
||||
journalctl --user-unit=rpa-streaming --since "10 minutes ago" --no-pager | \
|
||||
grep -vE "stream/image|/replay/next|GET /health|EDS-NLP" | tail -30
|
||||
|
||||
# Backup DB
|
||||
cp /home/dom/ai/rpa_vision_v3/visual_workflow_builder/backend/instance/workflows.db{,.backup_$(date +%Y-%m-%d_%H%M%S)_label}
|
||||
|
||||
# SCP fichier vers Léa Windows
|
||||
SSHPASS='loli' sshpass -e scp -o StrictHostKeyChecking=no \
|
||||
/home/dom/ai/rpa_vision_v3/agent_v0/agent_v1/ui/chat_window.py \
|
||||
dom@192.168.1.11:C:/rpa_vision/agent_v1/ui/chat_window.py
|
||||
|
||||
# Forcer reprise replay côté serveur
|
||||
curl -X POST "http://localhost:5005/api/v1/traces/stream/replay/<replay_id>/resume"
|
||||
```
|
||||
|
||||
### Trois questions Q1/Q2/Q3 Léa chat (déjà tranchées)
|
||||
|
||||
- Q1 : minimiser aussi sur Annuler ? → **oui**
|
||||
- Q2 : délai minimisation ? → **500 ms**
|
||||
- Q3 : purger `self._messages` RAM ? → **non** (clear visuel uniquement, RAM gardée pour debug)
|
||||
- Q4 (bulle accueil RGPD) : effaçable au 1er pause ? → **oui** OK
|
||||
|
||||
---
|
||||
|
||||
## 9. Posture pour la reprise
|
||||
|
||||
**Si nouvelle session Claude** : commencer par lire ce handoff EN ENTIER + `MEMORY.md` + `CLAUDE.md`. Ne pas relancer de modifs sans vérifier l'état actuel de la DB et du code.
|
||||
|
||||
**Si même session Claude** (ce qui est déjà perdu probablement) : reprendre directement.
|
||||
|
||||
**Priorité absolue** : résoudre le bug "clics NoMachine ne traversent pas". Sans ça, la démo vidéo est compromise.
|
||||
|
||||
**Démo J-5** : jeudi 21 mai. Marge de manœuvre étroite. Si NoMachine est un blocage durable, envisager un plan B (un seul OS = tout sous Linux ? ou tout sous Windows ?).
|
||||
Reference in New Issue
Block a user