# Pseudonymisation v11.0 — MVP livraison bêta Province Bêta

**Date** : 2026-06-02
**Audience** : bêta-testeur Province Bêta
**Build** : `13730d1` — 2026-05-29 (rebuild prévu dimanche 01/06)
**Canal** : OwnCloud

---

## Nouveautés de cette version (par rapport à v10)

### 🔴 Sécurité RGPD — quarantaine différentielle (Q-1)

**Changement majeur** : un document n'est livré « anonymisé » que si **toutes** les étapes critiques ont réussi.

- **Quarantaine automatique** : les documents dont l'extraction de texte échoue, dont la rédaction PDF échoue, ou dont le rescan de sécurité détecte des PII résiduelles sont automatiquement isolés dans un dossier `quarantaine/`.
- **Quarantaine partielle** : si le texte est correctement anonymisé mais que le PDF ne peut pas être rédigé (chiffrement, annotations corrompues), le texte `.pseudonymise.txt` sort normalement et le PDF va en quarantaine avec un fichier d'explication.
- **Quarantaine totale** : si le texte extrait est inférieur à 100 caractères (document vide ou OCR raté), le document entier va en quarantaine — aucun fichier de sortie n'est généré.
- **`quarantaine/INDEX.md`** : résumé lisible de tous les documents en quarantaine avec raisons et suggestions, généré à la fin de chaque batch.
- **`errors.log`** : journal cumulatif de toutes les erreurs du batch, format JSON par ligne pour analyse.
- **`<document>.log`** : log détaillé du traitement de chaque document (étapes, détections, warnings).

### Pré-flight texte vide (B-3)

- Avant tout traitement, le programme vérifie que le document contient au moins **100 caractères de texte extrait**. En dessous, le document est considéré comme non-OCRisé ou vide et envoyé directement en quarantaine.
- Évite le scénario où un document scanné non-OCRisé sort « anonymisé » alors qu'aucun texte n'a été traité.

### Tolérance zéro PII résiduelles (rescan check)

- Après anonymisation, un **rescan de sécurité** vérifie l'absence de PII résiduelles (emails, téléphones, NIR, IBAN, noms INSEE en MAJUSCULES, FINESS, RPPS, etc.).
- Si ≥ 1 PII résiduelle est détectée → le document va en **quarantaine totale** avec alerte.
- Réutilise les patterns de détection de `evaluation/leak_scanner.py` (patterns complets et validés).

### Traçabilité — métadonnées de sortie (B-1)

- **XMP metadata** dans les PDF de sortie : version de l'application, commit SHA, profil appliqué, horodatage. Les métadonnées source du PDF (auteur, titre original) sont **explicitement effacées** pour éviter les fuites.
- **Entrée `type=metadata`** en première ligne de chaque `.audit.jsonl` : version de l'app, commit, date de traitement, profil, flags de quarantaine.
- Permet de prouver a posteriori avec quelle configuration un document a été anonymisé (audit DPO/CNIL).

### Fix détection — régression nom "GRAND" (C-8)

- Le nom de famille **GRAND** (INSEE valide, courant) était filtré à tort car le mot `"grand"` était présent dans la liste des stopwords médicaux.
- **Fix** : `"grand"` retiré des stopwords. Les noms INSEE ambigus ne sont plus bloqués par le filtre stopwords.
- Impact : 17 occurrences de "GRAND" non masquées corrigées sur le corpus de test audit_30.
- 7 tests de non-régression ajoutés (`tests/unit/test_c8_grand_regression.py`).

---

## Corrections depuis v10 (changelog)

### Détection PII

| Commit | Description |
|---|---|
| `e0b526b` | Établissements multi-ligne, CHUXX en fin de phrase, ville après `[ETAB]` |
| `c7e7107` | RPPS avec qualificateur (`RPPS prescripteur :`, `RPPS de garde :`) |
| `7242b53` | Labels structurels Nom de jeune fille / Prénom / Ville |
| `c24b7f6` | Quick wins : caractère ñ, numéro adhérent, NIR avant TEL |
| `c3eb50b` | Masquer artefacts noms de fichiers DPI et variante BACTERIO N° venue |
| `8e43d8d` | Accepter prénoms 3 chars après Dr/Mme (Ute, Eva, Léo…) |
| `e2e2a7c` | Masquer tokens collés à ponctuation (`Douar,nécessitant`) |
| `aa3db69` | RE_HOPITAL_VILLE accepte les ALL-CAPS (`CENTRE HOSPITALIER`) |
| `51c7555` | Faux positifs pyzbar sur tableaux (carrés noirs sur dates/heures) |
| `2f19f7c` | DR. Ute (3 chars), SAINT-GERMES composé, SODIUM MACO/BAX pharma |
| `c157205` | Labels DPI masqués (Date, Note, Type, Heure) + whitelist désactivée |
| `4d33610` | Cross-validation respecte bypass_stopwords pour noms forcés (Dr/Mme) |

