---
from: qwen
to: dom
date: 2026-06-05
topic: validation-pack-beta
status: done
priority: high
references:
  - inbox/for-qwen/2026-06-05_dom-via-codex_relance-validation-beta.md
  - inbox/for-qwen/2026-06-04_17-05_claude_nouveaux-jobs-tn-to.md
---

# VERDICT GLOBAL : GO

Pack beta conforme sur les 6 axes. Deux remarques mineures (non bloquantes) en section 4 et 6.

## 1. Mode admin

| Check | Vérifié via | Résultat | Statut |
|---|---|---|---|
| Fichier `.admin` absent du repo | `find . -name ".admin" -not -path "./.git/*"` → sortie vide | Aucun fichier `.admin` présent | OK |
| `ANON_ADMIN` non forcé dans `launcher.py` | `grep -n "ANON_ADMIN" launcher.py` → 0 occurrence | Variable non définie | OK |
| `ANON_ADMIN` non forcé dans scripts build | `grep -rn "ANON_ADMIN" scripts/*.ps1 *.bat *.ps1` → 0 occurrence | Aucun script ne définit la variable | OK |
| Bannière admin conditionnelle dans GUI | `Pseudonymisation_Gui_V5.py:377-383` → `is_admin()` appelé, tag `[MODE ADMIN]` ajouté seulement si `_admin_active` | Titre = `APP_TITLE` sans tag en mode normal | OK |
| `admin_mode.py:is_admin()` défaut | `admin_mode.py:48-60` → vérifie env `ANON_ADMIN` + fichier `.admin`, retourne `False` si aucun | Par défaut = `False` | OK |

## 2. VLM/Ollama caché en non-admin (D-11/D-13)

| Check | Vérifié via | Résultat | Statut |
|---|---|---|---|
| VlmManager nullifié si non-admin | `Pseudonymisation_Gui_V5.py:80-89` → `if not _is_admin_mode(): VlmManager = None` | VlmManager = `None` en mode non-admin | OK |
| Checkbox VLM masquée | `Pseudonymisation_Gui_V5.py:766` → `if VlmManager is not None:` entoure toute la UI VLM | Checkbox invisible si non-admin | OK |
| `vlm_manager` dans spec | `anonymisation_onefile.spec:58` → présent dans `hiddenimports` | Module embarqué mais inactive sans admin | OK |
| VLM dans core | `anonymizer_core_refactored_onnx.py:4483-4487` → `if ocr_used and vlm_manager is not None` | Pipeline continue sans VLM si indisponible | OK |
| `force_disable_vlm` par profil | `profile_defaults.py:52` (standard) → `force_disable_vlm: false` ; autres profils → `true` | Profil local standard = VLM désactivable | OK |

## 3. Quarantaine permissions 0o700/0o600

| Check | Vérifié via | Résultat | Statut |
|---|---|---|---|
| Dossier quarantaine 0o700 | `quarantine.py:95` → `os.chmod(str(self.quarantine_dir), 0o700)` | Permissions 0700 sur le dossier | OK |
| Fichier errors.log 0o600 | `quarantine.py:211` → `os.open(..., 0o600)` + `os.fchmod(fd, 0o600)` ligne 216 | Permissions 0600 dès création + réparation | OK |
| Fail-closed sur Windows | `quarantine.py:97` → `except OSError: pass` | chmod ignoré silencieusement si FS incompatible, dossier quand même créé | OK |
| Protection symlink (TOCTOU) | `quarantine.py:210` → `O_NOFOLLOW` dans os.open | Refus atomique de symlinks | OK |
| Lock concurrent workers | `quarantine.py:222` → `fcntl.flock(fd, LOCK_EX)` | Serialization entre workers ProcessPoolExecutor | OK |

## 4. PII résiduelles dans les chemins du pack

