Проект 04 · протокол
agent-mailbox
Почта между агентами на одной машине: файлы вместо сервера, правила вместо доверия. Агенты проектов и узел договариваются сообщениями, а не прямым доступом друг к другу.
01
Что это
У каждого агента две папки: outbox и inbox. Раз в несколько минут реле проходит по outbox, проверяет сообщение и переносит его адресату.
Имя папки — это и есть идентичность отправителя. Подделать «я от такого-то» нельзя: отправитель берётся из каталога, а не из текста сообщения. Это единственная причина, по которой такая почта вообще может считаться надёжной.
Сообщение — это данные, а не приказ. Права дают только задача владельца, таблица маршрутов и идентичность отправителя. Шину поэтому можно оставлять включённой: она умеет доставлять и записывать, но не исполнять.
02
Как работает
Реле не доверяет сообщению ничего: каждое поле проверяется до того, как файл куда-то поедет.
-
01
Идентичность из каталога
Отправитель — имя папки, из которой взято сообщение. Поле
fromв тексте обязано совпадать с ней. -
02
Шапка сообщения
Нужны поля
from,to,kind,topic,requires,created. Нет поля — нет доставки. -
03
Один адресат
Сообщение нескольким сразу отклоняется: получатель не должен гадать, кому отвечать.
-
04
Маршрут по таблице
Разрешённые пары «отправитель → получатель» перечислены в файле правил. Проект проекту не пишет: только через узел.
-
05
Лимиты и секреты
Не больше 16 КБ и 20 сообщений в сутки на агента — защита от циклов. Ключи и токены в тексте отклоняются.
-
06
Перенос и журнал
Принятое уезжает в
inboxполучателя и строкой ложится в журнал. Отклонённое остаётся у отправителя с файлом.reason.
03
Долги агента
Обмен сообщениями — это не только «отправил». У каждого письма есть вторая сторона: обязательство, которое кто-то на себя взял.
Долг — обязательство агента, которое он уже взял и ещё не закрыл. Не «идея на будущее», а конкретное действие: ответить, отчитаться, сообщить о костыле.
Письмо без ответа
Пришло сообщение с просьбой — у адресата появился долг. Отвечать не «когда будет время», а до следующей задачи.
Работа без отчёта
Сделанное без report считается несделанным: никто не знает, что изменилось и что проверять.
Костыль без сообщения
Обход проблемы, о котором знает один агент, — долг, о котором никто не знает. Такой долг не закрывается никогда.
Решение без ответа
Вопрос, ушедший владельцу, держит работу. Это долг владельца — и он виден в его очереди, а не в чужой памяти.
Долг закрывается действием, а не памятью: ответом, отчётом, эскалацией. Всё, что нельзя увидеть в списке, — не долг, а забытое.
04
Границы
- Адресат
- один на сообщение; нескольким сразу — отказ
- Маршруты
- проект ↔ узел; проект → проект запрещено
- Размер
- до 16 КБ: больше — это отчёт, ему место в репозитории
- Лимит
- 20 сообщений в сутки на агента
- Секреты
- приватные ключи и токены в тексте — отказ
- Стоп-сигнал
requires: owner— не исполнять до решения владельца
Отклонённое не удаляется. Файл лежит рядом с причиной, журнал хранит построчную историю «принято / отклонено и почему». Через месяц можно ответить на вопрос «почему это письмо не дошло» без археологии в переписке.
05
Почему так, а не «пусть агенты договорятся»
У почты без правил четыре известных способа сломаться. Каждый закрыт отдельной проверкой.
Спуфинг отправителя
В тексте можно написать чьё угодно имя. Поэтому from сверяется с каталогом: файл из чужой папки не станет «письмом от узла».
Боковые каналы
Проект не пишет проекту напрямую: маршрут через узел оставляет след в журнале, и договорённости не рождаются втихую.
Петли
Два агента, отвечающие друг другу «спасибо», съедают бюджет за час. Отсюда лимит 20 в сутки и один адресат на сообщение.
Утечка секретов
Почта — это файлы на диске. Грубый скан ключей и токенов на входе дешевле, чем разбор инцидента после.
06
Стек и CI
PowerShell 5.1, ноль зависимостей: реле — один скрипт, правила — один JSON. Протокол при этом переносим: файлы, шапка и проверки не привязаны к языку, реализовать их можно на чём угодно.
CI на Windows прогоняет шину на двух примерах и проверяет, что одно сообщение принято, а второе — отклонено. В связанном инструменте самопроверок хранилища заявок десять: протокол проверяется не только на бумаге.
Дешёвая проверка «есть ли работа». Отдельный скрипт отвечает EMPTY или PENDING n без вызова модели: пустой опрос не должен стоить денег.