Что пришлось проверить, прежде чем доверять системе самостоятельную работу над программным проектом.

С чего все началось

Последние несколько месяцев я активно использую AI‑инструменты в разработке. Coding agent может изучить репозиторий, написать код, запустить тесты и предложить изменения. Но после завершения задачи кто‑то должен оценить результат, поставить следующую задачу, передать контекст и разобраться с ошибками. Обычно этот кто‑то — человек.

Мне стало интересно, можно ли передать системе больше работы: описать идею продукта обычным языком, уточнить требования, а затем последовательно получать работающие версии без ручного управления каждой AI‑сессией. Для исполнения я хотел использовать существующие CLI‑агенты, в том числе Codex CLI и Claude Code.

На схеме идея выглядела просто:

Идея пользователя
      ↓
Уточнение требований и план
      ↓
Задачи → AI-исполнители → проверка результата
      ↓
Работающая версия продукта

Проблемы начались, когда я попытался перейти от схемы к проверяемым гарантиям. Что агенту разрешено видеть? Как остановить все запущенные им процессы? Что делать, если система упала после выполнения внешнего действия, но до сохранения результата?

Проект пока находится на стадии архитектурных решений и отдельных прототипов. Ниже расскажу об экспериментах, которые заставили пересмотреть первоначальные решения.

1. Запретить чтение файла недостаточно, чтобы защитить данные

Первым делом я проверял изоляцию исполнения на macOS. Агенту нужен доступ к файлам проекта, но не к другим репозиториям, пользовательским документам и данным работающих приложений. В первоначальном прототипе для этого использовался App Sandbox.

Тестовый development‑процесс не смог напрямую прочитать закрытый файл с синтетическими пользовательскими данными. Файловое ограничение сработало. Но после разрешения сетевого доступа тот же процесс получил эти данные через тестовый HTTP‑интерфейс работающего продукта.

Условно ситуация выглядела так:

Прямое чтение закрытого файла → отказ
Получение тех же данных через HTTP → успех

Сервис, адреса и данные были частью тестового стенда. Реальные документы никуда не утекли, да и неожиданным нарушением правил macOS это назвать нельзя, процессу явно предоставили сетевые возможности.

Проблема заключалась в самой архитектуре ограничений. Запретили один способ получения данных, но оставили другой. Прямой сетевой доступ также позволил обращаться к адресам, которые политика экспериментального сценария считала запрещёнными.

В том же прототипе обнаружилась проблема остановки процессов. Дочерний процесс отделился от группы родителя через setsid и продолжил запись после остановки этой группы. Координатор мог считать задачу завершённой и запускать следующую, пока предыдущий процесс продолжал работать.

Всего получил 97 наблюдений: 40 разрешённых операций и 57 отклонённых. Проверенная архитектура не выполнила обязательные требования.

Из этого я вынес два требования. Доступ к данным необходимо контролировать по всем каналам, включая сеть, работающие сервисы и результаты инструментов. Завершение задачи должно означать фактическую остановку всей принадлежащей ей нагрузки, включая дочерние процессы.

2. Изоляция в VM помогла, но не решила все проблемы

Следующим кандидатом стали отдельные Linux VM на Mac. Одна для исполнения агентных задач, вторая для создаваемого продукта, третья для доверенной проверки. У недоверенной нагрузки нет прямого сетевого доступа и общих директорий с хостом. Разрешённые операции проходят через broker, который проверяет их тип, контекст и полномочия.

                   Mac
                    │
            Управляющий процесс
                    │
          Broker разрешенных операций
             ╱      │      ╲
            ╱       │       ╲
       Execution  Product  Verification
          VM        VM        VM

В исследованном сценарии процесс внутри execution VM мог работать со своим проектом, но не получал доступ к тестовым файлам хоста, соседнего проекта и пользовательским данным. Проверенные прямые сетевые пути также были недоступны. Настоящие Codex CLI и Claude Code выполнили сценарии с инструментами и MCP через синтетического провайдера.

Эксперимент подтвердил часть механики запуска и передачи запросов. VM также не решила вопрос доступа пользователя к созданному приложению. Если сервер работает внутри изолированной VM, а пользователь открывает приложение в обычном браузере, полученный JavaScript исполняется уже на хосте. Следовательно, нельзя считать весь продукт изолированным только потому, что его сервер находится внутри виртуальной машины.

В результате VM с broker стала рабочим архитектурным кандидатом, а безопасный доступ к продукту, реальные AI‑каналы и полноценный сетевой broker остались отдельными задачами. Для меня это стало важным архитектурным выводом: границы доверия необходимо определять через потоки данных и выполняемые действия, а не только через изоляцию конкретного процесса.

3. Два гигабайта памяти VM не означают два гигабайта памяти Mac