### Architecture / Infrastructure

| Commit | Description |
|---|---|
| `df5dabf` | Admin rules branchées dans le pipeline ONNX |
| `13730d1` | CLI `simulate_admin_rule` + fix email avant force_terms |
| `8f6c462` | python-doctr rendu requis (OCR systématique) |
| `6586b89` | Version + build date + commit affichés dans titre et status bar GUI |
| `cf36357` | Couche 2 tests étendue à 10 cas + gate pytest avec xfail strict |

### Interface

| Commit | Description |
|---|---|
| `ab5a24f` | Refonte UI — logo aivanonym + palette magenta/pêche + onglets + v5.5 |
| `0124457` | Étapes de chargement dans le splash natif PyInstaller |
| `0a377bc` | Splash natif PyInstaller — couvre la décompression onefile |

### Configuration

| Commit | Description |
|---|---|
| `500ebc2` | Externalisation des dictionnaires (YAML, data/) |
| `4b59253` | additional_stopwords exposés dans le panneau Paramètres avancés GUI |
| `b5058b9` | GUI whitelist_phrases enfin lue et appliquée par le core |
| `ea214db` | Nettoyage force_mask_terms — délégation aux gazetteers nationaux |

---

## Procédure d'utilisation

### Premier lancement

1. Décompresser l'archive ZIP dans `C:\Program Files\AIV Anonymisation\`
2. Double-cliquer `Pseudonymisation.exe`
3. **SmartScreen** : au premier lancement, Windows SmartScreen peut apparaître (application non signée). Cliquer **Informations complémentaires → Exécuter quand même**.
   - Voir `smartscreen-procedure.md` pour la procédure détaillée (Edge/Chrome/Firefox + DSI).

### Utilisation batch

1. Sélectionner un dossier source contenant les documents PDF
2. Sélectionner un dossier de sortie (vide)
3. Choisir un profil (standard_local par défaut) ou importer un profil JSON
4. Cliquer **Anonymiser**
5. À la fin du traitement :
   - Documents OK → `.pseudonymise.txt` + `.audit.jsonl` + `.redacted.pdf` dans le dossier de sortie
   - Documents en anomalie → dossier `quarantaine/` avec `INDEX.md` explicatif
   - Logs cumulatifs → `errors.log` dans le dossier de sortie

### En cas de quarantaine

1. Ouvrir le dossier `quarantaine/`
2. Lire `INDEX.md` pour comprendre les raisons
3. Lire les fichiers `.reason.txt` pour chaque document
4. Ré-essayer manuellement si la raison le permet (ex: PDF chiffré → fournir version non chiffrée)

---

## Risques connus

| Risque | Impact | Mitigation |
|---|---|---|
| Pas de signature Authenticode | SmartScreen au premier lancement | Procédure documentée + SHA-256 fourni |
| Performance sur très gros documents (>200 pages) | Temps de traitement long | Reporté v11.5 — pas de blocage fonctionnel |
| OCR sur scans dégradés | Texte extrait insuffisant → quarantaine | Pré-flight détecte et isole automatiquement |
| Faux positifs sur termes médicaux ambigus | Sur-masquage mineur | Whitelist manuelle configurable via GUI |

---

## Canal support post-livraison

- **Patches v11.X** via OwnCloud (correctifs critiques uniquement)
- **Logs à envoyer en cas de bug** : zip du dossier `<sortie>/quarantaine/` + `errors.log` + profil utilisé
- **Contact** : dbazin52@gmail.com

---

## Annexes

### Score qualité de référence

| Métrique | v10 | v11.0 | Cible |
|---|---|---|---|
| Score global | 97.0 | **99.8** | 100.0 |
| Leak audit | 100.0 | 99.7 | 100.0 |
| Leak regex | 100.0 | 100.0 | 100.0 |
| FP score | 90.0 | **100.0** | 100.0 |

Documents testés : **audit_30** (29 documents, formats variés)

### Hash SHA-256

> *À fournir par Dom après rebuild EXE v11*

### Fichiers livrés

- `Pseudonymisation.exe` — exécutable Windows (PyInstaller onefile)
- `config/profiles.yml` — profils par défaut (modifiables)
- `config/dictionnaires.yml` — dictionnaires personnalisables
- `smartscreen-procedure.md` — procédure de premier lancement
