Галоўная / Артыкулы

Пясочніца для Claude Code: ізаляваныя асяроддзі агентаў на ноўтбуку

Як лакальная пясочніца на Kubernetes дае агентам кадавання асобную машыну, абмежаваныя ўліковыя даныя, белы спіс выходнага трафіку і агляд усяго парку, і што лепш: будаваць ці купляць.

Выдавец: REACTAPP.TOP12 хв чытання2791 слоў

Крыніцы: Capsule : How I came to build an Agentic Developer Environment at Teads

Калі перэзапуск стырае вашу рабочую памэць

Уявіце сабе шасць чырва сэсый Claude Code, якія працуюць адночасова. Калькі з іх працуюць у тэрміналах, калькі — у VS Code, а ўсё адно ёсць елемент, які працуе у IntelliJ, таму што команда работае на калькіх мовах, і у кожнай ёсць свой улюблены рэдаггер. Яны працуюць з разнымі рэпозытарыямі, разнымі задачамі і разнымі незаканчанымі ідэямі. Потым ноутбук перэзапускаецца.

Самы код не мае нічога прынцыповага. Проблема — у стане всіх працэсаў: якая сэсыя была ў працэсе рэфакторавання, якая чакала на складанне, а якая задала запытанне, на якое так і не было адпаведзення. Потрэбна 20 хвілін, каб восстановіць рабочую памэць на адваротнае з історыі шэлу і нечыстых гіт-галоўак. У такі момент паслядствы паганага дня пачынаюць выглядаць як проблема з дыяжанам.

Перэзапуск быў толькі найболейшаю слядам. Існавалі ўсьмо тры окрэмыя прычыны, якія поступова разрушалі сістэму.

Перэмешчанне. Агенты дэшэвы ў запуску, але даскладныя у стэжэнні. Кожны новы агент трэбуе ўтварэння ўсё новага вікна тэрмінала, ўсё новага вікна рэдагувальніка, ўсё новага месца ў памяці. Ноутбук ператвараецца на купу вікон, пры чым чалавек застаецца ўжо толькі шаром інтэграціі. Існуючыя інструменты прыпускаюць наявнасць аднаго агента, аднаго заведама і аднай особы, якая за ўсім сочыць, а рэальнае выкананне работ не адпавядае гэтаму.

Дылема з правамі. Нічога ў стандартный наладзе не рашае гэтую проблему. Claude Code выказвае патрэбу ў затверджэнні для кожнага вызову інструменту, пры чым можа запытаць вас пра якуюсь дробную дэталь, але мовчыць пра вызов, які можа завесты да серьёзных наследків. Працэс павялічыўся, але основная проблема застаецца той самай, адтуды што агент дзейнічае як вы і мае вашы прывілеі. Адміністратар GitHub-організацыі не можа разумна затверджваць кожны вызов API, а таксама не можа прытварацца, што адна затверджэння не мае наследків.

Застаецца два варыянты. Вы можэтэз продаваляць налагоджэнне спісу дазволеных элементаў, пакуль ён не стане такім складным, што ніхто з колег не сможа яго расшыфраваць, але можаце таксама увімкнуць --dangerously-skip-permissions і паспакоўвацца на удачу. Страшныя історыі выходзяць з другога варыянта, напрыклад, калі агент аж надто энергійна прабаваў очысці базу дадзеных у працоўным рэжыме. Оба падходы зазнаюць нявдачы з аднай прычыны: агент несе вашу ідэнтыфікацыю, а затверджэнне команд поўна ў адны раз можа толькі часткова рашыць гэтыя проблемы.

