Проект 04 · протокол

agent-mailbox

Почта между агентами на одной машине: файлы вместо сервера, правила вместо доверия. Агенты проектов и узел договариваются сообщениями, а не прямым доступом друг к другу.

публичный репозиторий MIT github.com/Worseize/agent-mailbox

01

Что это

У каждого агента две папки: outbox и inbox. Раз в несколько минут реле проходит по outbox, проверяет сообщение и переносит его адресату.

Имя папки — это и есть идентичность отправителя. Подделать «я от такого-то» нельзя: отправитель берётся из каталога, а не из текста сообщения. Это единственная причина, по которой такая почта вообще может считаться надёжной.

Шина agent-mailbox: outbox, реле с проверками, inbox и отказ с причиной Сообщение идёт из outbox отправителя через реле в inbox получателя. Если проверка не пройдена, файл остаётся у отправителя с рядом лежащим .reason. outbox черновик сообщения реле шесть проверок inbox адресат один rejected рядом .reason
Файлы вместо сервера: одно реле, одна почта, видимая история

Сообщение — это данные, а не приказ. Права дают только задача владельца, таблица маршрутов и идентичность отправителя. Шину поэтому можно оставлять включённой: она умеет доставлять и записывать, но не исполнять.

02

Как работает

Реле не доверяет сообщению ничего: каждое поле проверяется до того, как файл куда-то поедет.

  1. 01
    Идентичность из каталога

    Отправитель — имя папки, из которой взято сообщение. Поле from в тексте обязано совпадать с ней.

  2. 02
    Шапка сообщения

    Нужны поля from, to, kind, topic, requires, created. Нет поля — нет доставки.

  3. 03
    Один адресат

    Сообщение нескольким сразу отклоняется: получатель не должен гадать, кому отвечать.

  4. 04
    Маршрут по таблице

    Разрешённые пары «отправитель → получатель» перечислены в файле правил. Проект проекту не пишет: только через узел.

  5. 05
    Лимиты и секреты

    Не больше 16 КБ и 20 сообщений в сутки на агента — защита от циклов. Ключи и токены в тексте отклоняются.

  6. 06
    Перенос и журнал

    Принятое уезжает в inbox получателя и строкой ложится в журнал. Отклонённое остаётся у отправителя с файлом .reason.

03

Долги агента

Обмен сообщениями — это не только «отправил». У каждого письма есть вторая сторона: обязательство, которое кто-то на себя взял.

Долг — обязательство агента, которое он уже взял и ещё не закрыл. Не «идея на будущее», а конкретное действие: ответить, отчитаться, сообщить о костыле.

A

Письмо без ответа

Пришло сообщение с просьбой — у адресата появился долг. Отвечать не «когда будет время», а до следующей задачи.

B

Работа без отчёта

Сделанное без report считается несделанным: никто не знает, что изменилось и что проверять.

C

Костыль без сообщения

Обход проблемы, о котором знает один агент, — долг, о котором никто не знает. Такой долг не закрывается никогда.

D

Решение без ответа

Вопрос, ушедший владельцу, держит работу. Это долг владельца — и он виден в его очереди, а не в чужой памяти.

Долг закрывается действием, а не памятью: ответом, отчётом, эскалацией. Всё, что нельзя увидеть в списке, — не долг, а забытое.

04

Границы

Адресат
один на сообщение; нескольким сразу — отказ
Маршруты
проект ↔ узел; проект → проект запрещено
Размер
до 16 КБ: больше — это отчёт, ему место в репозитории
Лимит
20 сообщений в сутки на агента
Секреты
приватные ключи и токены в тексте — отказ
Стоп-сигнал
requires: owner — не исполнять до решения владельца

Отклонённое не удаляется. Файл лежит рядом с причиной, журнал хранит построчную историю «принято / отклонено и почему». Через месяц можно ответить на вопрос «почему это письмо не дошло» без археологии в переписке.

05

Почему так, а не «пусть агенты договорятся»

У почты без правил четыре известных способа сломаться. Каждый закрыт отдельной проверкой.

01

Спуфинг отправителя

В тексте можно написать чьё угодно имя. Поэтому from сверяется с каталогом: файл из чужой папки не станет «письмом от узла».

02

Боковые каналы

Проект не пишет проекту напрямую: маршрут через узел оставляет след в журнале, и договорённости не рождаются втихую.

03

Петли

Два агента, отвечающие друг другу «спасибо», съедают бюджет за час. Отсюда лимит 20 в сутки и один адресат на сообщение.

04

Утечка секретов

Почта — это файлы на диске. Грубый скан ключей и токенов на входе дешевле, чем разбор инцидента после.

06

Стек и CI

PowerShell 5.1, ноль зависимостей: реле — один скрипт, правила — один JSON. Протокол при этом переносим: файлы, шапка и проверки не привязаны к языку, реализовать их можно на чём угодно.

CI на Windows прогоняет шину на двух примерах и проверяет, что одно сообщение принято, а второе — отклонено. В связанном инструменте самопроверок хранилища заявок десять: протокол проверяется не только на бумаге.

Дешёвая проверка «есть ли работа». Отдельный скрипт отвечает EMPTY или PENDING n без вызова модели: пустой опрос не должен стоить денег.

← Все проекты