Несколько агентов общаются через файловые почтовые ящики
От subagent к teammate: одноразовый → постоянный; анонимный → именованный; без связи → файловый почтовый ящик.
Чем teammate отличается от subagent?
Subagent из S04: spawn → работа → summary → уничтожен. Одноразовый, без имени, без двусторонней коммуникации между родителем и ребёнком.
Teammate из s09 — это независимый агент с именем, который можно многократно будить и который может отправлять и получать сообщения:
subagent (s04): spawn -> execute -> return -> destroyed
teammate (s09): spawn -> work -> idle -> work -> ... -> shutdown
Два механизма для разных целей:
- subagent подходит для «сделать одно конкретное исследование» (например, review PR).
- teammate подходит для «постоянно выполнять роль» (например, долгосрочный reviewer, которого будят при каждом новом коммите).
Почтовый ящик — это JSONL-файл
Как общаются члены команды? В s09 используется самый простой механизм: append-only JSONL-файл.
.team/ config.json # список членов команды inbox/ alice.jsonl # все письма для alice попадают сюда bob.jsonl lead.jsonl
Отправить — это open("alice.jsonl", "a").write(msg); прочитать — прочитать весь файл, распарсить JSONL, затем truncate для очистки (drain-семантика).
Почему файлы, а не очередь в памяти? Файлы персистентны по природе. Перезапуск агента, аварийный выход процесса, даже перезагрузка машины — письма никуда не денутся. Плюс их можно читать и grep-ать для отладки.
Путь одного сообщения от lead к alice
Виджет ниже позволяет отправить alice сообщение и наблюдать каждый шаг на уровне файловой системы.
5 типов сообщений
В s09 определены 5 типов сообщений (VALID_MSG_TYPES), но реализованы только первые два; остальные добавляются в уроке s10:
message— обычное текстовое сообщение.broadcast— отправить всем teammate, кроме себя.shutdown_request/shutdown_response— запрос/ответ на корректное завершение (s10).plan_approval_response— согласование плана (s10).
Почему объявлены, но не реализованы? В s09 «расширение протокола» намеренно открытое — типы сообщений перечислены, добавить новый значит добавить запись в словарь и обработку в _exec.