chore: add .gitignore

This commit is contained in:
dom
2026-03-05 00:37:41 +01:00
parent 542797a124
commit 2578afb6ff
1716 changed files with 1905609 additions and 18 deletions

21
docs/DEPENDENCIES.md Normal file
View File

@@ -0,0 +1,21 @@
# Dépendances T2A v2
## Versions validées (pytest OK, 2026-02-24)
| Package | Installée | Contrainte requirements.txt |
|----------------|-------------|----------------------------|
| protobuf | 3.20.3 | >=3.20.0,<7.0.0 |
| transformers | 4.57.6 | >=4.35.0,<6.0.0 |
| torch | 2.7.1 | >=2.1.0 |
| pydantic | 2.11.5 | >=2.5.0 |
| sentencepiece | 0.1.99 | >=0.1.99,<0.3.0 |
## Recommandation
Pour figer l'environnement exact :
```bash
pip freeze > requirements.lock
```
Utiliser `requirements.lock` pour les déploiements, `requirements.txt` pour le développement.

65
docs/GOLD_CRH_GUIDE.md Normal file
View File

@@ -0,0 +1,65 @@
# Gold Standard CRH — Guide d'annotation
## Principe
Le gold CRH permet d'évaluer la qualité de la sélection DP (NUKE-3) sur des dossiers CRH réels. Chaque cas annoté définit le DP attendu avec des marges de tolérance DIM.
## Règles d'annotation (DP)
- **DP** = diagnostic qui motive l'essentiel de la prise en charge et la consommation de ressources
- Si étiologie connue : coder l'étiologie, pas le symptôme (ex: I26.9, pas R06.0)
- Si ambigu : remplir `dp_expected` + `dp_acceptable_codes` + `dp_acceptable_family3`
- Si seul un symptôme est défendable : mettre `allow_symptom_dp=true` + expliquer dans `notes`
- `confidence` : certain (1 seul DP possible), probable (fort mais alternatives), ambiguous (vraie ambiguïté)
- `evidence` : 1-3 extraits courts (max 240 chars), section + texte
## Schéma JSON
```json
{
"case_id": "106_23056475",
"document_type": "crh",
"dp_expected": {"code": "I26.9", "label": "Embolie pulmonaire"},
"dp_acceptable_codes": ["I26.0"],
"dp_acceptable_family3": ["I26"],
"allow_symptom_dp": false,
"confidence": "certain",
"evidence": [{"section": "Conclusion", "excerpt": "EP confirmée au scanner"}],
"notes": ""
}
```
## Procédure en 10 étapes
1. `python tools/gold_crh_annotator.py --bootstrap --out data/gold_crh/gold_template.csv`
2. Ouvrir le CSV dans un tableur (LibreOffice, Excel)
3. Filtrer les cas CRH (ignorer les trackare bypass)
4. Pour chaque CRH : lire le JSON pipeline, vérifier le DP proposé
5. Remplir `dp_expected_code` et `dp_expected_label` (code correct selon les règles DIM)
6. Ajouter les alternatives dans `dp_acceptable_codes` (séparés par `|`)
7. Ajouter les familles dans `dp_acceptable_family3` (séparés par `|`)
8. Remplir `confidence`, `allow_symptom_dp`, `evidence` et `notes`
9. `python tools/gold_crh_annotator.py --import-csv data/gold_crh/gold_template.csv`
10. `python tools/gold_crh_annotator.py --check data/gold_crh/gold_crh.jsonl`
## Métriques d'évaluation
| Métrique | Description |
|----------|-------------|
| `exact_match_strict` | Code choisi == `dp_expected.code` |
| `exact_match_tolerant_codes` | Code choisi dans `dp_acceptable_codes` |
| `family3_match_tolerant` | Famille 3 chars du code dans `dp_acceptable_family3` |
| `acceptable_match` | tolerant_codes OU family3_match |
| `confirmed_accuracy_tolerant` | acceptable_match sur les CONFIRMED uniquement |
| `symptom_not_allowed` | R* choisi alors que `allow_symptom_dp=false` |
## Fichiers
| Fichier | Rôle |
|---------|------|
| `data/gold_crh/gold_template.csv` | Template CSV pré-rempli |
| `data/gold_crh/gold_crh.jsonl` | Gold validé (1 JSON/ligne) |
| `data/gold_crh/gold_crh_index.json` | Index case_id → offset |
| `src/eval/gold_models.py` | Modèles Pydantic + évaluation |
| `tools/gold_crh_annotator.py` | CLI annotation |
| `docs/NUKE3_GOLD_EVAL.csv` | Résultats évaluation |

View File

