# 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>_` (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/_full.png` | | `thumbnail_path` | ✅ (de facto) | PNG miniature, 100 % renseigné. Chemin `_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__`) | | `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.