MILAGPT
Начните с «Для бизнеса»: три шага до запуска.
Записаться на разборОткроется Telegram
RU·EN
Документация · Тайна клиента

Тайна клиента: проверка каждого сообщения

Перед каждым сообщением в Telegram текст Милы проходит через сторожа. Не тот чат, ключ, номер карты, название чата другого клиента — и сообщение не уходит. Мила получает причину и пишет заново. У каждой строки ниже — ссылка на код.

Для агентства и консультанта, у которых в одной Миле много клиентов.

Как работает

Проверка перед каждым сообщением

Сторож — небольшой скрипт. Claude Code запускает его до того, как Мила что-то отправит в Telegram. Правило в подсказке можно забыть, скрипт на выходе — нельзя. send-guard.py:1-5 settings.json:35-46

01 · КАЖДЫЙ РАЗ

Перед ответом и правкой

Срабатывает на новом сообщении и на правке уже отправленного. Другие инструменты не трогает.

send-guard.py:13-15
02 · ЧТО ВИДИТ

Чат и текст

Видит, в какой чат уходит сообщение, и сам текст, и сверяет то и другое со своими правилами.

send-guard.py:16-21
03 · НЕТ

Причина вместо отправки

Если что-то не так, сообщение остаётся. Мила получает «Не отправляю:» и все причины и пишет текст заново.

send-guard.py:179-187
04 · СБОЙ

Сторож упал — ничего не уходит

В шаблоне настроек у сторожа стоит onFailure: block: если он упал или завис, сообщение не уходит без проверки. Тест сторожа запускается при каждом изменении в репозитории.

settings.json:42 skills.yml:12 CHANGELOG.md:121
Тайна клиента

Чужое дело остаётся в своём чате

У Милы одна сессия на все чаты, стены между ними внутри нет. Поэтому замок стоит на выходе: проверка — в момент отправки. Это первый закон её конституции: деталь одного дела не звучит в разговоре о другом. send-guard.py:116-120 CONSTITUTION.md:15

Кто где, сторож узнаёт из журнала входящих: какие люди писали в каком чате и как называется каждый чат. send-guard.py:137-155

В этот чат не уйдёт
  • Человек из другого чата. @имя, которого в этом чате не было, а в другом есть. send-guard.py:158-162 test_send_guard.py:36-37
  • Название другого чата. Слово из названия другого чата длиной от пяти букв. send-guard.py:163-175 test_send_guard.py:41
  • Чаты одного дела — одно целое. Группу клиента и рабочий чат команды можно записать вместе в same-case-chats.json; внутри списка «чужого дела» нет. send-guard.py:127-135 test_send_guard.py:38-42
  • Хозяин видит всё. Для вашей лички и чатов из списка внутренних эта проверка выключена. send-guard.py:121-126 send-guard.py:136
Кому она пишет

Только туда, куда подключили

Сообщение уходит хозяину, в группы, куда её подключил хозяин, и в личку людей, допущенных списком доступа. Любому другому чату — ничего: «говорю только там, куда меня подключили». send-guard.py:23-36 test_send_guard.py:23-24

Если id хозяина не задан, хватает списка доступа. Если нет ни того, ни другого — как у Милы, которую ещё не подключили, — адресат не проверяется. send-guard.py:33-35 test_send_guard.py:44-49

✓ хозяин (OWNER_ID)
✓ группы из access.json
✓ люди из allowFrom
✗ любой другой чат
Что ещё не уходит

Ключи, карты, кухня не выходят наружу

Тот же сторож ищет то, чего в чате быть не должно, кому бы ни было сообщение.

01 · КЛЮЧИ

Ключи и токены

Ключи провайдеров, токен Telegram-бота, ключи AWS, GitHub и Slack, токены API. Сообщение остаётся, совет — «перевыпустить ключ».

send-guard.py:38-48 test_send_guard.py:26
02 · КАРТЫ

Номера карт

13–19 цифр, которые проходят проверку номера карты, в группу не уходят никогда. В личку номер уходит маской ****1234. Свои реквизиты можно разрешить; телефон с «+» — не карта.

send-guard.py:49-83 send-guard.py:179-184 test_send_guard.py:59-75
03 · КУХНЯ

Пути, id, сырые ошибки

Серверные пути, команды контейнера, сырые ошибки провайдера, внутренности хуков, id чатов вида -100… Вместо этого — результат словами человека.

send-guard.py:84-95 test_send_guard.py:27
04 · ИЗВИНЕНИЯ

Дело, а не «простите»

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

send-guard.py:97-104 CONSTITUTION.md:21 test_send_guard.py:25

И ещё одно правило: жирный, списки или ссылки без разметки Telegram тоже не уходят — чтобы никто не увидел сырые звёздочки. Подробнее — на странице про Telegram. send-guard.py:106-114

На своём сервере

Установщик ставит сторожа сам

Установщик кладёт send-guard.py в папку хуков и записывает его в настройки Claude Code на ответ и правку. Повторный запуск не добавляет его второй раз; тест проверяет и то и другое. install/install.sh:116-121 install/install.sh:292-297 test_install_hooks.sh:23-26

id хозяина берётся из MILA_OWNER_ID и попадает в настройки — так сторож знает, чья личка чья. install/install.sh:305-309

Обновления приносят новый код сторожа вместе с другими хуками ядра. Файл настроек обновление не трогает никогда. release.json:41-49 release.json:71

$ python3 templates/home/.claude/hooks/test_send_guard.py
✅ чужому чату — стоп
✅ извинение хозяину — стоп (закон 7)
✅ третий клиент — по-прежнему чужое дело: стоп
✅ карта в группу (с пробелами) — стоп
  итог 24/24
Честно

Что сторож не ловит

В репозитории

Каждую строку можно прочитать самому

Файлы сторожа отправки в репозитории mila
ФайлЧто делает
send-guard.pyсторож: адресат, ключи, карты, кухня, извинения, чужое дело
test_send_guard.py24 проверки сторожа
settings.jsonшаблон настроек: сторож на ответ и правку, onFailure: block
install/install.shкладёт сторожа и записывает его в настройки
test_install_hooks.shпроверяет, что установщик записал сторожа один раз
release.jsonобновления приносят хуки, файл настроек — никогда
CONSTITUTION.mdзакон 1 (тайна) и закон 7 (без извинений)
SECURITY.mdкак сообщить о дыре в стороже (на английском)
Открытый код · Apache-2.0

Форкните, научите, пришлите PR

Набор открыт: умения, хуки, инструменты и шаблоны. Запустите test_send_guard.py сами; нашли дыру в стороже — как сообщить, написано в SECURITY.md.

Факты на странице: github.com/shakhruz/mila (main, 8a6b97d, v1.5.2), проверено 24.10.2026; test_send_guard.py — 24 из 24. Переписка в телефоне — иллюстрация. «Mila», «MILAGPT» и логотип — товарные знаки MILAGPT.