@@ -0,0 +1,310 @@
# NUKE-3 — Benchmark Report
**Date** : 2026-02-24 17:44
**Commit** : `cad0dd2`
**Dossiers analysés** : 249
**Mode** : analyse offline (JSON existants)
## Métriques DIM-like
| Métrique | Valeur |
|----------|--------|
| CONFIRMED rate | 77.9% |
| REVIEW rate | 22.1% |
| CONFIRMED + evidence | 100.0% |
| DP symptôme (R*) | 0.4% |
| DP comorbidité | 0.4% |
| DP acte-seul | 0.0% |
| DP R-code | 9.2% |
| Confidence high | 77.9% |
## Volumes
- Dossiers avec dp_selection : 249/249
- CONFIRMED : 194
- REVIEW : 55
- Confidence — high: 194, medium: 54, low: 0
## Détail par dossier
| Dossier | Verdict | Code | Confidence | Evidence | Candidats | Reason |
|---------|---------|------|------------|----------|-----------|--------|
| 100_23054899 | CONFIRMED | H70.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 101_23041413 | CONFIRMED | Y83.8 | high | 1 | 0 | DP Trackare — source d'autorité |
| 102_23056463 | CONFIRMED | M45 | high | 1 | 0 | DP Trackare — source d'autorité |
| 103_23056749 | CONFIRMED | F06.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 104_23001083 | CONFIRMED | F41.00 | high | 1 | 0 | DP Trackare — source d'autorité |
| 105_23052612 | CONFIRMED | M35.2 | high | 1 | 0 | DP Trackare — source d'autorité |
| 106_23056475 | REVIEW | I26.9 | medium | 1 | 7 | Écart 1.0 < seuil 3.0, LLM désactivé |
| 107_23030611 | CONFIRMED | N76 | high | 1 | 0 | DP Trackare — source d'autorité |
| 108_23061103 | CONFIRMED | S72.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 109_23028431 | CONFIRMED | K83.5 | high | 1 | 0 | DP Trackare — source d'autorité |
| 10_23079252 | CONFIRMED | K81.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 110_23061319 | REVIEW | T83.5 | medium | 1 | 2 | Écart 2.0 < seuil 3.0, LLM désactivé |
| 111_23061304 | REVIEW | N19 | medium | 1 | 3 | Écart 1.0 < seuil 3.0, LLM désactivé |
| 112_23065936 | REVIEW | I25.5 | medium | 1 | 7 | Écart 0.0 < seuil 3.0, LLM désactivé |
| 113_23065949 | CONFIRMED | K57.5 | high | 1 | 0 | DP Trackare — source d'autorité |
| 114_23060661 | CONFIRMED | N23 | high | 1 | 0 | DP Trackare — source d'autorité |
| 115_23066188 | CONFIRMED | A87.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 116_23065570 | CONFIRMED | N17.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 117_23067053 | CONFIRMED | K28 | high | 1 | 0 | DP Trackare — source d'autorité |
| 118_23042633 | CONFIRMED | X20.13 | high | 1 | 0 | DP Trackare — source d'autorité |
| 119_23062819 | CONFIRMED | R48.10 | high | 1 | 0 | DP Trackare — source d'autorité |
| 11_23082513 | CONFIRMED | K80.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 120_23033508 | REVIEW | N85.7 | medium | 1 | 7 | Écart 1.0 < seuil 3.0, LLM désactivé |
| 121_23044152 | CONFIRMED | M17.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 122_23070126 | CONFIRMED | I67.4 | high | 1 | 0 | DP Trackare — source d'autorité |
| 123_23071970 | CONFIRMED | R06.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 124_23074376 | CONFIRMED | Q91.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 125_23074494 | CONFIRMED | S72.1 | high | 1 | 0 | DP Trackare — source d'autorité |
| 126_23075530 | REVIEW | E03.9 | medium | 1 | 7 | Écart 0.0 < seuil 3.0, LLM indisponible |
| 127_23048705 | CONFIRMED | M17.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 128_23076141 | CONFIRMED | E11.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 129_23076325 | CONFIRMED | I11.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 12_23084754 | CONFIRMED | K81.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 130_23077240 | CONFIRMED | J90 | high | 1 | 0 | DP Trackare — source d'autorité |
| 131_23079402 | CONFIRMED | R06.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 132_23080179 | REVIEW | R59.0 | medium | 2 | 0 | Trackare symptôme vs CRH diagnostic — vérification DIM requi |
| 133_23056022 | CONFIRMED | H33.2 | high | 1 | 0 | DP Trackare — source d'autorité |
| 134_23050890 | CONFIRMED | Q64.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 135_23036651 | CONFIRMED | R04.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 136_23083065 | CONFIRMED | Z99.1 | high | 1 | 0 | DP Trackare — source d'autorité |
| 137_23083269 | CONFIRMED | G40.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 138_23051225 | CONFIRMED | Y90.4 | high | 1 | 0 | DP Trackare — source d'autorité |
| 139_23087691 | REVIEW | M16.7 | medium | 1 | 7 | Écart 0.0 < seuil 3.0, LLM désactivé |
| 13_23085314 | CONFIRMED | K81.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 140_23090475 | REVIEW | Z54.8 | medium | 1 | 7 | Écart 0.0 < seuil 3.0, LLM désactivé |
| 141_23090597 | CONFIRMED | K85.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 142_23093202 | CONFIRMED | K83.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 143_23096917 | CONFIRMED | K35.8 | high | 1 | 0 | DP Trackare — source d'autorité |
| 144_23097531 | CONFIRMED | D86 | high | 1 | 0 | DP Trackare — source d'autorité |
| 145_23057452 | REVIEW | Z00.8 | medium | 2 | 0 | R5 — Z-code non whitelisté en DP |
| 146_23099769 | REVIEW | T83.5 | medium | 1 | 7 | Écart 2.0 < seuil 3.0, LLM désactivé |
| 147_23067572 | CONFIRMED | K40.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 148_23018396 | REVIEW | A41.9 | medium | 1 | 4 | Écart 2.0 < seuil 3.0, LLM désactivé |
| 149_23089771 | REVIEW | H16.0 | medium | 1 | 7 | Écart 0.0 < seuil 3.0, LLM désactivé |
| 14_23089947 | CONFIRMED | K85.1 | high | 1 | 0 | DP Trackare — source d'autorité |
| 150_23101667 | CONFIRMED | R06.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 151_23102469 | CONFIRMED | N17.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 152_23103061 | CONFIRMED | I74.2 | high | 1 | 0 | DP Trackare — source d'autorité |
| 153_23102610 | REVIEW | T83.5 | medium | 1 | 7 | Écart 1.0 < seuil 3.0, LLM désactivé |
| 154_23096269 | CONFIRMED | E11.8 | high | 1 | 0 | DP Trackare — source d'autorité |
| 155_23096278 | CONFIRMED | J45.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 156_23104564 | CONFIRMED | Z51.1 | high | 1 | 0 | DP Trackare — source d'autorité |
| 157_23106204 | CONFIRMED | Z99.1 | high | 1 | 0 | DP Trackare — source d'autorité |
| 158_23105874 | CONFIRMED | A41.3 | high | 1 | 0 | DP Trackare — source d'autorité |
| 159_23107113 | REVIEW | I26.9 | medium | 1 | 7 | Écart 0.0 < seuil 3.0, LLM désactivé |
| 15_23096332 | CONFIRMED | K81.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 160_23099448 | REVIEW | E88.1 | medium | 1 | 7 | Écart 1.0 < seuil 3.0, LLM désactivé |
| 161_23098838 | CONFIRMED | I11.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 162_23109279 | CONFIRMED | C81.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 163_23109304 | CONFIRMED | Z99.1 | high | 1 | 0 | DP Trackare — source d'autorité |
| 164_23100745 | CONFIRMED | R06.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 165_23104930 | CONFIRMED | K85.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 166_23113695 | CONFIRMED | N17.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 167_23104446 | CONFIRMED | I10 | high | 1 | 0 | DP Trackare — source d'autorité |
| 168_23113717 | CONFIRMED | R06.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 169_23115483 | CONFIRMED | E87.2 | high | 1 | 0 | DP Trackare — source d'autorité |
| 16_23098082 | CONFIRMED | K85.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 170_23077016 | REVIEW | K59.0 | medium | 1 | 7 | Écart 0.0 < seuil 3.0, LLM désactivé |
| 171_23108560 | CONFIRMED | N17.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 172_23119469 | CONFIRMED | J90 | high | 1 | 0 | DP Trackare — source d'autorité |
| 173_23069373 | CONFIRMED | E04.2 | high | 1 | 0 | DP Trackare — source d'autorité |
| 174_23080042 | REVIEW | Q40.1 | medium | 1 | 7 | Écart 1.0 < seuil 3.0, LLM désactivé |
| 175_23116191 | CONFIRMED | J45.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 176_23124187 | CONFIRMED | I10 | high | 1 | 0 | DP Trackare — source d'autorité |
| 177_23110276 | CONFIRMED | N82.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 178_23124458 | CONFIRMED | J01.2 | high | 1 | 0 | DP Trackare — source d'autorité |
| 179_23126805 | REVIEW | Z00.0 | medium | 2 | 0 | R5 — Z-code non whitelisté en DP |
| 17_23100690 | CONFIRMED | K85.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 180_23127321 | CONFIRMED | T41.4 | high | 1 | 0 | DP Trackare — source d'autorité |
| 181_23127286 | CONFIRMED | R30.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 182_23118076 | CONFIRMED | Z99.1 | high | 1 | 0 | DP Trackare — source d'autorité |
| 183_23087212 | REVIEW | T83.5 | medium | 1 | 7 | Écart 0.0 < seuil 3.0, LLM désactivé |
| 184_23119008 | CONFIRMED | F43.1 | high | 1 | 0 | DP Trackare — source d'autorité |
| 185_23128579 | CONFIRMED | R06.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 186_23105969 | REVIEW | Z00.8 | medium | 2 | 0 | R5 — Z-code non whitelisté en DP |
| 187_23133268 | REVIEW | Z00.8 | medium | 2 | 0 | R5 — Z-code non whitelisté en DP |
| 188_23092887 | CONFIRMED | R57.2 | high | 1 | 0 | DP Trackare — source d'autorité |
| 189_23138778 | CONFIRMED | I10 | high | 1 | 0 | DP Trackare — source d'autorité |
| 18_23103327 | CONFIRMED | K80.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 190_23139234 | CONFIRMED | J18.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 191_23140698 | CONFIRMED | R06.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 192_23132490 | REVIEW | D50 | medium | 1 | 7 | Écart 1.0 < seuil 3.0, LLM désactivé |
| 193_23123388 | CONFIRMED | G35 | high | 1 | 0 | DP Trackare — source d'autorité |
| 194_23142891 | CONFIRMED | R93.1 | high | 1 | 0 | DP Trackare — source d'autorité |
| 195_23144210 | CONFIRMED | K85.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 196_ 23140080 | CONFIRMED | K85.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 197_23149133 | CONFIRMED | M25.5 | high | 1 | 0 | DP Trackare — source d'autorité |
| 198_23130006 | CONFIRMED | E04.2 | high | 1 | 0 | DP Trackare — source d'autorité |
| 199_23149905 | CONFIRMED | I25.1 | high | 1 | 0 | DP Trackare — source d'autorité |
| 19_23103383 | CONFIRMED | K80.1 | high | 1 | 0 | DP Trackare — source d'autorité |
| 200_23149959 | REVIEW | I80.2 | medium | 1 | 7 | Écart 1.0 < seuil 3.0, LLM désactivé |
| 201_23149994 | CONFIRMED | G82.4 | high | 1 | 0 | DP Trackare — source d'autorité |
| 202_23151035 | REVIEW | N19 | medium | 1 | 3 | Écart 2.0 < seuil 3.0, LLM désactivé |
| 203_23151182 | CONFIRMED | M60.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 204_23142660 | REVIEW | N40 | medium | 1 | 3 | Écart 2.0 < seuil 3.0, LLM désactivé |
| 205_23151283 | CONFIRMED | J18.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 206_23152027 | CONFIRMED | Z99.1 | high | 1 | 0 | DP Trackare — source d'autorité |
| 207_23119040 | CONFIRMED | K60.3 | high | 1 | 0 | DP Trackare — source d'autorité |
| 208_23151988 | CONFIRMED | K81.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 209_23154576 | CONFIRMED | S72.3 | high | 1 | 0 | DP Trackare — source d'autorité |
| 20_23108737 | CONFIRMED | K81.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 210_23155084 | CONFIRMED | K35.8 | high | 1 | 0 | DP Trackare — source d'autorité |
| 211_23155556 | CONFIRMED | M10.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 212_23155836 | CONFIRMED | K85.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 213_23156193 | CONFIRMED | N23 | high | 1 | 0 | DP Trackare — source d'autorité |
| 214_23148798 | CONFIRMED | Z03.8 | high | 1 | 0 | DP Trackare — source d'autorité |
| 215_23158603 | REVIEW | Z31.5 | medium | 2 | 0 | R5 — Z-code non whitelisté en DP |
| 216_23159905 | CONFIRMED | G82.4 | high | 1 | 0 | DP Trackare — source d'autorité |
| 217_23159786 | CONFIRMED | G44.2 | high | 1 | 0 | DP Trackare — source d'autorité |
| 218_23164383 | CONFIRMED | H81.2 | high | 1 | 0 | DP Trackare — source d'autorité |
| 219_23164660 | CONFIRMED | R06.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 21_23111304 | CONFIRMED | K85.1 | high | 1 | 0 | DP Trackare — source d'autorité |
| 220_23159566 | REVIEW | Z01.4 | medium | 2 | 0 | R5 — Z-code non whitelisté en DP |
| 221_23167859 | CONFIRMED | I62.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 222_23139653 | CONFIRMED | Z43.3 | high | 1 | 0 | DP Trackare — source d'autorité |
| 223_23169043 | CONFIRMED | K85.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 224_23134304 | CONFIRMED | E66.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 225_23160703 | REVIEW | N85.7 | medium | 1 | 6 | Écart 1.0 < seuil 3.0, LLM désactivé |
| 226_23175167 | CONFIRMED | I74.3 | high | 1 | 0 | DP Trackare — source d'autorité |
| 227_23173599 | CONFIRMED | Z51.1 | high | 1 | 0 | DP Trackare — source d'autorité |
| 228_23176885 | CONFIRMED | E11.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 229_23177975 | CONFIRMED | Z99.1 | high | 1 | 0 | DP Trackare — source d'autorité |
| 22_23117170 | CONFIRMED | K81.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 230_23167769 | CONFIRMED | R06.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 231_23159944 | CONFIRMED | N85.7 | high | 1 | 0 | DP Trackare — source d'autorité |
| 232_23183311 | CONFIRMED | S22.31 | high | 1 | 0 | DP Trackare — source d'autorité |
| 233_23166628 | REVIEW | Z29.0 | medium | 2 | 0 | R5 — Z-code non whitelisté en DP |
| 234_23174515 | CONFIRMED | G40.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 235_23143706 | CONFIRMED | N76 | high | 1 | 0 | DP Trackare — source d'autorité |
| 236_23116794 | CONFIRMED | N82.3 | high | 1 | 0 | DP Trackare — source d'autorité |
| 237_23159792 | CONFIRMED | Z99.1 | high | 1 | 0 | DP Trackare — source d'autorité |
| 238_23188172 | CONFIRMED | T88.7 | high | 1 | 0 | DP Trackare — source d'autorité |
| 239_23188240 | CONFIRMED | T81.38 | high | 1 | 0 | DP Trackare — source d'autorité |
| 23_23122825 | CONFIRMED | K81.1 | high | 1 | 0 | DP Trackare — source d'autorité |
| 240_23171519 | CONFIRMED | Z51.1 | high | 1 | 0 | DP Trackare — source d'autorité |
| 241_23188038 | CONFIRMED | Z51.5 | high | 1 | 0 | DP Trackare — source d'autorité |
| 242_23192524 | CONFIRMED | S32.3 | high | 1 | 0 | DP Trackare — source d'autorité |
| 243_23193247 | CONFIRMED | R23.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 244_23193317 | CONFIRMED | E78.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 245_23193113 | CONFIRMED | N41.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 246_23193699 | CONFIRMED | S22.31 | high | 1 | 0 | DP Trackare — source d'autorité |
| 247_23194838 | CONFIRMED | Z99.1 | high | 1 | 0 | DP Trackare — source d'autorité |
| 248_23194278 | CONFIRMED | J41.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 249_23196688 | CONFIRMED | R06.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 24_23127065 | CONFIRMED | K81.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 250_23196454 | CONFIRMED | M30.3 | high | 1 | 0 | DP Trackare — source d'autorité |
| 25_23127187 | REVIEW | N19 | medium | 1 | 7 | Écart 1.0 < seuil 3.0, LLM désactivé |
| 26_23127395 | CONFIRMED | K85.1 | high | 1 | 0 | DP Trackare — source d'autorité |
| 27_23134370 | CONFIRMED | K85.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 28_23135549 | CONFIRMED | K85.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 29_23137897 | REVIEW | K80.0 | medium | 1 | 7 | Écart 0.0 < seuil 3.0, LLM désactivé |
| 2_23044104 | CONFIRMED | K80.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 30_23141147 | CONFIRMED | Z99.1 | high | 1 | 0 | DP Trackare — source d'autorité |
| 31_23142976 | CONFIRMED | K81.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 32_23143161 | CONFIRMED | K81.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 33_23150352 | CONFIRMED | K81.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 34_23153510 | CONFIRMED | K81.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 35_23154808 | CONFIRMED | K42.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 36_23156051 | CONFIRMED | Z99.1 | high | 1 | 0 | DP Trackare — source d'autorité |
| 37_23158940 | CONFIRMED | K81.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 38_23162619 | CONFIRMED | K81.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 39_23167029 | REVIEW | Z29.2 | medium | 2 | 0 | R5 — Z-code non whitelisté en DP |
| 3_23044882 | CONFIRMED | K81.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 40_23168633 | CONFIRMED | K81.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 41_23170176 | REVIEW | N19 | medium | 1 | 7 | Écart 0.0 < seuil 3.0, LLM désactivé |
| 42_23172367 | CONFIRMED | K81.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 43_23177057 | CONFIRMED | K81.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 44_23096703 | REVIEW | K80.2 | medium | 1 | 4 | Écart 2.0 < seuil 3.0, LLM désactivé |
| 45_23183041 | CONFIRMED | K81.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 46_23187081 | CONFIRMED | K85.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 47_23201117 | CONFIRMED | K81.1 | high | 1 | 0 | DP Trackare — source d'autorité |
| 49_23217289 | CONFIRMED | K81.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 4_23047260 | CONFIRMED | Z99.1 | high | 1 | 0 | DP Trackare — source d'autorité |
| 50_23219173 | REVIEW | N19 | medium | 1 | 7 | Écart 2.0 < seuil 3.0, LLM désactivé |
| 51_23222062 | CONFIRMED | K85.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 52_23223407 | REVIEW | Z35.9 | medium | 2 | 0 | R5 — Z-code non whitelisté en DP |
| 53_23224186 | CONFIRMED | K81.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 54_23230165 | CONFIRMED | K81.1 | high | 1 | 0 | DP Trackare — source d'autorité |
| 55_23246490 | CONFIRMED | K81.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 56_23248174 | CONFIRMED | K81.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 57_23003949 | CONFIRMED | I10 | high | 1 | 0 | DP Trackare — source d'autorité |
| 58_23084901 | CONFIRMED | R06.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 59_23088959 | CONFIRMED | R27.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 5_23047860 | CONFIRMED | E03.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 60_23106634 | REVIEW | Z31.5 | medium | 2 | 0 | R5 — Z-code non whitelisté en DP |
| 61_23001636 | CONFIRMED | Z99.1 | high | 1 | 0 | DP Trackare — source d'autorité |
| 62_23001636 | REVIEW | A41.9 | medium | 1 | 7 | Écart 2.0 < seuil 3.0, LLM désactivé |
| 63_23001636 | REVIEW | A41.9 | medium | 1 | 7 | Écart 2.0 < seuil 3.0, LLM désactivé |
| 64_23001636 | REVIEW | A41.9 | medium | 1 | 7 | Écart 2.0 < seuil 3.0, LLM désactivé |
| 65_23001636 | REVIEW | A41.9 | medium | 1 | 7 | Écart 2.0 < seuil 3.0, LLM désactivé |
| 66_23001636 | REVIEW | A41.9 | medium | 1 | 7 | Écart 2.0 < seuil 3.0, LLM désactivé |
| 67_23001636 | CONFIRMED | F43.28 | high | 1 | 0 | DP Trackare — source d'autorité |
| 68_23046068 | CONFIRMED | M71.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 69_23046068 | CONFIRMED | B96.80 | high | 1 | 0 | DP Trackare — source d'autorité |
| 6_23066847 | CONFIRMED | K81.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 70_23122843 | CONFIRMED | K57.4 | high | 1 | 0 | DP Trackare — source d'autorité |
| 71_23135194 | REVIEW | None | None | 1 | 0 | Aucun candidat DP identifié |
| 72_23068111 | REVIEW | K59.0 | medium | 1 | 2 | Écart 2.0 < seuil 3.0, LLM désactivé |
| 73_23139637 | REVIEW | R06.0 | medium | 1 | 1 | Pool mono-candidat fragile (symptôme) |
| 74_23141536 | REVIEW | D50 | medium | 1 | 3 | Écart 0.0 < seuil 3.0, LLM désactivé |
| 75_23181227 | CONFIRMED | R21 | high | 1 | 0 | DP Trackare — source d'autorité |
| 76_23165648 | REVIEW | S74.0 | medium | 1 | 6 | Écart 0.0 < seuil 3.0, LLM désactivé |
| 77_23194611 | REVIEW | N02 | medium | 1 | 7 | Écart 0.0 < seuil 3.0, LLM désactivé |
| 78_23187785 | CONFIRMED | B96.80 | high | 1 | 0 | DP Trackare — source d'autorité |
| 79_23187785 | CONFIRMED | M71.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 7_23066992 | CONFIRMED | K81.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 80_23202435 | CONFIRMED | M71.9 | high | 1 | 0 | DP Trackare — source d'autorité |
| 81_23202678 | REVIEW | I80.2 | medium | 1 | 7 | Écart 1.0 < seuil 3.0, LLM désactivé |
| 82_23206765 | CONFIRMED | S50.1 | high | 1 | 0 | DP Trackare — source d'autorité |
| 83_23187785 | CONFIRMED | B96.80 | high | 1 | 0 | DP Trackare — source d'autorité |
| 84_23215994 | CONFIRMED | L50 | high | 1 | 0 | DP Trackare — source d'autorité |
| 85_23215994 | CONFIRMED | L50.1 | high | 1 | 0 | DP Trackare — source d'autorité |
| 86_23221334 | CONFIRMED | Z51.30 | high | 1 | 0 | DP Trackare — source d'autorité |
| 87_23236926 | CONFIRMED | R06.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 88_23034958 | CONFIRMED | M25.2 | high | 1 | 0 | DP Trackare — source d'autorité |
| 89_23016863 | CONFIRMED | R06.4 | high | 1 | 0 | DP Trackare — source d'autorité |
| 8_23074520 | CONFIRMED | K80.5 | high | 1 | 0 | DP Trackare — source d'autorité |
| 90_23011562 | REVIEW | N19 | medium | 1 | 5 | Écart 1.0 < seuil 3.0, LLM désactivé |
| 91_23029879 | REVIEW | E21 | medium | 1 | 7 | Écart 1.0 < seuil 3.0, LLM désactivé |
| 92_23049455 | CONFIRMED | S52 | high | 1 | 0 | DP Trackare — source d'autorité |
| 93_23050151 | REVIEW | N04 | medium | 1 | 7 | Écart 2.0 < seuil 3.0, LLM désactivé |
| 94_23000519 | REVIEW | N85.7 | medium | 1 | 4 | Écart 2.0 < seuil 3.0, LLM désactivé |
| 95_23022137 | CONFIRMED | Z99.1 | high | 1 | 0 | DP Trackare — source d'autorité |
| 96_23044463 | CONFIRMED | K85.1 | high | 1 | 0 | DP Trackare — source d'autorité |
| 97_23053061 | CONFIRMED | K85.0 | high | 1 | 0 | DP Trackare — source d'autorité |
| 98_23054001 | CONFIRMED | M54.2 | high | 1 | 0 | DP Trackare — source d'autorité |
| 99_23033146 | REVIEW | E66.83 | medium | 1 | 4 | Écart 0.0 < seuil 3.0, LLM désactivé |
| 9_23077394 | CONFIRMED | K81.8 | high | 1 | 0 | DP Trackare — source d'autorité |
| pseudonymise | CONFIRMED | K85.1 | high | 1 | 0 | DP Trackare — source d'autorité |
## Évaluation Gold CRH
**Cas gold évalués** : 5
| Métrique | Valeur |
|----------|--------|
| Exact match (strict) | 60.0% (3/5) |
| Exact match (codes tolérants) | 60.0% (3/5) |
| Family3 match (tolérant) | 60.0% (3/5) |
| Acceptable match (codes OU family3) | 60.0% (3/5) |
| Confirmed accuracy (tolérant) | 100.0% (1 CONFIRMED) |
| Symptôme non autorisé | 1/5 |
### Détail par cas gold
| Case ID | Choisi | Attendu | Strict | Acceptable | Symptôme interdit | Verdict |
|---------|--------|---------|--------|------------|-------------------|---------|
| 106_23056475 | I26.9 | I26.9 | OK | OK | - | REVIEW |
| 115_23066188 | A87.0 | A87.0 | OK | OK | - | CONFIRMED |
| 132_23080179 | R59.0 | C83.3 | FAIL | FAIL | OUI | REVIEW |
| 73_23139637 | R06.0 | R06.0 | OK | OK | - | REVIEW |
| 74_23141536 | D50 | I25.1 | FAIL | FAIL | - | REVIEW |
---
*Généré par `scripts/benchmark_nuke3_compare.py` — 2026-02-24 17:44*
> **Règle DIM** : `CONFIRMED` ⇒ `evidence` obligatoirement non vide.
> Un DP sans preuve exploitable est automatiquement `REVIEW`.

