La pipeline DLP des documents — référence opérateur
Quand le balayage DLP est activé pour un workspace, chaque document téléversé traverse un balayage asynchrone pg-boss après l'ingestion :
Quand le balayage DLP est activé pour un workspace, chaque document téléversé traverse un balayage asynchrone pg-boss après l'ingestion :
Fonctionnalité Enterprise optionnelle, activable par workspace (workspaces.dlpDocumentScanEnabled, par défaut off ; l'activation exige le passage de la eval gate). Source :docs/DLP_DOCUMENT_PIPELINE.md(Phase 192, DLP-01..06 — v0.28.1). Lignes de provenance :FACT-CENSUS.mdF-DLP-1, F-DLP-2, F-AUDIT-1.
- Detect — une pipeline à 3 niveaux : des patterns regex configurables par l'admin (
dlpPatternService), la validation par somme de contrôle pour les identifiants italiens à format fixe (Codice Fiscale incl. l'omocodia, P.IVA, IBAN —dlpChecksum), la NER contextuelle via LLM pour les noms/adresses (le client Ollama existant). - Mask — les entités détectées deviennent des espaces réservés numérotés à l'échelle du document (
[PERSON_1],[GOV_ID_2], …). Le masquage est idempotent (mask∘mask = mask) — la syntaxe des espaces réservés ne peut jamais se ré-accrocher. - Re-embed masqué —
document_chunks.chunkTextest réécrit avec le texte masqué,searchVector/searchVectorMulti(FTS) recalculés, et les vecteurs ré-embeddés via l'endpoint du collector/api/ingest/reembed. Aucun vecteur non rédigé ne reste consultable. - Chiffrement des originaux — le texte original et chaque valeur d'entité sont conservés chiffrés AES-256-GCM (
encryptionService, le contrat ENCRYPTION_KEY). Le masquage est one-way : les originaux chiffrés sont la seule copie propre.
Les contrôles admin
L'interrupteur par workspace (DLP-01)
Settings → Workspaces → l'interrupteur DLP document scan (la colonne workspaces.dlpDocumentScanEnabled, par défaut off).
- L'interrupteur reste désactivé tant que la eval gate (ci-dessous) n'est pas passée — la DÉSACTIVATION n'est jamais bloquée.
- L'état bascule optimiste et revient en arrière sur une erreur de sauvegarde.
La eval gate (DLP-05)
L'évaluation de la qualité de détection doit passer avant l'activation :
- POST /api/system/dlp/eval/run (admin) — exécute le coureur répétable sur le corpus de fixtures PII italiennes commis (
packages/server/src/__tests__/fixtures/dlp-eval/). Persiste le résultat dans SystemConfigDLP_EVAL_LAST_RUN(non éditable par l'admin). - GET /api/system/dlp/eval/result (admin) — lit le dernier run ; jamais exécuté retourne
{ passed: false, noRun: true }— jamais un pass silencieux. - La métrique de la barrière : zéro faux positif par sommes de contrôle supprimées sur les classes GOV_ID/FINANCIAL. La recall PERSON/ADDRESS est documentée seule (nerMode marque
stubvslive).
Le backfill du corpus legacy (DLP-06)
POST /api/system/dlp/backfill (admin, avec la confirmation AlertDialog dans l'UI) :
- Eval-gated : refuse avec
409 { error, gate: "eval-not-passed" }quand le dernier eval est absent ou tombé. - Idempotent + reprise : le marqueur
dlpScannedAt— un re-run ne met en file que les documents sans le marqueur. - Rate-limited : concurrence de file 1 (sous la file de balayage en direct).
- La convergence est épinglée par le jumeau d'intégration (Postgres réel) : chunks masqués persistés, tsvector recalculé, le payload reembed byte-égal au texte masqué, les requêtes d'audit = zéro PII restante.
Les quatre classes de patterns (identifiants européens/italiens)
| Classe | Ce qu'elle détecte |
|---|---|
| GOV_ID | Codice Fiscale (incl. la vérification d'omocodia) |
| FINANCIAL | P.IVA, IBAN (avec validation par somme de contrôle) |
| PERSON | les noms de personnes (NER contextuelle LLM) |
| ADDRESS | les adresses (NER contextuelle LLM) |
Les classes à somme de contrôle (GOV_ID/FINANCIAL) sont déterministes ; les contextuelles (PERSON/ADDRESS) passent par la NER LLM — leur recall est documentée dans le résultat de l'eval.
Chat re-composition (DLP-03)
Les espaces réservés masqués atteignent la LLM ; à la fin du stream, exactement une fois, le serveur recompose les espaces réservés dans le message terminal pour les utilisateurs détenant dlp:unmask sur le workspace du document cité. Le champ additif content du payload done SSE porte le texte recomposé ; les visiteurs widget ne reçoivent JAMAIS de texte recomposé (appliqué côté serveur ; pour l'UI, ce n'est qu'un cacher du contrôle).
L'aperçu unmask (DLP-04)
GET /api/documents/:documentId/text sert le texte masqué par défaut. ?unmask=true ne recompose qu'au travers de l'échelle de barrières : le param valable → l'interrupteur workspace on → resolveWorkspaceRole + la permission dlp:unmask. Chaque bras de manquement retourne du texte masqué (200) — l'endpoint n'est jamais un oracle d'habilitation. L'interrupteur de l'UI se dessine seulement pour les usagers autorisés sur des documents avec entités (absence du DOM), est par-vue et jamais persisté.
La matrice d'audit (SC-4)
Chaque chemin de lecture est épinglé par un test comportemental (18 lignes : la vue texte, l'aperçu OCR, synthesis, citations, widget RAG, MCP tools, FTS, export, copie KB, reembed admin). Widget/citations/MCP portent des épingles négatives dures (masqués, jamais recomposés).
Ce guide couvre la surface opérationnelle du pipeline DLP des documents; l'approfondissement technique vit dans la publication jumelle :
Provenance
| Section | Source |
|---|---|
| La pipeline à 4 étapes / detect / mask / reembed / encrypt | docs/DLP_DOCUMENT_PIPELINE.md (Overview — Phase 192 DLP-01..06) — F-DLP-1 |
| Les contrôles admin / interrupteur / eval / backfill | docs/DLP_DOCUMENT_PIPELINE.md (§ Admin controls) |
| Chat re-composition / aperçu unmask / audit | docs/DLP_DOCUMENT_PIPELINE.md (§ DLP-03/04, SC-4) — F-AUDIT-1 pour la classe audit |
| Le compte « 10 PII » | non cité : le compte n'est pas traçable dans cette passe (F-DLP-2 = UNTRACED-IN-THIS-PASS) — la page nomme les classes réelles, jamais un nombre non tracé |
---
Référence opérateur — Simmetric Chat v0.28.1 (docs actualisées le 2026-10-02, SHA du census `aca5b8ff`).