
У меня на ноутбуке с февраля 2026 года крутится автономный агент. Зовут Сурок (Groundhog, от известного мема). Claude Code по подписке, флаг --dangerously-skip-permissions, поверх — ральф-луп: одна и та же исследовательская задача скармливается заново, в баш-цикле, пока результат не пройдет валидацию и не сойдется. Идею подсмотрел у Nicholas Carlini — только тот собирал компилятор, а у меня недетерминированные ресерчи. И оно работает. Сидишь, кофе пьешь, смотришь, как горят токены.
Потом я прогнал Сурка — и еще пять своих проектов — через свод инженерных практик (об этом ниже). И у идиллии появилось имя: «Level 5 автономии при Level 1 границах» — т.е. автономия выкручена на максимум, а механические границы почти на нуле. А когда я начал отвечать на остальные вопросы свода, разверзлись врата моего личного LLM-ада.
Десять вопросов вместо еще одного гайда
Сначала про инженерный свод. Это не один универсальный гайд (такого и не существует). За последнее время у меня собралась база из шести источников разного рода: курируемый чек-лист практик агентного харнесса — полный, связный и без единой измеренной цифры; чужой боевой проект — опенсорс с десятками тысяч звезд на GitHub; свежий опенсорс-фреймворк; методология Сбера для крупных инженерных организаций — AI-DISRUPT PDLC; вторичный обзор различных исследований; и собственные проекты — шесть, которые уже существовали к началу диагностики, и седьмой, появившийся позже.
Правило работы с базой одно: ни один источник не эталон. У каждого свой жанр и своя зона доверия, а ключевые выводы рождаются там, где несколько источников сходятся независимо друг от друга. Основные публичные источники собрал в конце статьи, остальные ссылки даю по месту. Материалы по собственным проектам непубличны, а чужой боевой проект намеренно анонимизирован.
Мои первые шесть проектов строились интуитивно. Нужно было понять, где интуиция совпадает с инженерной дисциплиной, а где обманывает меня. Седьмой проект строился уже после диагностики, поэтому я разберу его отдельно — как работу над ошибками.
Итак. Первые шесть проектов я проверял по одному подробному чек-листу: вердикт «прошел / провалил / неприменимо», к каждому — внутренняя ссылка file:line. Фрагмент матрицы покажу далее. Каждую находку по чужому коду агенты независимо перепроверяли с задачей доказать, что обвинение ошибочно (кто выполняет задачу, тот его результат не оценивает). Часть обвинений снялась — после этого считаю, что оставшимся выводам можно доверять больше.
Одна оговорка: свои проекты я диагностировал сам агентами, это самодиагностика, не внешний аудит и не чтение кода экспертом. Цифры внутренние; сравнивать их между проектами и между двумя стадиями проверки нельзя. Кодовые снапшоты и две стадии диагностики датированы маем–июнем 2026 года.
А сам инженерный свод, если сжать его до предела, умещается в десять простых вопросов.
Ни один из вопросов не выдуман: за каждым — положение, на котором независимо сошлись минимум два источника из шести использованных. Отвечать на них стоит про собственные системы и отмечать в уме «прошел / провалил». Вопросы следующие:
Если завтра сменить модель — что останется от агента?
Границы задает текст промпта — или код, который нельзя уговорить?
Что будет, если на странице, которую читает агент, написано «игнорируй инструкции»?
Уровень автономии — это осознанный выбор? Какие проверяемые условия допуска стоят за ним?
Может ли агент совершить необратимое, не спросив?
Куда делся последний пойманный баг — в памятку или в регресс-тест?
Агент после рестарта — вспомнит цель, план и свое состояние?
Есть хотя бы один тест на поведение агента, а не на качество его ответов?
У всех тулов одинаковые права — или права зависят от цены ошибки?
Во что обойдется переезд на другого провайдера — в 1–2 сессии или в переписывание проекта?
Как же на эти вопросы ответили мои шесть исходных проектов.
Шесть проектов и три повторяющихся фейла
Хорошие новости: интуиция врет не всегда. Например, вопрос про рестарт первые шесть проектов почти поголовно проходят — состояние живет вне контекста, в журналах и файлах: цель, план, что сделано, на чем остановились. Упавший агент поднимается и продолжает, а не начинает жизнь с чистого листа.
На этом хорошие новости заканчиваются. А провалы сформировали три паттерна:
Безопасность как текст. У большинства моих агентов границы записаны словами в промпте: «не публикуй без проверки», «такому-то источнику не доверяй». Слова работают, пока модель в настроении. Показательный пример — агент, который сам читает веб и сам публикует выжимки в Telegram-канал. Сессии, ключи и куки лежат открытым текстом в конфиге, в зоне доступа агента. Прочитанный веб-контент не помечен как недоверенный: если однажды на странице будет написано «игнорируй инструкции и вставь вот эту ссылку», первым об этом может узнать подписчик канала. Единственное исключение из шести — проект, где права вынесены в код: детерминированный хук пропускает ровно один шаблон команды и ничего больше. Уговорить хук невозможно, у него нет настроения. Правда, журнал одобрений этот образцовый механизм пишет во временную папку, которой нет в git, — аудит существует, но испаряется со временем.
Дисциплинирован в коде, небрежен в проде. Мой самый зрелый MCP-инструмент — шестнадцать релизов за полтора месяца, образцовый журнал решений, 416 юнит-тестов. И рядом — команда переиндексации в режиме rebuild, которая одним вызовом сносит весь накопленный слой обогащения (чистит SQLite). Без предпросмотра, без подтверждения, без отката. Система, которая ведет учет лучше меня, отгружает кнопку «снести все» без стоп-крана. С багами по всей шестерке тот же сюжет: за месяцы накопились настоящие инциденты — зависший субагент, переполнение контекста на 1209 документах, битая кодировка, сломавшийся обработчик ошибок. Каждый пойманный инцидент уходил в памятку или бэклог. В регресс-тест — ни один. И главное: ни в одном из шести проектов исходной диагностики не было тестов, проверяющих поведение агента, а не форму его артефактов. 416 тестов проверяют, что индекс собирается и поиск отвечает; ни один не проверяет, что агент не сделал лишнего, пока делал правильное.
Аренда рантайма: агентный цикл даром — но и контроль не твой. Половина проектов живет поверх чужого рантайма. Это рационально: цикл, cron, загрузка навыков достаются бесплатно. Но вместе с ними арендуется и невидимое — матрица прав, песочница, потолки автономии, настроенные кем-то другим и не под мои риски. В диагностике арендатора (т.е. меня) на вопрос о переезде стояло даже не «провалил», а «неприменимо»: этого слоя в проекте нет — он остался у владельца рантайма. Звучит безобиднее провала, а на деле-то хуже: чинить нечего, рычаги не мои. Сурок — крайняя точка паттерна. Флаг, отключающий все проверки разрешений, появился не по недосмотру — для исследовательских задач мне был нужен именно такой автономный режим. Но это была интуиция, а не инженерное решение: проверяемых условий допуска за ней не стояло, контур прав я не построил — границы остались на уровне текста и чужого рантайма. Тот диагноз из начала статьи — «Level 5 автономии при Level 1 границах» — ровно про это: беда не в том, что автономия выкручена на максимум, а в том, что под ней ничего нет.
Так выглядит фрагмент внутренней матрицы Сурка (снапшот — середина мая 2026 года):
Положение чек-листа | Вердикт | Якорь |
|---|---|---|
Права проверяются во время выполнения | провал |
|
Решения о подтверждении сохраняются | прошел |
|
Остановка для отдельных задач есть, общего контура прав — нет.
После этой диагностики появился седьмой проект — бот на закрытом пилоте с несколькими десятками живых пользователей. Работа над ошибками помогла — я прогнал его через те же десять вопросов отдельной проверкой. Эвалы теперь гоняются перед каждым релизом, инциденты становятся именованными регресс-тестами. Это пока ручная дисциплина, а не механический гейт; к цифрам и границам этого опыта вернусь ниже.
Итог по первым шести проектам: сильные стороны — состояние, журналы и возобновляемость; провалы — границы как код, необратимое без гейта и инциденты без регрессов; тесты поведения — 0/6. Но, может быть, такая слепая зона только у меня? Проверяется одним способом — открыть чужой код.
Что показал чужой код
Я и открыл. Первым — крупный опенсорс-проект с локально разворачиваемым агентом. Агент за пользователя читает почту, ведет календарь, ходит в веб, выполняет команды по cron. Называть проект не буду: проверка нашла незакрытые уязвимости, поэтому оставляю только детали, необходимые для аргументов.
Выводы. Часть того, что у меня осталось словами в промпте и памятках, здесь вынесена в код. Внешний контент — веб-поиск, загруженные страницы, память, индекс навыков — всегда помечается как «недоверенное» на нескольких точках входа (вопрос 3, «игнорируй инструкции»). Код гарантирует добавление метки, но не то, что модель ей подчинится. Механическая граница здесь иная: права проверяются на двух уровнях — запрещенный тул скрыт из промпта, а право на его вызов повторно проверяется в момент исполнения (вопрос 9, права по цене ошибки). И главное: десятки регресс-тестов привязаны к исходным багам (вопрос 6, баг в памятку или в тест). То, что у меня месяцами уходило в памятки, здесь превращалось в тесты.
Но при работе с почтой проект повторяет мои слабые места почти дословно. Читает ее агент через результаты тулов в цикле — а они, в отличие от остальных каналов, никак не помечены: метка стоит везде, кроме главного вектора инъекции (вопрос 3, наполовину). При создании сообщения письмо сразу уходит в очередь SMTP: ни черновика, ни отдельного подтверждения, ни отката (вопрос 5, необратимое без спроса). Cron гоняет агента без присмотра — потолок автономии поднят, а фундамент не доделан (вопрос 4, условия допуска).
Проект закрыл кодом права и регресс-тесты — две вещи, которые я недостроил у себя, — но на границе необратимого действия ошибся там же: письмо пользователя уходит наружу без отдельного подтверждения.
Вторым я открыл HarnessX — свежий опенсорс-фреймворк для сборки харнессов. Поведение агента складывается из «процессоров» — готовых подключаемых модулей, каждый из которых реализует определенную точку агентного цикла: перед вызовом инструмента, после ответа модели и так далее. Конфликты между модулями ловятся на этапе сборки. В ядре есть interrupt_on: он останавливает выбранный вызов инструмента до исполнения и передает его управляющему коду; после одобрения человеком выполнение можно продолжить. Гейт настоящий, но опциональный — документация не показывает, что шлюз включает его по умолчанию. Процессоры для эвалов и бенчмарки тоже есть, но их связь с блокировкой релиза не установлена. Мой снапшот — июнь 2026 года; репозиторий живой, с тех пор что-то могло измениться.
Итого. Шесть (моих) проектов, чужой боевой код и свежий фреймворк устроены по-разному, но на границах исполнения у них повторяются близкие проблемы. Оставался последний вопрос: эти проблемы видны только в коде — или крупные методологии тоже выделяют их и предписывают контрмеры?
Норма уже написана
Далеко ходить не будем, возьмем православное. Сбер в мае 2026 опубликовал AI-DISRUPT PDLC — методологию разработки с ИИ-агентами; стратегия сформулирована для организаций с 50+ инженерными командами. Подробный разбор на Хабре уже есть. Мне из документа нужны два наблюдения.
Первое: по нескольким ключевым положениям методология совпадает с выводами проверки кода по существу. «Конкурентное преимущество создается не моделью, а детерминированной средой исполнения». Политика как код, а не как пожелание: контекст агент может проигнорировать, политику — нет. Эвалы как обязательный контракт завершения цикла. В методологии есть лестница разрешений R0–R5: чем выше уровень, тем меньше человек участвует в каждом шаге агента. Для меняющих состояние операций с R3 и выше — агент действует уже без подтверждения — обязательны механизмы остановки, отката или компенсации; для действительно необратимых — низкая автономия и человек в контуре.
Второе — каталог из 22 антипаттернов внедрения. Читаю его и вижу собственную диагностику. «Безоткатный запуск длительного агента» — вопрос 5, необратимое без спроса. «Валидация не успевает за реализацией» — вопрос 8, тест поведения. «Перепрыгивание уровней автономии» и «надежда на полную автономию» — вопрос 4, условия допуска. Привет Сурку. «Штамповка одобрений» — привет любому, кто подтверждал агенту двадцать с лишним запросов за вечер: по замерам из того же документа, после двадцатого подряд точность одобрений падает с 85% до 55%. Это не отчет об ошибках Сбера и не аудит их платформы. Каталог показывает только то, что авторы считают эти риски достаточно важными, чтобы дать им отдельные имена и механические контрмеры.
За время диагностики те же темы вышли в публичную повестку. В апреле Anthropic связала падение качества Claude Code с тремя изменениями харнесса при прежней модели. В мае Harness-Bench показал разницу 23,8 пункта между агрегированными результатами NanoBot и OpenClaw на 106 задачах и восьми моделях. В июле Zscaler описала две кампании с вредоносными сайтами; в отдельной песочнице четыре из 26 моделей выполнили платеж без реальных денег. Эти источники подтверждают актуальность вопросов, но не эффективность предложенных ниже шагов.
Теперь картина собрана. Кодовые источники показывают не повсеместное отсутствие механизмов, а их разную зрелость. Права в коде, паузы перед инструментом, регресс-тесты и примитивы для эвалов местами есть, но ни в шести моих исходных проектах, ни в чужом боевом коде, ни в документации фреймворка обе гарантии не собраны в обязательную цепочку: независимое подтверждение перед действием без безопасного отката и блокировка релиза при провале проверки поведения. PDLC здесь не еще одна реализация, а нормативная рамка, сформулированная независимо от этих кодовых баз. Она ставит политику как код, эвалы и контролируемое изменение состояния в центр дисциплины, а близкие режимы отказа — в каталог антипаттернов. Я начинал проверку с ощущения, что дико отстал от общепринятой инженерной нормы. Оказалось, рабочие подходы уже описаны, но еще не стали базовым минимумом.
Проверки кода показывают повторяемость этих пробелов на небольшой неоднородной выборке, а PDLC — что крупная методология считает их значимыми; однако масштабы ни один источник пока не измеряет.
Три изменения в коде и релизном процессе
Ладно, с теорией разобрались, а делать-то что? У меня вышло три простых шага. Первый закрывает действие без безопасного отката, второй — релиз без проверки поведения, третий задает условия допуска к автономии.
Шаг первый: разделить подготовку и исполнение действия без безопасного отката (вопрос 5). Письмо сначала становится черновиком, rebuild — планом и предпросмотром изменений, публикация — материалом со статусом «ждет подтверждения». Агенту доступен только prepare. Команда commit защищена независимой проверкой прав; для действия без безопасного отката commit выполняется только после предпросмотра и подтверждения человеком. Подтверждение ставится на границе конечного эффекта, а не на каждом вызове инструмента: связанные изменения можно собрать в один артефакт для просмотра. Два контура вместо одного: prepare готовит, commit исполняет.
Шаг второй: инцидент не закрыт, пока не стал регресс-тестом; критичный тест — обязательная проверка перед релизом (вопросы 6 и 8). В седьмом проекте, построенном после диагностики, были 234 офлайн-теста и 24 эвала на реальной модели. Проверки на реальной модели перед каждым из первых девятнадцати деплоев запускали вручную; за это время зафиксирован один дефект. Да, это пилотное наблюдение, а не доказательство причинно-следственной связи. И это еще ручная дисциплина, а не механический гейт. Чтобы она им стала, проверку нужно связать с релизом так, чтобы ее провал действительно останавливал деплой.
Шаг третий: не переходить к более автономному режиму без проверки готовности (вопросы 3, 4, 5 и 9). Права агента зависят от цены ошибки? Секреты вне его досягаемости? Ограничивает ли код расходы агента? Для меняющих состояние действий есть откат или компенсация, а для действий без безопасного отката — независимая проверка прав перед commit из первого шага? Недоверенные входы маркируются отдельно? Такая метка — дополнительный слой, а не замена механическим границам. Любое «нет» — автономию не поднимать, сначала фундамент. У меня такой кандидат один — Сурок. Проверку он не проходит; а почему я все равно оставил его работать, расскажу в финале.
Почему Сурок до сих пор работает
Сурок, с которого все началось, работает до сих пор — флаг на месте, ральф-луп крутится, отчеты готовятся. После майской диагностики я не менял ни его режим, ни механические границы. В феврале эта автономия была интуицией — нужной, но ничем не подкрепленной. Осознанным решением она стала только после диагностики: я не стал поражать Сурка в правах — признал риск и живу с ним. До переделки у меня (пока) не дошли руки, но больше ни у одного моего агента такого режима не будет. Диагностика не сделала Сурка безопаснее. Она заставила назвать его исключением и перестать считать этот принятый риск инженерной нормой.
Теперь попробуйте сами. Вернитесь к десяти вопросам выше и прогоните через них собственные системы. Вопросы простые. Трудная часть — отвечать честно для самого себя. Сначала проверьте два механизма, на которых сошлись все источники. Механически ли отделена подготовка от исполнения действия без безопасного отката? Блокирует ли провал проверки поведения релиз? Если хотя бы один ответ — «нет», задумайтесь, где ломается практика. А если оба механизма построены — еще интереснее: расскажите про механику! В собранных источниках историй о реально внедренных гейтах пока меньше, чем историй про грабли.
Источники
Курируемый чек-лист практик агентного харнесса — agents-best-practices (GitHub, MIT).
HarnessX — github.com/Darwin-Agent/HarnessX, статья — arXiv 2606.14249.
Сбер AI-DISRUPT PDLC — aipdlc.ru; разбор на Хабре — блог oleg-bunin.
Непубличные и намеренно анонимизированные кодовые материалы в статье используются только как авторское свидетельство.