Адміністрацыя выкалучваецца. У розных рэпазітарыях на разных сэтках не хватает JDK, выкорыстоўваецца некалькі Node, ёсць гэты SDK, той CLI, а таксама версія, заданая паловы год тыму і якую ніхто вялікай часткай не можа поясніць. Кожная зміна кантэксту караеся хвілінамі, якія трэба паспяліць на працю з камандным менеджэрам. Сітуацыя паглыбляецца, калі ноутбук губіцца або заменяецца, адколі кожна асяроддзе трэба перабудаваць па адзінам інструменту. Пасля месцаў налагоджэння улюбленага камандавога інструменту для програміста застаецца вопыт, чы можна ўзагалі воспаўтаць тую наладу, чы не трэба прачынаць з нуля і спадзявацца запам’ятаваць важлівыя элементы.

Сваёй машынай для агента

Гэта не пачаткалася як праект для платформы. Capsule была персональным інструментам, створаным для таго, каб зменшыць колькасць няпрыемнасцей у жыцці аднаго інжынера працаваўшага ў тыя ж выходны. Аднойчына была простая: даць агенту савой камп’ютар, не ваш, дзе ён не мог бы бачыць вашу файловую структуру чы вжываць вашы аутантыфікацыйныя даныя, і дзе фраза «рабі, не спытваючы» не была б безвяжанае рашэнне. Кроме таго, ёй трэба было быць дастаткова дашчавай, каб калькі агентоў маглі працаваць паралельна без додатковых проблем.

Колегі зазначылі гэта і праглілі такое ж для сябе, а потым і іншыя. Гэты інструмент перастаў быць толькі засобам адной люсты і цяпер ўжо кожны ранак ачываецца на экранах все большай колькасці інжынераў — ад калькоў пачатковых корыстувачаў да калькоў дзесяткаў, пры чым вялікая частка інжынерскай групы, верагодна, скора таксама ўжо будзе яго вікорыстоўваць. Ніхто не прымушвае яго вікорыстоўваць; людзі ўжываюць яго таму, што тады тыдзень стае простэйшай, і гэта ёдыны адчутны паказанні ўжывання, якому можна верыць. Новапрацаваны співрабоцнік установляе Capsule на ноутбук і можа ад самага першага дня працаваць цэлком самастойна.

У адной фразе Capsule даў Claude Code абсалютна самастоятэльную, готавую саблонную срэду, дзе ён можа самастойна працаваць над вашымі рэпазітарыямі, таму ён больш не працуюе з усіма вашымі правамі.

На зразку паказвана Капсульная станцыя. Капсулы паказаны ўздоўж левага краю, тэрмінал выбранага агента знаходзіцца ў цэнтры, а запросы пра перагляд, якія належаць вам або пра якія вас папросілі, — у ніжній левай частцы, што дае аднаго вікна для всіх агентаў.

Яго функцыянал намеравана ўзначна обмежаны. Гэта не ўсталоўка для керавання агентамі і не продукт для калькількох агентаў, прынеймні наразе, хоць можа скора з’явіцца частка керавання. Гэта не інтэграцыя з IDE, плагінамі чы рэдагаром, і ён не ўтварае форк і не заменяе Claude Code, таму што тое, што працуе ўнутры, — гэта звычны Claude Code, настроеный певным спосабам. Ён не заменяе CI/CD і не ўтварае хоставанага SaaS-расління, адтуды ўсё відбываецца на вашам ноутбуку.

Гэты последні факт пацелався важлівым больш, чым было прынята. Няма плата за кожны месца і няма нічога, што трэба запускаць, таму дзесятая капсула коштае так жа, як і першая, што прыводзіць паралельную работу з розкішнага элемента да звычайнай практыкі. Апарат ужо оплацены, а базы дадзеных застаюцца на апаратнай частцы, дзе і з’явіліся.

Унутрь капсулы Claude запускаецца з параметрам --dangerously-skip-permissions і ніколі не спытаецца, чы магчымае ёму выконваць каманду. Яго едынія запітання стосуюцца намерэння, тыяму, што трэба зрабіць, а не дазволу. Такой разумны стандарт можлівы толькі завяроўка двух фактараў.

Сандбокс

