Trois nouveaux patterns cœur dans `_mask_structured_line` pour des labels génériques qui n'étaient pas couverts par le pipeline kv_value (le split key:value laissait fuir la valeur quand le label dépassait les patterns existants `RE_EXTRACT_NOM_NAISSANCE`, `RE_EXTRACT_PRENOM`, `RE_EXTRACT_VILLE_RESIDENCE`). `RE_LABEL_NOM_VARIANTES` capture : - Nom de jeune fille / de famille / de naissance(.) - Nom d'usage / Nom marital / Nom marié `RE_LABEL_PRENOM` capture : - Prénom : / Prénoms : / Prénom de naissance / utilisé(e) / usuel - Capture jusqu'à fin de ligne pour les énumérations virgulées (Prénoms : Sabine, Marie → tout masqué). `RE_LABEL_VILLE` capture : - Ville : / Ville de résidence : / Ville de naissance : - Capture jusqu'à fin de ligne (gère "Saint-Jean-de-Luz", "Saint-Denis (974)", composés multi-tokens). Effets de bord positifs : - Le bug "Saint-Jean-de-Luz → [ETABLISSEMENT]-de-Luz" est corrigé : le matcher `RE_LABEL_VILLE` masque toute la valeur en `[VILLE]` AVANT que le gazetteer FINESS Aho-Corasick ne grignote "Saint-Jean". Cas 006_trackare_soignants et 008_anesthesie_complete : alignement des expected.txt sur cette amélioration. Choix d'architecture (cf cadrage docs/cadrage-projet-anonymisation.md section 10.1) : ces labels sont des règles cœur génériques applicables à tout établissement de santé français. Légitimes en hardcodé. Les patterns layout-specific (Bordeaux suffixe, CHCB en fin de phrase, email cassé par force_term) seront branchés via admin_rules dans l'étape suivante. Cas 010_fiche_admission_minimale passe désormais (retiré de KNOWN_FAILURES). Le xfail strict aurait signalé xpass. Tests : 9 passed, 2 xfailed (avant : 8 passed, 3 xfailed sur test_synthetic_review). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Corpus synthétique de revue humaine
Ce corpus ne remplace pas les tests unitaires. Il sert à valider des documents complets, relus par un humain, avec un vrai diff entre :
test.txt: document synthétique sourceexpected.txt: anonymisation attendue selon la règle métieractual/: sortie réellement produite par le moteur
Objectif :
- détecter les régressions de composition sur des documents réalistes ;
- rendre visibles les écarts de comportement du moteur ;
- préparer une validation humaine avant promotion éventuelle en suite bloquante.
Commande :
python3 tools/run_synthetic_review_corpus.py
Chaque exécution écrit :
actual.txtactual.audit.jsonactual.summary.jsondiff.txt
Sous actual.