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,37 @@
# Revue 009 — compte rendu multi-établissements
Famille documentaire : consultation neurologique impliquant trois
établissements distincts cités dans le narratif (CHCB, CHU de Bordeaux,
Clinique Aguilera). Document typique du parcours de soin patient passant
d'un établissement à l'autre.
Patterns testés :
- établissement principal en entête (CHCB) ;
- établissement secondaire en narratif (`Centre Hospitalier Universitaire
de Bordeaux`, `CHU de Bordeaux`) — variantes longue et courte du même
établissement ;
- établissement privé en narratif (`Clinique Aguilera`) — pas dans les
gazetteers FINESS publics par défaut, doit être détecté contextuellement
via le mot-clé `Clinique` ;
- prénoms basques rares (Iban, Xabi, Maïté, Beñat) sur trois noms de
médecins différents — risque de FN si gazetteer prénoms incomplet ;
- nom composé avec accent (`Maïté`) ;
- code CIM `G56.8` cité littéralement — préservation obligatoire.
Points critiques :
- aucun token nominal de patient (SALABERRY Iban) ni des trois médecins
(ELISSALDE Xabi, LARRALDE Maïté, ITHURRIAGUE Beñat) ne doit fuiter ;
- les villes Bordeaux, Biarritz, Bayonne et le nom d'établissement
Aguilera doivent toutes disparaître ;
- le sigle `CHCB` doit être masqué (force_term) ;
- le terme `CHU de Bordeaux` doit être masqué — y compris la version
courte qui ne contient pas explicitement `Centre Hospitalier` ;
- terminologie médicale dense doit rester intacte :
`neuropathie périphérique`, `réflexes ostéotendineux`,
`rééducation fonctionnelle`, `EMG`, `IRM médullaire`.
Écart spécifique à observer :
- détection des établissements non FINESS publics (cliniques privées) ;
- détection variante longue vs sigle (`Centre Hospitalier Universitaire
de Bordeaux` vs `CHU de Bordeaux`) — la version sigle peut échapper au
matcher si `CHU` n'est pas en règle force_term ou contextuelle.