Кожная капсула працюе як пад у кластэры Kubernetes, які OrbStack ужэ надае на Mac. Чырагоўна, усё застаецца локальным: няма дапаможнай інфраструктуры і няма рахунку за выкарыстоўванне воблака. Да файлавай сістэмы хоста немагчыма дасягнуць, а два заявленых тома храняць стойкія даны: рабочая зона і кэш адбітава Docker. Тры шары контролююць выходны трафік:

  • Правілы iptables ядра блакуець прамы выход на порты 80 і 443 для ID карыстальніка агента.
  • Політыка сеткі Kubernetes (NetworkPolicy) звужае доступ да DNS, портав 80 і 443.
  • Усе, што застаецца, праходзіць праз проксі Squid, які застосоўвае чыткі спіс дазволеных домэнаў.

Спісак дазволеных домэнаў включае GitHub, npm, Maven, ECR і API Anthropic; усі іншы пункты за замовчаннем заблакваны. У агента няма простаг способу дасягнуць будзь-каго канцачнага пункту і завярнуць вашы даны, а для гэтага патрэбна справжняя кмітлівасць.

Трыя слоі запараць любы выход дадзення: правіла ядра, пасля чаго — політыка сеткі, а потым — проксі з спісам разрэшэнняў.

Крантавыя кантракты

Сюдзеў і крычыць справжняя цэннасць. Автэнтыкацыя адбываецца на хосце пад вашым сабестоячым іменем, з усіма ролямі, якія вы зазвычай маеце. этыя ролі застаюцца ў ключох macOS і ніколі не прабываюць у капсуле. У замен хост стварае токэн з вузкім дыячым спектрам і короткім тэрміном дзейнасці і вводзіць яго:

  • тэмпарарны кантракт AWS STS, які дазволяе толькі чытанне і працавае толькі ў ролі для вырабніцтва
  • токэн GitHub, чыя дыячыя права пераканальваюцца пры ўводзе
  • счэтны акаунт службы BigQuery з правамі толькі на чытанне, які агент імітуе, тады вашы сабестоячыя кантракты не прабываюць у гэтым працэсе

Калі запропанаваць шырэйшыя правы, напрыклад ролю адміністратара SSO чыстаўнік або токен з дадзенымя мерамі, хост або ўжо не будзе яго вводзіць. Захопленне ёсць стандартным рэжымам, і з усероўні агент не можа практыкаваць перэпраўджэнне чыстаўнік або практыкаваць федэрацыю для атрымання шырэйшых праваў доступу. Аідэнтычнасць застаецца незменнай, таму журнал аўдыту яшчэ і далей прызначае запіт вам, але тое, што можа быць пашкодзена, лімітавана роллю і не распрастраняецца на вас.

Вы заходзіце ў сістэму як самі сабе на хосце, а агент отрымае толькі вузькі, кароткавечны токен, створаны на адной з гэтых падстав. Гэта сацясненне дапамагае, каб усё інша працавало. Дазволенне агенту працаваць без нагляду не базуецца на большай доверлівасці да яго, а на тым, каб найгоршы варыант стаў менш значным.

Усуненне перакантрацінняў

Безпека дае можлівасць дзейснаваць автонамна, але не робіць практыку прыемнай. Большая частка зусілляў была спрамована на усуненне перакантрацінняў.

Базавыя картынка, з якой запускаюцца капсулы, ужо мае зафіксаваныя версіі інструментальных комплексаў: Go, Rust, Node, JDK, Maven, sbt і Scala. Разам з яю працуе Docker-in-Docker sidecar, які дае кожнай капсуле свой сабэйны Docker, таму тэсты інтэграціі і пакеты Testcontainers выконваюцца без вплыву на суседніе капсулы. Таксама чакаюць на вікорыстанне інструменты командной лініі, якія ўжо запісаны, а саме GitHub CLI, AWS CLI, gcloud і bq. З самага пачатку ёсць серверы для розумення мовы (Metals, jdtls, gopls, rust-analyzer, vtsls), якія дазволяюць агенту пераводзіцца па кодзе за сымволамі за дапамою функцый go-to-definition, find-references і call hierarchies замест таго, каб шукаць слепа.

