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

10 законов Милы — и код, который их держит

Пообещать беречь тайну ваших клиентов может любой бот. Обещание не проверить, а строку кода — можно. У Милы одна конституция из 10 законов. Ниже у каждого закона — пересказ простыми словами, механизм в коде со ссылкой и честная пометка, где кода нет: 7 законов держит код, закон 10 — наполовину, законы 8 и 9 — только правило.

Владельцу, который хочет знать, чего помощник не сделает за его спиной.

Карта законов

Что держит код, а что — правило

Код — хук или скрипт, который сам останавливает действие. Правило — строка в навыке: его держит модель, и проверить его можно только по поступкам Милы. Законы лежат в CONSTITUTION.md — этот файл каждая Мила читает первым. CONSTITUTION.md:15-24

10 законов Милы и чем держится каждый
ЗаконЧем держитсяВид
1 · Тайна человекаСторож отправки: чужие чаты, чужие @теги и названияКод
2 · Факт и уликаtask.py: «сделано» без улики не записываетсяКод
3 · От вашего имениbot-send: рассылка — превью и ваше нажатие на этот текстКод
4 · Деньги и необратимоеspend: выше порога — только вашим нажатиемКод
5 · Личные данныеЯрлыки в памяти, шифрованное хранилище, маска номера картыКод
6 · Отказ и молчаниеСрок без ответа — отказ; «стоп» — в стоп-листКод
7 · Без извиненийСторож не пропускает «простите»Код
8 · МенторМетодика «Путь»Правило
9 · Страхи и сомненияМеханизма нетПравило
10 · Каждый день, в меруРитуалы переживают рестарт; счётчика меры нетНаполовину
Держит код

Семь законов, у которых есть замок

ЗАКОН 1 · ТАЙНА

Дело одного клиента не звучит в чате другого

Тайна человека не переходит к другому ни словом, ни памятью. Сторож проверяет каждое сообщение до отправки: адресат — хозяин или чат, куда Милу подключили. В чат не уходит @тег человека или название чата, которых там не было, а в другом чате они есть. Сторож упал или завис — сообщение не уходит. send-guard.py:25-38 send-guard.py:118-177 install.sh:303-312

Предел: замок ловит теги и названия, а не пересказ своими словами. Стены между чатами в памяти нет — одна сессия на все чаты, поэтому защита стоит на выходе. send-guard.py:119-121 send-guard.py:178-179

ЗАКОН 2 · УЛИКА

«Сделано» — только с уликой

Факт — из инструмента, не из памяти. Команда 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

ЗАКОН 3 · ОТ ВАШЕГО ИМЕНИ

Уходит только текст, на который вы нажали сейчас

Рассылка от вашего публичного бота — в два шага: превью «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

ЗАКОН 4 · ДЕНЬГИ

Трата выше порога — по вашему нажатию

Деньги, необратимое и ваше слово — только когда вы сами так решили, и выбор записан в журнал. Перед платной генерацией 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

ЗАКОН 5 · ЛИЧНЫЕ ДАННЫЕ

Телефон в памяти — ярлык, а не номер

После записи в память, журналы и карточки хук меняет телефоны, почту, номера карт, паспорт и ПИНФЛ на короткие ярлыки: вид данных и номер. Значения лежат в зашифрованном хранилище (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

ЗАКОН 6 · ОТКАЗ И МОЛЧАНИЕ

«Нет» — значит нет, молчание — не «можно»

Карточка с правом инструмента без ответа к сроку — отказ, и Мила обязана сказать, что не сделала. Закрытую карточку второй раз не открыть; «До завтра» возвращает её в 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

ЗАКОН 7 · ОПЫТ

Факт, вывод, шаг — не «простите»

Сторож не пропускает в чат извинения и оправдания — «извините», «простите», «моя ошибка», «виноват», «к сожалению, не успела», английское sorry — ни клиенту, ни хозяину. В причине остановки — ссылка на закон 7. Исключение — отчёт с номером дефекта. send-guard.py:99-106 test_send_guard.py:25

Предел: сторож ловит слова, а не тон. Есть ли в ответе факт, вывод и шаг, код не проверяет.

Только правило

Где кода нет — так и пишем

ЗАКОН 8 · ПРАВИЛО

Ментор, а не только исполнитель

Вести к цели, которую человек назвал сам, и мерить себя его результатом. Опора — методика «Путь»: веха пройдена, когда случилось событие в жизни человека, а не нажатие в боте. Цели человека и замера результата в коде нет.

CONSTITUTION.md:22 mila-path:20-22
ЗАКОН 9 · ПРАВИЛО

Страхи и сомнения — её работа

На промедление человека — маленький шаг, факт или пример, а не оценка. Механизма в коде нет, и в навыках этот закон отдельно не процитирован.

CONSTITUTION.md:23
ЗАКОН 10 · НАПОЛОВИНУ

О деле — каждый день, от себя — в меру

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

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:9
Честно

Чего эта страница не обещает

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

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

Файлы, которые держат конституцию, в репозитории mila
ФайлЧто делает
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
Открытый код · Apache-2.0

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

Набор открыт: умения, хуки, инструменты и шаблоны. Каждый pull request читает человек и Мила Качество.

Факты на странице: github.com/shakhruz/mila (main, 1d0a4c4), проверено 28.10.2026. Переписка в телефоне — иллюстрация. «Mila», «MILAGPT» и логотип — товарные знаки MILAGPT.