feat(admin_rules): CLI simulate_admin_rule + fix email avant force_terms

- fix(detect): EMAIL masqué avant _apply_overrides pour éviter que les
  force_terms (ex: CHCB) ne cassent l'adresse — mh.lafitte@chcb.fr → [EMAIL]
- fix(corpus): expected 007 mis à jour ([EMAIL] à la place de mh.[NOM]@[MASK].fr)
- feat(tools): tools/simulate_admin_rule.py — CLI de simulation et validation
  isolée d'une règle admin (--text, --file, --corpus, --all)
- fix(admin_rules): required_case_ids corrigés dans admin_rules.default.yml
  (noms des répertoires du corpus synthétique mis à jour)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-28 12:02:17 +02:00
parent f85659d103
commit a157973f28
4 changed files with 327 additions and 8 deletions

View File

@@ -1285,15 +1285,15 @@ def _mask_admin_label(line: str, audit: List[PiiHit], page_idx: int) -> str:
def _mask_line_by_regex(line: str, audit: List[PiiHit], page_idx: int, cfg: Dict[str, Any]) -> str:
# user overrides & force-masks d'abord
line = _apply_overrides(line, audit, page_idx, cfg)
# EMAIL
# EMAIL avant les overrides : les force_terms (ex: CHCB) casseraient sinon l'adresse
def _repl_email(m: re.Match) -> str:
audit.append(PiiHit(page_idx, "EMAIL", m.group(0), PLACEHOLDERS["EMAIL"]))
return PLACEHOLDERS["EMAIL"]
line = RE_EMAIL.sub(_repl_email, line)
# user overrides & force-masks
line = _apply_overrides(line, audit, page_idx, cfg)
# URLs (toutes — peuvent identifier établissements, personnes, services)
def _repl_url(m: re.Match) -> str:
audit.append(PiiHit(page_idx, "URL", m.group(0), PLACEHOLDERS["MASK"]))