Décision Dom 2026-06-29 (honnêteté UI) :
- « Téléphones / e-mails » → « Téléphones » : EMAIL reste toujours masqué (non-toggleable),
le label ne le promet plus.
- hint « Adresses / CP » : « Voie, ville, code » → « Voie + code postal » : VILLE reste
toujours masquée (décision 1b), le hint ne la promet plus.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Suite à la migration OCR docTR→OnnxTR (8d683bc) et au verdict pré-audit Qwen
(GO technique, 2026-06-21), préparation des 3 specs PyInstaller pour le prochain
rebuild Windows :
- Retrait de "torch", "torchvision", "doctr.*" des hiddenimports des 3 specs
(anonymisation_onefile, _cli_onefile, _gui_v6_onefile) → -~2 Go EXE attendu,
suppression définitive de la classe de bug oneDNN sur CPU contraint.
- Ajout des hiddenimports transitifs OnnxTR manquants (réserve R1 Qwen) :
"pyclipper", "scipy.cluster.hierarchy", "scipy.special" → anti-omission
PyInstaller (évite un crash OCR en frozen).
- Retrait de python-doctr[torch]>=0.9.0 de requirements.txt (transitoire levé).
_configure_torch_threads() conservé en code (lazy import torch sous try/except,
no-op si torch absent) pour future réactivation EDS-Pseudo/GLiNER.
Aucun rebuild ni diffusion (gate Dom). 3 specs compilent (py_compile).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Recalibre la section sécurité au modèle de menace réel : portail sans
donnée patient (licences + compteurs agrégés) → HTTPS + login/mot de
passe fort suffisent. Retire la recommandation VPN/IP allowlist (overkill).
CSRF déjà couvert par SameSite=Lax ; rate-limiting /login = nice-to-have
au proxy. https_only désormais implémenté (app_aivanov 884661a).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Ajoute un conteneur scrollable dedie au sous-onglet Profils pour permettre le defilement souris du formulaire complet. Tests GUI: test_gui_v6_profiles.py et test_gui_v6_*.py.
Force input_ids et attention_mask en int64 avant inference CamemBERT ONNX, pour eviter les erreurs de dtype selon les tokenizers/environnements Windows. Test cible: test_camembert_manager_cache.py.
Passe theme clair, libelles utilisateur, aides conteneurs, recherche de mise a jour et indication honnete des moteurs optionnels non embarques. Tests GUI unitaires: 126 passed.
Couvre les corrections PII batch A/A-2, le NIR multi-ligne en flux reel, le gazetteer FINESS Corse derive depuis la base locale, et les tests de regression associes. Aucun build ni diffusion.
Condition du GO-CONDITIONNEL Qwen sur le lot engine capabilities
(cb3b767/890edb3/5e5f0bd) : un profil YAML forçant enable_eds/enable_gliner
ne doit pas déclencher un chargement voué à l'échec silencieux.
NerManagers.ensure_loaded() applique désormais un garde-fou via la sonde
engine_capabilities.capabilities_map() (injectable) AVANT toute tentative
de load EDS/GLiNER : si le moteur optionnel demandé est indisponible dans
le build courant → warning + désactivation forcée dans les réglages runtime.
Best-effort (sonde en échec ⇒ réglages inchangés, les try/except de load
protègent déjà). Sonde légère (find_spec), aucun import lourd.
CamemBERT (requis) inchangé. Diff limité au garde-fou + tests cibles.
TDD : 4 tests (test_gui_v6_engine_bridge.py) — eds/gliner indispo désactivés
et jamais chargés, moteur dispo conservé, fail-safe sonde. 282 unit passed.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Axe application GUI (utilisateur final) : cohérence UI/moteurs propre au build
GUI, sans présumer du build CLI. EDS-Pseudo / GLiNER désactivés (switch disabled
+ « non embarqué dans cette version ») et `enable_eds/gliner` forcés à False quand
indisponibles ; CamemBERT-bio reste le moteur standard actif. Note Moteurs des
Profils rendue honnête. `_mini_toggle` gère `disabled`/`disabled_hint` + `.switch`.
2 tests GUI (toggles désactivés si indispo + état forcé False ; actifs si dispo).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Axe CLI (intégration dans d'autres programmes) : contrat stable, codes retour
fiables. `--engines` liste les moteurs réellement disponibles dans CET
exécutable CLI (`[OUI]/[NON] Label (requis/optionnel) — raison`) et sort 0, sans
traiter. `input` devient optionnel pour ce mode (sinon code 2).
Le fail-closed CamemBERT (code 3) et le best-effort EDS/GLiNER (jamais déclarés
actifs si le chargement échoue) restent inchangés. Ne présume pas du build GUI.
2 tests (--engines → code 0 + moteurs listés ; absence d'input → code 2).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Utilitaire neutre (ni CLI ni GUI) qui dit la vérité sur les moteurs réellement
disponibles dans le build COURANT (la sonde reflète l'exécutable qui tourne, sans
présumer d'un autre build). Consommé séparément par chaque axe produit.
- `EngineCapability(key, label, available, required, reason)`.
- Sondes légères `importlib.util.find_spec` (pas d'import lourd au démarrage) +
présence du modèle ONNX pour CamemBERT (gère _MEIPASS en frozen).
- camembert=requis ; eds (edsnlp+spacy) / gliner=optionnels. Sondes injectables,
fail-closed. `capabilities_map()` / `available_engines()`.
6 tests (sondes injectables dispo/indispo, required, reasons, sondes réelles).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Retour Dom : « les règles du profil doivent être dans le menu profil, pas à
part ! ». Même logique que le Masquage — les règles qui influencent
l'anonymisation appartiennent au profil ; un sous-onglet séparé crée la
même confusion.
- Retrait du sous-onglet « Administration > Règles » (_SUBTABS, builder,
méthode _build_regles supprimée). Sous-onglets restants : Réglages /
Profils / Partage.
- Section « Profils > Règles du profil » enrichie : wording clair (règles
d'anonymisation portées par le profil), aperçu illustratif de la table
des règles (réutilise _rule_row + _HELP_REGLES), édition fine annoncée
« à venir ».
- Abandon du « Testeur de règle » (écran outil global) pour ne pas
réintroduire un second réglage métier.
Cible UX : Réglages / Profils (Général・Masquage・Mots・Moteurs・Règles du
profil) / Partage. Test obsolète test_rules_subtab_has_no_unexplained_2
remplacé par test_no_separate_rules_subtab.
262 tests unit OK (0 régression), self-test OK, nav 3 sous-onglets + section
Règles dans Profils + thème OK. Préserve d8bc0cd + GO Qwen. Aucun build/push
sans GO Dom.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Retour Dom : le sous-onglet Masquage séparé créait de la confusion. Le
masquage fait partie de la manière d'anonymiser associée au profil.
- Retrait du sous-onglet « Administration > Masquage » (_SUBTABS, builder,
méthode _build_masquage).
- Section « Profils > Masquage » enrichie : masque manuel requis, template
de masque (lié au profil édité), bouton « Ouvrir l'éditeur de masque »
(fenêtre dédiée) + dossier des templates, et apparence du masque
(couleur, style des marqueurs + aperçu, marges H/V, coins arrondis).
- Le template enregistré depuis l'éditeur remplit désormais le champ
Template du profil (preferred_manual_mask_template via _pro_template_var).
- Profils devient le centre des réglages métier (général/masquage/mots/
moteurs/règles). Réglages inchangé (pas de pastilles, pas de grosse
refonte). Nettoyage du code mort (_REPLACEMENT_CODES, _HELP_MASQUAGE).
261 tests unit OK (0 régression), self-test OK, nav 4 sous-onglets + éditeur
de masque depuis Profils + thème OK. Préserve 72841ed/GO Qwen. Aucun build/
push sans GO Dom.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Retour Dom : remplacer la page vitrine par un vrai éditeur de profils.
- gui_v6/profile_editor.py : couche logique (build_profile_spec,
profile_is_editable runtime vs defaut, list_profile_choices, slug_for_copy,
save/set_default/delete) au-dessus de profile_defaults — persistance dans
config/profiles.yml.
- gui_v6/editable_list.py : EditableTermList (tableau scrollable de termes,
ajout/suppression, pas de pastilles) — reste lisible à 50+ termes.
- tab_config : sous-onglet « 👤 Profils » réintroduit comme éditeur — menu
déroulant « Profil à modifier », boutons Nouveau / Dupliquer / Enregistrer /
Annuler / Définir par défaut, sections Identité, Masquage (require_manual_mask,
template), Moteurs (force_disable_vlm), Mots (à masquer/conserver/ignorer
éditables), Règles « à venir ». Profils défaut = lecture seule (dupliquer
pour modifier). Confirmation non bloquante (pas de modale).
- Réglages : bouton « ✏️ Modifier le profil… » → ouvre Profils sur le profil
actif. Pas de pastilles inline.
Persiste : label, description, require_manual_mask, force_disable_vlm,
preferred_manual_mask_template, param_lists (3 listes). 260 tests unit OK
(0 régression), self-test OK, nav 5 sous-onglets + thème OK. Préserve
1bbe70a/d30f7b7. Aucun build/push sans GO Dom.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Le module usage_telemetry est maintenant réellement branché : la GUI V6
envoie les statistiques au portail après chaque run (les stats web
restaient vides sans cela).
- processing_runner : RunSummary porte une liste DocResult (ordinal,
page_count via page_count_for, status, duration_ms, extension) — peuplée
dans la boucle. Aucun nom/chemin de fichier.
- usage_telemetry : report_run_summary(summary, base_url, license_ref,
machine_id, session, ...) construit le payload depuis le RunSummary et
l'envoie (non bloquant). N'envoie RIEN sans license_ref. Spool JSONL si
échec réseau.
- tab_usage : _finish() déclenche l'envoi en thread daemon (jamais bloquant
pour l'UI ni le run).
- app : fournit le reporter à UsageTab avec le contexte licence (base_url du
LicenseClient, license_ref via local_status, machine_id, app_version).
Tests : RunSummary.documents peuplé (0 chemin) ; report_run_summary (payload
correct, réseau KO → spool sans crash, pas d'envoi sans licence) ; _finish
appelle le reporter. 252 tests unit OK (0 régression), self-test OK.
V5/moteur/app_aivanov intacts, 0 dépendance. Aucun build/push sans GO Dom.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Retour Dom après validation visuelle : simplifier.
- Réglages > Listes locales : suppression des pastilles de termes et des
éditeurs inline (_compact_tag_editor). Remplacés par un texte court +
compteurs (À conserver/À masquer/À ignorer du profil actif) + bouton
« Ouvrir le tableau des termes » qui ouvre DIRECTEMENT TermsTableWindow.
- Retrait du bouton « Voir le profil » (son rôle = accéder au tableau).
- Retrait du sous-onglet « Profils » (doublon non câblé) : _SUBTABS,
builders, _build_profils/_rebuild_profils. Les helpers profil
(_active_profile_summary/_open_terms_table) sont conservés pour Réglages.
- Nettoyage du code mort associé : _compact_tag_editor, constantes
_PRESERVE_TERMS/_MASK_TERMS/_STOPWORDS, textes d'aide qui référençaient
l'onglet Profils.
Chemin utilisateur : Administration > Réglages > Ouvrir le tableau des
termes. 247 tests unit OK (0 régression), self-test OK. Préserve a9e8b2c
(thème, bêta, aide ?, fenêtre tableau). Aucun build/push sans GO Dom.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>