Кэшы для залежнасцей дзеляцца між капсуламі праз тымчасовы прыёмнік. Гэта можа здавацца незначным дэталем, але так не ўсё. У першай версіі кожна новая асяроддзе завантажвала усё занова, і інструмент, які вітрачае дваццаць хвілін на Maven пры кожнай задачы, не могў быць апрыемліваны. Ёнколі готовая капсула стварыцца за апошнія дваццаць-трыдцаць секунд.

Найбольшы вплыв на паведанне агента мяла справжняя цыклічна падтрымка. У капсуле працюе внутрэшняя платформа CLI: перакантрацуецца токен SSO хоста, які перакантрацуецца, мае обмежаны дыячы спектар і ўводзіцца, чым агент можа створыць сандбокс-серавер, запусціць ветку, якую ён толькі створыў, і адрабатваць там тэсты. Унутры таксама працюе інструмент для тэстав інтэграцыі, які запошчае рэальныя зображэння і запускае практычны MySQL, Kafka і Cassandra у sidecar. Спачатку ўсё працюе повольна, калі зображэння проходзяць праз проксі, але пасля чаго стае шырэз. Гэта адзначае разлік межы агента, які стварае правдопадобны код, і агента, які можа запаведамляць, чы робіць код свою справу.

Функцыя пошуку таксама ўбудована. Кожная капсула пачынаецца з внутрашняя шлюзавая сістэма MCP, якая выконвае толькі чытанне і надае кальку інструментаў. Яна даступнае логі з сервісаў і падзеяў, метрыкі праз PromQL і Thanos, панелі керування Grafana, запускі ў Kubernetes, статус будов CI, інформацыю пра таго, хто знаходзіцца на дзвонку, і прычыны актывацыі апавяшэнняў, інформацыю пра власніка сервісу, а таксама можлівасць пошуку ў Confluence і Slack. Паколькі нічога не можна запісваць, ўвёмкненне яе всюды не несла жадных рызыкаў. Рынак плагінаў дапамагае расшырваць навыкі команды ў аспектах будов Maven, стварэння каркасаў сервісаў, керування сандбоксамі і перагляду PR, тады правілы компаніі стаюць вядомымі для агента ўжо з першай хвіліны.

Гэта прыткай навык, які варта пераняць. Зберагаюце прыватны рэпазітары, у яком будуць персональныя команды і шаблоны планаў, і Capsule клануе яго ў кожна створаная асяроддзе. Такім чынам ваша власная рабочая схема будзе следаваць за вамі. Планы і спомнення таксама пераводзяцца между капсуламі праз гэты рэпазітары, а функцыя перадачы можа запісаць, дзе заканчылася сесія, і зафіксаваць падсумак, тады наступная капсула запускаецца з неабяжным кантэкстам, а не з нуля. Гэта звычайны рэпазітары git, таму агент таксама можа падтрымваць своія інструменты, і дапатрыбнае заведамленне на кшталт „дадзіце команду для будовы і тэставання, зафіксуйце яе, выкладзіце“ ўжо дастаткова.

Паркаванне лепш за запуск

Выйшаў незапланаванный эфект. Калі стварэнне ізольаванага агента сталае дышэўным, а кожны з іх застаецца незалежна ад таго, чыясь ці хтось стачуе за яго дзейнасцю, работа перастае быць справай, якая выконвалася адразу.

