299 lines
14 KiB
Markdown
299 lines
14 KiB
Markdown
# 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.yml`
|
|
- `config/admin_rules.yml`
|
|
- `schemas/admin_rules.schema.json`
|
|
- `admin_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 si `config/dictionnaires.yml` est 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 reutilisables` pour 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 requis` et `VLM desactive`
|
|
- 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`
|
|
|
|
## 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.py`
|
|
- `tests/unit/test_header_pii_detection.py`
|
|
- `tests/unit/test_synthetic_regression.py`
|
|
- `tests/unit/test_admin_rules_validator.py`
|
|
- `tests/unit/test_admin_rules_integration.py`
|
|
- `tests/unit/test_gui_batch_paths.py`
|
|
|
|
## Commits repere
|
|
|
|
- `500ebc2` Externalize dictionaries and add anonymization review corpus
|
|
- `b58d79f` Add project framing for anonymization
|
|
- `0fc8665` Add human review protocol and admin rules contract
|
|
- `df5dabf` Wire 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 `stem` du fichier source
|
|
- comme chaque cas contient `input.txt`, `test.txt` et `expected.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_header` restait 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.txt` de facon recursive
|
|
|
|
Exemple attendu :
|
|
|
|
- `anonymise/001_patient_header_and_birth/test.pseudonymise.txt`
|
|
- `anonymise/002_contact_bundle/test.pseudonymise.txt`
|
|
|
|
## Echantillon reel CHCB du 2026-04-22
|
|
|
|
Lot teste :
|
|
|
|
- dossier source : `/home/dom/Téléchargements/II-1 Ctrl_T2A_2025_CHCB_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.pdf`
|
|
- `26_23127395/ANAPATH 23127395.pdf`
|
|
- `29_23137897/ANAPATH 23137897.pdf`
|
|
|
|
Validation apres correctifs moteur :
|
|
|
|
- 2 fuites probables observees au premier passage ont ete corrigees :
|
|
- `228_23176885/BACTERIO 23176885.pdf`
|
|
- `84_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 `16371071` dans une ligne CLARISCAN
|
|
- ratio medical `1/10000`
|
|
|
|
Rapports produits :
|
|
|
|
- `anonymise/_sample_run_report_2026-04-22_seed20260422.json`
|
|
- `anonymise/_sample_validation_report_2026-04-22_seed20260422.json`
|
|
- `anonymise/_sample_validation_triage_2026-04-22_seed20260422.json`
|
|
|
|
## Prochaine action recommandee
|
|
|
|
Relancer soit :
|
|
|
|
- une nouvelle vague aleatoire de 30 documents reels CHCB
|
|
- 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 `LeakScanner` pour 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.md`
|
|
- `docs/spec-regles-administration.md`
|
|
- `docs/protocole-validation-humaine.md`
|
|
- `docs/rapport-analyse-campagne-gui-2026-04-21.md`
|
|
- `gui_batch_paths.py`
|
|
- `anonymizer_core_refactored_onnx.py`
|
|
- `Pseudonymisation_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 :
|
|
|
|
1. verifier le mode de sortie de la GUI
|
|
2. eviter de traiter le dossier global tant que le nommage de sortie n'est pas corrige
|
|
3. 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 `Sauvegarder` prealable dans `dictionnaires.yml`
|
|
|
|
Ergonomie GUI :
|
|
|
|
- l'onglet `Parametres` a ete simplifie pour un usage bureautique
|
|
- la navigation est maintenant organisee en trois onglets stables :
|
|
- `Anonymisation`
|
|
- `Parametres`
|
|
- `Profils`
|
|
- 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 `Profils` expose maintenant explicitement le `masque PDF memorise par ce profil`
|
|
- le sens de `masque manuel obligatoire` est 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 `PyInstaller` via `anonymisation_onefile.spec`
|
|
- le `.spec` n'est plus fige sur `C:\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.exe`
|
|
- `release\Anonymisation-Windows\`
|
|
- `release\Anonymisation-Windows.zip`
|
|
- `release\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.ps1` accepte maintenant une signature Authenticode via `-Sign`
|
|
- un fichier local non versionne `build_signing.local.ps1` peut 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`, `scipy` embarques 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.py` n'avait pas ete synchronise sur le poste Windows avant le build precedent
|
|
- correction : transfert de `admin_rules.py` sur `C:\Users\dom\ai\anonymisation`
|
|
- durcissement : `scripts/build_windows_oneclick.ps1` verifie 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 `aivanonym` existant
|
|
- 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/stderr` de type `tqdm` pendant 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.ps1` genere 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 452` octets, environ 696.6 MB
|
|
- taille ZIP : `728 300 929` octets
|
|
- taille installateur : `729 517 505` octets, 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.exe` OK ; deux processus `Anonymisation` repondants apres 60 secondes, puis arret volontaire
|