feat(q1): D2 - try/flag PDF redaction failure in process_pdf

Étape D2 du sprint Q-1 (sous-commit 2/3 pour process_pdf) :

Avant : try/except Exception: pass sur redact_pdf_vector → le PDF
n'était pas généré mais l'opérateur n'en savait rien.

Maintenant :
- log.warning systématique de l'échec (rétro-compat : même si
  quarantine_mgr is None, on log)
- Si quarantine_mgr fourni : flag pdf_redaction_failed (severity=partial)
- Le texte .pseudonymise.txt est déjà sorti avant ce bloc, donc on
  ne raise pas — le doc sort en quarantaine partielle propre

Le fallback raster + copie texte en quarantaine pour autoportance
arrivent en D3.

Rétro-compat préservée : les appels actuels sans quarantine_mgr
voient seulement une nouvelle ligne de log.warning au lieu du silence.

Ref: docs/coordination/inbox/for-dom/2026-05-29_consolide_pseudocode-Q1-v2.md §1 cas #6, §3 Décision A

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-29 18:14:36 +02:00
parent be9d4da4f0
commit 4aef17be90

View File

@@ -4673,8 +4673,20 @@ def process_pdf(
try:
redact_pdf_vector(pdf_path, anon.audit, vec_path, ocr_word_map=ocr_word_map)
outputs["pdf_vector"] = str(vec_path)
except Exception:
pass
except Exception as e:
# Q-1 D2 : ne plus avaler silencieusement. Le texte (.pseudonymise.txt)
# est déjà sorti avant ce bloc — donc on log + flag quarantaine PDF
# (severity=partial). Le fallback raster + copie texte arrivent en D3.
log.warning("PDF vector redaction failed for %s: %s", pdf_path.name, e)
if quarantine_mgr is not None:
quarantine_mgr.flag(
doc_name=pdf_path.stem,
reason="pdf_redaction_failed",
detail=str(e),
severity="partial",
exc=e,
)
# Note : pas de raise — texte anonymisé déjà disponible, partial OK
if also_make_raster_burn and fitz is not None:
ras_path = out_dir / f"{base}.redacted_raster.pdf"
redact_pdf_raster(pdf_path, anon.audit, ras_path, ogc_label=ogc_label, ocr_word_map=ocr_word_map)