# Audit BDD workflow Urgence_aiva_demo — 2026-05-10 Heure d'audit : 2026-05-10 15:42 CEST. Audit factuel post-dry-run 15:08 (replay_free_1957dd59), pas de modification BDD. Workflow_id : `wf_a38aeebea5e6_1778162737` BDD : `visual_workflow_builder/backend/instance/workflows.db` (SQLite 3.x). Périmètre : steps 8, 10, 12, 14, 18 (les blocages observés au runtime). --- ## 1. Schéma BDD pertinent ```sql CREATE TABLE workflows ( id VARCHAR(64) PRIMARY KEY, name, description, tags_json, trigger_examples_json, created_at, updated_at, is_active, source, review_status, review_feedback, reviewed_at ); CREATE TABLE steps ( id VARCHAR(64) PRIMARY KEY, workflow_id REFERENCES workflows(id), action_type, -- click_anchor, extract_text, key_combo, etc. "order" INTEGER, position_x, position_y, -- coords édition canvas (pas écran) parameters_json TEXT, -- ⚠ blob JSON : by_text, vlm_desc, visual_anchor.bounding_box, … anchor_id REFERENCES visual_anchors(id), label ); CREATE TABLE visual_anchors ( id VARCHAR(64) PRIMARY KEY, image_path, thumbnail_path, bbox_x, bbox_y, bbox_width, bbox_height, -- zone d'ancrage sur l'image source screen_width, screen_height, -- résolution d'enregistrement description, target_text, ocr_description, confidence_threshold, capture_method, created_at ); ``` **Pas de colonne** `resolve_order`, `verify_params`, `region_hint` dans la BDD : tout passe par `parameters_json` (champ texte JSON libre côté `steps`) si présent, sinon **defaults serveur**. --- ## 2. Métadonnées workflow | Champ | Valeur | |---|---| | name | Urgence_aiva_demo | | description | Démo GHT Sud 95 — workflow simplifié aligné sur maquette aiva-vision (1 DPI textarea + Justification + Analyser). Construit le 7 mai 2026. | | source | manual | | created_at | 2026-05-07 16:05:37 | | updated_at | 2026-05-07 16:05:37 | | is_active | 1 | | Total steps | 22 (DB) — 23 dans le replay (1 wait_before_start ajouté serveur) | --- ## 3. Dump des steps problématiques ### Step 8 — `Onglet Examens cliniques` (action_type=click_anchor) ```json parameters_json = {"by_text": "Examens cliniques"} ``` | Champ ancre | Valeur | |---|---| | anchor_id | `anchor_c3929b00816a_1778161050` | | bbox (x, y, w, h) | **(6, 467, 2538, 643)** — **TOUTE LA PAGE** | | image source | `anchor_c3929b00816a_1778161050_full.png` | | screen_width × height | 2560 × 1600 | | target_text | « Motif d'admission Examens cliniques Imagerie Notes médicales Synthèse Urgences Codage > Examens Cliniques Questionnaire Score Réponse significative … (~600 chars) » | ### Step 10 — `Onglet Imagerie` (action_type=click_anchor) ```json parameters_json = {"by_text": "Imagerie"} ``` | Champ ancre | Valeur | |---|---| | anchor_id | **`anchor_c3929b00816a_1778161050`** ⚠ **MÊME ANCRE QUE STEP 8** | | bbox | **(6, 467, 2538, 643)** — toute la page | | target_text | identique à step 8 (la même chaîne contenant tous les tabs) | ### Step 12 — `Onglet Notes médicales` (action_type=click_anchor) ```json parameters_json = {"by_text": "Notes médicales"} ``` | Champ ancre | Valeur | |---|---| | anchor_id | `anchor_0438bd2d9bdd_1778161174` | | bbox (x, y, w, h) | (444, 424, 146, 48) — **petite zone tabs** | | target_text | « ine Né(e) le 14/03/1947 I 77 ans **es Imagerie Notes médical** J scan, echograj phie » (OCR brut tronqué) | ### Step 14 — `Onglet Synthèse Urgences` (action_type=click_anchor) ```json parameters_json = { "by_text": "Synthèse Urgences", "visual_anchor": { "anchor_id": "anchor_6a2591e7c51c_1778229076", "bounding_box": {"x": 580, "y": 423, "width": 192, "height": 47} } } ``` | Champ ancre | Valeur | |---|---| | anchor_id | `anchor_6a2591e7c51c_1778229076` | | bbox (x, y, w, h) | (580, 423, 192, 47) — **petite zone tabs** | | target_text | « à 14/03/1947 I 77 ans I I Sexe F Arrivé **ie Notes médicales Synthèse Ur** » (OCR brut tronqué) | ### Step 18 — `Cliquer textarea DPI` (action_type=click_anchor, page codage.html) ```json parameters_json = { "by_text": "Coller ou saisir le dossier patient", "visual_anchor": { "anchor_id": "anchor_8d1822fbaad3_1778164480", "bounding_box": {"x": 41, "y": 690, "width": 301, "height": 32} } } ``` | Champ ancre | Valeur | |---|---| | anchor_id | `anchor_8d1822fbaad3_1778164480` | | bbox (x, y, w, h) | (41, 690, 301, 32) — petite zone textarea | | target_text | « **Coller ou saisir le dossier patient** Coller ou saisir le dossier patient » (placeholder italique gris) | --- ## 4. Tableau d'analyse — contrainte BDD vs laxiste | Step | Cible | Ancre restrictive ? | OCR contraint à zone ? | resolve_order ? | verify_params ? | Risque BDD | |---|---|---|---|---|---|---| | 8 Examens cliniques | tab Easily | ❌ bbox = full page (2538×643) | ❌ pas de region_hint | ❌ default serveur | ❌ default pHash | **élevé** : OCR libre matche n'importe quelle occurrence du mot | | 10 Imagerie | tab Easily | ❌ bbox = full page (**même ancre** que step 8) | ❌ | ❌ | ❌ | **élevé** : idem | | 12 Notes médicales | tab Easily | ✅ bbox 146×48 zone tabs | ⚠ contraint via anchor mais target_text imprécis (OCR tronqué) | ❌ | ❌ | **moyen** | | 14 Synthèse Urgences | tab Easily | ✅ bbox 192×47 zone tabs | ⚠ idem step 12 | ❌ | ❌ | **moyen** | | 18 textarea DPI | placeholder italique | ✅ bbox 301×32 textarea | ⚠ contraint mais cible non-OCRisable au runtime | ❌ | ❌ | **élevé** : placeholder gris non rendu pour OCR | **Constats généraux** : - Aucun step n'a de `resolve_order` explicite → tout passe par la cascade par défaut serveur (OCR-DIRECT → template → VLM) - Aucun step n'a de `verify_params` explicite → VERIFY = pHash global laxiste « any-change » - Steps 8 et 10 partagent la même ancre `anchor_c3929b00816a_1778161050` (anomalie d'enregistrement, ou choix volontaire mais alors la cible n'est pas zonée) --- ## 5. Diagnostic par step (BDD vs runtime observé) ### Step 8 — Examens cliniques - **BDD intention** : OCR libre sur full page, by_text="Examens cliniques" - **Runtime** : clic à (590, 447) — **dans la rangée tabs Easily**, OK - **Diagnostic** : **BDD imprécise mais runtime correct par chance** — docTR a renvoyé la première occurrence top-down qui se trouve être le tab. Fragile. ### Step 10 — Imagerie - **BDD intention** : MÊME ancre full page, by_text="Imagerie" - **Runtime** : clic à (606, **156**) — **bandeau Edge en haut**, ❌ raté - **Diagnostic** : **BDD fautive** — OCR libre sur la même grande zone retourne une occurrence "Imagerie" différente cette fois (probablement le titre Edge ou un breadcrumb URL). Pas de chance comme step 8. - **À ré-enregistrer** : avec bbox restreinte à la rangée tabs (~y 425-475) ### Step 12 — Notes médicales - **BDD intention** : ancre bbox 146×48 zone tabs, target_text imprécis - **Runtime** : clic à (516, 447) résolu par template_matching score 0.998 - **Diagnostic** : **BDD acceptable par chance** — la bbox est petite, template_matching a matché OK. Mais `target_text` enregistré pointe sur « **Imagerie Notes médical** » (cf. REPLAY_BLOCAGE_NOTES_MEDICALES_2026-05-08.md §6 anomalie 1 : la bbox est décalée d'un cran à gauche, le crop montre Imagerie au lieu de Notes médicales). - **À ré-enregistrer après-démo** pour fiabilité. ### Step 14 — Synthèse Urgences - **BDD intention** : ancre bbox 192×47 zone tabs, target_text imprécis - **Runtime** : clic à (689, 446) — REPORT success=True via template - **MAIS** : `t_synthese` extrait à 1110 chars **identique en taille à `t_imagerie`** → **le tab n'a probablement pas vraiment basculé**, le panneau de contenu n'a pas changé - **Diagnostic** : **BDD imprécise + VERIFY laxiste laisse passer un faux positif** — impossible de distinguer "tab Synthèse activé" vs "tab Synthèse cliqué mais l'app a ignoré l'event" avec le pHash global. - REPLAY_BLOCAGE_NOTES §6 anomalie 1 dit aussi que cette bbox crop "Notes médicales" pas "Synthèse Urgences" → ré-enregistrer. ### Step 18 — Cliquer textarea DPI - **BDD intention** : ancre bbox 301×32, target_text = placeholder italique « Coller ou saisir le dossier patient » - **Runtime** : OCR-DIRECT NON TROUVÉ, VLM échoué (21s), template échoué, retry échoué → mode apprentissage humain (timeout 120s) → final `target_not_found` - **Diagnostic** : **BDD fautive structurellement** — le placeholder italique gris d'un ``/`