Цифровые сотрудницы в вашем Telegram
Как Мила сделала: разборы и новости
Пообещать беречь тайну ваших клиентов может любой бот. Обещание не проверить, а строку кода — можно. У Милы одна конституция из 10 законов. Ниже у каждого закона — пересказ простыми словами, механизм в коде со ссылкой и честная пометка, где кода нет: 7 законов держит код, закон 10 — наполовину, законы 8 и 9 — только правило.
Владельцу, который хочет знать, чего помощник не сделает за его спиной.
Код — хук или скрипт, который сам останавливает действие. Правило — строка в навыке: его держит модель, и проверить его можно только по поступкам Милы. Законы лежат в CONSTITUTION.md — этот файл каждая Мила читает первым. CONSTITUTION.md:15-24
| Закон | Чем держится | Вид |
|---|---|---|
| 1 · Тайна человека | Сторож отправки: чужие чаты, чужие @теги и названия | Код |
| 2 · Факт и улика | task.py: «сделано» без улики не записывается | Код |
| 3 · От вашего имени | bot-send: рассылка — превью и ваше нажатие на этот текст | Код |
| 4 · Деньги и необратимое | spend: выше порога — только вашим нажатием | Код |
| 5 · Личные данные | Ярлыки в памяти, шифрованное хранилище, маска номера карты | Код |
| 6 · Отказ и молчание | Срок без ответа — отказ; «стоп» — в стоп-лист | Код |
| 7 · Без извинений | Сторож не пропускает «простите» | Код |
| 8 · Ментор | Методика «Путь» | Правило |
| 9 · Страхи и сомнения | Механизма нет | Правило |
| 10 · Каждый день, в меру | Ритуалы переживают рестарт; счётчика меры нет | Наполовину |
Тайна человека не переходит к другому ни словом, ни памятью. Сторож проверяет каждое сообщение до отправки: адресат — хозяин или чат, куда Милу подключили. В чат не уходит @тег человека или название чата, которых там не было, а в другом чате они есть. Сторож упал или завис — сообщение не уходит. send-guard.py:25-38 send-guard.py:118-177 install.sh:303-312
Предел: замок ловит теги и названия, а не пересказ своими словами. Стены между чатами в памяти нет — одна сессия на все чаты, поэтому защита стоит на выходе. send-guard.py:119-121 send-guard.py:178-179
Факт — из инструмента, не из памяти. Команда done без улики ничего не записывает. Улику — команду, адрес, сообщение, коммит — скрипт исполняет сам и сейчас; упала — задача не закрыта. Задачу клиента закрывает только чужая рука: слово человека или его сообщение. После каждого ответа хук находит в тексте обещания и заводит их со сроком. task.py:63 task.py:684-689 task.py:690-708 task-sent.py:1-10 task-open.py:1-3
Предел: скрипт не следит за чатом — слово «готово» без done код не остановит. «Нет данных — так и говорю» держится только правилом. mila-tasks:9 mila-tasks:53
Рассылка от вашего публичного бота — в два шага: превью «N человек» с полным текстом, отправка — только после вашего ✅. Превью живёт час, второе нажатие уже ничего не отправляет. Писать можно только тем, кто сам писал боту. Telegram велел ждать дольше часа — остаток сам не уходит: вам новое превью на тот же текст, вчерашнее нажатие не считается. bot_send.py:131-144 bot_send.py:146-155 bot_send.py:22 bot_send.py:173-180 bot_send.py:117-118 bot-send:14-20
Предел: обычный ответ в чате, куда Милу подключили, кнопки не ждёт. Сторож проверяет адресата, ключи и кухню, но не ваше нажатие — так и написано в README. README.md:82
Деньги, необратимое и ваше слово — только когда вы сами так решили, и выбор записан в журнал. Перед платной генерацией spend даёт прогноз с запасом 10 %. Выше порога — карточка с меткой этой траты. Деньги пускает только нажатие, которое записал плагин Telegram, а не id, который Мила пишет сама. Одна карточка — одна трата. Человек с бюджетом от владельца пускает только свою трату и в его пределах. Потолок месяца, бюджеты и список владельцев тоже меняются только вашим нажатием. Каждая трата — строка в журнале: кто нажал, какая карточка. spend.py:94-104 spend.py:51-74 spend.py:105-122 spend.py:134-146
Предел: трата ниже порога проходит сама — строкой в журнале. Удалять, публиковать, обещать — общего замка в коде нет: это держат навыки и правила инструментов. До 28.10 трату пускал id в аргументе, который пишет сама Мила; с v1.6.4 — только нажатие. spend.py:33 spend.py:99 permission_policy.ts:19-25 cards:34 topics:29 mila-update:89 spend.py:19-23 test_spend_tap.py:1-3
После записи в память, журналы и карточки хук меняет телефоны, почту, номера карт, паспорт и ПИНФЛ на короткие ярлыки: вид данных и номер. Значения лежат в зашифрованном хранилище (AES-256 и HMAC: подменённый файл не откроется). Номер карты в группу не уходит, в личку — маской ****1234. В своём клоне ядра коммит с вашими id и именами не создаётся. pd-mask.py:1-13 pd_vault.py:1-13 send-guard.py:51-85 send-guard.py:181-185 install_privacy_hook.sh:1-11
Предел: входящее сообщение модель читает целиком — хранилище бережёт то, что Мила хранит и передаёт. Раскрыть значение можно только хозяину в личке, и решает это навык, а не код. Маску выключает PD_MASK=0. pd-vault:19-23 pd_vault.py:5-10 pd-mask.py:2-4
Карточка с правом инструмента без ответа к сроку — отказ, и Мила обязана сказать, что не сделала. Закрытую карточку второй раз не открыть; «До завтра» возвращает её в 9:00. «Стоп» в боте — человек в стоп-листе, и рассылка пропускает его даже из очереди. permission_policy.ts:14-15 REFERENCE.md:352-355 cards.py:251-255 cards.py:244-248 bot_send.py:211-214 bot_send.py:166
Предел: развилка в задачах с истёкшим сроком закрывается вариантом по умолчанию — с честной строкой «ответа не было N ч» и способом отменить. Без отката и срока такая развилка не создаётся, а таймер стоит, пока сообщение не доставлено. task.py:833-853 mila-tasks:55
Сторож не пропускает в чат извинения и оправдания — «извините», «простите», «моя ошибка», «виноват», «к сожалению, не успела», английское sorry — ни клиенту, ни хозяину. В причине остановки — ссылка на закон 7. Исключение — отчёт с номером дефекта. send-guard.py:99-106 test_send_guard.py:25
Предел: сторож ловит слова, а не тон. Есть ли в ответе факт, вывод и шаг, код не проверяет.
Вести к цели, которую человек назвал сам, и мерить себя его результатом. Опора — методика «Путь»: веха пройдена, когда случилось событие в жизни человека, а не нажатие в боте. Цели человека и замера результата в коде нет.
CONSTITUTION.md:22 mila-path:20-22На промедление человека — маленький шаг, факт или пример, а не оценка. Механизма в коде нет, и в навыках этот закон отдельно не процитирован.
CONSTITUTION.md:23Код держит «каждый день»: расписание ритуалов переживает рестарт сессии, недостающие кроны поднимаются при старте. Меру держит правило: норма — тишина, плановых касаний не больше трёх в день. Счётчика «сообщений от себя за день» нет; похожее ограничение в час есть только на переписку Мил между собой.
crons-keeper.py:1-7 CONSTITUTION.md:24 client-chat:105 companion-feeder.py:332-336Конституция — файл CONSTITUTION.md: одна на всех Мил, читается первой. Менять её вправе владелец. CONSTITUTION.md:15-24
Новая редакция приходит с обновлением. План обновления выносит её отдельной строкой — «прочитайте до «Обновиться»» — и ставит риск не ниже среднего. update.py:782-791 update.py:827-832
Если у вас стоит своя редакция, обновление не советует заменить её редакцией ядра: ваша бывает новее. 28.10 закон 4 в ядре приведён к тексту, который владелец утвердил 20.09. update.py:797-799 CONSTITUTION.md:18
| Файл | Что делает |
|---|---|
| CONSTITUTION.md | текст: преамбула и 10 законов |
| hooks/send-guard.py | сторож отправки: адресат, чужое дело, номер карты, извинения — законы 1, 5, 7 |
| skills/mila-tasks/task.py | «сделано» только с уликой, развилки со сроком — законы 2 и 6 |
| skills/bot-send/bot_send.py | рассылка: превью, нажатие, стоп-лист — законы 3 и 6 |
| skills/spend/spend.py | траты: прогноз, порог, нажатие владельца — закон 4 |
| install/permission_policy.ts | права инструментов: срок без ответа — отказ — законы 4 и 6 |
| install/pd-mask.py | ярлыки вместо личных данных — закон 5 |
| skills/pd-vault/pd_vault.py | зашифрованное хранилище — закон 5 |
| skills/cards/cards.py | карточки: закрытая не открывается снова — закон 6 |
| install/crons-keeper.py | ритуалы переживают рестарт — закон 10 |
Набор открыт: умения, хуки, инструменты и шаблоны. Каждый pull request читает человек и Мила Качество.
Факты на странице: github.com/shakhruz/mila (main, 1d0a4c4), проверено 28.10.2026. Переписка в телефоне — иллюстрация. «Mila», «MILAGPT» и логотип — товарные знаки MILAGPT.