DLP-конвейер для документов — справочник оператора
Когда DLP-сканирование включено для workspace, каждый загруженный документ проходит асинхронное pg-boss-сканирование после ingestion:
Когда 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.mdF-DLP-1, F-DLP-2, F-AUDIT-1.
- Detect — конвейер из 3 уровней: регулярные выражения, настраиваемые администратором (
dlpPatternService), checksum-валидация для итальянских идентификаторов фиксированного формата (Codice Fiscale вкл. омо-кодию, P.IVA, IBAN —dlpChecksum), и контекстный NER через LLM для имён/адресов (существующий Ollama-клиент). - Mask — обнаруженные сущности становятся нумерованными заполителями уровня документа (
[PERSON_1],[GOV_ID_2], …). Маскирование идемпотентно (mask∘mask = mask) — синтаксис заполителей никогда не может снова зацепиться сам за себя. - Маскированный re-embed —
document_chunks.chunkTextперезаписывается замаскированным текстом,searchVector/searchVectorMulti(FTS) пересчитываются, векторы заново встраиваются через endpoint collector/api/ingest/reembed. Ни один не-редактированный вектор не остаётся поисковым. - Шифрование оригиналов — оригинальный текст и каждое значение сущности хранятся в шифре 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ирует результат в SystemConfigDLP_EVAL_LAST_RUN(не редактируемая администратором). - GET /api/system/dlp/eval/result (admin) — читает последний запуск; никогда не исполнявшийся возвращает
{ passed: false, noRun: true }— никогда тихий pass. - Метрика барьера: ноль ложных срабатываний от подавленных checksum на классах GOV_ID/FINANCIAL. Recall PERSON/ADDRESS — только документируемая (nerMode помечает
stubvslive).
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_ID | Codice Fiscale (вкл. верификацию омо-кодии) |
| FINANCIAL | P.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 / encrypt | docs/DLP_DOCUMENT_PIPELINE.md (Overview — Phase 192 DLP-01..06) — F-DLP-1 |
| Управление / переключатель / eval / backfill | docs/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`).