Песочница вызовов инструментов — контракт по бинарникам, путям записи и сроку жизни подпроцесса. Мыслить одноразовой ВМ как в E2B на удалённом Mac полезно: иначе LLM Agent унаследует Keychain и домашний каталог инженера.

Для тех, кто связывает раннеры и шлюзы. См. IDE-мост, права и health, PydanticAI: схемы и таймауты, LlamaIndex Workflows и бюджет таймаутов. Публично: главная, тарифы, блог.

Оглавление: риски · матрица E2B и Mac · угрозы · локальный фрагмент · CI · приёмка · FAQ · политика

Три боли до первого ночного прогона агента

  1. Размытая граница доверия: модель предлагает shell, а раннер исполняет его в том же пользователе, что и SSH-сессия человека — любой обход пути бьёт по ключам и соседним репозиториям.
  2. Нестабильные пути: общий /tmp и кэши вне префикса сессии дают гонки между параллельными задачами и усложняют постмортемы на удалённом Mac.
  3. Один зависший вызов: без слоёв таймаута очередь воркеров замирает, 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)

  1. Инструменты не выполняются под интерактивным пользователем разработчика: только сервисная учётка без лишних login items.
  2. Каждый удалённый вызов несёт SESSION_ID, AGENT_ROOT и счётчик глубины вложенных tool-call с убыванием на уровень.
  3. Три слоя таймаута документированы рядом с реестром: HTTP-клиент, подпроцесс, граф — одним файлом политики.
  4. CI на macOS обязан доказать ограничение путей и поведение по таймауту до промо шаблонов агента в основную ветку.
  5. Ночной прогон на узле аренды повторяет версии раннера и переменные staging, иначе приёмка лжёт о периметре.

Куда дальше без входа

Закрепите матрицу на постоянном удалённом Mac, чтобы soak и CI совпадали с бою. Откройте главную, сравните тарифы, загляните в технический блог и оформите аренду узла под длительные прогоны агентов.

Итог: E2B — выбросить среду после задачи; на Mac то же обещание даёт отдельный пользователь, префикс путей и слои таймаута плюс CI. Тогда LLM Agent не чёрный ящик на краю удалённого Mac.