Чтобы Codex и Claude не ломали систему я сделал рельсы [revisited]

 Публичный пост
19 мая 2026  480

По совету старожилов я переписал статью с целью улучшения ее "читабельности". Надеюсь в этом варианте она будет читаться легче.

Я начал продуктивно использовать ИИ в разработке ПО еще в начале 2023 года. Ранний chatGPT позволил мне закрыть дыру в моих знаниях конкретной технологии и создать новую подсистему в существующей распределенной платформе меньше чем за неделю. С тех пор я довольно плотно использую genAI/ИИ-агенты для разработки: Codex, Claude, Cursor, многоагентные процессы, отдельные рабочие деревья Git, передачи контекста между агентами, агенты-проверяющие и т.п.

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

Но когда я начал переходить на агентную разработку тут же вскрылись проблемы: ИИ-агент легко делает изменения, которые локально выглядят разумными, но глобально ломают систему.

ИИ агент может за несколько минут сделать такой объём изменений, который раньше занял бы у человека часы. И если он не понимает границы системы (а ИИ НЕ понимает что он делает в человеческом смысле этого слова!), то он очень быстро делает не просто "больше кода", а больше хаоса.

Вот неполный перечень проблем с которыми мне очень быстро пришлось иметь дело:

  • Ломает бизнес-инвариант;
  • Пересекает архитектурную границу;
  • Меняет поведение отката;
  • Задевает лишние модули;
  • Меняет семантику повторных попыток (retry logic);
  • Ломает идемпотентность;
  • Ухудшает читаемость кода;
  • Смешивает несколько несвязанных изменений в один коммит.

TL;DR

Главное что я пытаюсь донести этой статьей и что сделать с помощью контрольных инструкйций для агентов, я сформулировал так:
Your team does not need AI coding agents to write more code. It needs them to stop writing the wrong code!

Я много лет работаю архитектором и разработчиком, наверное поэтому я постоянно думаю про границы системы, инварианты, ответственность модулей, откаты изменений, диагностику и последствия изменений. И я начал собирать небольшой open-source проект:

https://github.com/vadimche/ai-agent-rails-pack

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

намерение → границы изменения → инварианты → тесты → сравнение изменений с намерением → риск → откат

Это набор инженерных рельсов, который я кладу в каждый новый проект и использую с Codex, Claude, Cursor и похожими инструментами.

А вот у нас был еще такой случай...

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

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

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

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

У меня есть проект с ботами для торговли на спортивной бирже. Трейдер поставил инвариант для одного из алгоритмов: если матч уже начался и у нас есть открытая позиция, то должна быть выставлена обратная позиция. Агенты, причем от всех ведущих производителей, регулярно ломают это поведение. Новый код выглядит адекватно, тесты проходят, агенты объясняют свои действия вполне убедительно. Но глобально бот становится бесполезным и даже вредным: главное бизнес условие его существования перестает срабатывать.

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

Другая повторяющаяся история: агент решает задачу, а заодно делает небольшую "полезную" уборку рядом. Например, чуть поменял структуру условий, убрал "лишнюю" проверку, объединил две ветки логики, изменил место логирования, поправил соседний класс, потому что так говорит Uncle Bob.

Ещё одна опасная зона - повторные попытки, таймауты и идемпотентность. Например, у вас есть внешний вызов: разместить заявку, отменить заявку, обновить статус. Человек, который знает предметную область, понимает разницу между: можно повторить только с тем же идентификатором и нельзя повторять без проверки статуса. Агент часто видит это проще: "здесь не хватает retry = добавлю retry".

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

Эволюция идеи

В итоге я начал собирать проект:

https://github.com/vadimche/ai-agent-rails-pack

Сейчас это набор файлов, которые можно положить в репозиторий:

  • Инструкции для ИИ-агентов;
  • Шаблон намерения изменения;
  • Реестр инвариантов;
  • Шаблон проверки изменений против намерения;
  • Шаблон отката;
  • Классификация риска;
  • Правила тестирования;
  • Правила безопасности;
  • Шаблон передачи задачи между агентами;
  • Шаблон для описания архитектурных границ;
  • Пример для критичных сценариев.

Главная идея простая:
перед тем как менять код, агент должен явно зафиксировать:

  • Что он собирается решить;
  • Что он не собирается менять;
  • Какие файлы можно трогать;
  • Какие файлы нельзя трогать;
  • Какие инварианты нельзя сломать;
  • Какие проверки должны пройти;
  • Как откатиться назад.

После изменения он должен сравнить фактическую разницу в коде с исходным намерением.

Не "я вроде всё сделал", а:

  • Сделал ли я именно то, что обещал;
  • Не тронул ли лишнее;
  • Не сломал ли инвариант;
  • Не изменил ли опасное поведение;
  • Есть ли доказательство через тесты или логи;
  • Понятен ли пусть отката.

Промежуточные выводы

Первое: ИИ-разработка сильно повышает ценность архитектурной дисциплины.

Раньше можно было сказать: "Не будем душнить, нормальный разработчик и так разберётся". С агентами это не работает. Агент не живёт в системе годами. Он не помнит историю компромиссов. Он не знает, какой некрасивый кусок кода держит редкий, но важный сценарий.

