---
name: anonymization-check
description: "Use when документ заказчика уходит во внешнюю модель. Проверка полноты обезличивания: что закрыто, а что осталось открытым."
version: 1.0.0
author: AI_Lab_SCRUM Co
license: MIT
platforms: [linux, macos, windows]
metadata:
  hermes:
    tags: [anonymization, privacy, documents, pii, docx]
    category: ailab
    related_skills: [docx]
---

**Правило: ни один документ заказчика не уходит в модель, пока не обезличен.**
Обезличивание делает человек; этот скилл — контрольный шаг перед загрузкой,
он отвечает на вопрос, **что осталось открытым**.

# Skill: Проверка полноты обезличивания

## 1. Назначение

**Правило: ни один документ заказчика не уходит в модель, пока не обезличен.**
Обезличивание делает человек по своей таблице соответствий. Скилл — контрольный
шаг перед загрузкой: он отвечает на вопрос, **что осталось открытым**.

Обезличивание делают люди, и оно бывает неполным. В разобранном ТЗ закрыты
адрес, кадастровый номер и топонимы — а наименование заказчика, управляющей
организации, фамилия подписанта и номер ГПЗУ остались открытыми. Никто этого не
скрывал: просто закрыли то, о чём подумали.

**Результат читает тот, кто будет работать с документом дальше** — и ему нужно
знать не «обезличено/не обезличено», а конкретно: что закрыто токенами, что
осталось открытым и откуда нельзя брать цитаты. Эта строка идёт в шапку любого
отчёта по документу.

## 2. Когда применять и когда не применять

**Применять:** документ заказчика (ТЗ, договор, форма КП, переписка) перед
загрузкой во внешнюю модель или перед отчётом, который увидят за пределами отдела.
Проверка идёт **до** предметного разбора — она стоит минуты и не требует
чтения документа целиком.

**Не применять** для самого обезличивания: скилл проверяет, а не закрывает.
Заменять реальные значения токенами — работа человека, у него есть таблица
соответствий, которую агент не читает.

## 3. Входные данные и их грабли

| Что | Формат | Роль |
|---|---|---|
| Обезличенная копия документа | DOCX, TXT | проверяемый |

**В ТЗ содержимое лежит в ячейках таблиц, а не в абзацах.** Проверка только по
абзацам даёт пустой результат и читается как «всё чисто». Скрипт разбирает и
абзацы, и таблицы; если делаешь проверку иначе — делай так же.

**`grep -i` в этом окружении не сворачивает регистр кириллицы.** Поиск
`grep -i "ооо"` не найдёт «ООО», и счётчик молча выйдет нулевым. Поэтому шаблоны
написаны явно под нужный регистр, а регистронезависимый поиск — только питоном
по `text.lower()`.

**Отсутствие находок — не доказательство.** Шаблоны находят то, что в них
описано: организационные формы, инициалы, кадастровые номера, номера ГПЗУ,
адреса. Заказчик, названный описательно («Инвестор проекта в районе станции»),
под шаблон не попадёт. Ноль находок означает «шаблоны не сработали».

## 4. Источник правды

Эталона у этой работы нет: проверяется сам документ. Источник правды — **текст
обезличенной копии**, и только он.

Таблица соответствия токенов и реальных значений **не читается никогда**:
ни для проверки, ни для «уточнить, что за объект». Само наличие такой таблицы
рядом не даёт права её открыть.


## 5. Процедура

1. **Убедись, что работаешь с копией, а не с оригиналом.** Если токенов
   обезличивания в документе нет вообще — это, скорее всего, оригинал. Останови
   работу и скажи об этом.
2. **Прогони шаблоны:**
   `python <скилл>/scripts/scan_open_pii.py "<файл.docx>"`. Скрипт печатает, что
   закрыто токенами (сколько и каких видов) и что осталось открытым, по
   категориям, с самими находками.
3. **Просмотри найденное глазами.** Не всякая организация — утечка: «ГБУ
   «Мосгоргеотрест»» и «АО «Мосводоканал»» это ресурсоснабжающие организации, они
   в любом ТЗ Москвы и объект не идентифицируют. А «ООО «Мангазея»» и «ООО «МД
   Проект III»» — заказчик и управляющая организация, по ним объект находится
   поиском за минуту. Разделять эти два случая — работа человека или агента, а не
   шаблона.
4. **Пройдись по тому, что шаблоны не ловят:** описательные упоминания объекта,
   узнаваемые характеристики («единственный в районе 50-этажный»), названия
   смежных проектов, ссылки на переписку.
5. **Сформулируй строку для шапки отчёта:** что закрыто токенами, что осталось
   открытым и откуда не берутся цитаты.

Самое чувствительное в этих документах — **название объекта и его адрес**
(заказчик в ТЗ обычно прямо не назван). Если что-то идентифицирует объект или
заказчика и токеном не закрыто — не переноси это в отчёт дословно и скажи
пользователю.

## 6. Выходные данные

Строка (или короткий блок) для шапки отчёта по документу:

```
Обезличивание: закрыто токенами — адрес, кадастровый номер, топонимы (26 замен).
Открыто: наименование заказчика и управляющей организации, фамилия подписанта,
номер ГПЗУ. Цитаты не берутся из подписного блока и пункта «Заказчик».
```

Отдельного файла-отчёта скилл не производит: его результат живёт в шапке того
отчёта, ради которого документ и открывали. Если проверка делается впрок —
положи вывод скрипта рядом с документом в рабочей папке.

## 7. Запреты

- Не читать таблицу соответствий токенов и не пересылать её.
- Не угадывать, что стоит за токеном. `[АДРЕС-003]` — обычный текст, переноси
  как есть.
- Не цитировать подписной блок и пункт «Заказчик».
- Не выносить открытые находки в документы, которые уйдут наружу: назвать факт в
  шапке — да, перечислять реальные наименования в отчёте заказчику — нет.
- Не докладывать «документ обезличен» по результату одного прогона шаблонов.
  Правильная формулировка: «шаблоны нашли столько-то, вот что осталось открытым».

## 8. Приёмка

Эталона пока нет: скилл переносится из другого набора, а свой приёмочный случай
нужно завести — обезличенная копия реального документа с известным людям ответом:
что закрыто токенами и что осталось открытым.

Семь критериев на этой работе: бизнес-результат — есть готовая строка для шапки,
а не «проверено»; метод — разобраны и абзацы, и таблицы; полномочия — таблица
соответствий не читалась; остановка — сомнительные находки отданы человеку,
а не расклассифицированы самостоятельно; ровно один раз — один документ, один
вывод; доказательство — вывод скрипта с самими находками, а не утверждение;
исключения — если токенов нет вовсе, работа остановлена, а не продолжена на
оригинале.
