Группа — единица изоляции
Единица изоляции в Элис — не пользователь, а группа. Отдельные бот-контуры со своим каталогом на диске. Группы не делят ни браузер, ни файлы, ни память, ни бюджет. И правило: в группе одновременно идёт только один активный разговор, остальное — в очередь.
Каталог группы — data/groups/<имя>/. Внутри: • workspace — песочница, «тюрьма путей»; • events — журнал, каждый факт — отдельный файл; • state.db — очередь, гранты, outbox, todos; это не источник правды, она пересобирается из журнала; • chrome-profile — свой профиль браузера; • memory.db — память группы; • audit.log — цепочка решений человека; • skills/ и agents/ — навыки и субагенты; • roles.yaml — какая модель на какую роль: зрение, OCR, генерация; • allowed_domains — куда браузеру можно.
Замок «один активный разговор». Новая задача, пока идёт текущая, встаёт в очередь или получает честный отказ «занято». Параллель — только если явно включён такой режим. Так в каждый момент один «мозг» владеет файлами и браузером группы.
Зачем так. Каталог можно скопировать, перенести на другую машину или удалить целиком. Нет общей базы, где данные групп перемешаны.
Ключевая трудность (инженерная): замок, который переживает падение. Процесс умер, держа замок, — группа «зависла». Снимать замок по таймауту агрессивно — два разговора пишут в одну папку. Нужно отличать «владелец долго думает» от «владельца больше нет» и не потерять очередь. Помогает то, что state.db — производная от журнала: очередь и outbox можно восстановить, а не угадывать.
Дальше — журнал событий и правило «сначала сохрани, потом сообщи».