Для тех, кто связывает раннеры и шлюзы. См. IDE-мост, права и health, PydanticAI: схемы и таймауты, LlamaIndex Workflows и бюджет таймаутов. Публично: главная, тарифы, блог.
Оглавление: риски · матрица E2B и Mac · угрозы · локальный фрагмент · CI · приёмка · FAQ · политика
Три боли до первого ночного прогона агента
- Размытая граница доверия: модель предлагает shell, а раннер исполняет его в том же пользователе, что и SSH-сессия человека — любой обход пути бьёт по ключам и соседним репозиториям.
- Нестабильные пути: общий
/tmpи кэши вне префикса сессии дают гонки между параллельными задачами и усложняют постмортемы на удалённом Mac. - Один зависший вызов: без слоёв таймаута очередь воркеров замирает, GPU остаётся занятым, а оркестратор бесконечно ретраит неидемпотентные шаги.
Сравнительная матрица: облако в духе E2B и локальный контур macOS
| Измерение | Облачная одноразовая песочница (E2B-класс) | Локально / удалённый Mac |
|---|---|---|
| Изоляция | Свежая ВМ на задачу, граница ядра, быстрый dismantle. | Отдельный пользователь macOS, выделенный том или префикс APFS, нет общей интерактивной сессии с разработчиком. |
| Права | IAM, токены на джоб, короткоживущие секреты. | ACL, SIP, headless без TCC-диалогов; раннер без Apple ID разработчика. |
| Пути | Эфемерный /workspace, предсказуемые слои образа. |
Явные AGENT_ROOT, TMPDIR, запрет «случайно» писать в ~/Library автоматизацией. |
| Таймауты | Часы ВМ и лимиты cgroup там, где доступны. | Настенные часы на инструмент, дедлайн HTTP, при возможности ulimit -t, глобальный предохранитель графа. |
| Когда по умолчанию | Полностью недоверенный код из сети. | Metal, MLX, Xcode, on-prem и колокация с Apple-стеком. |
Модель угроз: однострочная таблица
Каждая строка должна иметь тест или алерт в CI либо в мониторинге узла.
| Вектор | Актив | Сбой | Главный контроль |
|---|---|---|---|
| Shell от модели | Домашний каталог, SSH | Рекурсивное удаление, архив наружу | Белый список argv, фиксированный cwd, репозиторий только для чтения |
| Безобидный бинарник + злой ввод | Соседние проекты | Обход путей и симлинки | Канонизация путей, префикс сессии, запрет выхода за корень задачи |
| Хуки зависимостей | Egress | Supply-chain звонок домой | Запрет по умолчанию наружу, офлайн-зеркало в CI |
| Зависший подпроцесс | Пул воркеров | Очередь стопорится, GPU залипает | SIGTERM затем SIGKILL, TTL аренды session id |
| Инъекция через вывод инструмента | Следующие вызовы LLM | Веерный fan-out инструментов | Лимит байт на вывод, JSON Schema, максимальная глубина |
Локальная песочница: фрагмент конфигурации (наследие sandbox-exec)
sandbox-exec и Seatbelt задают культуру «запрет по умолчанию». На новых macOS считайте это спецификацией, которую вы воссоздаёте в раннере: отдельный пользователь, жёсткий cwd, санитарное окружение, явные дескрипторы.
# Старт сессии — семантика «одноразового корня» локально
export SESSION_ID="${SESSION_ID:-$(uuidgen | tr '[:upper:]' '[:lower:]')}"
export AGENT_ROOT="$HOME/llm-agent-sand/$SESSION_ID"
mkdir -p "$AGENT_ROOT"/{workspace,tmp,cache,logs}
chmod 700 "$AGENT_ROOT"
cd "$AGENT_ROOT/workspace" || exit 1
export TMPDIR="$AGENT_ROOT/tmp"
export XDG_CACHE_HOME="$AGENT_ROOT/cache"
ulimit -t 180 2>/dev/null || trueМанифест инструментов в git: пути к бинарникам, лимит argv, запретные ключи окружения, $HOME только внутри префикса. Шлюз: только чтение кода и отдельный scratch — как в гайде по IDE-мосту.
Связка с CI: гейты вместо устных договорённостей
- Дифф реестра инструментов — падайте сборку, если новое имя появилось без JSON Schema, владельца и дефолтного таймаута.
- Сухой прогон — на Mac-раннере выполните каждый инструмент на синтетическом дереве и проверьте, что записи остались под
AGENT_ROOT. - Таблица бюджетов — сумма wall time по классам не выше SLA ночного джоба; верхняя граница графа согласована с оркестратором.
- Секреты — блокируйте коммиты с токенами шлюза и сертификатами в шаблонах агента.
Очередь слияний — мини-облако: PR доказывает пути и таймауты до флота удалённых Mac.
Чек-лист приёмки: права, пути и таймауты
- SESSION_ID префиксирует каждый путь записи; удаление сессии сносит workspace, tmp и cache.
- TMPDIR и XDG_CACHE_HOME лежат внутри
AGENT_ROOT; откат к общему/tmpзапрещён политикой раннера. - На каждый вызов — настенные часы и убийство группы процессов по истечении.
- У графа или workflow есть глобальный предохранитель меньше idle-shutdown инфраструктуры.
- Исходные репозитории смонтированы read-only;
git pushтолько через отдельный человеческий шаг. - Egress по умолчанию закрыт; разрешены только хосты и порты из профиля инструмента.
- Логи обезличены; в модель уходит структурированный JSON ошибки, а не сырой stderr целиком.
- Soak на выделенном узле: удвоенная конкуренция на час без зомби PID и роста дескрипторов за порог.
FAQ: типовые режимы отказа
Белый список имён не спасает? Режет подписи, не композицию: симлинки, env, дочерние процессы — без cwd-lock и капа на вывод.
Облако безопаснее Mac? Для чужого кода без Apple API — чаще да, одноразовая ВМ. Mac — подпись, Metal, on-prem; копируйте контракт отдельными учётками и томами.
Что падает первым? Сироты shell, переполнение scratch, чекпойнты против кэша; inode и байты вместе.
Как сообщать о таймауте модели? Возвращайте класс TOOL_TIMEOUT с ретраем только для идемпотентных операций; иначе — терминальный код политики без цикла повторов.
Исполняемые пункты политики (вставьте в README)
- Инструменты не выполняются под интерактивным пользователем разработчика: только сервисная учётка без лишних login items.
- Каждый удалённый вызов несёт
SESSION_ID,AGENT_ROOTи счётчик глубины вложенных tool-call с убыванием на уровень. - Три слоя таймаута документированы рядом с реестром: HTTP-клиент, подпроцесс, граф — одним файлом политики.
- CI на macOS обязан доказать ограничение путей и поведение по таймауту до промо шаблонов агента в основную ветку.
- Ночной прогон на узле аренды повторяет версии раннера и переменные staging, иначе приёмка лжёт о периметре.
Куда дальше без входа
Закрепите матрицу на постоянном удалённом Mac, чтобы soak и CI совпадали с бою. Откройте главную, сравните тарифы, загляните в технический блог и оформите аренду узла под длительные прогоны агентов.
Итог: E2B — выбросить среду после задачи; на Mac то же обещание даёт отдельный пользователь, префикс путей и слои таймаута плюс CI. Тогда LLM Agent не чёрный ящик на краю удалённого Mac.