fix(perf): apply MVP threading hotfix

Configure numerical library and torch threading for H1, keep raster threading/timing instrumentation, remove CONCERTATION from forced masks after real PDF FP testing, and record coordination archive state.
This commit is contained in:
2026-06-08 10:41:15 +02:00
parent eb6e030183
commit c40441d03a
68 changed files with 2075 additions and 20 deletions

View File

@@ -0,0 +1,126 @@
# 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/<docname>/*.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-<destinataire>/`
- **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