# 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 ``/`