При проверке ресурсов обнаружилась следующая проблема. Если виртуальной машине выделено 2 GB памяти гостевой системы, это не означает, что вся связанная с ней нагрузка на хосте будет занимать не больше 2 GB. Есть память процесса виртуализации, вспомогательных компонентов и дополнительные накладные расходы. Причём не все из них можно надёжно приписать отдельному процессу.

Для проверки механизмов ограничений я провёл эксперимент с QEMU/HVF. Это было отдельное исследование ресурсного подхода, а не замена VM‑кандидата из предыдущего раздела. В одном из прогонов 37 из 38 проверок получили PASS, но общий результат остался отрицательным. Причина достаточно простая: необходимую совокупную гарантию для хоста доказать не удалось.

В частности:

  • Ограничение виртуального адресного пространства процесса не доказывало предел физической памяти, потребляемой всей системой.

  • Ограничение накопленного CPU‑времени не обеспечивало необходимое поведение запуска и остановки VM.

  • Независимый watchdog позволял обнаружить превышение по наблюдаемой метрике и остановить нагрузку, но работал реактивно, с задержкой и потенциальным превышением порога.

В итоге пришлось разделить два требования. Первое — технически ограничивать параметры гостевой среды и проверять их отдельно. Второе — наблюдать за состоянием хоста и при опасных условиях прекращать собственную нагрузку за установленное время. Абсолютный жёсткий предел совокупного потребления RAM и CPU всего Mac я теперь не заявляю.

Для мониторинговой защиты ещё необходимо определить допустимые превышения, доказать полноту учёта процессов и проверить время обнаружения и фактической остановки. Причём просто отправить сигнал завершения недостаточно. Нужно убедиться, что процесс действительно прекратил выполнение, а его ресурсы можно освободить.

С наблюдением давления памяти возникла похожая ситуация. Один из прототипов прошёл 44 из 44 проверок, но общий профиль так и остался непроверенным. В последующем read‑only прогоне независимый наблюдатель собрал 698 показаний, вспомогательный процесс — ещё 170. Все показывали WARN; реального перехода между состояниями не произошло.

Фактически удалось проверить получение и обработку наблюдений в конкретных условиях, но не всю цепочку от изменения давления памяти до своевременного прекращения нагрузки и безопасного восстановления. Вывод оказался достаточно очевидным, но важным: успешные проверки отдельных компонентов не доказывают выполнение требований ко всей системе.

4. Действие выполнено, а координатор об этом не знает

Изоляция и контроль ресурсов составляют только часть проблемы. Система должна продолжать работу после падения управляющего процесса или отдельного исполнителя.

Здесь возникает достаточно неприятный сценарий:

Координатор отправил команду
           ↓
Действие могло выполниться
           ↓
Координатор упал до записи результата
           ↓
После перезапуска результат неизвестен

Если команда читала файл, повторное выполнение может быть допустимо. Если она изменила данные, создала внешний ресурс, отправила сообщение или использовала однократное разрешение, слепой повтор уже может привести к проблемам. При этом история AI‑сессии не устраняет неопределённость. В ней может просто не оказаться информации о фактическом результате последней операции.

Поэтому я разделяю намерение выполнить действие, отправку команды, наблюдаемый результат и подтверждённое состояние внешней системы. После сбоя координатор не всегда может сразу продолжить выполнение. Иногда сначала необходимо установить, что именно произошло, и только потом выбирать между продолжением, проверкой, повтором или передачей решения человеку.

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

Рядом обнаружилась ещё одна интересная проблема, уже при перезапуске сетевого relay. Позднее закрытие старого соединения могло затронуть новое, поскольку оба получали идентификатор conn-1. После добавления поколения к идентификатору сценарии рестарта прошли повторную проверку.

Причина заключалась в том, что имя ресурса само по себе не гарантирует его идентичность. После перезапуска за тем же именем может находиться уже другой экземпляр. Именно поэтому восстановление нельзя сводить к обычному продолжению AI‑сессии. Необходимо согласовывать сохранённое состояние с фактическими последствиями уже выполненных действий.

Что пока остается открытым

Все описанные эксперименты не отменяют первоначальные вопросы о декомпозиции задач, передаче контекста, выборе моделей и проверке качества кода. Они добавили целый набор требований, без выполнения которых я не готов запускать полностью автономную работу над долгоживущим проектом. Сейчас предстоит проверить полноценный сетевой broker, реальные механизмы авторизации двух CLI, безопасный доступ пользователя к приложениям внутри VM, защиту ресурсов Mac при изменении давления памяти, восстановление после сбоев и независимую проверку результатов работы агентов.

Для будущей версии я зафиксировал достаточно строгие критерии приёмки. Один и тот же релиз должен пройти автоматические проверки, 48-часовой прогон, семидневное длительное испытание и реальный цикл исчерпания и восстановления квоты хотя бы одного CLI. Не исключаю, что текущая архитектура ещё неоднократно изменится.

