# Handoff session 2026-05-06 — démo GHT Sud 95 (J-2) **Auteur :** Claude (session précédente, contexte saturé) **Pour :** Claude (nouvelle session) **Démo :** dans ~2 jours, pour DSI Carvella + DIM/TIM/DG GHT Sud 95 **Branche git :** `feature/feedback-bus` --- ## 🎯 Objectif de la nouvelle session Finir la prep démo : terminer corrections `data.js` + structurer onglet Imagerie + accompagner Dom sur l'enregistrement workflow Urgence_unit + tests E2E. --- ## 📊 État actuel — ce qui est FAIT ### Code & infrastructure - ✅ **Maquette aiva-vision** déployée : `https://urgence.labs.laurinebazin.design/codage.html?id=XXX` + service systemd `rpa-mockup-easily` (Flask, port 8765) - ✅ **Backend `/api/analyse`** branché sur `core.llm.t2a_decision.analyze_dpi` (qwen2.5:7b par défaut) - ✅ **Maquette codage.html refondue** avec layout aiva-vision 2 colonnes + auto-trigger paste - ✅ **5e onglet "Imagerie"** ajouté côté UI (HTML + JS) — mais **`data.js` pas encore alimenté** (sauf le champ vide qui est traité comme "Aucun examen") - ✅ **Pipeline Léa orchestrateur** dans `agent_chat/urgences_orchestrator.py` (NLP gemma3:1b + thread + boucle + synthèse) — fonctionne en bout-en-bout, validé matin du 2026-05-05 - ✅ **`extract_table` backend** dans `core/llm/ocr_extractor.py` + `agent_v0/server_v1/replay_engine.py` (regex IPP `^25\d{6}$`) — testé OK 11/11 sur capture liste patients - ✅ **Préchargement EasyOCR au boot** du streaming server (3.8s, log confirmé) — fini le cold start qui bloquait 2 min - ✅ **Templating `{{patient_id}}`** sur `by_text` dans replay_engine + variables runtime initiales via `ReplayRequest.variables` - ✅ **Agent V1 mis à jour** sur PC Windows (32 fichiers .py, hashes vérifiés, compile clean) — 2026-05-04 - ✅ **Catalogue de réflexes** (`gesture_catalog.py`) utilisé par l'orchestrateur (composition réflexes + workflows appris, pas de hardcode) ### Bench LLM — 18 modèles testés - ✅ Rapport complet : `docs/BENCH_T2A_DECISION_11DOSSIERS.md` - 🥇 **`gemma3:27b-cloud` : 8/11 (73%)** sur vérité-terrain corrigée — recommandé démo - 🥈 `qwen3:8b` : 7/11 (64%) — backup local, 7.6s/dossier, 5 GB → tient large dans 12 GB GPU - ⚠️ Bench fait sur DPI partiellement fictifs (cf. revue Pauline) → ré-évaluer après corrections data.js ### Documentation produite - `docs/BENCH_T2A_DECISION_11DOSSIERS.md` — bench 18 modèles - `docs/BENCH_MINI_LLM_NLP.md` — bench gemma3:1b vainqueur (NLP commande chat) - `docs/REVUE_DOSSIERS_PAULINE.md` — revue 11 dossiers vs captures (fait par sous-agent, **avec quelques inexactitudes** : "médecins du sport 0559447669" remonté comme inventé, en réalité présent dans la capture) - `docs/POINTS_SUSPECTS_PAULINE.md` — synthèse pour visio Pauline (méthodo : on ne signale PAS les noms anonymisés, on focus hallucinations cliniques + constantes + imagerie) - `docs/MAIL_PAULINE_AVANT_VISIO.md` — mail-template à adapter ### Mémoires importantes (`~/.claude/.../memory/`) - `feedback_anonymisation_stricte.md` ⭐ — règle absolue : anonymiser = remplacement chirurgical des identités, **JAMAIS réécrire le contenu clinique**. Erreur historique : "anhydrose" vs "ankylose" sur 25003475 - `feedback_lea_reflexes_catalog.md` — utiliser `gesture_catalog.py`, ne pas hardcoder Win+R+type+Enter - `feedback_auth_dialogs_runtime.md` — Windows Hello / Basic Auth bloquent le replay, anticiper avant chaque démo client - + toutes les feedbacks existantes dans `MEMORY.md` ### Corrections data.js DÉJÀ FAITES 1. **25003475** (UHCD aura migraineuse) — 3 hallucinations cliniques graves corrigées : - `symptomes_orientation` : "Migraines de membre" → "**Faiblesse** de membre" - `notes_paramedicales[0]` (03:09) : "Pansement compressif possible si perfusé" → "**--> RAD possible. dé perfusé**" - `notes_medicales[1]` (Histoire maladie) : "anhydrose au talon supérieur" → "**ankylose du membre supérieur gauche**" 2. **25151530** (Forfait colique néphrétique) : - "TDM sans injection" → "**TDM avec injection**" (2 occurrences) - Histoire de la maladie enrichie avec **ATCD RGO + TTT ESOMEPRAZOLE** 3. **`server.py` `VERITES_TERRAIN`** : 25003284 reclassé `FORFAIT_URGENCE` (sortie domicile en 3h37, J12.1 VRS) 4. **`app.js` signes_vitaux** : adapté pour itérer sur N colonnes dynamiquement (au lieu de v1/v2 fixe). **MAIS** `data.js` a toujours 2 cols partout → rétrocompatible. --- ## ❌ Ce qui RESTE à faire (priorité décroissante) ### 🔴 PRIORITÉ 1 — corrections data.js (1-2h) #### Constantes vitales tronquées (4 dossiers) Captures Pauline source : `/home/dom/Téléchargements/Exemples Dossiers UHCD - Forfaits (1)/Exemples Dossiers UHCD - Forfaits/[UHCD|FORFAITS]//` | IPP | Actuel data.js | Capture | Cols à ajouter | Priorité | |---|---|---|---|---| | 25003364 | 2 cols (21:02 + 14:45) | 4 cols | 19:45 (volume miction 700) + 18:44 (T 71, FC 87, PA 168/92, débit O2 2L) | 🟠 | | 25005866 | 2 cols (10:56 + 23:01) | 5 cols | 08:20, 06:25, 02:00 (surveillance neuro post-trauma) | 🔴 grave | | 25048485 | 2 cols (12:09 + 10:52) | 5 cols | 10:58, 10:54, 10:53 + ligne PA Latéralité | 🔴 grave | | 25151530 | 2 cols (06:41 + 03:25) | 7 cols | 08:15, 07:37, 06:00, 04:45, 04:01 (évolution douleur EN: 7→0→5→10→6→4) | 🔴 très grave | **Format à adopter** : passer de `{item, v1, v2}` à `{item, v1, v2, v3, v4, ...}`. `app.js` itère déjà dynamiquement sur N cols. #### Imagerie à structurer (7 dossiers) Le champ `imagerie: [{date, type, par, role, horodatage, contenu}, ...]` est lu par `renderImagerie()` dans `app.js` (déjà branché). | IPP | CR à déplacer | Source actuelle data.js | |---|---|---| | 25003284 | RX thorax (signé Dr LAURENT Charles) | `notes_medicales[3]` | | 25003364 | RX pulmonaire (foyer condensation lobaire D) | `notes_medicales[0]` | | 25003475 | Scanner cérébral sans injection (normal) | `notes_medicales[0]` | | 25005866 | 3 examens : TDMc 01:53 + RX thorax 01:54 + TDMc contrôle 10:18 | `notes_medicales[1, 2]` | | 25012257 | TDM AP sans injection (allergie iode) + ECG | `notes_medicales[0]` | | 25056615 | Scanner AP avec injection (CR complet) | `notes_medicales[0]` | | 25151530 | Scanner AP avec injection | `notes_medicales[1]` | **Règle** : extraire le CR du `notes_medicales` (ou autre source), le placer dans `imagerie` **mot pour mot** (procédure stricte). Le retirer de `notes_medicales` si entièrement déplacé OU laisser une mention "voir onglet Imagerie". #### Enrichir 25048485 (2 motifs CTCG) Captures montrent 2 motifs distincts le **même jour 28/02/2025** : 1ère CTCG le matin 9h15, 2e CTCG l'après-midi (récidive). data.js modélise UN seul passage 10:40→17:30 → cohérent (le patient a été gardé entre les 2). **Action** : enrichir l'histoire de la maladie pour mentionner explicitement les 2 épisodes (matin + après-midi). **Pas une question Pauline** — juste clarification de présentation. ### 🟠 PRIORITÉ 2 — re-bench T2A après corrections (30 min) Après corrections data.js, relancer `bench_t2a_cloud.py` (top 5 modèles seulement) pour avoir les chiffres réels. Les scripts existent dans `/tmp/bench_t2a*.py`. Mettre à jour `BENCH_T2A_DECISION_11DOSSIERS.md`. ### 🟠 PRIORITÉ 3 — workflow Urgence_unit (Dom, sur PC Windows) Dom enregistre le workflow VWB qui traite 1 dossier de bout-en-bout : 1. Click sur lien IPP `{{patient_id}}` (variabilisé) 2. Navigation dans les onglets dossier (Motif, Examens, Imagerie, Notes médicales, Synthèse) 3. extract_text par onglet → DPI consolidé 4. Click "Coder >" → arrive sur aiva-vision 5. type_text DPI dans `#dpi-input` (auto-trigger analyse) 6. Wait + extract_text décision aiva-vision 7. Click "Liste patients" pour revenir **Tu peux le faire MAINTENANT** (data.js stable, aiva-vision opérationnelle, agent V1 à jour). Mais **attendre que les corrections data.js soient finies** est plus sûr (sinon les anchors visuels peuvent se déplacer si la table signes vitaux gagne des colonnes). ### 🟡 PRIORITÉ 4 — visio Pauline (pour les questions ouvertes) Pauline doit répondre à 4-5 questions critiques : 1. **25048485** : confirmer 2 épisodes le même jour ✓ (pas urgent, je gère seul) 2. **25005866** : "médecins du sport 0559447669" — Pauline avait dit inventé, le sous-agent a vu présent → contradiction à trancher 3. **25003284 étiquette workflow** : "UHCD asthme" → "Pneumopathie VRS" ? 4. **Onglet Imagerie** : niveau de détail attendu Mail-template prêt : `docs/MAIL_PAULINE_AVANT_VISIO.md` ### 🟡 PRIORITÉ 5 — Tests E2E (J-1, dernier jour) 10 répétitions du scénario démo complet (chat Léa "traite-moi 3 dossiers" → orchestration → boucle → synthèse). --- ## 🚨 Contraintes critiques 1. **Procédure d'anonymisation stricte** (cf. `feedback_anonymisation_stricte.md`) : pour toute correction data.js, **NE JAMAIS reformuler/synthétiser** le contenu clinique. Remplacer chirurgicalement les identités/dates uniquement. Erreur historique grave : "anhydrose"/"ankylose". 2. **Catalogue de réflexes** (cf. `feedback_lea_reflexes_catalog.md`) : utiliser `gesture_catalog.py` pour les raccourcis natifs (Win+R, etc.), ne pas hardcoder. 3. **Pas de cloud LLM dans le projet** sauf pour la démo (Ollama Cloud via clés Dom). Prod 100% local. 4. **Captures Pauline = source de vérité** : `/home/dom/Téléchargements/Exemples Dossiers UHCD - Forfaits (1)/...` (8 dossiers) + `/tmp/captures_pauline_3manquants/` (3 dossiers extraits du docx). En cas de conflit avec rapport revue, **la capture prime**. 5. **Noms substitués = anonymisation volontaire** : ne pas signaler comme erreur, ne pas chercher à les réaligner avec captures. --- ## 📁 Fichiers clés à connaître - `/home/dom/ai/rpa_vision_v3/docs/clients/ght_sud_95/mockup_easily_assure/data.js` — base 11 dossiers (~2100 lignes) - `/home/dom/ai/rpa_vision_v3/docs/clients/ght_sud_95/mockup_easily_assure/server.py` — backend Flask + `/api/analyse` + `VERITES_TERRAIN` - `/home/dom/ai/rpa_vision_v3/docs/clients/ght_sud_95/mockup_easily_assure/app.js` — rendering frontend (signes_vitaux dynamique appliqué) - `/home/dom/ai/rpa_vision_v3/agent_v0/server_v1/api_stream.py` — streaming server (boot avec préchargement EasyOCR) - `/home/dom/ai/rpa_vision_v3/agent_chat/urgences_orchestrator.py` — orchestrateur démo - `/home/dom/ai/rpa_vision_v3/core/llm/t2a_decision.py` — décision T2A LLM - `/home/dom/ai/rpa_vision_v3/core/llm/ocr_extractor.py` — `extract_text_from_image` + `extract_table_from_image` --- ## 🔧 Commandes utiles ```bash # Vérifier syntaxe data.js node -e "var fs=require('fs'); var c=fs.readFileSync('docs/clients/ght_sud_95/mockup_easily_assure/data.js','utf-8'); c=c.replace(/^const /gm, 'var '); var s={}; require('vm').runInContext(c, require('vm').createContext(s)); console.log('OK', Object.keys(s.DOSSIERS).length);" # Restart streaming server cd /home/dom/ai/rpa_vision_v3 && ./svc.sh restart streaming # Restart maquette sudo systemctl restart rpa-mockup-easily # Re-bench T2A (après corrections data.js) node /tmp/extract_dpi.js > /tmp/dpis.json /home/dom/ai/rpa_vision_v3/.venv/bin/python /tmp/bench_t2a_cloud.py ``` --- ## ⏱ Timeline démo - **Aujourd'hui** : finir corrections data.js + visio Pauline - **Demain (J-2 / 2026-05-07)** : enregistrement workflow Urgence_unit sur PC Windows - **J-1 (2026-05-08)** : tests E2E répétés - **Jour J** : démo GHT Sud 95 --- ## 📌 Ce qui marche aujourd'hui (pas casser) - Maquette aiva-vision visible et fonctionnelle - Pipeline orchestrateur opérationnel (testé matin 05/05) - Préchargement EasyOCR opérationnel (3.8s au boot) - Bench complet avec rapport - Mail-template Pauline prêt **Ne pas relancer les services systemd sans raison**, ne pas modifier `server.py` sauf pour les corrections explicites.