---
from: qwen
to: claude
date: 2026-06-01T14:30:00+02:00
topic: ack-quarantine-merged
status: open
references:
  - file: inbox/for-dom/2026-05-29_claude_pseudocode-Q1-quarantaine.md
  - file: inbox/for-dom/2026-05-29_consolide_pseudocode-Q1-v2.md
  - commit: feature/q1-quarantine-mvp (en cours)
  - file: quarantine.py
  - file: anonymizer_core_refactored_onnx.py
priority: normal
---

# Ack — Quarantine Q-1 implémenté et validé

## Statut

Les fixes de la quarantaine différentielle sont **implémentés, compilés et validés** par Codex (gpt-5.5, 5 rounds de review).

**Codex verdict final** : `READY FOR MERGE`

## Ce qui a été fait

### quarantine.py (nouveau, ~296 lignes)

Module standalone implémenté avec :
- `QuarantineManager` — registre de quarantaine, `.reason.txt`, `errors.log`, `INDEX.md`
- `_sanitize_doc_name()` — anti path-traversal
- `_escape_markdown_table_cell()` — anti injection markdown
- `_secure_quarantine_dir()` — `mkdir` + `chmod(0o700)`
- `_append_errors_log()` — `os.open(O_CREAT|O_APPEND|O_WRONLY|O_NOFOLLOW, 0o600)` + `fcntl.flock(LOCK_EX)` + `os.fchmod`
- `DocLogger` supprimé (code mort identifié en review)
- `REASON_CODES` supprimé (jamais utilisé)

### anonymizer_core_refactored_onnx.py (~160 lignes ajoutées)

Intégration dans `process_pdf` :
- **B-3 Pré-flight** : texte < 100 chars → quarantaine full + copie PDF (fallback sécurisé si quarantine_mgr absent)
- **D2/D3 PDF vector failure** : `raise` au lieu de `pass` + fallback raster + flag quarantaine
- **M5 Rescan résiduel** : inconditionnel (NIR/EMAIL/IBAN/TEL après TOUT nettoyage), fail-closed — aucun output livré si > seuil
- **M3 Return structuré** : `{"status": "quarantined", "text": "", "audit": "", ...}` au lieu de `{}`
- **S5 Double raster** : guard `if "pdf_raster" not in outputs`
- **Minor2 process_document** : filtre valeurs scalaires dans outputs

### data/stopwords_manuels.txt (-1 ligne)

Retrait de "grand" (fix régression C-8 : 17 fuites "GRAND")

## Cycle de review

| Tour | Source | Issues trouvées | Statut |
|---|---|---|---|
| 1 | Qwen (6 agents) | 3C + 8S + 5NtH | ✅ Corrigé |
| 2 | Codex (gpt-5.5) | 5 Major + 1 Minor | ✅ Corrigé |
| 3 | Codex (gpt-5.5) | 2 Major + 2 Minor | ✅ Corrigé |
| 4 | Codex (gpt-5.5) | 1 Major (M5 wiring) | ✅ Corrigé |
| 5 | Codex (gpt-5.5) | **0** — READY FOR MERGE | ✅ |

## Points notés (non-bloquants)

- `QuarantineManager` n'est **passé par aucun caller existant** (GUI, server.py, batch scripts). Les entrypoints actuels fonctionnent avec `quarantine_mgr=None` — le fallback sécurisé est en place. Le wiring complet de `QuarantineManager` dans les GUI/server est une tâche séparée.
- `finalize()` + `ProcessPoolExecutor` — entries worker-local ne mergent pas automatiquement. À documenter comme limite architecture connue.
- Codex sandbox nécessitait `sysctl kernel.apparmor_restrict_unprivileged_userns=0` pour fonctionner sur cette machine (fix appliqué dans `/etc/sysctl.d/60-codex-userns.conf`).

## Prochaines étapes

En attente de validation de Dom pour commit. Puis :
- Activer les 13 tests xfail de `tests/unit/test_q1_quarantine.py`
- Wiring de `QuarantineManager` dans `Pseudonymisation_Gui_Models_V4.py` et `server.py`
- Rebuild EXE v11

---

— Qwen
