# Resumption — Qwen Code (nouvelle session) **Date de création** : 2026-05-30 **Dernière activité** : 2026-05-29 13:45 **Sprint en cours** : v11.0 MVP (livraison prévue mardi 02/06) --- ## Contexte en 1 phrase Le sprint v11.0 consiste à ajouter la **quarantaine différentielle**, le **fix de la fuite "GRAND"**, les **métadonnées de sortie**, et le **pré-flight** au moteur d'anonymisation, pour une livraison bêta à la Province Bêta. --- ## État du sprint | Étape | Qui | Statut | Fichier de référence | |---|---|---|---| | Pseudo-code Q-1 (quarantaine) | Claude (v2 consolidé) | ✅ Fait | `inbox/for-dom/2026-05-29_consolide_pseudocode-Q1-v2.md` | | Analyse régression GRAND | Qwen | ✅ Fait | `inbox/for-dom/2026-05-29_qwen_analyse-regression-grand.md` | | Tests C-8 (7 tests) | Qwen | ✅ Fait | `inbox/for-dom/2026-05-29_qwen_tests-c8-grand.md` | | Release notes v11 | Qwen | ✅ Fait | `inbox/for-dom/2026-05-29_qwen_release-notes-v11-draft.md` | | Smoke test bêta T6 | Qwen | ✅ Fait | `inbox/for-dom/2026-05-29_qwen_smoke-test-T6.md` | | **CODE Q-1 + C-8 + P0** | **Dom** | 🔴 **Non commencé** | En attente | --- ## Ce qui est en attente ### 1. Dom doit coder le Q-1 + C-8 + P0 dans `anonymizer_core_refactored_onnx.py` **Ce que Dom doit implémenter (priorité) :** | # | Action | Détail | Référence | |---|---|---|---| | 1 | Fix C-8 : supprimer `"grand"` des stopwords | 1 ligne dans `data/stopwords_manuels.txt` | `data/stopwords_manuels.txt:549` | | 2 | Q-1 : 6 cas `except: pass` critiques | L3938 (redaction vector), L4655 (redaction vector process_pdf), L1118/1128/1139/1156 (extraction PDF) → remplacer par `log.warning()` + flag quarantaine | `inbox/for-dom/2026-05-29_consolide_pseudocode-Q1-v2.md` | | 3 | Q-1 : dossier `quarantaine/` + `INDEX.md` | Structure : quarantaine//*.reason.txt, errors.log, INDEX.md | Idem | | 4 | Q-PDF : fallback raster si vector échoue | `redact_pdf_raster` appelé en fallback, flag `partial` | Idem | | 5 | B-3 : pré-flight texte < 100 chars | `SEUIL_TEXTE_MINI = 100` | Idem | | 6 | Q-DOC : rescan check (0 PII résiduelles) | Réutiliser `evaluation/leak_scanner.py` | Idem | | 7 | B-1 : métadonnées `.audit.jsonl` + XMP | Type `metadata` en 1ère ligne, XMP dans PDF | `inbox/for-dom/2026-05-29_consolide_pseudocode-Q1-v2.md` §B-1 | | 8 | B-2 : fichiers `.log` + `errors.log` | Un `.log` par doc, `errors.log` cumulatif | Idem §B-2 | ### 2. Après le code de Dom — tâches de Qwen | # | Tâche | Détail | |---|---|---| | 1 | **Review du code implémenté** | Vérifier que les 6 `except: pass` sont bien remplacés, que la quarantaine est fonctionnelle, que les tests C-8 passent | | 2 | **Mettre à jour les release notes** | Score → 100 (après fix C-8), ajouter fallback raster | | 3 | **Préparer le pack de livraison** | ZIP + SHA-256 + smartscreen-procedure.md | | 4 | **Re-exécuter evaluate_quality.py** | Confirmer score 100/100 après fix C-8 | --- ## Fichiers à lire en priorité (dans l'ordre) 1. `docs/coordination/etat-projet.md` — état courant du projet (commit, score, décisions) 2. `docs/coordination/log.md` — journal des échanges (dernières lignes surtout) 3. `docs/coordination/inbox/for-dom/2026-05-29_consolide_pseudocode-Q1-v2.md` — **LE** document de référence pour le code Q-1 4. `docs/coordination/decisions/` — décisions de Dom (MVP, no-UI) 5. `docs/coordination/audits/2026-05-28_qwen_audit-complet.md` — audit technique complet (pour contexte) --- ## Règles de coordination - **Protocol** : `docs/coordination/README.md` - **Communication** : fichiers dans `inbox/for-/` - **Règle d'or** : toujours `grep`/`sed` avant de citer un numéro de ligne - **Pas de modif GUI** : décision Dom (`decisions/2026-05-28_dom_no-ui-changes.md`) - **Pas de code irréversible** sans accord de Dom --- ## Acteurs | Rôle | Qui | |---|---| | Chef de projet / décideur | Dom (dbazin52@gmail.com) | | Pivot / coordination | Claude | | Reviewer code / perf | Qwen Code | --- ## Mémo technique rapide ### Core : `anonymizer_core_refactored_onnx.py` (4770 lignes) Fonction principale : `process_pdf(doc_path, output_dir, cfg)` → retourne `AnonResult` Pipeline : 1. Extraction texte (pdfplumber → pdfminer → PyMuPDF → docTR OCR → fallback tesseract) 2. Regex PII (phases 0a-0h : EMAIL, TEL, NIR, IBAN, FINESS, IPP, OGC, dates, adresses) 3. NER (EDS-Pseudo, CamemBERT-bio ONNX, GLiNER, VLM) 4. Gazetteers Aho-Corasick (FINESS, villes, noms INSEE) 5. Cross-validation des noms (`_cross_validate_name_candidates`) 6. Masquage ligne par ligne (`_mask_line_by_line`) 7. Rescan de sécurité (`selective_rescan`) 8. Redaction PDF (`redact_pdf_vector` puis fallback `redact_pdf_raster`) 9. Sauvegarde (`.pseudonymise.txt`, `.audit.jsonl`, `.redacted.pdf`) ### 6 cas `except: pass` critiques (vérifiés par grep) | Ligne | Fonction | Problème | |---|---|---| | 1118 | `extract_text_with_fallback_ocr` | PyMuPDF échec silencieux | | 1128 | `extract_text_with_fallback_ocr` | pdfplumber échec silencieux | | 1139 | `extract_text_with_fallback_ocr` | pdfminer échec silencieux | | 1156 | `extract_text_with_fallback_ocr` | docTR OCR échec silencieux | | 3938 | `redact_pdf_vector` | `apply_redactions()` échec silencieux | | 4655 | `process_pdf` | Rédaction vectorielle globale échec silencieux | ### Fix C-8 : fuite "GRAND" ```bash grep -n "^grand$" data/stopwords_manuels.txt # → ligne 549 # → supprimer cette ligne ``` "grand" est un nom de famille INSEE valide. Sa présence dans les stopwords filtre les tokens "GRAND" en MAJUSCULES lors du masquage ligne par ligne. --- ## Fin du fichier