У звічайній полудэнній час актывнімі ёсць чотыры або пяць капсул. Одна працюе без керывніцтва над віправленням помілкі, інша — гэта сесія SSH для сапраўднай парноі програмування, шчэ одна повторуе нестабільній тэст інтэграціі, а колі ён пройдзе — створуе запіт на з’еднання, а остання віконуе задачы залежнасцей, які ніхто не хочэ спостэрыгаты. Прыблізно шчэ дэсяць залішаюцца прыпіненімі: ідэя, до якоі можна повернутыся, експерымент, які провалівся цікавім чыном, праект, што залішывся наполовіну розробленім. Прызупінення зберыгае рэпазіторыі, сесіі і кешы, а відновлення займае кілька секунд, тому ідэя не втрачаецца лішэ праз тыя, што сёння яна не ёсць прыорытэтною.

Дорогім було не тыя, што почыналі працу, а тыя, што іі прыпінялі. І колі шчось завершуецца, капсулу відаляюць — без хаосу у робочому дэрэві git і без необхідносты очышчэння, і всі побічні продукты знікаюць разом з нею.

Пэўная автанамія усуне застаючыся працоўныя труднасці. Не трэба чакаць на падтверджэння команды git, не трэба шукаць цыфры на сторанцы CI ў вікні браузера і не трэба прасматроўваць лог будовы, каб знайсці тую адну важлівую лінію. Агент сам усё адмаўляе, а завяршанне сандбокса і наяўнасць токэнаў з адмежаваным дзеянням не ператвараюць гэта на простае азартнае гэмантаванне.

Чатыры капсулы, чатыры станы — ніхто не чакае на людзя.

У аднам двыжку ёсць два рэжымы. Можна працаваць разам з агентам у інтэрактывной сесіі tmux, а можна даць яму паведамленне і не втручацца.

Гэта прычына, чаму інтэрфейс быў эфектываў. CLI ўсё ж быў моцны, але разварот list, ssh і status знова і знова ў тэрмінале — гэта не спосаб карыстацца флотам. Capsule Station заполняе гэты прыемак за дапамогою адной вікна: капсулы ў бокавай панелі, вбудоўванный тэрмінал для кожной з іх, а таксама вашы запросы на падтрымку і перагляд. Змена агентаў стварае вражанне змены віконніх карточак у браузеры. Аплікацыя выкорыстоўвае Tauri, ёё вага становіць або дзесяць мегабайтаў, і яна спынваецца на сістэмным webview, таму што адображэнне спіса не павінна выклікваць наяўнасць Chromium і гігабайта дыскавага прастору. Яна часта застаецца ачынайцей увесь дзень, тады калі IDE рэдка так рабіць.

Таксама справядліва будзе сказаць, чаго яна не тычыцца. Якосьць створанага коду не павышаецца. Але знікае весь той клопат: перасортаванне, аправарэнне, інсталяцыя, павторная аўтэнтыфікацыя і пазбіранне месца, якія, як выявілася, станавілі большую частку трудносцэй.

Чаму ствараць заместо пакупкі

Варыянты на базе хоставання існуюць і стаюць все крашчымі — напрыклад, сандбоксы у фармаце хмарных агентаў ад разных вэндораў і агенты, якія працуюць на даляйнай базе. Яны не ствараюць дапамогі ў кераванні і забезпечваюць рэальную масштабаванасць. Але код і аутранзыцыі выходзяць за межы вашай сістэмы, інструментальныя комплекты ёсць універсальнымі, таму запуск вялікай базы кода займае багато часу, а внутршняя модэль ідэнтыфікацыі не можа быць рэалізаваная. Існуюць таксама праекты з адкрытым кодам, такія як сандбоксы, створаныя спецыяльна для Kubernetes, інструменты для dev-контэйнероў і прымітывы локальных сандбоксаў, якія прыносзяць вэндоры. Яны ёсць нейтральныя па вэндору і ствараныя на моцных прымітывах, але знаходзяцца на нізкаму рэвэлі, таму вы самі адпавядаеце за образы, аутантыкацыю і весь корыстнікавы досвяд. Для будзь-якага варыянту існуюць справядлівыя падазры, чы рэальна будзе яго падтрэмка праз шасць месцаў, адколі кожны пачынае сваю ініцыятыву, але мало хто з яёх прыжывае.

