malahov.io

Ralph Loop — цикл, который работает сам

Как я ушёл от «промптить задачу за задачей» к циклу план → задачи → ревью-агенты → валидация. Где эта конструкция выигрывает, сколько стоит фаза ревью и почему выкидывать E2E-тесты из цикла было ошибкой.

Автор: Georg Malahov

У меня незаметно устоялась новая практика работы. Сегодня, разбирая очередной pull request, я поймал себя на том, что она стала рутиной: Claude сам открывает браузер, проходит по базовым экранам приложения, чинит то, что явно сломано, и пишет рекомендации. Потом то же самое прохожу я руками и даю свои правки. Одна-две такие итерации на пункт — и изменения уезжают в pull request.

Ещё зимой я работал иначе: промптил задачу за задачей. Сидел рядом с агентом, давал задание, смотрел на результат, давал следующее. Циклом был я сам, и стоило мне отойти — всё останавливалось.

В середине марта я потратил день на то, что называю «точить пилу»: настроил Ralphex — открытый инструмент для автономных агентских запусков, про который узнал из «Радио-Т», подкаста про IT, который слушаю больше десяти лет. Требования у меня были простые: чтобы агенты работали параллельно, в безопасном контейнере и долго — до готовой задачи, а не до первого вопроса. Моя роль сдвинулась: планировать бизнес-логику, писать планы и принимать результат.

Планы я пишу тоже с Claude — про это я упоминал в июне: работа по готовому плану идёт сильно лучше, чем промптить задачу за задачей. Из этого вырос цикл, который в этой среде принято называть Ralph Loop — название не моё, инструментов с ним много: план → задачи → ревью-агенты → валидация. План разбивается на задачи, каждую выполняет отдельный агент, потом другие агенты делают ревью, а в конце прогоняются проверки: линтер, типы, юнит-тесты и E2E — сквозные тесты, которые кликают по приложению как настоящий пользователь.

Где это ломается, я тоже успел узнать. В мае я переписал цикл с Docker-контейнеров на нативных агентов Claude и заодно выкинул из него E2E-тесты — они разрослись до шестнадцати минут на прогон и стали неподдерживаемыми. Зря: сразу полезли явные недоработки — должно прийти письмо-уведомление, а его нет; кнопка должна быть неактивна, а она активна. В июне я потратил почти неделю, чтобы стабилизировать тесты и вернуть их в цикл, — теперь полный прогон занимает меньше двух минут. Вторая проблема — цена: фаза ревью расходует токены крайне быстро, одна задача за деньги обходилась мне в 17–18 долларов только на ревью. Третья — агент умеет эффектно буксовать: в начале июля на простую с виду задачу с навигацией свайпами сессия шла почти семь часов, запустила 227 фоновых под-агентов и что-то сделала, но криво — принимать такой результат и пользоваться им нельзя.

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

Слабое место не изменилось с марта: это я. На прошлой неделе я написал заранее десятка два планов и поставил их в очередь агентам: я стараюсь держать очередь заполненной, чтобы каждый следующий план продолжал предыдущий и агенты не простаивали. Они утверждают, что всё сделано, а открываешь приложение и видишь: работает, но выглядит неаккуратно. Ручная приёмка остаётся за мной, и именно на ней всё застревает. Вчера я сделал следующий шаг — отдал агенту доступ к своей серверной инфраструктуре. Если он научится проверять задачи под ключ, от старого способа работы у меня останется только привычка перепроверять. Оправдана ли она — покажет август, когда я доберусь до накопившегося.