Изначально я думал преимущественно о том, как заставить нескольких AI‑агентов последовательно писать код. Теперь гораздо больше времени занимает проверка условий, при которых системе вообще можно доверить следующий шаг: какие данные она видит, какие процессы продолжают работать после остановки, какие действия можно безопасно повторять после сбоя и какие гарантии мы действительно способны обеспечить.

Пока мой главный вывод достаточно простой: автономность начинается не с длинной цепочки вызовов модели, а с возможности точно установить, что система сделала, что ей было разрешено и что безопасно делать дальше.

Комментарии (8)


  1. Sap_ru
    18.10.2026 11:16

    Это очень серьёзная тема, которая пока не имеет нормального решения.
    Да, все действия ИИ должен выполнять только через MCP сервер в изолированном окружении. Причём даже простая изоляция на уровне докера не обеспечивает необходимой безопасности. Нужен сильно ограниченный rootless контейнер или виртуальная машина (так как не всё можно запустить в docker).
    Любой в сеть должен быть только по белому списку портов. Настроить это для localhost и локальной сети бывает нетривиально.
    Любой доступ в интернет должен быть только по белым спискам сайтов и протоколов с ручным одобрением каждого неизвестного соединения. Это совсем уж неочевидная проблема не имеющая общего решения. Всё становится совсем весело, когда оказывается, что никакие секреты ИИ давать нельзя, но при этом нужно обеспечить его доступ к некоторым сторонним сервисам - нужна инъекция токенов и сертификатов на уровне прокси и MCP.
    Все браузерные поделки ИИ можно запускать только в выделенном браузере с кучей ограничений. И весь локальный софт тоже можно запускать только в виртуальных средах (особенно весело становится, если этот софт содержит GUI).
    В идеале нужна ещё ручная проверка всех пакетов и библиотек.
    Нужен откат всего окружения к контрольным точкам с случае зависаний и крашей.
    В иных случаях ИИ будет подвержен совершенно примитивным целевым атакам, а при длительной самостоятельной работе будет творить все те ужасы из новостей. Вы дали ему задание, а нужный ему интернет-сервис не отвечает, и он реально ломанёт вам всё, до чего дотянется из самый лучших побуждений.
    Я бы сказал, что сейчас вот всё можно решить только частично и ручной настройкой очень сложных окружений. Есть какие-то типовые решения по изоляции, но они подходят только для разработки каких-то типовых web-сервисов.
    Индустрия ещё не осознала, что ИИ это злоумышленник, которого вы вынуждены пускать в самое ядро свой инфраструктуры.


    1. BladeConjuror Автор
      18.10.2026 11:16

      Да, я примерно в это и уперся. Только MCP сам по себе не дает изоляции - если у агента есть shell, запущенные им процессы могут обойти MCP. В моем первом прототипе чтение файла блокировалось, а те же тестовые данные оказались доступны через HTTP

      Поэтому я проверял вариант с отдельными VM без прямой сети и общих папок, где разрешённые операции идут через broker, там уже ситуация по-лучше, но идеалом я бы все равно не назвал.

      Так же некоторые проблемы возникли из-за MacOS, пришлось писать туда на форум выяснять нюансы, и результаты конечно не положительные, часть моих ограничений практически невозможно реализовать на их операционке


  1. becefi
    18.10.2026 11:16

    Да просто не используйте ИИ. Зачем вы мучаете себя и его.


  1. Ka463
    18.10.2026 11:16

    А не думали о том, что если не делать ограничений то нейросеть нечего не взламывает вообще ? и вся та хрень в новостях происходила только в сценариях когда такое действие было намеренно спровоцированно


  1. Fenogik
    18.10.2026 11:16

    После "у меня нет возможности запустить sudo, но вы входите в группу dockers и я сделаю ...", и выполнил команду которая требует sudo, я и не питаю иллюзий об ограничениях, что у меня с ноута все просканировано и корпоративных тайн не осталось.


    1. becefi
      18.10.2026 11:16

      Зависит от обвязки. К некоторым доверия больше. К своей еще больше, сам знаешь что она делает, а что нет.


  1. rumataestor
    18.10.2026 11:16

    Вы уже используете поколения идентификаторов для сетевых соединений. А как насчёт аналогичного механизма для разрешений? Допустим, агент получил доступ, потом его отозвали, координатор упал и восстановился из старого состояния. Не воскреснут ли вместе с ним старые полномочия?

    Я бы проверял актуальность разрешений непосредственно в broker, по состоянию, которое не откатывается вместе с координатором. А то получится зомби-агент: доступ уже отобрали, а он восстановился и снова пришёл с ключами от продакшена. :)

    Такой сценарий тестировали?


    1. BladeConjuror Автор
      18.10.2026 11:16

      В отдельных прототипах проверял отзыв доступа и запросы после рестарта broker - они отклонялись. Ещё проверял восстановление, бэкап, сделанный до изменения разрешений, не активировался. Но весь описанный сценарий целиком я пока не тестировал, да и честно мозги уже плавятся)