Files
anonymisation/docs/cadrage-projet-anonymisation.md
Domi31tls d21e01a2c2 chore(rgpd): replace CHCB/Bayonne refs in docs (D-12)
Anonymise les références aux entités réelles (CHCB, villes basques,
Saint-Denis, Réunion, etc.) dans la documentation projet, les maquettes
HTML/Python, les notes de coordination et les audits.

Conserve docs/coordination/decisions/2026-06-02_dom_mvp-pivots-strategiques.md
(table de mapping de référence) et docs/coordination/inbox/for-claude/
intacts.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-02 14:40:20 +02:00

559 lines
14 KiB
Markdown

# Cadrage projet — anonymisation
## 1. Objet du projet
Le projet n'a pas pour finalite de "faire tourner un pipeline" ni de "passer des tests".
La finalite est plus stricte :
- produire des documents exploitables sans fuite de donnees personnelles ;
- conserver l'information medicale utile au controle ;
- permettre une validation humaine fiable et rapide ;
- rendre les regles d'anonymisation pilotables sans repasser systematiquement par du code.
Autrement dit, la qualite du projet se mesure d'abord sur la **fonction d'anonymisation**,
pas sur l'elegance interne du code.
## 2. Priorites produit
Ordre de priorite assume :
1. **Ne pas laisser fuiter de PII**.
2. **Preserver le sens medical et administratif utile**.
3. **Rendre le comportement verifiable, explicable et auditable**.
4. **Permettre l'ajout rapide de regles metier locales**.
5. **Industrialiser ensuite seulement** : performance, packaging, confort d'usage.
Consequence directe :
- un faux negatif est plus grave qu'un faux positif ;
- mais un taux trop eleve de faux positifs finit par rendre le systeme inutilisable ;
- la bonne cible n'est donc pas "tout masquer", mais "masquer tout ce qui doit l'etre, sans casser l'usage metier".
## 3. Definition de "fonctionne correctement"
Le systeme fonctionne correctement si, ensemble, les conditions suivantes sont remplies :
- aucune fuite critique sur le corpus de validation bloquant ;
- rappel tres eleve sur les PII obligatoires ;
- preservation correcte des termes metier, structures, services, formulations cliniques utiles ;
- stabilite du comportement entre deux versions ;
- explicabilite minimale via les sorties texte, les audits et les diffs ;
- capacite a integrer rapidement une nouvelle regle locale sans regression laterale evidente.
## 4. Definition de done d'une evolution
Une evolution ne doit pas etre consideree comme "terminee" parce que le code compile.
Elle est terminee si :
- les tests unitaires regressifs passent ;
- les cas synthetiques rapides passent ;
- le corpus synthetique complet de revue est relu ou au minimum regenere sans surprise ;
- le sous-ensemble reel annote est dans les seuils cibles ;
- les ecarts nouveaux sont compris et documentes ;
- la revue humaine metier valide que le document reste exploitable.
## 5. Risques structurants du projet
### 5.1 Faux negatifs
Risque principal :
- nom patient en en-tete non propage ;
- identifiant compact non reconnu ;
- libelle et valeur separes sur plusieurs lignes ;
- OCR degrade ;
- PII noyé dans un tableau ou un layout multi-colonnes ;
- nouvelle variante locale non couverte.
Impact :
- non-conformite ;
- exposition de donnees de sante ;
- perte de confiance dans le systeme.
### 5.2 Faux positifs
Risque secondaire mais reel :
- services, actes, classes medicales, phrases metier masques a tort ;
- document rendu illisible pour le controle ;
- inflation des exceptions manuelles.
Impact :
- baisse d'utilite ;
- surcharge de revue humaine ;
- contournements du systeme.
### 5.3 Pilotage des regles
Risque operationnel :
- ajout d'une regle locale trop large ;
- regle non testee qui casse 20 autres formats ;
- absence de trace de qui a ajoute quoi et pourquoi.
Impact :
- regressions silencieuses ;
- gouvernance faible ;
- difficultes d'audit interne.
## 6. Etat actuel utile dans le depot
Le projet dispose deja de briques solides, mais elles ne sont pas encore un cadre complet de validation produit.
Existant :
- configuration externalisee :
- `config/dictionnaires.default.yml`
- `config/dictionnaires.yml`
- `config_defaults.py`
- evaluation :
- `evaluation/quality_evaluator.py`
- `evaluation/leak_scanner.py`
- `evaluation/benchmark.py`
- corpus reel annote :
- `tests/ground_truth/`
- suite synthetique rapide :
- `tests/synthetic_regression/`
- corpus synthetique complet de revue humaine :
- `tests/synthetic_review/`
- `tools/run_synthetic_review_corpus.py`
Manque encore a ce stade :
- des gates de release formels et assumes ;
- un workflow standard de revue humaine ;
- un moteur de regles administrables avec versioning et validation avant activation ;
- un tableau de bord simple "safe / warning / blocked" pour une version donnee.
## 7. Strategie de validation complete
Il faut raisonner en **4 couches** et non en un seul type de test.
### Couche 1 — garde-fous rapides
Objectif :
- attraper vite les regressions simples et frequentes.
Contenu :
- tests unitaires sur regex, rescan, config, propagation ;
- cas synthetiques courts et stables ;
- verification des sorties texte et de l'audit.
Dans le depot :
- `tests/unit/`
- `tests/synthetic_regression/`
Usage :
- a executer a chaque modification.
### Couche 2 — revue sur documents synthetiques complets
Objectif :
- verifier le comportement d'ensemble sur des documents realistes et diffables.
Contenu :
- documents synthetiques longs ;
- `test.txt` source ;
- `expected.txt` attendu metier ;
- `review.md` indiquant les points critiques ;
- `actual.txt` et `diff.txt` generes par le runner.
Dans le depot :
- `tests/synthetic_review/`
- `tools/run_synthetic_review_corpus.py`
Usage :
- a executer pour toute evolution de regles ou de pipeline ;
- support principal de revue humaine rapide.
### Couche 3 — corpus reel annote
Objectif :
- mesurer la qualite sur des documents representatifs du terrain.
Contenu :
- annotations manuelles ;
- precision, rappel, F1 ;
- analyse des faux positifs / faux negatifs ;
- scanner de fuite.
Dans le depot :
- `tests/ground_truth/`
- `evaluation/`
Usage :
- avant merge important ;
- avant release ;
- avant activation d'une famille de nouvelles regles.
### Couche 4 — validation humaine metier
Objectif :
- confirmer que le document reste exploitable et conforme dans la vraie vie.
Contenu :
- lecture de `expected.txt` vs `actual.txt` ou du PDF de sortie ;
- checklist de revue ;
- validation ou rejet motive ;
- trace date / personne / version / decision.
Usage :
- obligatoire pour les changements qui touchent :
- les noms patients ;
- les identifiants administratifs ;
- les regles globales ;
- les whitelists / blacklists sensibles ;
- les formats documentaires majeurs.
## 8. Gates de release proposes
Une release ne doit pas se limiter a "tout est vert dans pytest".
### Gate A — technique minimale
- les tests unitaires passent ;
- la suite synthetique rapide passe ;
- le corpus synthetique complet ne presente aucun ecart non explique ;
- aucun leak critique dans le scanner de fuite.
### Gate B — qualite reelle
Sur le corpus reel annote :
- rappel global >= 99,5 % sur les PII obligatoires ;
- precision >= 97 % ;
- F1 >= 0,98 ;
- aucun document critique avec fuite non acceptee.
Si ces seuils sont trop ambitieux pour une famille documentaire donnee, il faut documenter explicitement l'exception, pas l'ignorer.
### Gate C — validation humaine
- un echantillon de documents impactes est relu ;
- les nouveaux faux positifs sont juges acceptables ou corriges ;
- la decision est tracee.
Sans Gate C, on a un systeme "teste", pas un systeme "approuve".
## 9. Workflow cible d'une modification
### Cas 1 — correction technique simple
1. ecrire ou adapter le test unitaire ;
2. corriger le moteur ;
3. rejouer la suite rapide ;
4. rejouer le corpus synthetique complet ;
5. si changement visible, faire relire les cas impactes.
### Cas 2 — ajout de regle metier
1. definir la regle ;
2. preparer 1 a 3 documents synthetiques representatifs ;
3. lancer le runner de revue ;
4. verifier l'absence de regression sur le corpus reel ;
5. faire valider la regle avant activation globale.
### Cas 3 — nouvelle famille documentaire
1. echantillonner des documents reels ;
2. construire 2 a 4 cas synthetiques representatifs ;
3. annoter un sous-ensemble reel ;
4. regler le pipeline ;
5. passer la revue humaine ;
6. seulement ensuite integrer la famille au gate standard.
## 10. Gouvernance des regles d'anonymisation
Il faut distinguer plusieurs classes de regles.
### 10.1 Regles coeur
Exemples :
- nom, prenom, date de naissance, telephone, email, adresse ;
- RPPS, FINESS, IPP, OGC, NDA, dossier.
Caracteristiques :
- versionnees dans le code ou dans la config versionnee ;
- modifiees rarement ;
- forte revue requise.
### 10.2 Regles locales / metier
Exemples :
- un sigle d'etablissement local ;
- un format de numero interne ;
- un libelle administratif propre a l'organisation.
Caracteristiques :
- doivent etre administrables sans dev lourd ;
- doivent etre historisees ;
- doivent etre testables avant activation.
### 10.3 Regles de preservation
Exemples :
- "classification internationale" ;
- "prise en charge" ;
- "service de cardiologie" ;
- termes structurels indispensables a la lecture.
Caracteristiques :
- aussi importantes que les regles de masquage ;
- toute regle de masquage nouvelle doit etre testee contre elles.
## 11. Cadrage de l'interface d'administration
L'interface d'administration n'est pas une "feature de confort".
C'est un dispositif de pilotage du risque.
### 11.1 Objectif
Permettre a un administrateur metier autorise de :
- ajouter une regle ;
- la tester ;
- visualiser son effet ;
- l'activer ;
- la desactiver ;
- savoir qui l'a creee et pourquoi.
### 11.2 Principe cle
L'admin ne doit jamais saisir "une regex brute obligatoire" comme seule option.
Il faut partir d'objets metier.
### 11.3 Types de regles a proposer en MVP
#### Type A — terme exact
Exemple :
- `CHUXX`
- `LOCAL_SIGLE`
Usage :
- masquer exactement cette chaine, avec ou sans casse.
#### Type B — identifiant normalise
Exemple :
- `1234567`
L'outil doit pouvoir generer automatiquement des variantes comme :
- `1234567`
- `N°1234567`
- `N° 1234567`
- `No 1234567`
- `Numero 1234567`
Et, selon le contexte choisi :
- seulement comme jeton entier ;
- seulement apres certains prefixes ;
- partout dans le document.
#### Type C — prefixe + valeur
Exemple :
- `N° venue : 1234567`
- `IPP : ABC12345`
Usage :
- quand on veut contraindre la detection a un contexte structure plutot qu'au nombre seul.
#### Type D — phrase a ne jamais masquer
Exemple :
- `classification internationale`
- `prise en charge`
Usage :
- proteger les formulations critiques contre les regressions.
### 11.4 Champs minimum d'une regle
- identifiant technique ;
- libelle humain ;
- type de regle ;
- valeur source ;
- placeholder cible ;
- options de normalisation ;
- options de contexte ;
- portee ;
- priorite ;
- auteur ;
- motif ;
- date d'effet ;
- statut : brouillon / testee / active / retiree.
### 11.5 Options de normalisation necessaires
Pour le cas `1234567`, il faut pouvoir cocher par exemple :
- ignorer les espaces ;
- accepter ou non les prefixes `N°`, `No`, `Numero` ;
- accepter ou non les separateurs `:`, `-` ;
- matcher sur ligne simple ou multi-ligne ;
- matcher en casse insensible ;
- matcher seulement sur mot entier.
### 11.6 Portee de la regle
La regle ne doit pas etre obligatoirement globale.
Il faut pouvoir choisir :
- globale ;
- famille documentaire ;
- etablissement ;
- lot de validation ;
- environnement de test uniquement.
### 11.7 Cycle de vie d'une regle
1. creation en brouillon ;
2. simulation sur corpus synthetique ;
3. simulation sur sous-ensemble reel ;
4. lecture du diff ;
5. approbation ;
6. activation ;
7. surveillance ;
8. retrait ou revision.
### 11.8 Garde-fous obligatoires dans l'interface
- previsualisation des variantes generees ;
- affichage du nombre de documents impactes ;
- exemples "avant / apres" ;
- lancement automatique des tests associes ;
- blocage si fuite critique ou regression majeure ;
- journal d'audit des changements ;
- possibilite de rollback.
## 12. Proposition concrete pour ton exemple `N°1234567` / `1234567`
Oui, c'est realisable proprement.
La bonne approche n'est pas :
- "ajouter une ligne de dictionnaire brute et prier".
La bonne approche est :
- creer un type de regle **identifiant normalise** ;
- stocker la valeur canonique `1234567` ;
- generer les variantes autorisees ;
- choisir la portee :
- partout ;
- seulement apres prefixes ;
- seulement en contexte administratif ;
- visualiser les occurrences matchees ;
- valider la regle sur corpus avant activation.
Cela evite deux erreurs classiques :
- rater `N°1234567` parce qu'on n'avait saisi que `N° 1234567` ;
- masquer tous les `1234567` partout alors qu'il fallait un contexte plus strict.
## 13. Tableau de bord de pilotage recommande
Pour chaque version du moteur ou du jeu de regles :
- nombre de cas synthetiques rapides passes ;
- nombre de cas complets de revue passes ;
- nombre de documents reels evalues ;
- rappel / precision / F1 ;
- nombre de fuites critiques ;
- top faux positifs ;
- top faux negatifs ;
- liste des regles ajoutees ou modifiees ;
- decision : OK / WARNING / BLOCKED.
## 14. Roadmap recommandee
### P0 — securiser la fonction d'anonymisation
- stabiliser les gates ;
- enrichir le corpus synthetique complet jusqu'a 10 documents ;
- selectionner un sous-ensemble reel bloquant ;
- formaliser la revue humaine.
### P1 — administrabilite
- definir le modele de regles ;
- implementer le moteur de regles administrables ;
- ajouter la simulation avant activation ;
- tracer les changements.
### P2 — industrialisation
- tableau de bord de validation ;
- packaging propre ;
- exports de rapports ;
- gestion du cycle de vie des regles.
## 15. Decisions recommandees maintenant
### Decision 1
Assumer officiellement que la validation produit repose sur :
- unitaires ;
- corpus synthetique rapide ;
- corpus synthetique complet ;
- corpus reel annote ;
- revue humaine.
### Decision 2
Assumer que toute nouvelle regle d'anonymisation passe par :
- un cas synthetique ;
- une simulation ;
- une validation humaine si la portee est large.
### Decision 3
Faire de l'interface d'administration un **moteur de regles gouverne**, pas un simple formulaire de texte.
## 16. Prochaine etape concrete
La suite la plus utile n'est pas de rajouter encore du code "au hasard".
La suite utile est :
1. fixer le protocole de validation humaine ;
2. etendre `tests/synthetic_review/` a 10 documents complets ;
3. definir le schema de regles d'administration ;
4. concevoir l'ecran MVP d'ajout de regle ;
5. brancher la simulation automatique avant activation.