У командной строки своя песочница и свои флаги автономности, и вместе они образуют пару, которую важно понимать целиком. Флаг песочницы включает изоляцию выполнения; флаг форсирования, наоборот, снимает подтверждения. Первый ограничивает возможности, второй ускоряет работу. Опасность возникает не от каждого по отдельности, а от их сочетания с широкими разрешениями на запись и сеть.
Отдельная группа команд управляет песочницей явно: включить, выключить, сбросить состояние и запустить в ней произвольную команду. Последнее полезнее, чем кажется. Запуск конкретной команды в песочнице с указанием путей только на чтение и правил сети - это способ проверить, что политика действительно работает, ещё до того, как вы отдадите агенту реальную задачу.
Полезно один раз увидеть эти команды рядом. Ниже - включение изоляции, запуск тестов с доступом только на чтение к соседнему каталогу схем и выключение. Такой прогон - тот самый негативный тест: если тесты проходят при закрытой записи туда, куда писать не должны, политика доказана поведением, а не текстом конфигурации.
У изоляции есть своя цена, и первыми её платят проверки. Закрытая сеть ломает установку зависимостей, закрытые пути ломают доступ к общему кэшу сборки, а падение при этом выглядит как поломка кода, хотя код ни при чём. Отсюда правило: список путей на чтение и правила сети формируют по реальным потребностям прогона, а первый запуск в песочнице делают на заведомо зелёном состоянии - чтобы отличить эффект изоляции от эффекта правок.
Особое внимание - флагу форсирования в неинтерактивном режиме. Он разрешает применять изменения файлов без подтверждения, и в скрипте это ровно то, что нужно: спрашивать некого. Но именно поэтому его нельзя соединять с широкими правами на запись и сеть на общем исполнителе. Сочетание без подтверждений и с широкими правами превращает любой недоверенный ввод в потенциальное действие, а на общем исполнителе рядом лежат чужие секреты.
Правильная форма для такого прогона - внешняя одноразовая среда и учётные данные с узкой областью. Контейнер, который создаётся под задачу и уничтожается после, лишает ошибку последствий: сломать в нём нечего, унести нечего. Это дешевле любой попытки сделать безопасным прогон с широкими правами на машине, где есть что терять, и проще объясняется тому, кто будет разбирать инцидент.
Границу применимости песочницы стоит понимать честно. Она ограничивает то, что процесс делает с файлами и сетью на этой машине, но не делает безопасными сами данные, попавшие в задачу. Текст из тикета, лога или чужого предложения изменений способен влиять на действия агента в пределах того, что разрешено. Поэтому изоляция работает только вместе с узкими разрешениями и с отсутствием ценных секретов в среде прогона: песочница ограничивает радиус, а не намерение.
Отдельная тема - команды рабочего процесса для собственной инфраструктуры. Они запускают исполнителя для облачных задач на вашей стороне: со своими метками, ёмкостью, аутентификацией и настройками изоляции. Метки при этом можно передавать файлом, что удобно при разворачивании. Это не обычный интерфейс разработчика, а серверный компонент, и относиться к нему нужно соответственно - как к сервису, у которого есть владелец, мониторинг и план обновления.
Инженерный вывод простой: изоляция и автономность - независимые оси, и настраивают их отдельно. Автономность без изоляции опасна, изоляция без автономности неудобна, а сочетание узкой изоляции с высокой автономностью - это как раз то, что нужно для автоматизации: агент действует сам, но в границах, из которых не может выйти.
Типичные провалы предсказуемы. Соединить отказ от подтверждений с широкими правами на общем исполнителе. Считать флаг песочницы включённым по умолчанию и не проверить это. Запускать серверный компонент как обычный инструмент разработчика, без владельца и мониторинга. И не проверить политику запуском конкретной команды в изоляции до того, как она понадобится в бою.
agent sandbox enable
agent sandbox run --readonly-paths ../schemas pnpm test
agent sandbox disable
# --force в неинтерактивном режиме уместен только с узкими правами и в одноразовой среде