backup: WIP Windows avant repart propre (GUI core installer splash spec)
This commit is contained in:
298
docs/memoire-projet.md
Normal file
298
docs/memoire-projet.md
Normal file
@@ -0,0 +1,298 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user