Второе: плохой код менее опасен, чем почти хороший код.

Плохой код видно быстро. Почти правильный код проходит дальше по цепочке проверок.

Третье: рецензирование должно быть не общим, а направленным.

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

Четвёртое: человек всё равно должен оставаться в контуре (human in the loop), как мне было известно еще с середины 90х, когда я только начинал заниматься интеллектуальными системами.

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

Ожидания от vas3k

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

Интересны любые кейсы:

  • где ИИ-агент реально что-то сломал;
  • где он сделал локально правильное, но системно опасное изменение;
  • где он полез не туда;
  • где он поменял поведение, которое не должен был менять;
  • где он “почистил” важный старый код;
  • где рецензент-агент помог;
  • где рецензент-агент оказался бесполезен;
  • какие правила вы уже пишете в репозитории;
  • как вы контролируете изменения;
  • как вы ограничиваете область работы агента;
  • как вы боретесь с раздуванием контекста;
  • как вы решаете, когда нужен человек.

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

Возможно ли это?

Ссылки

Проект:

https://github.com/vadimche/ai-agent-rails-pack

Первый пост в LinkedIn:

https://www.linkedin.com/posts/chepegin_ai-codex-claude-activity-7462400424663384064-CkHE

Буду рад любому фидбеку: техническому, архитектурному, продуктовому или просто историям "у нас ИИ сделал вот такую дичь".

Связанные посты
28 комментариев 👇

Не синтаксис.
Не стиль.
Не "забыл точку с запятой".

Это не отдельная платформа и не “корпоративное управление ИИ”.

Это не "красивая архитектура".
Это не "желательное поведение".
Это инвариант безопасности алгоритма.

Пост точно соответствует ИИ-полиси?

  Развернуть 1 комментарий

@SergeiTikhomirov, спасибо за Ваш комментарий )
В правилах написано: "сгенерированные ИИ, не несут никакой новой ценности миру" - мое сообщение содержит кокретные use cases из моей практики, а так же ссылки на бесплатные и полезные материалы для разработчиков.

У Вас есть комментарии или возражения по-сути статьи?

  Развернуть 1 комментарий

@che_, проблема как раз в том, что я не смог дочитать статью, потому что на ИИ-обороты в духе "это не А, это Б" уже аллергия. Подозреваю, что у многих читателей то же. Я не спорю, что в статье волне может быть полезная информация, но добраться до неё было бы проще без AI speak.

  Развернуть 1 комментарий

@SergeiTikhomirov, статья стала статьей по воле модераторов - мягко переведу стрелки. Сначала она просто было сообщением на 250 слов со ссылкой.

Обещаю как только появится время, перепишу ее более человеческим языком и сокращу.

  Развернуть 1 комментарий

@che_, а можно в конец статьи кинуть оригинальное сообщение на 250 слов в качестве воркэраунда?

  Развернуть 1 комментарий

@Maks_fm, Я поправил статью и добавил в начале резюме.

  Развернуть 1 комментарий

@SergeiTikhomirov, как и обещал - переписал. Надеюсь, теперь читается легче. Давно я такие длинные тексты на русском не писал.

  Развернуть 1 комментарий

@che_, спасибо!

  Развернуть 1 комментарий

Очень интересно. Недавно столкнулся с тем, что агент в проекте очень хотел писать по-своему. Не помогали ни правила, ни память. Только хуки с линтерами.

  Развернуть 1 комментарий

@glader,

Хуки с линетрами спасают. Но тоже только до опеределенного момента. За кодом тоже надо следить. Например, в моих проектах (Elixir + Phoenix + Ash) что клод что кодекс прям обожают выбирать все записи из базы данных и проводить над ними операции (фильтрацию, сортировку и т.п.) в памяти. Приходится периодически вручную отыскивать проблемы.

  Развернуть 1 комментарий

А у тебя есть опыт внедрения этих рельсов в существующий проект?

  Развернуть 1 комментарий

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

  Развернуть 1 комментарий
Vadim Chepegin решаю бизнес задачи с помощью IT автор 1 день, 5 часов назад

Если кратко, то суть статьи:
Your team does not need hashtag#AI coding agents to write more code. It needs them to stop writing the wrong code!

That is why I created AI Agent Rails Pack - an open-source workflow pack for teams using hashtag#Codex, hashtag#Claude Code, hashtag#Cursor and other AI coding agents.

The problem is simple: AI agents are fast enough to turn a small task into a broad, confident, well-formatted diff before anyone has defined the boundaries.

  Развернуть 1 комментарий

не называй задачу готовой без проверок;

Это, к сожалению, близко к "make no mistakes". Потому что, как описано рядом, контекст - это боль :) Агент прекрасно может это игнорировать. И особенно субагенты. Им почему-то часто передается только отрывочная информация, или запускаются более слабые модели.

У меня было близкое по духу "do not commit anything before user approval". 99 раз работало нормально, на 100-й раз каждый из субагентов нагенерил по десятку коммитов.

  Развернуть 1 комментарий

