# Изменения AILab SCRUME Agent

История до 1.7.5 — в `git log` (сообщения коммитов вида `v1.7.5: …`). Здесь ведём план и состав следующего релиза.

---

## 1.7.6 — план (не выпущено)

**Статус: состав накапливается. Сборка не запускается — Олег добавляет нововведения, релиз собирается после закрытия состава.**

Тема: **правило периметра данных доводится до работающего механизма, а не остаётся декларацией в промпте.**

Основание — аудит профиля ai-si 05.11.2026. Проверенное состояние:

| Что | Факт |
|---|---|
| `skills/productivity/docx/references/anonymization.md` | процедура полная: тело, таблицы, все `headerN/footerN.xml`, `docProps/core.xml`, `app.xml`, картинки; замена подчёркиваниями; верификация из 3 шагов. **Лежит только в профиле ai-si — в сборке файла нет** |
| `skills/productivity/docx/scripts/scan_open_pii.py` | работает (`--summary`, `--header`, `--json`, `--fail-on-open`). **Лежит только в профиле ai-si — в сборке файла нет** |
| `skills/ailab/anonymization-check` | лежит в сборке, **в профиль не ставится** — категории `ailab` в установленном профиле нет |
| `skills/engineering/ai-data-perimeter` | есть **только в профиле ai-si**, в сборке отсутствует → получателям не приедет |
| `profiles/<p>/hooks/` | **пусто** — принуждения нет |
| `SOUL.md` сборки | про обезличивание, периметр и заказчика — **ни слова** |

Отсюда формулировка «у нас обезличивание до отправки в модель» сегодня не подтверждается: правило записано в скилле, но срабатывает по триггеру и зависит от того, вспомнит ли модель его применить.

### 1. Один канон процедуры + скилл в сборку и в профиль

Проблема: одна и та же процедура описана в трёх местах — `docx/references/anonymization.md`, `ailab/anonymization-check`, `engineering/ai-data-perimeter`. Три редакции разъедутся.

Иерархия, которую фиксируем:

| Место | Роль |
|---|---|
| `engineering/ai-data-perimeter` | **канон**: правила периметра, проверка «соблюдается ли», порядок работы с документом заказчика, чек-лист и нормы (`references/perimeter-rules.md`) |
| `docx/references/anonymization.md` | техника правки DOCX-пакета + `scripts/scan_open_pii.py` — исполнение под каноном |
| `ailab/anonymization-check` | свести к тонкой ссылке на канон либо убрать; сейчас это третья редакция того же правила |

- Что: положить `engineering/ai-data-perimeter` в сборку (`dist/vasily/skills/engineering/`) — **в сборке этой категории нет вообще**, поэтому переносится каталог целиком, вместе с `references/perimeter-rules.md` и `templates/soul-perimeter-block.md`.
- Что, дополнительно (иначе канон ссылается на отсутствующий файл): перенести в сборку исполнение — `skills/productivity/docx/references/anonymization.md` и `skills/productivity/docx/scripts/scan_open_pii.py`. Оба сейчас есть только в профиле ai-si; в `dist/vasily/skills/productivity/docx/` их нет. Копировать без `__pycache__`.
- Проверить, что категории `engineering` и `ailab` доезжают до установленного профиля при установке и обновлении (`ailab` сейчас не доезжает — см. таблицу выше).
- Критерий приёмки: после чистой установки в профиле есть `skills/engineering/ai-data-perimeter/SKILL.md` + `references/perimeter-rules.md`; третьей редакции правила в профиле нет.
- Причина: скилл, лежащий только в профиле разработчика или только в сборке, в работе не участвует. Правило в SOUL.md на него ссылается — битая ссылка хуже отсутствия ссылки.

### 2. Правило порядка в `SOUL.md` — сведено с `ai-data-perimeter`

Сверено с каноном. SOUL не переписывает светофор и контуры (они в `references/perimeter-rules.md`), а закрывает то, что действует до первого чтения файла, и не противоречит трём правилам скилла: аудит вместо согласия (Правило 0), декларация ≠ контроль (Правило 1), агент сам канал (Правило 2).

Расхождения первой редакции, исправленные при сверке:

| Было в первой редакции | Что говорит скилл | Исправлено |
|---|---|---|
| не покрывала запрос «подтверди, что соблюдается» | Правило 0: это аудит по двум слоям, а не согласие | добавлены оба слоя и запрет ответа по одному |
| «не открывается, пока не решено» — без статуса данных | документ до классификации считается красным | добавлен статус «считается красным» |
| правило жило само по себе | процедура — в скилле, SOUL задаёт только порядок | добавлена ссылка на канон, дублирование убрано |
| не было стоп-сигнала | «маркеров нет» = скорее всего оригинал; ноль находок ≠ чисто | добавлено |
| не сказано, кто обезличивает | обезличивание — работа человека, спорное агент не решает | добавлено |

Формулировка для вставки в `SOUL.md` (в сборку и в рабочий профиль):

