feat(admin): D-13 partial — bannière "MODE ADMIN" + doc périmètre

## Bannière mode admin

Ajout d'un suffixe "[⚙ MODE ADMIN]" dans le titre de la fenêtre principale
quand `admin_mode.is_admin()` retourne True. Signal visuel clair pour :
- Le bêta-testeur (s'il bidouille, il voit qu'il a déverrouillé quelque chose)
- L'opérateur Dom (pour vérifier d'un coup d'œil que le mode admin est actif
  pour ses propres tests)

## Périmètre D-13 partial

Documenté dans `decisions/2026-06-02_dom_d13-partial-scope.md` :

| Protection | Statut |
|---|---|
| VLM Ollama caché en non-admin |  (D-11) |
| Titre fenêtre signalé en admin |  (ce commit) |
| Stopwords personnalisés | ⏭ Reporté v11.5 |
| Profils techniques (regex_overrides, force_terms) | ⏭ Reporté v11.5 |
| Choix moteur NER | ⏭ Reporté v11.5 |
| Sauvegarde configs sensibles | ⏭ Reporté v11.5 |

## Pourquoi le report est OK pour MVP

1. Le risque RGPD critique (envoi externe à Ollama) est résolu par D-11
2. Les autres réglages, bien que visibles, ne déclenchent pas de fuite
3. La transposition customtkinter v6 (v11.5) refondra l'UI — patcher
   2874 lignes tkinter aujourd'hui = double travail à refaire en v6
4. Le bêta-testeur n'a pas accès au mode admin (pas de fichier .admin
   livré, pas d'env var par défaut)

## Activation manuelle

- Env : `ANON_ADMIN=1 python Pseudonymisation_Gui_V5.py`
- Fichier : créer `.admin` à la racine

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-02 17:04:01 +02:00
parent 831c70c105
commit 91c51514de
2 changed files with 95 additions and 3 deletions

View File

@@ -372,9 +372,16 @@ class ToolTip:
class App:
def __init__(self, root: tk.Tk):
self.root = root
# Titre avec version longue pour identifier la build au premier coup d'œil
# (évite les confusions entre exe ancien/nouveau lors des tests).
self.root.title(f"{APP_TITLE}{_version_long()}")
# D-13 — Mode admin : titre annoté si admin actif (signale au bêta
# et à l'opérateur que des fonctions sensibles sont déverrouillées).
# L'activation se fait via env ANON_ADMIN=1 ou fichier .admin.
try:
from admin_mode import is_admin as _is_admin
_admin_active = _is_admin()
except Exception:
_admin_active = False
admin_tag = " [⚙ MODE ADMIN]" if _admin_active else ""
self.root.title(f"{APP_TITLE}{_version_long()}{admin_tag}")
self.root.geometry("780x820")
self.root.minsize(600, 650)