К документации
Руководство 00

DLP-конвейер для документов — справочник оператора

Когда DLP-сканирование включено для workspace, каждый загруженный документ проходит асинхронное pg-boss-сканирование после ingestion:

3 мин чтения

Когда DLP-сканирование включено для workspace, каждый загруженный документ проходит асинхронное pg-boss-сканирование после ingestion:

Опциональная Enterprise-функция, включаемая на workspace (workspaces.dlpDocumentScanEnabled, по умолчанию off; включение требует прохождения eval gate). Источник: docs/DLP_DOCUMENT_PIPELINE.md (Phase 192, DLP-01..06 — v0.28.1). Строоки происхождения: FACT-CENSUS.md F-DLP-1, F-DLP-2, F-AUDIT-1.
  1. Detect — конвейер из 3 уровней: регулярные выражения, настраиваемые администратором (dlpPatternService), checksum-валидация для итальянских идентификаторов фиксированного формата (Codice Fiscale вкл. омо-кодию, P.IVA, IBAN — dlpChecksum), и контекстный NER через LLM для имён/адресов (существующий Ollama-клиент).
  2. Mask — обнаруженные сущности становятся нумерованными заполителями уровня документа ([PERSON_1], [GOV_ID_2], …). Маскирование идемпотентно (mask∘mask = mask) — синтаксис заполителей никогда не может снова зацепиться сам за себя.
  3. Маскированный re-embed — document_chunks.chunkText перезаписывается замаскированным текстом, searchVector/searchVectorMulti (FTS) пересчитываются, векторы заново встраиваются через endpoint collector /api/ingest/reembed. Ни один не-редактированный вектор не остаётся поисковым.
  4. Шифрование оригиналов — оригинальный текст и каждое значение сущности хранятся в шифре AES-256-GCM (encryptionService, контракт ENCRYPTION_KEY). Маскирование one-way: шифрованные оригиналы — единственная чистая копия.

Управление администратора

Переключатель на workspace (DLP-01)

Settings → Workspaces → переключатель DLP document scan (колонка workspaces.dlpDocumentScanEnabled, по умолчанию off).

  • Переключатель остаётся выключенным до прохождения eval gate (ниже) — ВЫКЛЮЧЕНИЕ никогда не блокируется.
  • Состояние переключается оптимистично и возвращается назад при ошибке сохранения.

Eval gate (DLP-05)

Оценка качества детекции должна пройти до включения:

  • POST /api/system/dlp/eval/run (admin) — исполняет повторяемый runner по committed корпусу итальянских PII-фикстур (packages/server/src/__tests__/fixtures/dlp-eval/). Persistирует результат в SystemConfig DLP_EVAL_LAST_RUN (не редактируемая администратором).
  • GET /api/system/dlp/eval/result (admin) — читает последний запуск; никогда не исполнявшийся возвращает { passed: false, noRun: true } — никогда тихий pass.
  • Метрика барьера: ноль ложных срабатываний от подавленных checksum на классах GOV_ID/FINANCIAL. Recall PERSON/ADDRESS — только документируемая (nerMode помечает stub vs live).

Backfill по legacy-корпусу (DLP-06)

POST /api/system/dlp/backfill (admin, с подтверждением AlertDialog в UI):

  • Eval-gated: отвергает с 409 { error, gate: "eval-not-passed" }, когда последнего evalа нет или он падал.
  • Идемпотентно + возобновляемо: маркер dlpScannedAt — повторный запуск кладёт в очередь только документы без маркера.
  • Rate-limited: конкаренция очереди 1 (под очередью живого сканирования).
  • Сходимость закреплена integration-близнецом (настоящий Postgres): маскированные chunks persistированы, tsvector пересчитан, reembed-payload byte-равен замаскированному тексту, аудиторские запросы = ноль оставшейся PII.

Четыре класса паттернов (европейские/итальянские идентификаторы)

КлассЧто детектирует
GOV_IDCodice Fiscale (вкл. верификацию омо-кодии)
FINANCIALP.IVA, IBAN (с checksum-валидацией)
PERSONимена людей (контекстный NER LLM)
ADDRESSадресы (контекстный NER LLM)

Checksum-классы (GOV_ID/FINANCIAL) детерминистичны; контекстные (PERSON/ADDRESS) идут через NER LLM — их recall документируется в результате evalа.

Chat re-composition (DLP-03)

Замаскированные заполнители достигают LLM; в конце стрима, ровно один раз, сервер перекомпонует заполители в терминальном сообщении для пользователей, владеющих dlp:unmask на workspace цитированного документа. Аддитивное поле content в payload done SSE несёт перекомпонованный текст; widget-визитеры НИКОГДА не получают перекомпонованный текст (обеспечено server-side; для UI это лишь скрыть контроль).

Unmask-превью (DLP-04)

GET /api/documents/:documentId/text выдаёт маскированный текст по умолчанию. ?unmask=true перекомпонует только по лестнице барьеров: валидный param → переключатель workspace on → resolveWorkspaceRole + право dlp:unmask. Каждая рука неудачи возвращает маскированный текст (200) — endpoint никогда не оракул полномочий. Переключатель UI рисуется только для полномочных пользователей на документах с сущностями (отсутствие в DOM), пер-вью и никогда не persistируется.

Матрица аудита (SC-4)

Каждый путь чтения закреплён поведенческим тестом (18 строк: просмотр текста, OCR-превью, synthesis, citations, widget RAG, MCP tools, FTS, export, копия KB, reembed admin). Widget/citations/MCP несут жёсткие негативные закрепления (маскировано, никогда перекомпоновано).

Это руководство описывает операционную поверхность DLP-конвейера для документов; техническая глубина живёт в статье-близнеце:

Provenance

РазделИсточник
4-фазный конвейер / detect / mask / reembed / encryptdocs/DLP_DOCUMENT_PIPELINE.md (Overview — Phase 192 DLP-01..06) — F-DLP-1
Управление / переключатель / eval / backfilldocs/DLP_DOCUMENT_PIPELINE.md (§ Admin controls)
Chat re-composition / unmask-превью / аудитdocs/DLP_DOCUMENT_PIPELINE.md (§ DLP-03/04, SC-4) — F-AUDIT-1 для класса аудита
Счётчик "10 PII"не цитируется: счёт не отслеживаем в этой фазе (F-DLP-2 = UNTRACED-IN-THIS-PASS) — страница называет фактические классы, никогда неотслеживаемое число

---

Справочник оператора — Simmetric Chat v0.28.1 (документы обновлены 2026-10-02, SHA переписи `aca5b8ff`).