```
## Периметр данных

Правила, светофор и процедура — скилл `ai-data-perimeter`. Здесь — то, что
действует до первого чтения файла.

- Документ заказчика (ТЗ, договор, переписка, форма, ИД) до классификации считается
  красным. Инструментами чтения он не открывается, пока не решено, откуда берётся
  обезличенная копия: её даёт владелец или агент делает копию и читает только её.
- Оригинал не открывать «чтобы посмотреть объект». Таблица соответствия токенов и
  реальных значений не читается никогда — она и есть закрываемые данные.
- Обезличивание — работа человека по его таблице соответствий. Агент делает копию по
  технике `docx/anonymization.md`, только если об этом попросили, и не решает за
  человека, что закрывать в спорных случаях.
- Проверка полноты: `python scripts/scan_open_pii.py "<файл>" --summary`. Агент читает
  счётчики; полный отчёт со значениями — человеку, потому что находки и есть
  закрываемые данные.
- «Маркеров нет» — единственный стоп-сигнал: скорее всего, это оригинал. Ноль находок
  ≠ «документ чист». Формулировка: «шаблоны нашли N, открыто: …».
- «Документ обезличен» и «у нас это соблюдается» без проверки файлов — запрещены.
  На просьбу подтвердить меру проверяются два слоя: организационный (приказ,
  регламент, журнал) и технический (SOUL, установленные скиллы, hooks). Ответ по
  одному слою — ошибка в обе стороны.
- Если механизма принуждения нет — говорить это прямо: правило в промпте срабатывает
  по триггеру, а не по факту.
```

- Где: `SOUL.md` в сборке (приезжает всем получателям) + `profiles/<p>/SOUL.md` в рабочем профиле (иначе правило не действует у того, кто уже установлен).
- Критерий приёмки: правило есть в обоих файлах; на контрольной задаче («прочитай ТЗ и найди требования») агент сначала спрашивает про обезличенную копию, а не открывает оригинал.
- Оговорка для релиз-ноутов, честно: это по-прежнему правило в промпте. Принуждение — только hook/шлюз (п. 4).

### 3. Журнал применения ИИ — с записями, а не пустая форма

- Что: форма журнала + процедура, при которой запись появляется по факту задачи, а не заполняется задним числом «для проверки».
- Минимальный состав записи: дата · задача · сервис · контур · категория данных (🟢/🟡/🔴) · обезличивание выполнено (да/нет, чем подтверждено) · результат перепроверен человеком · кто.
- Куда писать: файл журнала в рабочей папке проекта (CSV/MD), запись — по факту задачи; при инциденте — отдельной строкой в журнал инцидентов.
- Критерий приёмки: после пилота на одной команде в журнале есть не менее 5 реальных записей, каждая с категорией данных и отметкой обезличивания; повторяющаяся операция закрывается одной строкой, без ручного заполнения таблицы каждый раз.
- Причина: в папке «AI безопасность» журнал присутствует только как пустая форма Регламента. Пустая форма — не контроль.

### 4. (Задел, вне объёма 1.7.6) Принуждение на исходящем запросе

Каталог `hooks/` пуст — механизма, физически не дающего уйти оригиналу, нет. Кандидат на следующий релиз: перехват исходящего запроса (hook или шлюз) с прогоном шаблонов ПДн и блокировкой отправки. Перед планированием — проверить, какие события Hermes умеет перехватывать; обещать механизм без проверки нельзя.

### 5. Состав из «Mastermind — требования к следующей сборке»

Единый источник UI- и функциональных требований — `C:\Users\Admin\OneDrive\Документы\OM LAB\Mastermind — требования к следующей сборке.md` (§0 — сводка, §1–§4 — тексты). Здесь только состав и статусы; требования не дублируются, при расхождении верен документ.

| № в документе | Пункт | Раздел | Статус на 05.11.2026 |
|---|---|---|---|
| 1 | Только разрешённые модели, персональный ключ, бренд агрегатора скрыт | §1 | готово к реализации |
| 2 | Один провайдер (шлюз), прямой `polza.ai` удалён, `discover_models` выключен + миграция для установленных | §3a | готово к реализации |
| 3 | Прогресс-бар лимита — по ключу в рублях, через шлюз | §1a | **блокер:** нужен `/v1/wallet` на шлюзе |
| 4 | Vision через шлюз тем же ключом | §1b | готово к реализации |
| 5 | Резерв proxy.ai, только автопереключение, пользователю не виден | §2 | **блокер:** регистрация в proxy.ai + список моделей |
| 6 | Настройки: пять вкладок, «О программе» скрыть | §3 | готово к реализации |
| 6a | Вкладка «Боты» скрыта, Bot Mode остаётся в коде | §3b | решено 04.11.2026: только вкладка |
| 6b | Первое открытие после установки — тёмная тема | §3c | записано 04.11.2026 |
| 7 | Бот на звонок в Телемост | §4 | **блокер:** отдельная учётка Яндекс |

- **Что реально войдёт в 1.7.6:** пункты без внешних блокеров — 1, 2, 4, 6, 6a, 6b (плюс безопасность п.1–3 выше).
- **Переносятся** 3, 5, 7 — собираются, когда закроются блокеры; тогда же поднимается номер (1.7.7 или следующий по порядку).
- Не путать: «п.4» здесь — vision, а «§4» документа — бот на звонок; сквозная нумерация в документе своя.
- Перед сборкой закрыть открытые вопросы §5 документа: префиксы `testoff/…` в названиях моделей, точный перечень вкладок настроек, маппинг моделей proxy.

### Что НЕ входит в 1.7.6

- Локальная модель / RAG (Ollama + Open WebUI): решения нет, железа нет. Ценность такого контура — только на красной категории, и он снимает риск утечки ценой качества на русском техническом тексте.
- Заполнение Регламента и приказа ООО «СКРАМ ИНЖИНИРИНГ» — организационный слой, отдельная работа вне сборки.

---

## Как выпускается

1. Состав закрыт Олегом; пункты 1–3 (безопасность) проверены на чистой установке, а не только в рабочем профиле, и пункты 1, 2, 4, 6, 6a, 6b из п.5 (UI) проверены там же.
2. `distribution.yaml` → `version: 1.7.6`; `README.md` → «Текущая версия: 1.7.6».
3. Коммит с сообщением `v1.7.6: <главное изменение>`.
4. Сборка bundle, проверка по разделу «Проверка перед передачей» в README.