@dmitriid, Вы нашли как можно заставить субагентов выполнять инварианты 100 из 100? Есть какие-то практические выводы из Вашей практики? Я думаю о том чтобы перевести часть этой инофрмации в скилы.

  Развернуть 1 комментарий

@che_,

Нет :) И не думаю, что это возможно. Это все же черная коробка с недетерминированой генерацией текста и очень маленьким (и быстро засоряемым) окном контекста.

Без "глаз да глаз за ними" пока не обойтись. Ну и по возможности расширять корректирующие инструменты: линтеры, форматтеры, анализаторы, анализаторы кода и т.п.

  Развернуть 1 комментарий

@dmitriid, тогда накину на вентилятор.

  1. Кому ИИ агенты могут помочь в разработке? Обещание, что они будут полезны для не-программистов. По факту, они становятся еще одним инструментом для профессиональных девелоперов.
  2. Реально ли они повышают проуктивность и на сколько?
  3. Какова цена владения - не дешевле нанять команду в Юго-Восточной Азии, или даже Индии?
  Развернуть 1 комментарий

@che_,

Отличные вопросы, без иронии.

И пока что ответ на них... хз :)

Лично мне они помогли сделать три сайд-проекта за в разы более короткое время, чем если бы я их делал руками, но: я знал, что хочу, знал, что надо делать, знал, какой код я хочу и т.п.

Возможно, они в целом повышают производительности ценой externalities: кода и фич становится больше, а качество все хуже, за что платят другие. Мой любимый пример — claude code. Ну и что, что он потребляет 68GB в пике. Пофиг, выкатываем в продакшн. Потом купим инжинеров, которые это пофиксят может быть: https://x.com/jarredsumner/status/2026497606575398987

  Развернуть 1 комментарий

@dmitriid, такой жде опыт, такие же мысли. Если проекты начинают приносить прибыль: нанимаем инженеров чтобы или переписать код с нуля и поправить то что ИИ налабал.

  Развернуть 1 комментарий
Vadim Chepegin решаю бизнес задачи с помощью IT автор 1 день, 12 часов назад

То есть Вы проверяли уже только результаты их труда, output? Можете подробнее рассказать о своем кейсе?

  Развернуть 1 комментарий

@che_, там подробности тривиальны. Я пишу код с помощью агента. Ставлю задачи через OpenSpec. Агент генерит код, я проверяю. И несколько особенностей того, как он генерит код, меня сильно напрягали. Например, он очень любил вызывать импорты библиотек внутри функций. Я лично считаю, что это зашквар, поэтому старался объяснить агенту, что так делать не надо. Перепробовал все известные мне способы. Сработали только хуки на Stop, которые вызывают линтеры, а линтеры проверяют то, что мне надо, и падают с ошибкой. После этого полегчало.

Хотя иногда все же случается, когда агент 9 раз вызывает хук, тот падает, агентв ызывает еще раз, и так по кругу. Потом сдается и говорит "я не в силах". Но тут я хотя бы вижу в чате, что он облажался.

  Развернуть 1 комментарий

@glader, как минимум, это вызывает серьезные утечки времени и токенов (бюджета). Спасибо, что поделились. Вы какого агента (название, версия) используете?

  Развернуть 1 комментарий

@che_, Claude Code, Opus 4.7, Sonnet 4.6.

  Развернуть 1 комментарий
Vadim Chepegin решаю бизнес задачи с помощью IT автор 1 день, 10 часов назад

Всё самое свежее и "умное". Действительно интересно в чем проблема. Я не пишу много на питоне, но какие-то скрипты делаю. У меня проблем, описанных Вами, пока не встречалось.

  Развернуть 1 комментарий

@che_, это просто по размеру проекта можно увидеть. После того как т посидишь над проектом с пол-годика, и внезапно очередное обновление у кого-то шила в жопе приводит к тому, что модель которая писала так-то начинает писать вот так-то.

Фактически, обновления этих моделей - это как установка новых ядер на GlaDOS. Проблему не решает, но всё выглядит по-другому.

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

Опять же, кто играл в Портал прекрасно представляют себе как работает ИИ. Это фактически - джин из бутылки. Выглядит так, что у тебя есть бесконечно желаний. Но по факту на каждом углу есть подъёб.

  Развернуть 1 комментарий

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

  Развернуть 1 комментарий
🕵️ Юзер скрыл свои комментарии от публичного просмотра...

@nemelnikov,

Кек. Более того, я об этом писал ещё в 2021 году. Там ещё больше цитат. https://roganov.me/ru/blog/ai-real-fears/

Это копия моей сатьи с хабра на моём личном блоге.

За пределы клуба можно выносить сколько угодно. Тока сделай одолжение, у меня в шапке профиля на Вастркие - ссылка на мою телегу. Ты её как автора укажи.

  Развернуть 1 комментарий
Vadim Chepegin решаю бизнес задачи с помощью IT автор 1 день, 8 часов назад

😱 Комментарий удален его автором...

  Развернуть 1 комментарий

😎

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

Что вообще здесь происходит?


Войти  или  Вступить в Клуб