171
docs/NUKE3_NEXT_STEPS.md Normal file
View File

@@ -0,0 +1,171 @@
# NUKE-3 — Plan de sprint court
## 3 Objectifs
1. **Réduire le taux REVIEW sur les dossiers sans DP** : 43/43 → cible < 50% REVIEW
2. **Améliorer la qualité du pool** : éliminer le bruit OCR et fusionner les doublons
3. **Activer le signal synthèse** : rendre motif_align opérant même sur les dossiers trackare
## 5 Patchs proposés (ordre d'impact)
### Patch 1 — Dedup par code dans `build_candidates()` ⭐⭐⭐
**Symptôme** : Même code CIM-10 apparaît 2× (edsnlp + regex) → le candidat se bat contre lui-même, delta artificiellement réduit.
**Patch minimal** : `src/medical/dp_selector.py`, fonction `build_candidates()`
```python
# Après la boucle de construction des candidats :
# Dedup par code : garder le meilleur section_strength, ajouter bonus multi-source
seen: dict[str, DPCandidate] = {}
for c in candidates:
if not c.code:
continue
if c.code in seen:
existing = seen[c.code]
existing.num_occurrences += 1
if c.section_strength > existing.section_strength:
existing.section_strength = c.section_strength
existing.source = c.source
else:
seen[c.code] = c
candidates = list(seen.values())
# Réindexer
for i, c in enumerate(candidates):
c.index = i
```
**Pourquoi ça aide** : Les 4 dossiers avec doublons (I26.9, K81.0, D69.6, J18.9) gagnent un candidat fusionné plus fort. Le bonus `occurrences` existant (+1 ou +2) s'active déjà sur `num_occurrences`.
**Test** : `test_dedup_same_code_merged()` — 2 candidats avec même code, sources différentes → 1 seul candidat avec meilleur section_strength.
**Effort** : 1h
---
### Patch 2 — Filtre bruit OCR dans `build_candidates()` ⭐⭐⭐
**Symptôme** : Candidats avec texte OCR corrompu ("C : 9.4", "C omprend décollement de la (d") polluent le pool et consomment des places dans top_k=7.
**Patch minimal** : `src/medical/dp_selector.py`, dans `build_candidates()`
```python
MIN_TERM_WORDS = 2
def _is_ocr_noise(text: str) -> bool:
"""Rejette les candidats dont le texte est du bruit OCR."""
clean = text.strip()
if len(clean) < 4:
return True
words = clean.split()
if len(words) < MIN_TERM_WORDS:
return True
# Ratio de caractères non-alpha suspect
alpha = sum(1 for ch in clean if ch.isalpha())
if alpha / max(len(clean), 1) < 0.5:
return True
return False
```
**Pourquoi ça aide** : Réduit le pool de 7 à ~4-5 candidats pertinents, améliore le delta.
**Test** : `test_ocr_noise_excluded()` — candidat "C : 9.4" exclu du pool.
**Effort** : 1h
---
### Patch 3 — Synthèse depuis top-level JSON + sections trackare ⭐⭐
**Symptôme** : 100% des REVIEW ont synthèse vide → `motif_align` ne fonctionne jamais. Le JSON a `sejour.motif` mais `build_synthese()` ne lit que `sections.motif_hospitalisation`.
**Patch minimal** : `src/medical/dp_selector.py`, fonction `build_synthese()`
```python
def build_synthese(dossier, parsed_data):
sections = parsed_data.get("sections", {})
motif = sections.get("motif_hospitalisation", "")
conclusion = sections.get("conclusion", "")
# Fallback : motif depuis le séjour (trackare)
if not motif and dossier.sejour.motif:
motif = dossier.sejour.motif
return {"motif": motif, "conclusion": conclusion, ...}
```
**Pourquoi ça aide** : Active le bonus `motif_align` (+2) sur les trackare qui stockent le motif dans `sejour.motif`, discriminant les candidats.
**Test** : `test_synthese_fallback_sejour_motif()` — synthèse avec motif depuis séjour.
**Effort** : 30min
---
### Patch 4 — Abaisser DELTA_CONFIRMED de 3.0 à 2.0 ⭐⭐
**Symptôme** : 13/43 REVIEW ont delta 2.0-2.9 — cas où le pré-ranker a une préférence nette mais pas assez pour le seuil actuel. Exemple : T83.5 (4.0) vs R50.9 (2.0) = delta 2.0 → REVIEW, alors que le symptôme (R50.9) est clairement un mauvais DP.
**Patch minimal** : `src/medical/dp_selector.py`
```python
DELTA_CONFIRMED = 2.0 # Était 3.0
```
**Pourquoi ça aide** : +13 CONFIRMED (30% des REVIEW), mais uniquement si les gardes A1/A2/A3 valident. Le hardening empêche les faux positifs.
**Test** : Adapter les fixtures existantes (dp_acute_vs_comorbidity.json utilise un delta attendu).
**Effort** : 30min (+ vérification non-régression)
---
### Patch 5 — DAS order bonus (premier listé = plus saillant) ⭐
**Symptôme** : En cas d'ex-aequo total (15 cas), il n'y a aucun signal pour départager. Or l'ordre des DAS dans le document médical n'est pas aléatoire — les premiers listés sont souvent les plus pertinents.
**Patch minimal** : `src/medical/dp_selector.py`, dans `score_candidates()`
```python
# 9. Bonus d'ordre (premier DAS listé = +1)
if c.index == 0:
score += 1
details["first_listed"] = 1
elif c.index == 1:
score += 0.5
details["second_listed"] = 0.5
```
**Pourquoi ça aide** : Brise les ex-aequo dans 15 cas (36% des REVIEW) avec un signal faible mais non-arbitraire. Le premier DAS listé reflète l'ordre du document source.
**Test** : `test_first_listed_bonus()` — 2 candidats identiques, le premier listé gagne.
**Effort** : 30min
---
## Ordre d'exécution
| # | Patch | Effort | Impact estimé | Pré-requis |
|---|-------|--------|---------------|------------|
| 1 | Dedup par code | 1h | 4 dossiers améliorés | Aucun |
| 2 | Filtre bruit OCR | 1h | ~5 dossiers pool nettoyé | Aucun |
| 3 | Synthèse fallback | 30min | Jusqu'à 43 dossiers (si motif trackare dispo) | Vérifier séjour.motif |
| 4 | DELTA 3.0 → 2.0 | 30min | +13 CONFIRMED | Patches 1+2 (pool propre) |
| 5 | DAS order bonus | 30min | Brise 15 ex-aequo | Après patch 4 |
**Total estimé** : 3h30
## Critères d'acceptation (KPI)
| KPI | Avant | Cible |
|-----|-------|-------|
| REVIEW rate (sans-DP) | 100% (43/43) | < 50% |
| CONFIRMED + evidence | 100% | 100% (maintenu) |
| DP symptôme R* (CONFIRMED) | 0% | < 5% |
| DP comorbidité (CONFIRMED) | 0% | < 3% |
| Candidats bruit OCR dans pool | ~5% | 0% |
| Ex-aequo (delta=0) | 36% (15/43) | < 15% |
## Prochaines étapes hors sprint
- **Gold standard CRH** : sélectionner 20 CRH avec DP expert pour mesurer `confirmed_accuracy`
- **Benchmark LLM ON** : relancer le pipeline avec `T2A_DP_RANKER_LLM=1` sur les 43 REVIEW
- **Extraction synthèse trackare** : parser le motif d'hospitalisation depuis les PDF trackare
---
*Plan rédigé le 2026-02-24 — benchmark offline sur 249 dossiers*

