Сандбокс для Claude Code: изолированные среды агентов на ноутбуке
Как локальная сандбокс-среда Kubernetes предоставляет агентам для программирования собственную машину, узкоспециализированные учетные данные, список разрешенных выходящих соединений и возможность просмотра флота устройств, с учетом компромиссов между самостоятельной разработкой и покупкой решений.
Источники: Capsule : How I came to build an Agentic Developer Environment at Teads
Когда перезагрузка стирает вашу рабочую память
Представьте себе шесть или семь сессий Claude Code, открытых одновременно. Несколько из них работают в терминалах, пара — в VS Code, ещё одна запущена в IntelliJ, поскольку команда работает на нескольких языках, и у каждого есть свой любимый редактор. Они используют разные репозитории, занимаются разными задачами и работают над разными незавершёнными идеями. Затем ноутбук перезагружается.
С самим кодом всё в порядке. Проблема заключается в состоянии всех процессов: какая сессия находилась в процессе рефакторинга, какая ожидала сборки, в какой был задан вопрос, ответ на который так и не прочитали. На восстановление рабочей памяти из истории командной строки и «грязных» веток Git уходит двадцать минут. В такой момент плохой день начинает казаться проблемой проектирования.
Перезагрузка была лишь самым заметным симптомом. На износ влияли три отдельные проблемы.
Смешивание элементов. Агенты дешево запускаются, но их сложно отслеживать. Каждый новый агент требует дополнительной вкладки терминала, ещё одного окна редактора и ещё одного «слота» в памяти пользователя. Ноутбук превращается в кучу окон, где человек выступает единственным слоем интеграции. Существующие инструменты предполагают наличие одного агента, одной задачи и одного человека, контролирующего процесс, но на деле всё работает иначе.
Дилемма с разрешениями. В стандартной настройке нет решения этой проблемы. Claude Code требует одобрения для вызовов инструментов, но может спрашивать у пользователя согласия на незначительные действия, в то же время молча игнорируя вызовы, которые могут причинить серьёзный ущерб. Поведение системы улучшилось, но основная проблема осталась прежней: агент действует от имени пользователя и обладает его привилегиями. Администратор организации в GitHub не может разумно одобрять каждый вызов API, а также не может утверждать, что однократное одобрение не имеет последствий.
Остаются два варианта. Вы можете продолжать настраивать список разрешений, пока он не превратится в закрытый документ, который никто из коллег не сможет расшифровать, или же можно включить параметр --dangerously-skip-permissions и положиться на удачу. Ужасные истории связаны именно со вторым вариантом, например, с агентом, который поспешно очистил производственную базу данных. Оба подхода терпят неудачу по одной причине: агент несет в себе ваши учетные данные, и одобрение команд по отдельности — единственный способ обойти эту проблему.
Усталость от установок. В разных проектах на разных платформах встречается отсутствующий JDK, неправильный Node, тот или иной SDK, разные CLI-инструменты, а также версии, заданные полгода назад и которые уже никто не может объяснить. Каждая смена контекста стоит времени, потраченного на работу с менеджером пакетов. Проблема усугубляется при потере или замене ноутбука, поскольку каждую среду приходится воссоздавать по отдельным инструментам. После месяцев настройки любимого CLI-инструмента для программирования остается открытым вопрос: можно ли вообще воспроизвести текущую конфигурацию или придётся начинать всё сначала, надеясь запомнить важные детали.
Собственная машина для агента
Изначально это не был проект платформы. Capsule представлял собой личный инструмент, созданный для того, чтобы сделать неделю одного инженера менее утомительной. Идея была проста: предоставить агенту собственную машину, не вашу, на которой он не сможет видеть вашу файловую систему или использовать ваши учетные данные, и где фраза «действуйте, не спрашивайте» не будет проявлением безрассудства. Кроме того, он должен был быть достаточно дешевым, чтобы несколько таких агентов могли работать одновременно без каких-либо проблем.
Коллеги заметили это и попросили себе аналогичные инструменты, затем захотели и другие. Инструмент вышел за рамки первоначального назначения в качестве средства одного человека и теперь каждое утро открывается на экранах всё большего числа инженеров — от нескольких первых пользователей до нескольких десятков, причём большинство сотрудников инженерной группы, скорее всего, последуют их примеру. Никто не заставляет его использовать; люди принимают этот инструмент потому, что это облегчает работу на неделю, и это единственный достоверный признак его принятия. Новый сотрудник устанавливает Capsule на ноутбук и может полностью самостоятельно работать с первого дня.
Одним словом, Capsule предоставляет Claude Code изолированную, готовую среду, в которой он может самостоятельно работать с вашими репозиториями, поэтому он больше не работает с полным набором ваших привилегий.
На изображении показана станция Capsule Station. Капсулы перечислены вдоль левого края, терминал выбранного агента находится в центре, а запросы на изменения, которые принадлежат вам или по которым вас попросили провести ревью, расположены в нижней левой части, что позволяет видеть всю флотилию в одном окне.
Его функционал намеренно ограничен. Это не фреймворк для оркестрации агентов и не многопоточный продукт, по крайней мере пока, хотя в ближайшее время может появиться некоторая функция оркестрации. Это не среда разработки, не интеграция плагинов или редакторов, и он не является форком или заменой Claude Code, поскольку внутри работает обычный Claude Code, настроенный определённым образом. Он не заменяет системы CI/CD и не является SaaS-сервисом, поскольку всё происходит на вашем ноутбуке.
Этот последний фактор оказался важнее, чем ожидалось. Отсутствие платы за каждое место и необходимости в дополнительных ресурсах означают, что десятая капсула стоит столько же, сколько и первая, что превращает одновременную работу из роскоши в обычную практику. Машина уже оплачена, а хранилища остаются на том же оборудовании, где и были изначально.
Внутри капсулы Claude работает с параметром --dangerously-skip-permissions и никогда не спрашивает, разрешено ли ему выполнять команду. Его единственные вопросы касаются намерения, то есть того, что нужно сделать, а не разрешений. Такой разумный стандарт возможен только благодаря двум факторам, лежащим в его основе.
Песочница
Каждая капсула работает как под в кластере Kubernetes, который OrbStack уже предоставляет на Mac. Это позволяет сохранять всё локально, без дополнительной инфраструктуры и оплаты за облачные сервисы. К файловой системе хоста невозможно получить доступ, а два объявленных тома хранят постоянные данные: рабочую область и кэш изображений Docker. Три уровня защиты ограничивают выходящий трафик:
- Правила ядра
iptablesблокируют прямой выход на порты 80 и 443 для пользователя агента. - Политика сети Kubernetes NetworkPolicy ограничивает доступ только к DNS, портам 80 и 443.
- Все оставшиеся запросы проходят через прокси Squid, который реализует явный список разрешенных доменов.
Список разрешенных доменов включает GitHub, npm, Maven, ECR и API Anthropic; все остальные адреса по умолчанию запрещены. У агента нет простого способа подключиться к произвольному конечному пункту и загрузить исходный код, а для этого потребуется значительное изобретательство.
Три уровня проверки блокируют любые действия до их выполнения: правила ядра, затем сетевая политика, и наконец прокси с списком разрешенных действий.
Учетные данные с минимальными привилегиями
Именно здесь кроется настоящая ценность. Аутентификация происходит на хосте под вашим собственным именем, с использованием всех обычных ролей. Эти роли остаются в ключевом хранилище macOS и никогда не попадают в капсулу. Вместо этого хост создает токен с узкими полномочиями и ограниченным сроком действия, который затем вводится:
- временные учетные данные AWS STS, ограниченные ролью только для чтения в производственной среде
- токен GitHub, чьи полномочия проверяются перед его использованием
- учетная запись службы BigQuery с правами только на чтение, которую имитирует агент, тем самым сохраняя ваши собственные учетные данные в безопасности
Если предоставить что-то более широкое, например роль production-admin в системе SSO или токен с избыточными полномочиями, хост откажется его использовать вообще. Защита является стандартом, и изнутри агент не может повторно авторизоваться или получить более широкий доступ. Идентичность сохраняется, поэтому журнал аудита по-прежнему приписывает запрос вам, но ущерб ограничивается ролью и не затрагивает вас лично.
Вы входите в систему на хосте под своим именем, а агент получает только узкий, краткосрочный токен, созданный на его основе. Именно этот компромисс позволяет всему остальному функционировать. Разрешение агенту работать без присмотра основано не на большем доверии к нему, а на том, чтобы самый худший сценарий стал менее значимым.
Устранение препятствий
Безопасность дает возможность действовать автономно, но не делает процесс использования удобным. Большая часть усилий была направлена на устранение препятствий.
Основное изображение, с которого запускаются капсулы, уже содержит фиксированные версии инструментальных комплексов: Go, Rust, Node, JDK, Maven, sbt и Scala. Помимо этого работает дополнительный процесс Docker-in-Docker, который обеспечивает каждой капсуле собственный рабочий Docker, благодаря чему тесты на интеграцию и наборы Testcontainers выполняются без воздействия на соседние капсулы. Также доступны инструменты командной строки с подключением к аккаунту, а именно GitHub CLI, AWS CLI, gcloud и bq. Из коробки предустановлены серверы языка (Metals, jdtls, gopls, rust-analyzer, vtsls), что позволяет агенту перемещаться по коду с использованием функций go-to-definition, find-references и анализа иерархии вызовов вместо слепого поиска.
Кэши зависимостей обмениваются между капсулами через том хоста. Это может показаться незначительной деталью, но на самом деле это важно. В первой версии каждая новая среда загружала всё заново, и инструмент, который тратит двадцать минут на запуск Maven перед каждой задачей, не мог быть принят в использование. Теперь готовая капсула создаётся примерно за двадцать–тридцать секунд.
Самым значимым фактором, изменившим поведение агента, стал настоящий цикл обратной связи. Внутри капсулы работает внутренняя платформа CLI: проверяется токен SSO хоста, ограничивается его диапазон использования и вводится в систему, что позволяет агенту создать среду песочницы, развернуть только что скомпилированную ветку и провести там тесты на корректность работы. Внутри также запускается инструментарий для тестирования интеграции, который загружает реальные изображения и запускает сервера MySQL, Kafka и Cassandra в компоненте sidecar. Поначалу процесс работает медленно из-за обработки изображений через прокси, но затем становится быстрым. Именно это отличает агента, способного генерировать правдоподобный код, от агента, способного сообщить о том, работает ли этот код.
Встроена также функция поиска. Каждая капсула начинается с внутреннего шлюза MCP, предназначенного исключительно для чтения и обеспечивающего доступ к нескольким десяткам инструментов. Они позволяют получать логи от сервисов и подов, метрики через PromQL и Thanos, панели управления Grafana, события Kubernetes, информацию о статусе сборок CI, данные о том, кто находится в режиме дежурства и какие сигналы тревоги активны, информацию о владельцах сервисов, а также осуществлять поиск в Confluence и Slack. Поскольку ничего нельзя записывать, включение этой функции во всех местах не несло никаких рисков. Рынок плагинов добавляет инструменты для сборки Maven, создания структуры сервисов, управления песочницей и рассмотрения pull-реквестов, благодаря чему агент с первой минуты знаком с корпоративными стандартами.
Вот привычка, которую стоит приобрести. Ведите закрытый репозиторий с личными командами и шаблонами планов, и Capsule будет копировать его в каждую создаваемую среду. Таким образом, ваша собственная рабочая процедура всегда будет с вами. Планы и записи также перемещаются между капсулами через этот репозиторий, а функция передачи информации позволяет отмечать место окончания сессии и сохранять краткое описание, чтобы следующая капсула начинала работу с уже имеющейся информацией, а не с нуля. Это обычный git-репозиторий, поэтому агент может также хранить собственные инструменты, и достаточно одной команды вроде «добавить команду для сборки и тестирования, сохранить её и загрузить».
Лучше временно остановиться, чем начинать заново
Последовал непланируемый эффект. Поскольку создание изолированного агента стало дешевым, и каждый из них сохраняется независимо от того, наблюдает за ним кто-либо или нет, работа перестала быть процессом, выполняемым по одному заданию за раз.
В обычный день активны четыре-пять капсул. Одна работает автономно над исправлением ошибок, другая — это сессия SSH для совместной программирования, третья перезапускает нестабильный тест интеграции и создает запрос на слияние, когда тест проходит, а четвертая занимается обновлением зависимостей, которыми никто не хочет заниматься. Еще примерно десять капсул находятся в состоянии паузы: идея, к которой можно вернуться, эксперимент, провалившийся в интересной манере, концепция, рассмотренная лишь частично. Пауза позволяет сохранить репозитории, сессии и кэш, а возобновление работы занимает всего несколько секунд, поэтому идея не отбрасывается лишь потому, что сегодня она не является приоритетной.
Дорогостоящей была не сама работа, а ее приостановка. А когда что-то завершается, капсулу удаляют — без беспорядка в рабочей деревне Git и без лишних задач по очистке, причем все побочные продукты исчезают вместе с ней.
Полная автономия устраняет оставшиеся препятствия. Нет необходимости ждать подтверждения для выполнения команды git, нет нужды искать номер на странице CI в вкладке браузера или просматривать журнал сборки в поисках важной строки. Агент справляется с этим сам, и благодаря использованию песочницы и ограниченных токенов это не превращается в простую удачную игру.
Четыре капсулы, четыре состояния — ни одно из них не зависит от человека.
В одном двигателе есть два режима: можно работать рядом с агентом в интерактивной сессии tmux или просто дать ему команду и оставить все как есть.
Вот почему интерфейс оказался эффективным. CLI-инструменты сильны, но постоянное использование команд list, ssh и status в терминале — это не способ управления флотом капсул. Capsule Station заполняет этот пробел с помощью одного окна: капсулы отображаются в боковой панели, для каждой есть встроенный терминал, а рядом — запросы на pull requests и проверку кода. Переключение агентов происходит так же легко, как переключение вкладок браузера. Приложение использует Tauri, его размер составляет около десяти мегабайт, и оно опирается на системный веб-вью, поскольку отображение списка не должно требовать встроенного Chromium и гигабайта дискового пространства. Оно обычно остается открытым весь день, в то время как IDE редко это делает.
Столь же справедливо сказать, что остается нетронутым. Качество генерируемого кода не улучшается. Однако исчезает вся рутинная работа с ним: перемещение файлов, их утверждение, установка, повторная аутентификация и потеря местоположения в структуре проекта, что оказалось основной причиной сложностей.
Почему создавать самому вместо покупки
Варианты хостинга действительно существуют и становятся всё лучше: это облачные сандбоксы от различных поставщиков и агенты, работающие удалённо. Они не создают дополнительной нагрузки на операционную систему и обеспечивают реальный масштабирование. Однако код и учётные данные покидают вашу инфраструктуру, инструментарии остаются универсальными, из-за чего процесс запуска крупных кодовых баз затягивается, а внутренняя модель идентификации пользователей невозможна реализовать. Существуют также проекты с открытым исходным кодом, такие как сандбоксы, разработанные специально для Kubernetes, инструменты dev-container и примитивы локального сандбоксинга от поставщиков. Они нейтральны с точки зрения поставщика и основаны на надёжных примитивах, но имеют низкий уровень абстракции, поэтому вы сами отвечаете за образы, аутентификацию и всё пользовательское взаимодействие. В любом случае возникает законный вопрос: будет ли решение поддерживаться ещё через шесть месяцев, ведь каждый запускает свои инициативы, но мало кто из них просуществует долго.
Система располагается между этими двумя компонентами. Капсула в основном представляет собой составную часть: DevPod отвечает за управление контейнером разработчика и жизненным циклом пода, Squid — за выход в сеть, кластер Kubernetes, уже предоставляемый OrbStack, а также пользовательский образ рабочего пространства, авторизация через хост и Station служат верхним уровнем. Зависимость остается незначительной, и компоненты можно заменять. Это соответствует структуре кодовой базы и модели авторизации; код остается на ноутбуке, за исключением того, что агент отправляет в API модели, как и в случае со всеми другими вариантами.
Учетные данные генерируются на хосте, в то время как все, с чем взаимодействует агент, выполняется в поде за прокси с списком разрешенных запросов.
Еще одним важным фактором является гибкость, которая оказалась более значимой, чем ожидалось. Если кому-то нужна та или иная функция, он создает pull request, обсуждает ее, и функция внедряется. Никто не тратит три недели на обсуждения с менеджером продукта относительно того, будет ли эта функция входить в планы на следующий год.
Риск действительно существует, и его стоит отметить: команда берёт на себя ответственность за него, и по сути это проект одного человека при поддержке компании. Разработка никогда не была такой дешёвой, а затраты на техническое обслуживание остаются настоящей неизвестной. У кого-либо пока нет ответа на этот вопрос.
Что будет дальше
Впереди — более широкое внедрение от десятков пользователей до всей организации, добавление новых навыков и инструментов в систему, а также увеличение количества интеграций. Последний пункт сложнее, чем кажется, поскольку для каждой из них необходимо определить, что агент в режиме без вопросов может с ней делать. Чтение данных — это просто, но любые операции записи требуют серьёзного обсуждения и способа отметки разрушительных действий. Удалённое управление — самая востребованная функция, поэтому система будет продолжать работать даже при закрытом ноутбуке.
Предупреждение о пробелах в безопасности
Система преднамеренно ориентирована на защиту, и её создание дает неприятный урок: инструмент, предоставляющий агентам автономию, в первую очередь опирается на слабые места модели безопасности. Хороший контроль доступа облегчает интеграцию, тогда как его отсутствие сразу же наносит ущерб и показывает причину этого.
Тем не менее у «песочницы» есть ограничения. Запуск агента с полными привилегиями подобен ношению оружия с заряженным магазином, независимо от того, стреляют ли из него или нет. Компонент Capsule устраняет эти проблемы. Однако если в чат вставить административный токен и попросить агента им воспользоваться, привилегии снова будут вернуты.
Начинайте разработку
Это удивительные времена, и трудно переоценить то, что может создать один инженер. Всё началось с личного раздражения одного человека в обычный день, но превратилось в то, что всё больше коллег открывают каждое утро. Остаются два условия: вы должны знать, какую проблему хотите решить, и вам нужна поддержка, ведь токены стоят денег, и кто-то должен согласиться, что они того стоят. При наличии обоих условий работа изменилась навсегда, поэтому найдите проблемы и решите их.