Trois fixes regroupés issus de la session de revue couche 2 : #6 — caractère ñ dans les patterns de noms Étend les classes de caractères pour inclure Ñ/ñ (basque, hispanique). Avant : `Beñat` → `[NOM]ñat` (fuite indirecte du suffixe). Après : `Beñat` → `[NOM]` (capture complète). Justification : usage prévu La Réunion + populations basques/ hispaniques. Si nécessaire on ajoutera Ã/ã, Õ/õ (portugais) plus tard. #10 — règle numéro adhérent mutuelle (nouveau) Ajoute placeholder [ADHERENT] et `RE_NUM_ADHERENT` : `(?:n[°o]?\s*|num[ée]ro\s+(?:d['’]\s*)?)adh[ée]rent[e]?\s*[:\-]?\s*([A-Z0-9]{6,15})` Couvre `n°adhérent`, `n° adhérent:`, `Numéro d'adhérent :`, `Numéro d'adhérente:`, `numero adherent`, alphanumérique 6-15. Faux positif `Le patient est adhérent à la mutuelle.` non matché (préfixe N°/numéro obligatoire). Branché dans `_mask_structured_line` (pour conserver le préfixe au moment du matching, avant le split key:value) et dans `_mask_line_by_regex` (texte non-structuré). #11 — NIR avant TEL pour éviter consommation prématurée Réordonne RE_NIR avant RE_TEL dans `_mask_line_by_regex` et `selective_rescan`. Le NIR au format espacé `2 73 04 65 100 100 88` est testé d'abord (validation modulo 97). Si validé, masqué en [NIR] avant que RE_TEL ne consomme les 10 chiffres centraux. Si la clé échoue (faux positif), TEL reprend la main inchangé. Avant : `2 73 04 65 100 100 68` → `2 73 [TEL] 68`. Après : `2 73 04 65 100 100 68` → `[NIR]`. Cas synthetic_review/010 corrigé : NIR de test mis à clé valide (68 au lieu de 88), expected aligné sur [ADHERENT] et [NIR]. Le case 010 reste en xfail — fuites résiduelles ELIZONDO / Sabine / Bayonne (labels structurels Nom de jeune fille / Prénom / Ville non couverts) à fixer dans le batch suivant. Tests : 70 passed, 3 xfailed (inchangé). Pas de régression. 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.