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>
14 KiB
Memoire projet
Derniere mise a jour : 2026-04-22
Objet
But du projet : anonymiser/pseudonymiser des documents medicaux de facon fiable, diffable, validable par des humains, avec une contrainte forte de conformite et de non-fuite.
Ce fichier sert de point de reprise rapide pour ne pas perdre le fil entre deux sessions.
Etat courant
- La source de verite des dictionnaires par defaut est
config/dictionnaires.default.yml. - La surcharge runtime/site est
config/dictionnaires.yml. - Les dictionnaires hardcodes ont ete externalises vers
data/. - Les regles d'administration ont un contrat dedie :
config/admin_rules.default.ymlconfig/admin_rules.ymlschemas/admin_rules.schema.jsonadmin_rules.py
- Les regles admin sont branchees dans le moteur ONNX.
- Le core legacy n'est pas encore aligne sur ce branchement admin.
- La GUI conserve maintenant le chemin relatif des cas sous
anonymise/au lieu d'ecraser les sorties homonymes. - La GUI ignore maintenant le sous-dossier
anonymise/lors du scan recursif des entrees. - L'onglet Parametres de la GUI charge maintenant les listes effectives
default + overlay, donc les phrases/termes par defaut sont visibles meme siconfig/dictionnaires.ymlest vide. - L'onglet Parametres affiche aussi un resume chiffré des listes visibles et precise que le moteur applique d'autres regles automatiques non affichees dans ces champs.
- La GUI expose maintenant un mode
masques PDF reutilisablespour les documents formates :- ouverture d'un editeur de caviardage manuel depuis l'onglet Parametres
- stockage persistant des templates dans
config/mask_templates/ - ouverture automatique du PDF courant quand l'utilisateur a selectionne un fichier PDF
- selection d'un template dans la GUI pour l'appliquer a tous les PDF du lot avant anonymisation
- La GUI expose maintenant aussi des
profils metier:- definitions chargees depuis
config/profiles.default.yml+config/profiles.yml - selection d'un profil dans l'onglet Parametres
- surcharge de configuration appliquee au moteur pour le lot courant
- options de poste utilisateur prises en compte comme
masque manuel requisetVLM desactive
- definitions chargees depuis
- Le moteur anonymise maintenant correctement deux layouts reels supplementaires :
- numero de venue BACTERIO rejete juste avant
IPP - artefacts de noms de fichiers scannes
EXT2-...-1234567890.TIF
- numero de venue BACTERIO rejete juste avant
Validation deja en place
- Suite rapide :
tests/synthetic_regression/ - Corpus complet de revue :
tests/synthetic_review/ - Runner de revue :
tools/run_synthetic_review_corpus.py - Protocole humain :
docs/protocole-validation-humaine.md - Fiche de revue :
docs/fiche-validation-humaine-modele.md
Tests ajoutes/maintenus :
tests/unit/test_config_externalization.pytests/unit/test_header_pii_detection.pytests/unit/test_synthetic_regression.pytests/unit/test_admin_rules_validator.pytests/unit/test_admin_rules_integration.pytests/unit/test_gui_batch_paths.py
Commits repere
500ebc2Externalize dictionaries and add anonymization review corpusb58d79fAdd project framing for anonymization0fc8665Add human review protocol and admin rules contractdf5dabfWire admin rules into ONNX anonymizer
Dernier constat important
La campagne lancee depuis la GUI sur le dossier global tests/synthetic_regression/cases n'est pas exploitable comme validation complete.
Cause racine :
- la GUI parcourt recursivement tous les fichiers supportes du dossier choisi
- la GUI ecrit toutes les sorties dans un seul dossier
anonymise/ - les sorties sont nommees avec le seul
stemdu fichier source - comme chaque cas contient
input.txt,test.txtetexpected.txt, les sorties s'ecrasent entre elles
Rapport detaille :
docs/rapport-analyse-campagne-gui-2026-04-21.md
Conclusion :
- seul le cas
010_spaced_establishment_headerrestait encore verifiable - ce cas etait conforme
- la campagne globale est non concluante pour les autres cas
Correctif applique ensuite
Le probleme de nommage GUI identifie ci-dessus a ete corrige dans Pseudonymisation_Gui_V5.py.
Effets du correctif :
- les sorties de campagne conservent desormais le sous-dossier relatif de chaque cas
- le dossier
anonymise/est exclu des entrees candidates, pour eviter les retraitements accidentels - le controle de fuite GUI relit desormais les
.pseudonymise.txtde facon recursive
Exemple attendu :
anonymise/001_patient_header_and_birth/test.pseudonymise.txtanonymise/002_contact_bundle/test.pseudonymise.txt
Echantillon reel CHUXX du 2026-04-22
Lot teste :
- dossier source :
/home/dom/Téléchargements/II-1 Ctrl_T2A_2025_CHUXX_DocJustificatifs - echantillon aleatoire reproductible de 30 documents
- manifeste :
anonymise/_sample_manifest_2026-04-22_seed20260422.json
Resultat de traitement :
- 27 documents anonymises avec succes
- 3 echecs dus a des PDF proteges par mot de passe :
149_23089771/ANAPATH 23089771.pdf26_23127395/ANAPATH 23127395.pdf29_23137897/ANAPATH 23137897.pdf
Validation apres correctifs moteur :
- 2 fuites probables observees au premier passage ont ete corrigees :
228_23176885/BACTERIO 23176885.pdf84_23215994/trackare-16014215-23215994_16014215_23215994.pdf
- controle automatique final : 22 documents sans fuite detectee sur 27
- les 5 alertes restantes sont des faux positifs connus du
LeakScanner- initiales d'une lettre dans l'audit (
A,F,S) - code produit
16371071dans une ligne CLARISCAN - ratio medical
1/10000
- initiales d'une lettre dans l'audit (
Rapports produits :
anonymise/_sample_run_report_2026-04-22_seed20260422.jsonanonymise/_sample_validation_report_2026-04-22_seed20260422.jsonanonymise/_sample_validation_triage_2026-04-22_seed20260422.json
Prochaine action recommandee
Relancer soit :
- une nouvelle vague aleatoire de 30 documents reels CHUXX
- soit la campagne de validation sur
tests/synthetic_regression/cases
Objectif :
- separer les vrais ecarts moteur des faux positifs du validateur
- prioriser ensuite une amelioration du
LeakScannerpour ignorer les hits NOM mono-lettre et certains numeriques medicaux non patients
Option recommandee :
- verifier d'abord que la GUI ne traite plus
anonymise/comme entree - lancer une passe complete sur le corpus
- confirmer visuellement que chaque cas produit sa sortie dans son propre sous-dossier
Amelioration utile ensuite :
- ajouter un mode GUI "campagne de tests" qui ne traite que
test.txt - generer automatiquement un rapport de comparaison contre les
expected.txt
Fichiers a relire en premier pour reprendre
docs/cadrage-projet-anonymisation.mddocs/spec-regles-administration.mddocs/protocole-validation-humaine.mddocs/rapport-analyse-campagne-gui-2026-04-21.mdgui_batch_paths.pyanonymizer_core_refactored_onnx.pyPseudonymisation_Gui_V5.py
Etat du worktree a ne pas confondre avec le chantier courant
Il existe des changements hors perimetre qu'il ne faut pas ecraser par erreur :
- suppressions sous
ano/pdf_natif/pseudonymise/ - gros volume non tracke sous
data/silver_annotations/ - sorties generees sous
tests/synthetic_review/actual/ - sorties GUI sous
tests/synthetic_regression/cases/anonymise/
Regle de reprise
Avant toute nouvelle passe de validation humaine sur corpus :
- verifier le mode de sortie de la GUI
- eviter de traiter le dossier global tant que le nommage de sortie n'est pas corrige
- preferer un cas a la fois si la GUI n'a pas encore ete corrigee
Derniere avancee
Les profils metier ne sont plus seulement lus depuis YAML :
- la GUI permet maintenant de creer un nouveau profil
- la GUI permet d'enregistrer les reglages courants dans le profil selectionne
- les profils utilisateur sont ecrits dans
config/profiles.yml - un profil peut memoriser :
- les listes visibles de preservation / masquage / stop-words
- le caractere obligatoire du masque manuel
- la desactivation du VLM
- le modele de masque PDF prefere
Effet important :
- la selection d'un profil recharge maintenant ses reglages visibles dans l'onglet Parametres
- le lancement de traitement utilise les reglages courants de l'ecran via une config temporaire de lot, sans exiger un
Sauvegarderprealable dansdictionnaires.yml
Ergonomie GUI :
- l'onglet
Parametresa ete simplifie pour un usage bureautique - la navigation est maintenant organisee en trois onglets stables :
AnonymisationParametresProfils
- les listes manuelles sont revenues directement dans
Parametres - la creation / edition / suppression / profil par defaut sont gerees directement dans l'onglet
Profils - on evite ainsi les enchainements de popups pour le flux normal
- l'onglet
Profilsexpose maintenant explicitement lemasque PDF memorise par ce profil - le sens de
masque manuel obligatoireest documente dans l'UI :- cela n'impose pas un masque precis
- cela bloque seulement le lancement si aucun masque PDF n'est selectionne
Packaging Windows :
- le build Windows a maintenant un point d'entree "un clic" :
build_windows_oneclick.bat - ce lanceur appelle
scripts/build_windows_oneclick.ps1 - le packaging utilise
PyInstallerviaanonymisation_onefile.spec - le
.specn'est plus fige surC:\Users\dom\ai\anonymisation; il resolve maintenant le projet de facon portable - les repertoires de configuration, donnees, detecteurs, assets et modele ONNX sont embarques dans l'executable
- sur la machine Windows de build, la sortie attendue est :
dist\Anonymisation.exerelease\Anonymisation-Windows\release\Anonymisation-Windows.ziprelease\Anonymisation.exe.sha256.txt
- objectif produit :
- les utilisateurs finaux n'ont pas besoin d'installer Python
- le build doit en revanche etre realise depuis un poste Windows
- risque Windows identifie :
- un executable PyInstaller non signe peut declencher SmartScreen / Defender
- meme signe, un nouveau hash peut encore afficher un avertissement de reputation selon les politiques Windows
scripts/build_windows_oneclick.ps1accepte maintenant une signature Authenticode via-Sign- un fichier local non versionne
build_signing.local.ps1peut activer la signature automatiquement pour conserver le build en un clic - le modele de configuration est
build_signing.example.ps1
Build Windows realise le 2026-04-23 via SSH sur dom@192.168.1.11 :
- poste :
DESKTOP-58D5CAC - chemin projet Windows :
C:\Users\dom\ai\anonymisation - executable cree :
C:\Users\dom\ai\anonymisation\dist\Anonymisation.exe - archive creee :
C:\Users\dom\ai\anonymisation\release\Anonymisation-Windows.zip - hash :
C:\Users\dom\ai\anonymisation\release\Anonymisation.exe.sha256.txt - SHA256 final :
8F3E3786D669F44824D24BF14AC06EF22CE19A8E900056DAB031891791871841 - taille exe : environ 697 MB
- contenu OCR :
python-doctr,torchvision,opencv-python,scipyembarques dans l'environnement de build - signature : non signee, car aucun certificat n'est configure
- smoke test : lancement de l'exe OK ; processus encore vivant apres 45 secondes, puis arret volontaire
Correctif build Windows du 2026-04-23 :
- probleme constate au lancement utilisateur :
No module named admin_rules - cause :
admin_rules.pyn'avait pas ete synchronise sur le poste Windows avant le build precedent - correction : transfert de
admin_rules.pysurC:\Users\dom\ai\anonymisation - durcissement :
scripts/build_windows_oneclick.ps1verifie maintenant la presence des modules source critiques avant PyInstaller - nouveau build cree :
C:\Users\dom\ai\anonymisation\dist\Anonymisation.exe - nouveau SHA256 :
0EB97B1E2859D0BCD6E45DC420CFDC929C3B79B6B0AF123CF59F2230187F5712 - smoke test : lancement de l'exe OK ; processus encore vivant apres 60 secondes, puis arret volontaire
Demarrage produit / installateur Windows du 2026-04-23 :
- le lanceur conserve le splash visuel
aivanonymexistant - apres le splash natif PyInstaller, une fenetre de demarrage applicative reprend le meme visuel et affiche :
- etapes numerotees de chargement
- barre de progression
- journal court des modules/dictionnaires charges
- la fenetre de configuration initiale affiche aussi le visuel produit et un journal des chargements de modeles
- les sorties
stdout/stderrde typetqdmpendant le chargement EDS-Pseudo / GLiNER sont redirigees vers ce journal pour montrer les poids/modules en cours - un script Inno Setup a ete ajoute :
installer/Anonymisation.iss - le build Windows peut maintenant produire un vrai installateur :
release\Anonymisation-Setup.exe - l'installateur propose :
- choix du dossier d'installation
- installation utilisateur sans droit administrateur par defaut
- raccourci menu Demarrer
- option icone bureau
- desinstallation Windows standard
scripts/build_windows_oneclick.ps1genere l'installateur si Inno Setup 6 est present ; sinon il conserve EXE/ZIP et affiche un avertissement- verification locale Linux :
python3 -m py_compile launcher.py Pseudonymisation_Gui_V5.py camembert_ner_manager.py eds_pseudo_manager.py gliner_manager.py - smoke test local du nouveau splash : OK
- build Windows non relance a ce stade : authentification SSH refusee lors de la tentative de reconnexion au poste Windows
Build Windows installateur realise le 2026-04-23 via SSH sur dom@192.168.1.11 :
- Inno Setup 6.7.1 installe en mode utilisateur sur le poste Windows via
scripts/install_inno_setup_build_dep.ps1 - chemin Inno :
C:\Users\dom\AppData\Local\Programs\Inno Setup 6\ISCC.exe - build relance avec
scripts\build_windows_oneclick.ps1 -SkipRequirements - executable cree :
C:\Users\dom\ai\anonymisation\dist\Anonymisation.exe - archive creee :
C:\Users\dom\ai\anonymisation\release\Anonymisation-Windows.zip - installateur cree :
C:\Users\dom\ai\anonymisation\release\Anonymisation-Setup.exe - taille executable :
730 483 452octets, environ 696.6 MB - taille ZIP :
728 300 929octets - taille installateur :
729 517 505octets, environ 695.7 MB - SHA256 executable :
520EE614CD9B56EB7C748AB5BCCDF0DD4DAAD0726EF0EAB0EFE89177A84E5882 - SHA256 installateur :
A22B5D1A3AE10203DEEA7FB053C0184695A88084294603CF1EA643F123597FC1 - signature : non signee, car aucun certificat Authenticode n'est configure
- smoke test Windows : lancement de
dist\Anonymisation.exeOK ; deux processusAnonymisationrepondants apres 60 secondes, puis arret volontaire