Pipeline DLP para documentos — referencia operativa
Cuando el escaneo DLP está habilitado para un workspace, cada documento cargado atraviesa un escaneo asíncrono pg-boss tras la ingesta:
Cuando el escaneo DLP está habilitado para un workspace, cada documento cargado atraviesa un escaneo asíncrono pg-boss tras la ingesta:
Función Enterprise opcional activable por workspace (workspaces.dlpDocumentScanEnabled, por defecto off; la habilitación requiere superar la eval gate). Fuente:docs/DLP_DOCUMENT_PIPELINE.md(Phase 192, DLP-01..06 — v0.28.1). Filas de procedencia:FACT-CENSUS.mdF-DLP-1, F-DLP-2, F-AUDIT-1.
- Detect — una pipeline de 3 niveles: patterns regex configurables por el administrador (
dlpPatternService), validación por checksum para los identificadores italianos de formato fijo (Codice Fiscale incl. la omocodía, P.IVA, IBAN —dlpChecksum) y NER contextual vía LLM para nombres/direcciones (el cliente Ollama existente). - Mask — las entidades detectadas se convierten en marcadores numerados a nivel de documento (
[PERSON_1],[GOV_ID_2], …). El enmascaramiento es idempotente (mask∘mask = mask) — la sintaxis de los marcadores jamás vuelve a engancharse a sí misma. - Re-embed enmascarado —
document_chunks.chunkTextse reescribe con el texto enmascarado,searchVector/searchVectorMulti(FTS) recalculados, y los vectores se re-embedan vía el endpoint del collector/api/ingest/reembed. Ningún vector sin redactar queda consultable. - Cifrado de los originales — el texto original y cada valor de entidad se conservan cifrados AES-256-GCM (
encryptionService, el contrato ENCRYPTION_KEY). El enmascaramiento es one-way: los originales cifrados son la única copia limpia.
Controles de administración
El interruptor por workspace (DLP-01)
Settings → Workspaces → el interruptor DLP document scan (la columna workspaces.dlpDocumentScanEnabled, por defecto off).
- El interruptor queda deshabilitado hasta que la eval gate (abajo) se supere — la DESHABILITACIÓN jamás se bloquea.
- El estado cambia de forma optimista y retrocede ante un error de guardado.
La eval gate (DLP-05)
La evaluación de la calidad de detección debe superar antes de habilitar:
- POST /api/system/dlp/eval/run (admin) — ejecuta el runner repetible sobre el corpus de fixtures PII italianas comprometido (
packages/server/src/__tests__/fixtures/dlp-eval/). Persiste el resultado en SystemConfigDLP_EVAL_LAST_RUN(no editable por administración). - GET /api/system/dlp/eval/result (admin) — lee el último run; jamás ejecutado devuelve
{ passed: false, noRun: true }— nunca un pase silencioso. - La métrica de la barrera: cero falsos positivos de checksums suprimidos sobre las clases GOV_ID/FINANCIAL. La recall de PERSON/ADDRESS queda documentada solamente (nerMode marca
stubvslive).
El backfill del corpus legacy (DLP-06)
POST /api/system/dlp/backfill (admin, con confirmación AlertDialog en la UI):
- Eval-gated: rechaza con
409 { error, gate: "eval-not-passed" }cuando el último eval falta o cayó. - Idempotente + reanudable: el marcador
dlpScannedAt— una re-ejecución solo encola los documentos sin el marcador. - Rate-limited: concurrencia de cola 1 (por debajo de la cola de escaneo en vivo).
- La convergencia queda fijada por el gemelo de integración (Postgres real): chunks enmascarados persistidos, tsvector recalculado, el payload reembed byte-igual al texto enmascarado, y las consultas de auditoría = cero PII restante.
Las cuatro clases de patterns (identificadores europeos/italianos)
| Clase | Qué detecta |
|---|---|
| GOV_ID | Codice Fiscale (incl. la verificación de omocodía) |
| FINANCIAL | P.IVA, IBAN (con validación por checksum) |
| PERSON | nombres de persona (NER contextual LLM) |
| ADDRESS | direcciones (NER contextual LLM) |
Las clases de checksum (GOV_ID/FINANCIAL) son deterministas; las contextuales (PERSON/ADDRESS) pasan por la NER LLM — su recall queda documentada en el resultado del eval.
Chat re-composition (DLP-03)
Los marcadores enmascarados llegan a la LLM; al fin del stream, exactamente una vez, el servidor recompone los marcadores en el mensaje terminal para los usuarios que poseen dlp:unmask en el workspace del documento citado. El campo aditivo content en el payload done del SSE lleva el texto recompuesto; los visitantes widget JAMÁS reciben texto recompuesto (aplicado server-side; para la UI es solo ocultar el control).
La vista previa unmask (DLP-04)
GET /api/documents/:documentId/text sirve el texto enmascarado por defecto. ?unmask=true solo recompone a través de la escalera de barreras: el param válido → el interruptor del workspace on → resolveWorkspaceRole + el permiso dlp:unmask. Cada brazo de falta devuelve texto enmascarado (200) — el endpoint nunca es un oráculo de habilitación. El interruptor de la UI se dibuja solo para los usuarios autorizados sobre documentos con entidades (ausencia del DOM), es por-vista y jamás se persiste.
La matriz de auditoría (SC-4)
Cada vía de lectura queda fijada por una prueba de comportamiento (18 filas: vista de texto, vista previa OCR, synthesis, citations, widget RAG, MCP tools, FTS, export, copia KB, reembed admin). Widget/citations/MCP llevan fijaciones negativas duras (enmascarados, jamás recompuestos).
Esta guía cubre la superficie operativa del pipeline DLP para documentos; la profundidad técnica vive en el post gemelo:
Provenance
| Sección | Fuente |
|---|---|
| La pipeline de 4 fases / detect / mask / reembed / encrypt | docs/DLP_DOCUMENT_PIPELINE.md (Overview — Phase 192 DLP-01..06) — F-DLP-1 |
| Los controles admin / el interruptor / eval / backfill | docs/DLP_DOCUMENT_PIPELINE.md (§ Admin controls) |
| Chat re-composition / la vista previa unmask / la auditoría | docs/DLP_DOCUMENT_PIPELINE.md (§ DLP-03/04, SC-4) — F-AUDIT-1 para la clase de auditoría |
| El conteo "10 PII" | no citado: el conteo no es trazable en esta pasada (F-DLP-2 = UNTRACED-IN-THIS-PASS) — la página nombra las clases reales, jamás un número sin trazabilidad |
---
Referencia operativa — Simmetric Chat v0.28.1 (documentos actualizados el 2026-10-02, SHA del censo `aca5b8ff`).