365
docs/analyse_t2a_v2.md Normal file
View File

@@ -0,0 +1,365 @@
# Rapport d'analyse — t2a_v2
**Date** : 2026-02-19
**Codebase** : `/home/dom/ai/t2a_v2/`
**Branche** : `master` (HEAD: `5c8c281`)
---
## 1. Vue d'ensemble
| Indicateur | Valeur |
|-----------|--------|
| Fichiers source (.py) | 46 |
| Lignes de code (src/) | 12 596 |
| Fichiers tests | 24 |
| Lignes de tests | 7 095 |
| Fonctions test | 685 |
| Ratio tests/code | 0.56 |
| Monolithes (>500L) | 10 fichiers |
| Modules (sous-packages) | 7 |
### Comparaison t2a v1 -> v2
| Aspect | t2a (v1) | t2a_v2 | Delta |
|--------|----------|--------|-------|
| Lignes source | 10 508 | 12 596 | +2 088 (+20%) |
| Fichiers source | 44 | 46 | +2 |
| Ratio tests/code | 0.68 | 0.56 | -0.12 |
| Monolithe max | 1 227L | 1 352L | +125L |
| Config YAML | Aucun | 6 fichiers | +Flexibilite |
| Module quality/ | - | 1 226L | NOUVEAU |
---
## 2. Structure des modules
```
src/ 12 596L total
|
+-- config.py (746L) -- Config unifiee + modeles Pydantic + chargement YAML
+-- main.py (640L) -- Orchestrateur CLI principal
|
+-- anonymization/ (904L) -- Anonymisation NER + regex
| +-- anonymizer.py (529L)
| +-- entity_registry.py (86L)
| +-- ner_anonymizer.py (95L)
| +-- regex_patterns.py (194L)
|
+-- control/ (1161L) -- Controles CPAM
| +-- cpam_parser.py (115L) -- Parsing Excel CPAM
| +-- cpam_response.py (1046L) -- Contre-argumentation multi-pass
|
+-- export/ (190L) -- Export RUM
| +-- rum_export.py (190L)
|
+-- extraction/ (928L) -- Extraction documents PDF
| +-- trackare_parser.py (424L)
| +-- crh_parser.py (129L)
| +-- document_splitter.py (124L)
| +-- document_classifier.py (94L)
| +-- page_tracker.py (91L)
| +-- pdf_extractor.py (66L)
|
+-- medical/ (5323L) -- Coeur metier CIM-10/CCAM/RAG
| +-- cim10_extractor.py (1352L) -- Extraction codes CIM-10 (MONOLITHE)
| +-- rag_search.py (849L) -- RAG FAISS + embedding + reranking
| +-- rag_index.py (803L) -- Index FAISS dual (ref + proc)
| +-- clinical_context.py (315L) -- Enrichissement contexte clinique
| +-- fusion.py (294L) -- Merge multi-PDFs
| +-- cim10_dict.py (243L) -- Dictionnaire CIM-10
| +-- severity.py (242L) -- Calcul severite + niveaux CMA
| +-- ghm.py (231L) -- Estimation GHM
| +-- ccam_dict.py (191L) -- Dictionnaire CCAM
| +-- exclusion_rules.py (169L) -- Filtrage codes impossibles
| +-- das_filter.py (152L) -- 11 regles filtrage DAS bruit
| +-- edsnlp_pipeline.py (140L) -- Wrapper edsnlp (optionnel)
| +-- ollama_client.py (135L) -- Client Ollama + retry + JSON
| +-- ccam_noncumul.py (122L) -- Non-cumulativite CCAM
| +-- ollama_cache.py (85L) -- Cache JSON persistant
|
+-- quality/ (1226L) -- NOUVEAU : qualite deterministe post-LLM
| +-- decision_engine.py (609L) -- Decisions KEEP/DOWNGRADE/REMOVE
| +-- veto_engine.py (411L) -- Vetos + contestabilite
| +-- rules_router.py (205L) -- Routage dynamique packs regles
|
+-- viewer/ (1478L) -- Interface web Flask
+-- app.py (872L) -- Routes + dashboard
+-- validation.py (272L) -- Validation manager (mode DIM)
+-- referentiels.py (160L) -- Upload/indexation referentiels
+-- pdf_redactor.py (154L) -- Redaction source PDF
+-- __main__.py (20L)
```
---
## 3. Pipeline d'execution
### 3.1 CLI (`python -m src.main`)
```
main()
+-- Pour chaque PDF :
| +-- extract_text_with_pages() [extraction/pdf_extractor.py]
| +-- classify() [extraction/document_classifier.py]
| +-- split_documents() [extraction/document_splitter.py]
| +-- parse_trackare() ou parse_crh() [extraction/]
| +-- Anonymizer.anonymize() [anonymization/anonymizer.py]
| +-- _run_edsnlp() [medical/edsnlp_pipeline.py] (optionnel)
| +-- extract_medical_info() [medical/cim10_extractor.py] << MONOLITHE
| | +-- RAG FAISS + Ollama (si --rag)
| | +-- Validation CIM-10 dict + supplements
| | +-- Extraction actes CCAM
| | +-- Scoring confiance biologie
| +-- build_rules_runtime_context() [quality/rules_router.py]
| +-- apply_vetos() [quality/veto_engine.py]
| +-- apply_decisions() [quality/decision_engine.py]
| +-- _compute_metrics() [main.py]
| +-- estimate_ghm() [medical/ghm.py]
| +-- write_outputs() [main.py]
|
+-- FUSION (si multi-PDFs meme groupe)
| +-- merge_dossiers() [medical/fusion.py]
| +-- Re-application vetos/decisions
| +-- Re-estimation GHM
|
+-- CONTROLE CPAM (si Excel detecte)
+-- match_dossier_ogc() [control/cpam_parser.py]
+-- generate_cpam_response() [control/cpam_response.py] << MONOLITHE
+-- Passe 1 : extraction structuree
+-- 5 requetes RAG ciblees
+-- Passe 2 : argumentation 3 axes
+-- Passe 3 : validation adversariale
```
### 3.2 Viewer (`python -m src.viewer --debug`)
- Dashboard : `/` -- liste dossiers + stats
- Detail : `/dossier/<nom>` -- codes CIM-10, DAS, CPAM, GHM
- Admin : `/admin/models` -- gestion modeles Ollama
- Referentiels : `/referentiels` -- upload/indexation PDFs
- Validation : mode DIM pour valider/corriger les codes
### 3.3 Flags CLI
```bash
--no-ner # Desactiver anonymisation NER
--no-edsnlp # Desactiver pipeline edsnlp
--no-rag # Desactiver RAG (LLM seul)
--build-dict # Reconstruire dictionnaire CIM-10
--build-ccam-dict # Reconstruire dictionnaire CCAM
--rebuild-index # Reconstruire index FAISS
--export-rum # Export RUM V016
--control-cpam # Excel CPAM pour contre-argumentation
```
---
## 4. Nouveau module : quality/
Le module `src/quality/` est l'ajout architectural majeur de la v2. Il implementa la couche de validation deterministe post-LLM.
### decision_engine.py (609L)
Post-traitement des codes proposes par le LLM. Chaque code recoit une decision :
- **KEEP** : code valide, maintenu
- **DOWNGRADE** : confiance reduite (ex: symptome R00-R99 avec diagnostic precis)
- **REMOVE** : code rejete (invalide, redondant, non pertinent)
### veto_engine.py (411L)
Detection de vetos deterministes :
- Negation dans le texte source
- Conditionnel (diagnostics non confirmes)
- Antecedents non pertinents pour le sejour
- Conflits entre codes
### rules_router.py (205L)
Routage dynamique des packs de regles selon les signaux du dossier :
- Pack biologie active si valeurs bio presentes
- Pack CPAM active si controle CPAM detecte
- Configuration via `config/rules/router.yaml`
### Configuration YAML associee
```
config/
+-- reference_ranges.yaml -- Valeurs normales biologiques (adulte/enfant)
+-- bio_rules.yaml -- Regles hyponatremie, hyperkaliemie, etc.
+-- lab_value_sanity.yaml -- Garde-fous OCR (K, Na, Plaquettes, Hb, etc.)
+-- rules/
+-- base.yaml -- Catalogue complet des regles
+-- enabled.yaml -- Overlay d'activation
+-- router.yaml -- Routage packs par signaux
```
---
## 5. Croissance par module (v1 -> v2)
| Module | t2a (v1) | t2a_v2 | Delta | % |
|--------|----------|--------|-------|---|
| anonymization | 904 | 904 | 0 | 0% |
| control | 1 062 | 1 161 | +99 | +9% |
| extraction | 928 | 928 | 0 | 0% |
| medical | 4 912 | 5 323 | +411 | +8% |
| viewer | 1 486 | 1 478 | -8 | -0.5% |
| **quality** | **0** | **1 226** | **+1 226** | **NOUVEAU** |
| root (config+main) | 669 | 1 386 | +717 | +107% |
| **TOTAL** | **10 508** | **12 596** | **+2 088** | **+20%** |
La croissance vient principalement de :
1. **quality/** (+1 226L) : nouveau module deterministe
2. **config.py** (+484L) : chargement YAML, rules context, modeles Pydantic supplementaires
3. **main.py** (+233L) : fusion multi-PDFs, vetos/decisions, metriques
---
## 6. Monolithes identifies (>500L)
| # | Fichier | Lignes | Responsabilites |
|---|---------|--------|----------------|
| 1 | cim10_extractor.py | 1 352 | Extraction LLM + validation + filtering + RAG |
| 2 | cpam_response.py | 1 046 | RAG CPAM multi-requete + prompt engineering |
| 3 | app.py | 872 | Routes Flask + dashboard + admin |
| 4 | rag_search.py | 849 | Embedding + reranker + FAISS + generation |
| 5 | rag_index.py | 803 | Dual indexing + chunking CIM-10 |
| 6 | config.py | 746 | Config + Pydantic + chargement YAML |
| 7 | main.py | 640 | Orchestration pipeline complet |
| 8 | decision_engine.py | 609 | Decisions KEEP/DOWNGRADE/REMOVE |
| 9 | anonymizer.py | 529 | 3 phases anonymisation |
| 10 | veto_engine.py | 411 | Vetos + contestabilite |
---
## 7. Tests
### Couverture par fichier (top 10)
| Fichier test | Lignes | Fonctions |
|-------------|--------|-----------|
| test_cpam_response.py | 1 289 | 75 |
| test_rag.py | 1 089 | 72 |
| test_medical.py | 686 | 94 |
| test_fusion.py | 493 | 33 |
| test_viewer.py | 299 | 31 |
| test_das_llm.py | 272 | 13 |
| test_clinical_context.py | 264 | 36 |
| test_das_filter.py | 260 | 67 |
| test_justification.py | 245 | 13 |
| test_rum_export.py | 212 | 29 |
### Zones sous-testees
- **quality/** : nouveau module, pas de fichier test dedie visible
- **rag_index.py** : 803L sans test specifique (teste via test_rag.py)
- **Ratio global** : 0.56 (en baisse vs 0.68 en v1) -- le code a grandi plus vite que les tests
---
## 8. Dependencies externes
| Package | Role | Criticite |
|---------|------|----------|
| pdfplumber | Extraction PDF | Haute |
| PyMuPDF | PDF alternatif + redaction | Haute |
| torch + transformers | Modeles HF | Haute |
| sentence-transformers | Embeddings RAG | Haute |
| faiss-cpu | Index semantique | Haute |
| edsnlp | NLP medical francais | Moyenne (optionnel) |
| flask | Viewer web | Moyenne |
| pydantic | Validation donnees | Haute |
| requests | Client HTTP (Ollama) | Haute |
| openpyxl + pandas | Parsing Excel CPAM | Moyenne |
| PyYAML | Configuration YAML | Haute (v2) |
---
## 9. Variables globales et thread-safety
### Thread-safe
| Module | Variable | Technique |
|--------|----------|-----------|
| config.py | `_RULES_RUNTIME_CTX` | contextvars.ContextVar |
| rag_search.py | `_embed_model` | Lock + double-check + sentinel |
| rag_search.py | `_reranker_model` | Lazy singleton |
| cim10_dict.py | `_dict_cache` | @lru_cache(maxsize=1) |
| ccam_dict.py | `_dict_cache` | @lru_cache(maxsize=1) |
| ollama_cache.py | JSON | File-based lock (fcntl) |
### Non thread-safe (risque)
| Module | Variable | Risque |
|--------|----------|--------|
| main.py:139 | `_use_edsnlp` | Race condition en batch multi-thread |
| main.py:141 | `_use_rag` | Race condition en batch multi-thread |
---
## 10. Dettes techniques
### Haute priorite
| # | Description | Fichier | Impact |
|---|------------|---------|--------|
| T1 | Flags `_use_edsnlp`, `_use_rag` non thread-safe | main.py | Comportement imprevisible en batch |
| T2 | cim10_extractor.py (1352L) melange 4+ responsabilites | medical/ | Testabilite, maintenance |
| T3 | cpam_response.py (1046L) -- prompts en dur, pas de templates | control/ | Versioning, A/B testing |
| T4 | Docstrings manquantes sur extract_medical_info() | cim10_extractor.py | Documentation API |
| T5 | `except Exception:` sans re-raise dans main.py | main.py | Bugs silencieux |
### Moyenne priorite
| # | Description | Fichier | Impact |
|---|------------|---------|--------|
| T6 | Prompts LLM en dur (~50 lignes) | cim10_extractor.py | Versioning |
| T7 | Pas de pytest-cov -> couverture inconnue | tests/ | Risque regressions |
| T8 | Cache Ollama sans TTL, grandit indefiniment | ollama_cache.py | Disque |
| T9 | GHM estime sur 28% des dossiers seulement | ghm.py | Reporting incomplet |
| T10 | quality/ sans tests dedies | tests/ | Couverture insuffisante |
### Basse priorite
| # | Description | Fichier | Impact |
|---|------------|---------|--------|
| T11 | Pagination viewer (500+ dossiers) | viewer/app.py | UX |
| T12 | Extraction CCAM eparses (~1/dossier) | cim10_extractor.py | Completude |
| T13 | Vetos/decisions appliques 2x (PDF + fusion) -- code duplique | main.py | Maintenance |
---
## 11. Points forts architecturaux
1. **Couche quality/ deterministe** : le LLM propose, le moteur de regles dispose -- conforme au principe de l'IA medicale
2. **Pipeline CPAM multi-pass** : extraction -> argumentation -> validation adversariale avec modeles potentiellement differents
3. **Configuration YAML editable** : regles, seuils bio, routage dynamique sans toucher au code
4. **Fallbacks gracieux** : CUDA->CPU (embedding), Ollama->Anthropic (LLM), edsnlp optionnel
5. **RAG dual-index** : separation referentiels / procedures pour meilleure precision
6. **Fusion multi-PDFs** : gestion native des dossiers en plusieurs parties
7. **Tracabilite** : tags [BIO-1], [IMG-2] etc. dans les arguments CPAM
---
## 12. Recommandations
### Court terme (stabilite)
1. Remplacer `_use_edsnlp` / `_use_rag` par contextvars (thread-safety)
2. Ajouter docstrings sur les fonctions principales des monolithes
3. Remplacer `except Exception:` par logging `exc_info=True` + re-raise fatales
4. Ajouter tests dedies pour quality/ (decision_engine, veto_engine, rules_router)
### Moyen terme (maintenance)
1. Externaliser les prompts LLM dans `src/prompts/` (templates versionnables)
2. Refactorer cim10_extractor.py : separer extraction LLM / validation / enrichissement RAG
3. Ajouter pytest-cov et viser 70%+ de couverture
4. Extraire la logique vetos+decisions dupliquee dans un helper `_apply_quality_checks()`
### Long terme (architecture pro)
1. Architecture en couches : Domain / Use Cases / Adapters
2. Event bus pour vetos/decisions (permet A/B testing regles sans code)
3. Architecture multi-modeles LLM (role-based dispatch : coding, cpam, validation, qc)

View File

@@ -0,0 +1,173 @@
{
"case_id": "106_23056475",
"document_type": "trackare",
"gold": {
"dp_expected": {
"code": "I26.9",
"label": "Embolie pulmonaire"
},
"dp_acceptable_codes": [
"I26.0",
"I26.9"
],
"dp_acceptable_family3": [
"I26"
],
"allow_symptom_dp": false,
"confidence": "certain"
},
"prediction": {
"chosen_code": "I26.9",
"chosen_term": "Embolie pulmonaire",
"verdict": "REVIEW",
"confidence": "medium",
"reason": "Écart 1.0 < seuil 3.0, LLM désactivé",
"review_reason_tag": "low_delta",
"evidence": [
"Scores proches : 6.0 vs 5.0"
],
"evidence_count": 1
},
"pool_stats": {
"raw_pool_size": 10,
"filtered_pool_size": 7,
"topk_size": 7
},
"top_candidates": [
{
"rank": 1,
"index": 5,
"code": "I26.9",
"term": "Embolie pulmonaire",
"score": 6.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3,
"occurrences": 1
},
"evidence_snippets": []
},
{
"rank": 2,
"index": 0,
"code": "I26.9",
"term": "Embolie pulmonaire",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 1,
"occurrences": 1
},
"evidence_snippets": []
},
{
"rank": 3,
"index": 2,
"code": "Q53.9",
"term": "Cryptorchidie",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 4,
"index": 3,
"code": "J34.2",
"term": "Déviation de la cloison",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 5,
"index": 8,
"code": "D50",
"term": "Anémie",
"score": 2.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 1
},
"evidence_snippets": []
},
{
"rank": 6,
"index": 9,
"code": "D72.1",
"term": "Thrombocytose",
"score": 2.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 1
},
"evidence_snippets": []
},
{
"rank": 7,
"index": 1,
"code": "Z51.1",
"term": "Chimiothérapie",
"score": 1.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": true
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3,
"act_only_malus": -4
},
"evidence_snippets": []
}
],
"match_eval": {
"strict_match": true,
"acceptable_match": true,
"family3_match": true,
"symptom_not_allowed": false
}
}

View File

@@ -0,0 +1,81 @@
{
"case_id": "111_23061304",
"document_type": "trackare",
"gold": null,
"prediction": {
"chosen_code": "N19",
"chosen_term": "Insuffisance rénale",
"verdict": "REVIEW",
"confidence": "medium",
"reason": "Écart 1.0 < seuil 3.0, LLM désactivé",
"review_reason_tag": "low_delta",
"evidence": [
"Scores proches : 4.0 vs 3.0"
],
"evidence_count": 1
},
"pool_stats": {
"raw_pool_size": 3,
"filtered_pool_size": 3,
"topk_size": 3
},
"top_candidates": [
{
"rank": 1,
"index": 0,
"code": "N19",
"term": "Insuffisance rénale",
"score": 4.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 1
},
"evidence_snippets": []
},
{
"rank": 2,
"index": 1,
"code": "Z99.9",
"term": "Anesthésie + paresthésie",
"score": 3.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3,
"z_code_malus": -2
},
"evidence_snippets": []
},
{
"rank": 3,
"index": 2,
"code": "R50.9",
"term": "Fièvre",
"score": 2.0,
"flags": {
"is_symptom_like": true,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 3,
"symptom_malus": -2
},
"evidence_snippets": []
}
],
"match_eval": null
}

View File

@@ -0,0 +1,153 @@
{
"case_id": "112_23065936",
"document_type": "trackare",
"gold": null,
"prediction": {
"chosen_code": "I25.5",
"chosen_term": "Cardiopathie ischémique",
"verdict": "REVIEW",
"confidence": "medium",
"reason": "Écart 0.0 < seuil 3.0, LLM désactivé",
"review_reason_tag": "low_delta",
"evidence": [
"Scores proches : 5.0 vs 5.0"
],
"evidence_count": 1
},
"pool_stats": {
"raw_pool_size": 8,
"filtered_pool_size": 7,
"topk_size": 7
},
"top_candidates": [
{
"rank": 1,
"index": 2,
"code": "I25.5",
"term": "Cardiopathie ischémique",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 2,
"index": 4,
"code": "K60.5",
"term": "Fistule",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 3,
"index": 5,
"code": "T37.0",
"term": "+ sulfamides + sulfamides",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 4,
"index": 6,
"code": "N39.0",
"term": "Infection urinaire due à Escherichia coli",
"score": 4.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 5,
"index": 0,
"code": "I10",
"term": "Hypertension artérielle",
"score": 3.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": true,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 3,
"comorbidity_malus": -3
},
"evidence_snippets": []
},
{
"rank": 6,
"index": 3,
"code": "R30.0",
"term": "Dysurie",
"score": 3.0,
"flags": {
"is_symptom_like": true,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3,
"symptom_malus": -2
},
"evidence_snippets": []
},
{
"rank": 7,
"index": 7,
"code": "D50",
"term": "Anémie",
"score": 2.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 1
},
"evidence_snippets": []
}
],
"match_eval": null
}

View File

@@ -0,0 +1,152 @@
{
"case_id": "120_23033508",
"document_type": "trackare",
"gold": null,
"prediction": {
"chosen_code": "N85.7",
"chosen_term": "Hématome",
"verdict": "REVIEW",
"confidence": "medium",
"reason": "Écart 1.0 < seuil 3.0, LLM désactivé",
"review_reason_tag": "low_delta",
"evidence": [
"Scores proches : 5.0 vs 4.0"
],
"evidence_count": 1
},
"pool_stats": {
"raw_pool_size": 8,
"filtered_pool_size": 7,
"topk_size": 7
},
"top_candidates": [
{
"rank": 1,
"index": 2,
"code": "N85.7",
"term": "Hématome",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 2,
"index": 0,
"code": "N19",
"term": "Insuffisance rénale",
"score": 4.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 1
},
"evidence_snippets": []
},
{
"rank": 3,
"index": 5,
"code": "C68.9",
"term": "Porteur de mutation BRCA 2",
"score": 4.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 4,
"index": 6,
"code": "D50",
"term": "Anémie légère",
"score": 4.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 5,
"index": 3,
"code": "K64",
"term": "Hémorroïdes",
"score": 3.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 1
},
"evidence_snippets": []
},
{
"rank": 6,
"index": 4,
"code": "Z01.7",
"term": "Laboratoire contacter le laboratoire",
"score": 3.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3,
"z_code_malus": -2
},
"evidence_snippets": []
},
{
"rank": 7,
"index": 7,
"code": "Z54.0",
"term": "Douleur postopératoire",
"score": 2.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 1
},
"evidence_snippets": []
}
],
"match_eval": null
}

View File

@@ -0,0 +1,41 @@
{
"case_id": "132_23080179",
"document_type": "trackare",
"gold": {
"dp_expected": {
"code": "C83.3",
"label": "Lymphome diffus à grandes cellules B"
},
"dp_acceptable_codes": [],
"dp_acceptable_family3": [
"C83"
],
"allow_symptom_dp": false,
"confidence": "probable"
},
"prediction": {
"chosen_code": "R59.0",
"chosen_term": "Adénopathie",
"verdict": "REVIEW",
"confidence": "medium",
"reason": "Trackare symptôme vs CRH diagnostic — vérification DIM requise",
"review_reason_tag": "other",
"evidence": [
"Source: Trackare (codage établissement)",
"Alerte: Trackare code un symptôme (R*) mais le CRH mentionne un diagnostic étiologique"
],
"evidence_count": 2
},
"pool_stats": {
"raw_pool_size": 23,
"filtered_pool_size": 0,
"topk_size": 0
},
"top_candidates": [],
"match_eval": {
"strict_match": false,
"acceptable_match": false,
"family3_match": false,
"symptom_not_allowed": true
}
}

View File

@@ -0,0 +1,152 @@
{
"case_id": "139_23087691",
"document_type": "trackare",
"gold": null,
"prediction": {
"chosen_code": "M16.7",
"chosen_term": "Coxarthrose",
"verdict": "REVIEW",
"confidence": "medium",
"reason": "Écart 0.0 < seuil 3.0, LLM désactivé",
"review_reason_tag": "low_delta",
"evidence": [
"Scores proches : 5.0 vs 5.0"
],
"evidence_count": 1
},
"pool_stats": {
"raw_pool_size": 17,
"filtered_pool_size": 7,
"topk_size": 7
},
"top_candidates": [
{
"rank": 1,
"index": 0,
"code": "M16.7",
"term": "Coxarthrose",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 2,
"index": 1,
"code": "G25.0",
"term": "Tremblements essentiels",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 3,
"index": 3,
"code": "G56.0",
"term": "Syndrome du canal carpien",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 4,
"index": 4,
"code": "K59.0",
"term": "Constipation",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 5,
"index": 6,
"code": "F43.28",
"term": "Troubles de la",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 6,
"index": 7,
"code": "G70.0",
"term": "Myasthénie auto-immune",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 3,
"occurrences": 1
},
"evidence_snippets": []
},
{
"rank": 7,
"index": 13,
"code": "Z50.5",
"term": "Orthophoniste",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
}
],
"match_eval": null
}

View File

@@ -0,0 +1,155 @@
{
"case_id": "140_23090475",
"document_type": "trackare",
"gold": null,
"prediction": {
"chosen_code": "Z54.8",
"chosen_term": "Convalescence",
"verdict": "REVIEW",
"confidence": "medium",
"reason": "Écart 0.0 < seuil 3.0, LLM désactivé",
"review_reason_tag": "low_delta",
"evidence": [
"Scores proches : 5.0 vs 5.0"
],
"evidence_count": 1
},
"pool_stats": {
"raw_pool_size": 7,
"filtered_pool_size": 7,
"topk_size": 7
},
"top_candidates": [
{
"rank": 1,
"index": 3,
"code": "Z54.8",
"term": "Convalescence",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 2,
"index": 4,
"code": "E03.9",
"term": "Hypothyroïdie",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 3,
"index": 0,
"code": "M54.5",
"term": "Douleur lombaire post-opératoire",
"score": 4.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 4,
"index": 1,
"code": "E78.5",
"term": "Dyslipidémie",
"score": 4.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": true,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 3,
"occurrences": 1,
"comorbidity_malus": -3
},
"evidence_snippets": []
},
{
"rank": 5,
"index": 2,
"code": "N19",
"term": "Insuffisance rénale",
"score": 4.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 1
},
"evidence_snippets": []
},
{
"rank": 6,
"index": 6,
"code": "O86.0",
"term": "Infection post-opératoire",
"score": 2.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 1
},
"evidence_snippets": []
},
{
"rank": 7,
"index": 5,
"code": "E78.0",
"term": "Hypercholestérolémie",
"score": 1.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": true,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 1,
"occurrences": 1,
"comorbidity_malus": -3
},
"evidence_snippets": []
}
],
"match_eval": null
}

View File

@@ -0,0 +1,153 @@
{
"case_id": "146_23099769",
"document_type": "trackare",
"gold": null,
"prediction": {
"chosen_code": "T83.5",
"chosen_term": "Infection urinaire",
"verdict": "REVIEW",
"confidence": "medium",
"reason": "Écart 0.0 < seuil 3.0, LLM désactivé",
"review_reason_tag": "low_delta",
"evidence": [
"Scores proches : 6.0 vs 6.0"
],
"evidence_count": 1
},
"pool_stats": {
"raw_pool_size": 9,
"filtered_pool_size": 7,
"topk_size": 7
},
"top_candidates": [
{
"rank": 1,
"index": 0,
"code": "T83.5",
"term": "Infection urinaire",
"score": 6.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 2,
"index": 3,
"code": "D50",
"term": "Anémie",
"score": 6.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 3,
"index": 5,
"code": "C92.0",
"term": "Leucémie myeloblastique aigue",
"score": 6.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3,
"occurrences": 1
},
"evidence_snippets": []
},
{
"rank": 4,
"index": 7,
"code": "C92.6",
"term": "Leucémie aigue myeloide",
"score": 6.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3,
"occurrences": 1
},
"evidence_snippets": []
},
{
"rank": 5,
"index": 4,
"code": "B40.9",
"term": "Blastose",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 6,
"index": 1,
"code": "Z03.8",
"term": "Infection à Proteus vulgaris",
"score": 4.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 7,
"index": 2,
"code": "A41.9",
"term": "Sepsis",
"score": 4.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 1
},
"evidence_snippets": []
}
],
"match_eval": null
}

View File

@@ -0,0 +1,157 @@
{
"case_id": "149_23089771",
"document_type": "trackare",
"gold": null,
"prediction": {
"chosen_code": "H16.0",
"chosen_term": "C omprend décollement de la (de la) : • conjonctive",
"verdict": "REVIEW",
"confidence": "medium",
"reason": "Écart 0.0 < seuil 3.0, LLM désactivé",
"review_reason_tag": "low_delta",
"evidence": [
"Scores proches : 6.0 vs 6.0"
],
"evidence_count": 1
},
"pool_stats": {
"raw_pool_size": 9,
"filtered_pool_size": 7,
"topk_size": 7
},
"top_candidates": [
{
"rank": 1,
"index": 1,
"code": "H16.0",
"term": "C omprend décollement de la (de la) : • conjonctive",
"score": 6.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 3,
"occurrences": 2
},
"evidence_snippets": []
},
{
"rank": 2,
"index": 2,
"code": "H16.1",
"term": "C omprend décollement de la (de la) : • cornée",
"score": 6.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 3,
"occurrences": 2
},
"evidence_snippets": []
},
{
"rank": 3,
"index": 3,
"code": "H16.2",
"term": "C omprend décollement de la (de la) : • membrane de Descemet",
"score": 6.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 3,
"occurrences": 2
},
"evidence_snippets": []
},
{
"rank": 4,
"index": 4,
"code": "N19",
"term": "Insuffisance rénale",
"score": 6.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 5,
"index": 6,
"code": "G82.11",
"term": "Tétraparésie spastique",
"score": 6.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 3,
"occurrences": 2
},
"evidence_snippets": []
},
{
"rank": 6,
"index": 7,
"code": "G82.10",
"term": "Tétraplégie spastique",
"score": 6.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 3,
"occurrences": 2
},
"evidence_snippets": []
},
{
"rank": 7,
"index": 8,
"code": "G82.19",
"term": "Tétraplégie spastique, sans précision",
"score": 6.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 3,
"occurrences": 2
},
"evidence_snippets": []
}
],
"match_eval": null
}

View File

@@ -0,0 +1,153 @@
{
"case_id": "153_23102610",
"document_type": "trackare",
"gold": null,
"prediction": {
"chosen_code": "T83.5",
"chosen_term": "Infection urinaire",
"verdict": "REVIEW",
"confidence": "medium",
"reason": "Écart 1.0 < seuil 3.0, LLM désactivé",
"review_reason_tag": "low_delta",
"evidence": [
"Scores proches : 6.0 vs 5.0"
],
"evidence_count": 1
},
"pool_stats": {
"raw_pool_size": 15,
"filtered_pool_size": 7,
"topk_size": 7
},
"top_candidates": [
{
"rank": 1,
"index": 0,
"code": "T83.5",
"term": "Infection urinaire",
"score": 6.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 1,
"diag_section_bonus": 2
},
"evidence_snippets": []
},
{
"rank": 2,
"index": 3,
"code": "C49",
"term": "C : 9.4",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 3,
"index": 4,
"code": "F06.4",
"term": "Pathologique",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 4,
"index": 9,
"code": "T88.7",
"term": "Effets indésirables",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 5,
"index": 14,
"code": "K71",
"term": "Hépatopathie induite par médicaments",
"score": 4.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 6,
"index": 1,
"code": "E11.9",
"term": "Diabète de type 2",
"score": 3.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": true,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 3,
"comorbidity_malus": -3
},
"evidence_snippets": []
},
{
"rank": 7,
"index": 8,
"code": "N19",
"term": "Insuffisance rénale",
"score": 3.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 0
},
"evidence_snippets": []
}
],
"match_eval": null
}

View File

@@ -0,0 +1,156 @@
{
"case_id": "159_23107113",
"document_type": "trackare",
"gold": null,
"prediction": {
"chosen_code": "I26.9",
"chosen_term": "Embolie pulmonaire",
"verdict": "REVIEW",
"confidence": "medium",
"reason": "Écart 0.0 < seuil 3.0, LLM désactivé",
"review_reason_tag": "low_delta",
"evidence": [
"Scores proches : 6.0 vs 6.0"
],
"evidence_count": 1
},
"pool_stats": {
"raw_pool_size": 21,
"filtered_pool_size": 7,
"topk_size": 7
},
"top_candidates": [
{
"rank": 1,
"index": 1,
"code": "I26.9",
"term": "Embolie pulmonaire",
"score": 6.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 2,
"index": 3,
"code": "J18.9",
"term": "Pneumopathie",
"score": 6.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 1,
"diag_section_bonus": 2
},
"evidence_snippets": []
},
{
"rank": 3,
"index": 4,
"code": "N19",
"term": "Insuffisance rénale",
"score": 6.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 4,
"index": 15,
"code": "B01.8",
"term": "Varicelle",
"score": 6.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 1,
"occurrences": 1,
"diag_section_bonus": 2
},
"evidence_snippets": []
},
{
"rank": 5,
"index": 16,
"code": "B01",
"term": "Pneumopathie varicelleuse",
"score": 6.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 1,
"occurrences": 1,
"diag_section_bonus": 2
},
"evidence_snippets": []
},
{
"rank": 6,
"index": 6,
"code": "P37.1",
"term": "Toxoplasmose congénitale",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 7,
"index": 9,
"code": "B06.9",
"term": "Rubéole",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
}
],
"match_eval": null
}

View File

@@ -0,0 +1,151 @@
{
"case_id": "160_23099448",
"document_type": "trackare",
"gold": null,
"prediction": {
"chosen_code": "E88.1",
"chosen_term": "Lipodystrophie",
"verdict": "REVIEW",
"confidence": "medium",
"reason": "Écart 1.0 < seuil 3.0, LLM désactivé",
"review_reason_tag": "low_delta",
"evidence": [
"Scores proches : 5.0 vs 4.0"
],
"evidence_count": 1
},
"pool_stats": {
"raw_pool_size": 11,
"filtered_pool_size": 7,
"topk_size": 7
},
"top_candidates": [
{
"rank": 1,
"index": 1,
"code": "E88.1",
"term": "Lipodystrophie",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 2,
"index": 0,
"code": "D50",
"term": "Anémie",
"score": 4.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 1
},
"evidence_snippets": []
},
{
"rank": 3,
"index": 4,
"code": "N19",
"term": "Insuffisance rénale",
"score": 3.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 0
},
"evidence_snippets": []
},
{
"rank": 4,
"index": 3,
"code": "E16.2",
"term": "Hypoglycémie",
"score": 2.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 1
},
"evidence_snippets": []
},
{
"rank": 5,
"index": 5,
"code": "L50.9",
"term": "Urticaire",
"score": 2.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 0
},
"evidence_snippets": []
},
{
"rank": 6,
"index": 6,
"code": "K74.0",
"term": "Fibrose hépatique",
"score": 2.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 0
},
"evidence_snippets": []
},
{
"rank": 7,
"index": 7,
"code": "V09.9",
"term": "Polytraumatisme suite à accident de la voie publique",
"score": 2.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 1
},
"evidence_snippets": []
}
],
"match_eval": null
}

View File

@@ -0,0 +1,152 @@
{
"case_id": "170_23077016",
"document_type": "trackare",
"gold": null,
"prediction": {
"chosen_code": "K59.0",
"chosen_term": "Constipation",
"verdict": "REVIEW",
"confidence": "medium",
"reason": "Écart 0.0 < seuil 3.0, LLM désactivé",
"review_reason_tag": "low_delta",
"evidence": [
"Scores proches : 5.0 vs 5.0"
],
"evidence_count": 1
},
"pool_stats": {
"raw_pool_size": 11,
"filtered_pool_size": 7,
"topk_size": 7
},
"top_candidates": [
{
"rank": 1,
"index": 4,
"code": "K59.0",
"term": "Constipation",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 2,
"index": 7,
"code": "M05.9",
"term": "Polyarthrite rhumatoïde",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 3,
"index": 2,
"code": "I97.8",
"term": "Hémorragie postopératoire (sans complication)",
"score": 4.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 4,
"index": 3,
"code": "N19",
"term": "Insuffisance rénale",
"score": 3.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 0
},
"evidence_snippets": []
},
{
"rank": 5,
"index": 0,
"code": "R50.9",
"term": "Fébricule postopératoire",
"score": 2.0,
"flags": {
"is_symptom_like": true,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 3,
"symptom_malus": -2
},
"evidence_snippets": []
},
{
"rank": 6,
"index": 8,
"code": "J18.9",
"term": "Infection",
"score": 2.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 1
},
"evidence_snippets": []
},
{
"rank": 7,
"index": 9,
"code": "D72.8",
"term": "Leucocytose",
"score": 2.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 1
},
"evidence_snippets": []
}
],
"match_eval": null
}

View File

@@ -0,0 +1,153 @@
{
"case_id": "174_23080042",
"document_type": "trackare",
"gold": null,
"prediction": {
"chosen_code": "Q40.1",
"chosen_term": "Hernie hiatale ce",
"verdict": "REVIEW",
"confidence": "medium",
"reason": "Écart 1.0 < seuil 3.0, LLM désactivé",
"review_reason_tag": "low_delta",
"evidence": [
"Scores proches : 5.0 vs 4.0"
],
"evidence_count": 1
},
"pool_stats": {
"raw_pool_size": 7,
"filtered_pool_size": 7,
"topk_size": 7
},
"top_candidates": [
{
"rank": 1,
"index": 2,
"code": "Q40.1",
"term": "Hernie hiatale ce",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 2,
"index": 0,
"code": "N19",
"term": "Insuffisance rénale",
"score": 4.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 1
},
"evidence_snippets": []
},
{
"rank": 3,
"index": 6,
"code": "D72.8",
"term": "Leucocytose",
"score": 4.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 4,
"index": 1,
"code": "E66.05",
"term": "Obésité (IMC 37.806)",
"score": 3.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": true,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 3,
"comorbidity_malus": -3
},
"evidence_snippets": []
},
{
"rank": 5,
"index": 4,
"code": "A69.2",
"term": "Maladie de lyme",
"score": 3.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 1
},
"evidence_snippets": []
},
{
"rank": 6,
"index": 3,
"code": "M54.2",
"term": "Cervicalgies",
"score": 2.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 0
},
"evidence_snippets": []
},
{
"rank": 7,
"index": 5,
"code": "R73.9",
"term": "Hématome postopératoire",
"score": 0.0,
"flags": {
"is_symptom_like": true,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 1,
"symptom_malus": -2
},
"evidence_snippets": []
}
],
"match_eval": null
}

View File

@@ -0,0 +1,154 @@
{
"case_id": "183_23087212",
"document_type": "trackare",
"gold": null,
"prediction": {
"chosen_code": "T83.5",
"chosen_term": "Infection urinaire",
"verdict": "REVIEW",
"confidence": "medium",
"reason": "Écart 0.0 < seuil 3.0, LLM désactivé",
"review_reason_tag": "low_delta",
"evidence": [
"Scores proches : 5.0 vs 5.0"
],
"evidence_count": 1
},
"pool_stats": {
"raw_pool_size": 9,
"filtered_pool_size": 7,
"topk_size": 7
},
"top_candidates": [
{
"rank": 1,
"index": 0,
"code": "T83.5",
"term": "Infection urinaire",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 1,
"occurrences": 1
},
"evidence_snippets": []
},
{
"rank": 2,
"index": 7,
"code": "Z43.3",
"term": "Colostomie",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 3,
"index": 1,
"code": "N10",
"term": "Pyélonéphrite sévère",
"score": 4.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 4,
"index": 2,
"code": "N20.0",
"term": "Obstruction de l'uretère",
"score": 4.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 5,
"index": 4,
"code": "T83.1",
"term": "Lésion traumatique du Bricker",
"score": 3.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 1,
"occurrences": 1
},
"evidence_snippets": []
},
{
"rank": 6,
"index": 6,
"code": "E66.04",
"term": "Obésité (IMC 31.231)",
"score": 3.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": true,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 3,
"comorbidity_malus": -3
},
"evidence_snippets": []
},
{
"rank": 7,
"index": 3,
"code": "N19",
"term": "Insuffisance rénale, non spécifiée",
"score": 2.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 1
},
"evidence_snippets": []
}
],
"match_eval": null
}

View File

@@ -0,0 +1,152 @@
{
"case_id": "192_23132490",
"document_type": "trackare",
"gold": null,
"prediction": {
"chosen_code": "D50",
"chosen_term": "Anémie",
"verdict": "REVIEW",
"confidence": "medium",
"reason": "Écart 1.0 < seuil 3.0, LLM désactivé",
"review_reason_tag": "low_delta",
"evidence": [
"Scores proches : 6.0 vs 5.0"
],
"evidence_count": 1
},
"pool_stats": {
"raw_pool_size": 8,
"filtered_pool_size": 7,
"topk_size": 7
},
"top_candidates": [
{
"rank": 1,
"index": 0,
"code": "D50",
"term": "Anémie",
"score": 6.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 2,
"index": 2,
"code": "F06.4",
"term": "Pathologique",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 3,
"index": 5,
"code": "M48.4",
"term": "Fracture vertébrale de t",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 4,
"index": 1,
"code": "Z72.0",
"term": "Tabagisme",
"score": 4.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 3,
"z_code_malus": -2
},
"evidence_snippets": []
},
{
"rank": 5,
"index": 6,
"code": "N19",
"term": "Insuffisance rénale",
"score": 4.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 1
},
"evidence_snippets": []
},
{
"rank": 6,
"index": 7,
"code": "S22.0",
"term": "Fracture de",
"score": 3.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 1
},
"evidence_snippets": []
},
{
"rank": 7,
"index": 4,
"code": "G44.8",
"term": "Céphalées",
"score": 2.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 0
},
"evidence_snippets": []
}
],
"match_eval": null
}

View File

@@ -0,0 +1,153 @@
{
"case_id": "200_23149959",
"document_type": "trackare",
"gold": null,
"prediction": {
"chosen_code": "I80.2",
"chosen_term": "Thrombose veineuse profonde",
"verdict": "REVIEW",
"confidence": "medium",
"reason": "Écart 1.0 < seuil 3.0, LLM désactivé",
"review_reason_tag": "low_delta",
"evidence": [
"Scores proches : 6.0 vs 5.0"
],
"evidence_count": 1
},
"pool_stats": {
"raw_pool_size": 21,
"filtered_pool_size": 7,
"topk_size": 7
},
"top_candidates": [
{
"rank": 1,
"index": 2,
"code": "I80.2",
"term": "Thrombose veineuse profonde",
"score": 6.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 2,
"index": 1,
"code": "I26.9",
"term": "Embolie pulmonaire",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 1,
"occurrences": 1
},
"evidence_snippets": []
},
{
"rank": 3,
"index": 4,
"code": "J18.9",
"term": "Pneumopathie",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 1,
"occurrences": 1
},
"evidence_snippets": []
},
{
"rank": 4,
"index": 8,
"code": "B02.8",
"term": "Zona",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 5,
"index": 10,
"code": "K62.1",
"term": "Polype rectal",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 6,
"index": 12,
"code": "I77.0",
"term": "Fistule artérioveineuse",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 7,
"index": 15,
"code": "Z03.8",
"term": "Bmr",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
}
],
"match_eval": null
}

View File

@@ -0,0 +1,133 @@
{
"case_id": "225_23160703",
"document_type": "trackare",
"gold": null,
"prediction": {
"chosen_code": "N85.7",
"chosen_term": "Hématome",
"verdict": "REVIEW",
"confidence": "medium",
"reason": "Écart 1.0 < seuil 3.0, LLM désactivé",
"review_reason_tag": "low_delta",
"evidence": [
"Scores proches : 5.0 vs 4.0"
],
"evidence_count": 1
},
"pool_stats": {
"raw_pool_size": 6,
"filtered_pool_size": 6,
"topk_size": 6
},
"top_candidates": [
{
"rank": 1,
"index": 4,
"code": "N85.7",
"term": "Hématome",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 2,
"index": 0,
"code": "C17.9",
"term": "Tumeur neuroendocrine du grêle, grade 1",
"score": 4.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 3,
"index": 1,
"code": "K56.2",
"term": "Adhérences post-opératoires",
"score": 4.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 4,
"index": 3,
"code": "N19",
"term": "Insuffisance rénale",
"score": 4.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 1
},
"evidence_snippets": []
},
{
"rank": 5,
"index": 2,
"code": "K59.9",
"term": "Lésion du grêle",
"score": 2.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 1
},
"evidence_snippets": []
},
{
"rank": 6,
"index": 5,
"code": "J18.9",
"term": "Infection",
"score": 2.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 1
},
"evidence_snippets": []
}
],
"match_eval": null
}

View File

@@ -0,0 +1,152 @@
{
"case_id": "25_23127187",
"document_type": "trackare",
"gold": null,
"prediction": {
"chosen_code": "N19",
"chosen_term": "Insuffisance rénale",
"verdict": "REVIEW",
"confidence": "medium",
"reason": "Écart 1.0 < seuil 3.0, LLM désactivé",
"review_reason_tag": "low_delta",
"evidence": [
"Scores proches : 6.0 vs 5.0"
],
"evidence_count": 1
},
"pool_stats": {
"raw_pool_size": 8,
"filtered_pool_size": 7,
"topk_size": 7
},
"top_candidates": [
{
"rank": 1,
"index": 1,
"code": "N19",
"term": "Insuffisance rénale",
"score": 6.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 2,
"index": 2,
"code": "M96.0",
"term": "Arthrodèse",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 3,
"index": 3,
"code": "K74.0",
"term": "Fibrose hépatique",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 4,
"index": 4,
"code": "K66.0",
"term": "Adhérences péri",
"score": 5.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 5,
"index": 0,
"code": "K81.0",
"term": "Cholécystite aiguë",
"score": 4.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 6,
"index": 5,
"code": "A49.1",
"term": "Infection streptococcique",
"score": 2.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 1
},
"evidence_snippets": []
},
{
"rank": 7,
"index": 6,
"code": "Z00.0",
"term": "Cholangite aiguë",
"score": 2.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 3,
"z_code_malus": -2
},
"evidence_snippets": []
}
],
"match_eval": null
}

View File

@@ -0,0 +1,99 @@
{
"case_id": "74_23141536",
"document_type": "crh",
"gold": {
"dp_expected": {
"code": "I25.1",
"label": "Syndrome coronarien aigu"
},
"dp_acceptable_codes": [
"I25.1",
"I25.5"
],
"dp_acceptable_family3": [
"I25"
],
"allow_symptom_dp": false,
"confidence": "probable"
},
"prediction": {
"chosen_code": "D50",
"chosen_term": "Anémie",
"verdict": "REVIEW",
"confidence": "medium",
"reason": "Écart 0.0 < seuil 3.0, LLM désactivé",
"review_reason_tag": "low_delta",
"evidence": [
"Scores proches : 4.0 vs 4.0"
],
"evidence_count": 1
},
"pool_stats": {
"raw_pool_size": 3,
"filtered_pool_size": 3,
"topk_size": 3
},
"top_candidates": [
{
"rank": 1,
"index": 0,
"code": "D50",
"term": "Anémie",
"score": 4.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 1
},
"evidence_snippets": []
},
{
"rank": 2,
"index": 2,
"code": "I25.1",
"term": "SCA (Syndrome Coronarien Aigu)",
"score": 4.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 3,
"index": 1,
"code": "Z95.5",
"term": "Stent vasculaire",
"score": 2.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 3,
"z_code_malus": -2
},
"evidence_snippets": []
}
],
"match_eval": {
"strict_match": false,
"acceptable_match": false,
"family3_match": false,
"symptom_not_allowed": false
}
}

View File

@@ -0,0 +1,99 @@
{
"case_id": "99_23033146",
"document_type": "trackare",
"gold": null,
"prediction": {
"chosen_code": "E66.83",
"chosen_term": "Obésité (IMC 30.408)",
"verdict": "REVIEW",
"confidence": "medium",
"reason": "Écart 0.0 < seuil 3.0, LLM désactivé",
"review_reason_tag": "low_delta",
"evidence": [
"Scores proches : 3.0 vs 3.0"
],
"evidence_count": 1
},
"pool_stats": {
"raw_pool_size": 4,
"filtered_pool_size": 4,
"topk_size": 4
},
"top_candidates": [
{
"rank": 1,
"index": 0,
"code": "E66.83",
"term": "Obésité (IMC 30.408)",
"score": 3.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": true,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 3,
"comorbidity_malus": -3
},
"evidence_snippets": []
},
{
"rank": 2,
"index": 1,
"code": "N85.7",
"term": "Hématome",
"score": 3.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 1
},
"evidence_snippets": []
},
{
"rank": 3,
"index": 3,
"code": "J18.9",
"term": "Infection",
"score": 2.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 1
},
"evidence_snippets": []
},
{
"rank": 4,
"index": 2,
"code": "Z51.1",
"term": "Chimiothérapie",
"score": -2.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": true
},
"section_strength": 2,
"score_details": {
"section": 2,
"confidence": 0,
"act_only_malus": -4
},
"evidence_snippets": []
}
],
"match_eval": null
}

View File

@@ -0,0 +1,99 @@
{
"case_id": "74_23141536",
"document_type": "crh",
"gold": {
"dp_expected": {
"code": "I25.1",
"label": "Syndrome coronarien aigu"
},
"dp_acceptable_codes": [
"I25.1",
"I25.5"
],
"dp_acceptable_family3": [
"I25"
],
"allow_symptom_dp": false,
"confidence": "probable"
},
"prediction": {
"chosen_code": "D50",
"chosen_term": "Anémie",
"verdict": "REVIEW",
"confidence": "medium",
"reason": "Écart 0.0 < seuil 3.0, LLM désactivé",
"review_reason_tag": "low_delta",
"evidence": [
"Scores proches : 4.0 vs 4.0"
],
"evidence_count": 1
},
"pool_stats": {
"raw_pool_size": 3,
"filtered_pool_size": 3,
"topk_size": 3
},
"top_candidates": [
{
"rank": 1,
"index": 0,
"code": "D50",
"term": "Anémie",
"score": 4.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 3,
"score_details": {
"section": 3,
"confidence": 1
},
"evidence_snippets": []
},
{
"rank": 2,
"index": 2,
"code": "I25.1",
"term": "SCA (Syndrome Coronarien Aigu)",
"score": 4.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 3
},
"evidence_snippets": []
},
{
"rank": 3,
"index": 1,
"code": "Z95.5",
"term": "Stent vasculaire",
"score": 2.0,
"flags": {
"is_symptom_like": false,
"is_comorbidity_like": false,
"is_act_only": false
},
"section_strength": 1,
"score_details": {
"section": 1,
"confidence": 3,
"z_code_malus": -2
},
"evidence_snippets": []
}
],
"match_eval": {
"strict_match": false,
"acceptable_match": false,
"family3_match": false,
"symptom_not_allowed": false
}
}

View File

@@ -0,0 +1,42 @@
# Case Debug — 74_23141536
**Type** : crh
**Verdict** : REVIEW
**Confidence** : medium
**Code choisi** : D50
**Reason** : Écart 0.0 < seuil 3.0, LLM désactivé
**Evidence** : 1 extrait(s)
**Pool** : 3 raw → 3 candidats
**DP attendu** : I25.1 (Syndrome coronarien aigu)
**Confiance gold** : probable
**Match** : strict=FAIL, acceptable=FAIL, symptôme interdit=-
## Gold vs Prediction
| | Gold | NUKE-3 |
|---|------|--------|
| Code | I25.1 | D50 |
| Label | Syndrome coronarien aigu | Anémie |
| Codes acceptables | I25.1, I25.5 | - |
| Family3 | I25 | - |
| Confiance | probable | medium |
| Symptôme autorisé | non | - |
## Top candidats
| Rank | Code | Score | Term | Flags | Section |
|------|------|-------|------|-------|---------|
| 1 | D50 | 4.0 | Anémie | - | 3 |
| 2 | I25.1 | 4.0 | SCA (Syndrome Coronarien Aigu) | - | 1 |
| 3 | Z95.5 | 2.0 | Stent vasculaire | - | 1 |
## Evidence
1. Scores proches : 4.0 vs 4.0
## Hypothèse bug
**Mauvais classement**`I25.1` est dans le pool (rank 2) mais `D50` a été choisi. Problème de scoring (bonus/malus).
---
*Généré le 2026-02-24 11:40*