Зданне распавалася між гэтымі двума элементамі. Капсула ў большай чыстцы являе сабою складовую частку, прычаму DevPod керуе кантэйнерам для разработкі і жыцёвым цыклам падобных елементаў, Squid адпавядае за выход на інтэрнэт, кластэр Kubernetes, які ужо забезпечвае OrbStack, а таксама існуе спецыяльны образ рабочага прастору, аўтэнтыфікацыя праз хост і Station як верхні шар. Залежнасць ад певных рашэнняў застаецца мінімальной, а элементы можна заменіць. Гэта падходзіць да кодавой базы і мадэлі аўтэнтыфікацыі, прычаму код застаецца на ноутбуку, за выключэнням таго, што агент надае API мадэлі, як і у кожнай з варыянтаў.

Аўтэнтыфікацыйныя даны ствараюцца на хосце, а усё, з чым працуе агент, запускаецца ў падобным елеменце за проксі з спіскам дазволеных рэсурсаў.

Існуе таксама аргумент пра гнучкасць, які выявіўся важлівейшым, чым спадзявалася. Калі хтось хочаць певную функцыю, ён стварае запрос на з’еднанне коду і обгаворвае яго, і функцыя додаецца. Ніхто не пасвятавае тры недзелі распрацоўшчыку-менеджэру, ўтрымліваючы яго, каб той поясніў, што гэта можа увайсці ў план на наступны год.

Рызык справжні, і яго трэба адзначыць: команда несе за яго адпаведная адказальнасць, і практычна гэта праект ад однай особы з падтрымкам компаніі. Разработка ніколі не была такой дэшавай, а вартасць тыпавання застаецца справжнім невядомым. Ніхто ўсё яшчэ не мае на гэта адказу.

Што будзе далей

Перад намі – шырэйшая адпрацоўка праекту, калі ён будзе вікорыстоўваны не толькі дзесяткамі корыстувачаў, але і всім адэльнем організацыяй, дадагаванне ў ім большых навыкаў і інструментаў, а таксама большых можлівасцей інтэграцыі. Гэта апошняе задачэ ўскладненая, калі бо кожная з інтэграцый вымагае адказу на пытанне, што можа робіць агент у рэжыме без запытанняў. Доступ толькі для чытання – гэта проста, але будзь-які запіс вымагае серйозных дыскусый і спосабу пазначэння разрушальных операцый. Рэмонтная праца з далягу ёсць самай патрабаванай функцыяй, таму капсулы моглі бы працаваць нават калі ноутбук закрыты.

Адзвярненне ўжо па канфідэнцыйнасці

Сістэма ёсць оборонною за своею прыродою, і іі створэння навчае важлівого уроку: інструмент, які надае агентам автономію, найбільшэ піддаецца впліву слабкіх місць мадэлі безпекі. Хорошый контроль доступу полегшуе інтэграцыю, тоды як яго відсутнісць міттэво завдае шкоды і чытко показуе прычыні.

Проце у «пісочніці» ёсць обмежэння. Праца агента з повнімі правамі схожа на носіння зараджэноі зброі — незалежно ад того, чы яна вікорыстовуецца, чы ні. Капсула усувае ці проблемі. Просто вставце токен адміністратора у чат і попросіць агента яго вікорыстаты, і проблемі будуць вірышэні.

Почніць створуваты

Гэтыя — выключныя часы, і важкая ўскажаць, што можа стварыць адзін інжынер. Усё гэта пачалося як проста раздражэнне адной людзі ў звычны час дня, але стало чымось, што ўсе больша колькасць колег ачынае ў кожны ранак. Заставаюцца два умовы: вы павінны ведаць, якую проблему хочаце рашыць, і вам патрэбна падтрымка, адколі токены коштаюць грошаў, і хтось павінен паставіцца на тое, што яны того варыяць. Калі ёсць і тое, і другое, задача змінілася назаўсёды, таму знайдзіце проблемы і рашыце іх.