| Check | Vérifié via | Résultat | Statut |
|---|---|---|---|
| `pdf_natif/` dans `.gitignore` | `.gitignore` → ligne `pdf_natif/` | Présent | OK |
| `ano/pdf_natif/pseudonymise/` dans `.gitignore` | `.gitignore` → ligne `ano/pdf_natif/pseudonymise/` | Présent | OK |
| `*.pdf` dans `.gitignore` | `.gitignore` → ligne `*.pdf` (avec `!assets/**` exception) | Couvre `.redacted_*.pdf` | OK |
| `.pseudonymise.txt` dans `.gitignore` | `grep -E "\.pseudonymise" .gitignore` → aucun | **Non explicitement couvert** (mais ces fichiers n'apparaissent que dans `pdf_natif/` qui est ignoré) | OK (couvert indirectement) |
| `.audit.jsonl` dans `.gitignore` | `grep -E "\.audit\.jsonl" .gitignore` → aucun | **Non explicitement couvert** (même remarque : uniquement dans `pdf_natif/`) | OK (couvert indirectement) |
| `git status --short` propre | `git status --short` → sortie vide | Aucun fichier non tracké ne sera commité | OK |
| Scripts build ne référencent pas PII | `grep -rn "pdf_natif\|pseudonymise" scripts/*.ps1 *.bat` → aucun | Aucun chemin PII dans les scripts de build | OK |

**Remarque** : Ajouter `*.pseudonymise.txt` et `*.audit.jsonl` au `.gitignore` serait une sécurité supplémentaire (protection explicite), mais non bloquant car ces fichiers n'existent que dans `pdf_natif/`.

## 5. Build cohérence

| Check | Vérifié via | Résultat | Statut |
|---|---|---|---|
| Modèle ONNX dans spec datas | `anonymisation_onefile.spec:23` → `("models/camembert-bio-deid/onnx", "models/camembert-bio-deid/onnx")` | Présent | OK |
| Fichiers modèle sur disque | `ls models/camembert-bio-deid/onnx/` → `model.onnx` (440 Mo) + config + tokenizer | Fichiers présents | OK |
| `launcher.py` comme entry point | `anonymisation_onefile.spec:87` → `Analysis([str(project_dir / "launcher.py")], ...)` | Correct | OK |
| `vlm_manager` dans hiddenimports | `anonymisation_onefile.spec:58` → `"vlm_manager"` | Présent | OK |
| Aucun ANON_ADMIN dans build | `grep -n "ANON_ADMIN\|\.admin" scripts/*.ps1 anonymisation_onefile.spec` → aucun | Aucun forçage admin | OK |
| `build_signing.example.ps1` | Contient uniquement des placeholders (`REMPLACER_PAR_L_EMPREINTE_DU_CERTIFICAT`) | Pas de secret réel | OK |
| `build_signing.local.ps1` dans `.gitignore` | `.gitignore` → ligne `build_signing.local.ps1` | Exclu du repo | OK |

## 6. Secrets / chemins absolus

| Check | Vérifié via | Résultat | Statut |
|---|---|---|---|
| `C:\Users` dans fichiers source | `grep -rn "C:\\\\Users" --include="*.py,*.ps1,*.bat,*.spec,*.iss"` → uniquement `.venv/` (non packagé) | Aucun dans fichiers packagés | OK |
| `/home/dom` dans fichiers source packagés | `grep -rn "/home/dom" --include="*.py,*.ps1,*.bat,*.spec"` → trouvé dans `server.py` (docstring, ligne 14), `run_batch_*.py` | Ces fichiers **ne sont PAS** dans le `.spec` (ni `server.py` ni `run_batch_*.py` dans `datas`/`hiddenimports`) | OK |
| `app.aivanov.fr` dans fichiers source | `grep -rn "app\.aivanov\.fr" --include="*.py,*.ps1,*.bat,*.iss,*.spec"` → aucun | Absent de tous les fichiers packagés | OK |
| api_key / password / secret en dur | `grep -rn "api_key\|password\|secret" --include="*.py,*.ps1,*.bat,*.spec"` (filtré .venv/tests/docs/tools) → aucun | Aucun credential en dur | OK |
| `server.py:14` docstring | `server.py` contient `cd /home/dom/ai/anonymisation` dans sa docstring | **Informationnel uniquement** — `server.py` n'est pas inclus dans le pack EXE | Non bloquant |

---

**Synthèse** : Le pack beta est conforme sur les 6 axes de vérification. Aucune PII ne sera commitée, aucun secret ou chemin absolu ne fuitera dans l'EXE, le mode admin est inactif par défaut, le VLM est caché en non-admin, la quarantaine a les permissions restrictives requises, et le build est cohérent avec le modèle ONNX présent.

**Réserves mineures** (non bloquantes pour GO) :
1. `.pseudonymise.txt` et `.audit.jsonl` ne sont pas explicitement dans `.gitignore` (couverts indirectement via `pdf_natif/`)
2. `server.py:14` contient `/home/dom/ai/anonymisation` dans sa docstring (fichier non packagé)
