192 lines
12 KiB
Markdown
192 lines
12 KiB
Markdown
# 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>/`
|
|
|
|
| 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.
|