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:
164
docs/handoffs/2026-05-13_inventaire_anchors_interop.md
Normal file
164
docs/handoffs/2026-05-13_inventaire_anchors_interop.md
Normal file
@@ -0,0 +1,164 @@
|
||||
# Inventaire anchors — préparation interop Excel
|
||||
|
||||
**Date** : 2026-05-13
|
||||
**Contexte** : Préparation du workflow `Demo_urgence_2_interop` (id `wf_56bf8fa2d332_1778666923`). Ce document inventorie les ancres VWB nécessaires pour remplacer les 5 steps « UI Codage Easily » supprimés par des étapes d'export Excel.
|
||||
**Source** : table `visual_anchors` de `visual_workflow_builder/backend/instance/workflows.db` (150 ancres au total).
|
||||
|
||||
---
|
||||
|
||||
## 1. Structure d'un anchor (schéma `visual_anchors`)
|
||||
|
||||
```sql
|
||||
CREATE TABLE visual_anchors (
|
||||
id VARCHAR(64) NOT NULL PRIMARY KEY,
|
||||
image_path VARCHAR(512),
|
||||
thumbnail_path VARCHAR(512),
|
||||
bbox_x FLOAT,
|
||||
bbox_y FLOAT,
|
||||
bbox_width FLOAT,
|
||||
bbox_height FLOAT,
|
||||
screen_width INTEGER,
|
||||
screen_height INTEGER,
|
||||
description TEXT,
|
||||
confidence_threshold FLOAT,
|
||||
created_at DATETIME,
|
||||
capture_method VARCHAR(64),
|
||||
target_text TEXT,
|
||||
ocr_description TEXT
|
||||
);
|
||||
```
|
||||
|
||||
### Champs et rôle
|
||||
|
||||
| Champ | Obligatoire | Rôle |
|
||||
|---|---|---|
|
||||
| `id` | ✅ | Format observé : `anchor_<12 hex>_<timestamp Unix s>` (ex. `anchor_c07eeb32f46e_1778497407`) |
|
||||
| `image_path` | ✅ (de facto) | PNG plein du crop d'ancre. 100 % des 150 ancres l'ont. Chemin absolu vers `visual_workflow_builder/backend/data/anchors/<id>_full.png` |
|
||||
| `thumbnail_path` | ✅ (de facto) | PNG miniature, 100 % renseigné. Chemin `<id>_thumb.png` dans le même dossier |
|
||||
| `bbox_x`, `bbox_y`, `bbox_width`, `bbox_height` | ✅ | Coordonnées de la bounding box dans la résolution de référence. Toutes les ancres ont une bbox |
|
||||
| `screen_width`, `screen_height` | ✅ | Résolution de l'écran sur lequel l'ancre a été enregistrée. Permet la normalisation pour le matching à toute résolution |
|
||||
| `description` | ⚠️ Optionnel | Description textuelle, souvent « Button labeled "..." ». Vide pour 45/150 ancres |
|
||||
| `confidence_threshold` | ✅ | Seuil pour template matching. **Valeur unique observée : 0.8** sur les 150 ancres |
|
||||
| `created_at` | ✅ | Timestamp ISO |
|
||||
| `capture_method` | ✅ | **Valeur unique observée : `screen_capture`** sur les 150 ancres |
|
||||
| `target_text` | ⚠️ Optionnel | Texte OCR vu **autour** de l'ancre au moment de la capture. Sert au matching `by_text` quand l'ancre est élargie. Vide pour 45/150 |
|
||||
| `ocr_description` | ⚠️ Optionnel | Souvent doublon de `description`. Vide pour 45/150 |
|
||||
|
||||
### Liaison avec `steps`
|
||||
|
||||
```
|
||||
steps.anchor_id ───▶ visual_anchors.id (FK, NULL-able)
|
||||
```
|
||||
|
||||
Un step `click_anchor` typique réfère son ancre par `anchor_id`, ET embarque aussi une copie compactée dans `parameters_json.visual_anchor` (champs `anchor_id`, `bounding_box`). Le `by_text` est lui dans `parameters_json.by_text` au niveau step (pas dans l'ancre). Voir exemple ord 4 :
|
||||
|
||||
```json
|
||||
{
|
||||
"visual_anchor": {
|
||||
"anchor_id": "anchor_c07eeb32f46e_1778497407",
|
||||
"bounding_box": {"x": 264, "y": 421, "width": 199, "height": 51}
|
||||
},
|
||||
"by_text": "Examens cliniques"
|
||||
}
|
||||
```
|
||||
|
||||
### Distribution de la table
|
||||
|
||||
| Critère | Valeurs |
|
||||
|---|---|
|
||||
| Total anchors | 150 |
|
||||
| Fichiers sur disque (`data/anchors/`) | 370 PNGs (150 × 2 = 300 attendus, ~70 orphelins) |
|
||||
| `capture_method` | 100 % `screen_capture` |
|
||||
| `confidence_threshold` | 100 % `0.8` |
|
||||
| Résolution de référence | 2560×1600 : 98 ancres • 1920×1080 : 49 • 320×180 : 3 (atypique) |
|
||||
| Sans `target_text` | 45 / 150 |
|
||||
| Sans `description` | 45 / 150 |
|
||||
|
||||
---
|
||||
|
||||
## 2. Ancres référencées par le workflow source `Demo_urgence_2`
|
||||
|
||||
| Ord | action_type | anchor_id | bbox (x,y,w,h) | OCR `target_text` (court) |
|
||||
|---:|---|---|---|---|
|
||||
| 0 | extract_table | `anchor_90aab00906b5_1778493250` | (19, 505, 2529, 488) | Tableau liste patients (zone full liste IPP/NOM/Date…) |
|
||||
| 2 | click_anchor | `anchor_79c26617976d_1778493882` | (30, 548, 101, 30) | `25003284` cellule IPP |
|
||||
| 4 | click_anchor | `anchor_c07eeb32f46e_1778497407` | (264, 421, 199, 51) | onglet `Examens cliniques` |
|
||||
| 6 | click_anchor | `anchor_e31b93822caa_1778497559` | (477, 429, 109, 35) | onglet `Imagerie` |
|
||||
| 8 | click_anchor | `anchor_b8bf39376b8a_1778497633` | (612, 423, 183, 48) | onglet `Notes médicales` |
|
||||
| 10 | click_anchor | `anchor_e757dbf3f22f_1778497837` | (802, 423, 214, 46) | onglet `Synthèse Urgences` |
|
||||
| 13 | click_anchor | `anchor_8d4b9cf0207c_1778575835` | (833, 404, 230, 49) | onglet `Codage` |
|
||||
| 15 | click_anchor | `anchor_8e72328ac1f1_1778575896` | (20, 381, 338, 131) | textarea `Coller ou saisir le dossier patient` |
|
||||
| 18 | click_anchor | `anchor_de15b10a848b_1778498168` | (1350, 981, 619, 31) | textarea `Justification de la décision` |
|
||||
|
||||
**Toutes en référence 2560×1600** (résolution Léa Windows actuelle).
|
||||
|
||||
Pattern observé pour un click sur libellé simple (cas ord 4 — `Examens cliniques`) :
|
||||
- Crop ~200×50 autour du libellé
|
||||
- `target_text` ≈ contexte OCR voisin (libellés alentours) pour aider le matcher hybride
|
||||
- `description` ≈ libellé propre (« Button labeled "Examens cliniques" »)
|
||||
- `confidence_threshold = 0.8`
|
||||
|
||||
---
|
||||
|
||||
## 3. Ancres existantes pour le besoin interop Excel
|
||||
|
||||
Requête effectuée sur `target_text`, `description`, `ocr_description` avec les patterns : `excel`, `.xlsx`, `xls`, `codage_urgence`, `bureau`, `desktop`.
|
||||
|
||||
**Résultat : aucune ancre trouvée.**
|
||||
|
||||
| Besoin interop | Ancre existante ? | Action requise |
|
||||
|---|---|---|
|
||||
| Icône bureau Windows (générique, pour ouvrir l'Explorateur ou poser le fichier sur bureau) | ❌ | **À créer** en enregistrement VWB |
|
||||
| Cellule Excel (entête ou première cellule de saisie) | ❌ | **À créer** — dépend du gabarit du `.xlsx` |
|
||||
| Fichier `codage_urgence.xlsx` (icône bureau ou ligne Explorateur) | ❌ | **À créer** — le fichier doit d'abord exister sur le bureau Windows |
|
||||
| Bouton « Enregistrer » Excel | ❌ | **À créer** si on passe par Ctrl+S, sinon pas nécessaire |
|
||||
| Onglet/bouton Excel « Fichier » ou « Ouvrir » | ❌ | **À créer** seulement si scénario UI complet (vs server-side openpyxl) |
|
||||
|
||||
---
|
||||
|
||||
## 4. Procédure de création d'une ancre
|
||||
|
||||
### Option A — Côté serveur (recommandée si pure I/O fichier)
|
||||
|
||||
Si l'export Excel est réalisé via une action serveur (openpyxl côté Linux, fichier déposé sur partage SMB / synchronisé via OwnCloud), **aucune ancre Léa Windows n'est nécessaire**. Le workflow se termine après `llm_generate justification_t2a` par un step serveur de type à définir (ex. nouveau `export_excel_row` à câbler, ou via `_handle_*` existant).
|
||||
|
||||
Avantages :
|
||||
- Pas d'ancres à enregistrer
|
||||
- Pas de dépendance à la résolution écran
|
||||
- Robuste, déterministe
|
||||
|
||||
### Option B — Côté UI Léa Windows (si la démo doit montrer Excel ouvert)
|
||||
|
||||
Si on veut **visuellement** voir Léa ouvrir Excel et coller les données, il faut enregistrer les ancres via le mode enregistrement VWB sur la machine cible (Windows 192.168.1.11, résolution 2560×1600 cohérente avec les 98 ancres existantes du workflow source).
|
||||
|
||||
Étapes type :
|
||||
1. Préparer le fichier `codage_urgence.xlsx` sur le bureau Windows (gabarit prêt avec entêtes : IPP, Décision, Résumé, Justification, etc.)
|
||||
2. Lancer VWB en mode enregistrement, viser machine 192.168.1.11
|
||||
3. Ancres à capturer dans l'ordre du scénario (à valider avec Dom) :
|
||||
- Ancre 1 : icône `codage_urgence.xlsx` sur le bureau (pour double-clic d'ouverture). **⚠️ rappel : `double_click` non implémenté côté Léa, fallback = 2 click rapprochés ou key_combo `["alt", "f4"]` après ouverture par défaut.**
|
||||
- Ancre 2 : cellule cible de la première colonne (IPP) — varie selon le gabarit
|
||||
- Ancre 3 : éventuel bouton « Enregistrer » ou ancre de validation
|
||||
4. Pour chaque ancre : laisser VWB capturer le crop, vérifier que `target_text`, `description`, bbox sont cohérents avant validation
|
||||
|
||||
### Champs minima à fournir lors de la création
|
||||
|
||||
| Champ | Valeur cible |
|
||||
|---|---|
|
||||
| `id` | auto-généré (`anchor_<hex>_<ts>`) |
|
||||
| `image_path` + `thumbnail_path` | auto-générés par VWB |
|
||||
| `bbox_x/y/width/height` | définis par la sélection visuelle de l'utilisateur |
|
||||
| `screen_width/height` | **2560 × 1600** (cohérence avec ancres existantes) |
|
||||
| `confidence_threshold` | 0.8 (valeur unique observée dans la table) |
|
||||
| `capture_method` | `screen_capture` |
|
||||
| `target_text` | OCR autour de l'ancre — auto-rempli par VWB |
|
||||
| `description` | optionnel, ex. « Icône fichier codage_urgence.xlsx sur le bureau » |
|
||||
|
||||
---
|
||||
|
||||
## 5. Récapitulatif
|
||||
|
||||
- **Structure d'ancre** : 15 champs, dont **9 obligatoires** (id, image_path, thumbnail_path, 4 bbox, 2 résolutions de réf, confidence, capture_method) et **4 fortement recommandés** (description, target_text, ocr_description, created_at). Référence dans `steps.anchor_id`.
|
||||
- **Réutilisable directement** : les 8 ancres `click_anchor` du workflow source restent utilisées par `Demo_urgence_2_interop` (anchor_id partagé, FK).
|
||||
- **À créer** : 0 si **option A** (export Excel server-side via openpyxl) ; **2 à 4 ancres** si **option B** (Léa ouvre et remplit Excel à l'écran).
|
||||
|
||||
**Décision attendue de Dom** : choisir entre option A (server-side) ou B (UI Léa) avant de poursuivre la conception des steps Excel.
|
||||
Reference in New Issue
Block a user