test(review): étendre couche 2 à 10 cas et brancher gate pytest avec xfail strict

Couche 2 (revue humaine sur documents complets) : ajout de 6 cas
synthétiques pour atteindre la cible cadrage produit (10 cas).

Cas ajoutés :
- 005_bacterio_complete : layout BACTERIO N° venue rejeté avant IPP
  + RPPS prescripteur (pattern qualifié non détecté).
- 006_trackare_soignants : export Trackare avec activités HH:MM NOM,
  Note IDE/médicale, Signé — médicament greedy.
- 007_lettre_sortie_complete : courrier médecin→médecin, multi-villes,
  email institutionnel @chcb.fr (cassé par le force_term CHCB).
- 008_anesthesie_complete : protocole anesthésique avec molécules
  BDPM, prénoms basques rares (Maddi, Pantxoa).
- 009_multi_etablissements : 3 établissements distincts (CHCB, CHU
  Bordeaux, Clinique Aguilera), prénoms basques avec ñ (Beñat).
- 010_fiche_admission_minimale : fiche administrative dense, labels
  variés (Nom de jeune fille :, Prénom :, Ville :, Mutuelle :).

Gate pytest (tests/unit/test_synthetic_review.py) :
- vérifie l'inventaire (10 cas) et fait passer chaque cas via run_case.
- 3 cas marqués xfail(strict=True) pour révéler 9 fuites de PII et
  2 patterns partiels que le moteur ne couvre pas aujourd'hui :
  * 005 — RPPS avec qualificateur (RPPS prescripteur :)
  * 009 — Bordeaux résiduel après [ETAB], CHCB en fin de phrase,
          Biarritz sur ligne Ville :, ñ qui casse Beñat → [NOM]ñat
  * 010 — Nom de jeune fille / Prénom / Ville sans label "Patient :",
          NIR au format espacé partiellement consommé en TEL,
          numéro de mutuelle MGEN non couvert
- xfail strict force pytest à signaler un xpass quand un fix passe :
  rappel automatique de retirer l'entrée de KNOWN_FAILURES.

Le runner tools/run_synthetic_review_corpus.py reste utilisable en
direct (sortie diff/audit/summary) pour la revue humaine. Les sorties
actual/ sont gitignorées (régénérées à chaque exécution).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-27 20:46:22 +02:00
parent 8f6c462b27
commit cf36357fe5
26 changed files with 1065 additions and 0 deletions

View File

@@ -0,0 +1,43 @@
# Revue 006 — dossier de soins Trackare
Famille documentaire : export Trackare/TrakCare avec activités de soins
horodatées et noms de soignants en formats variés. Regroupe les patterns
historiquement les plus piégeux du moteur (cf. mémoire `soignants-trackare`).
Le document doit contenir au moins deux marqueurs Trackare reconnus
(`Détails des patients`, `Nom de naissance`, `Dossier Patient`) pour que
`_extract_trackare_identity` se déclenche. Sans ces marqueurs, les patterns
spécifiques (HH:MM NOM, Note IDE NOM, Signé NOM, etc.) ne tournent pas.
Patterns testés et confirmés masqués :
- `Patient :\n<PRENOM>\n<NOM>` (PIERRE / HARRIET) sur trois lignes ;
- soignants `HH:MM <NOM>` dans les activités de soins (ETCHEBARNE,
ALVARADO, LACLAU-, NARZABAL, LACROUTS) — kind NOM_GLOBAL ;
- soignants `Note IDE <NOM>` (DUPONT) — kind NOM_FORCE ;
- soignant `Note médicale Dr <NOM> <Prénom-composé>` (MARTIN Jean-Paul)
— capturé en bloc puis Jean-Paul re-confirmé en NOM_FORCE ;
- soignant après médicament greedy `Signé — PARACETAMOL BBM 1000 MG INJ
DURAND Sophie` — DURAND et Sophie sont masqués via NOM_GLOBAL ;
- nom tronqué `Signé LARRIEU-` — masqué (kind NOM_FORCE).
Vérification métier (préservation) :
- `PARACETAMOL BBM 1000 MG INJ` reste lisible (gazetteer BDPM) ;
- `cholécystectomie`, `EVA 2/10`, `Service de chirurgie viscérale`
restent intacts ;
- `Détails des patients` doit rester pour conserver la trace de la
source documentaire.
Écarts détectés au runner (à fixer ultérieurement) :
- **`Saint-Jean-de-Luz` partiellement masqué en `[ETABLISSEMENT]-de-Luz`**
via un hit `ETAB_FINESS` sur `Saint-Jean`. La ville composée doit être
prise comme un bloc avant que le matcher FINESS ne morde. Laisser le
résiduel `-de-Luz` est un FP visuel mais pas une fuite directe.
- **classification `NDA` → `DOSSIER`** : la valeur `2300784512` derrière
`NDA :` est masquée mais le kind utilisé est `DOSSIER`, pas `NDA`. Le
texte est masqué correctement, c'est la cohérence d'audit qui souffre.
- **horodatages `07:00` deviennent `07 : 00`** : une normalisation
cosmétique ajoute des espaces autour du `:`. Sans impact sur la sécurité
mais altère la lisibilité du document final.
- **bloc `Dr MARTIN Jean-Paul` masqué en un seul `[NOM]`** : MARTIN et
Jean-Paul sont bien dans l'audit, mais le rendu `Note médicale Dr [NOM]`
efface la structure préfixe+nom+prénom.