Главная / Статьи

Циклы программирования с использованием агентов: от одной строки в Bash до команды /goal, проверки и жесткие ограничения

Циклы агентного кодирования пошагово: однострочная команда bash, Claude Code /goal и /loop, проверка снаружи, три лимита расходов и навыки, которые стоит сохранить.

Издатель: REACTAPP.TOP11 мин чтения2572 слов

Источники: WTF Is a Agentic Coding Loop? And How to Build One.

Одно предложение Питера Штайнбергера определило ход дискуссий о программировании с использованием ИИ в июне 2026 года и набрало два миллиона просмотров: агентам для программирования больше не следует давать указания вручную, вместо этого следует создавать циклы, которые будут их управлять. Ответы превратились в споры о том, что это означает. Когда кто-то спросил, как это выглядит на практике, самый часто цитируемый ответ шутил, что об этом знают только два человека. Это смешно и неверно. Эта идея не является мистической, и способ её реализации — одна команда.

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

Три момента объясняют остальное:

  • Цикл — это скрипт, который отправляет запрос агенту, анализирует полученный результат, определяет, выполнена ли задача, и повторяет процесс в случае отрицательного результата. Человек больше не находится внутри цикла и не вводит указания вручную. Цикл создается один раз, а модель выступает в нем в роли подпроцедуры.
  • Самым простым полезным циклом является одна строка кода на bash, а самым эффективным — команда с одним слэшем. Для его запуска не требуется никаких фреймворков оркестрации, и начинать с чего-то более сложного — ошибка.
  • То, что отличает работающий цикл от того, который истощает бюджет, сводится к двум факторам: способу проверки собственного результата на соответствие внешней истине и четким условиям остановки, заставляющим его прекратить работу.

Определение и структура

Борис Черный создал Claude Code, и, по его словам, за последний месяц Claude Code написал каждый из его собственных вкладов в проект — 259 pull request, в то время как его IDE была установлена ещё в ноябре. Он просто описывает этот метод: он больше не задаёт вопросы Claude, циклы выполняются автоматически, а затем он сам решает, что делать дальше; его задача заключается лишь в написании циклов.

Его лестница из трёх ступеней делает эту идею конкретной. Год назад это был вручную написанный код с автодополнением. Затем появились несколько одновременных сессий агента, каждая из которых запускалась вручную. Теперь же программа сама запускает агента, а инженер может заняться чем-то другим. Работа поднялась на уровень выше — от написания кода к созданию инструмента для написания кода. Он ясно указывает, что это не приводит к увольнению инженеров. Кто-то всё равно должен решать, что создавать; хорошие инженеры остаются важными, а проверка результатов всегда имеет значение. Нажатия клавиш остались прежними, а способность к оценке — тоже.

Самый маленький цикл: одна строка bash

Вся концепция помещается в одну строку, и её однократная эксплуатация позволяет получить представление о ней. Её называют циклом Ральфа — в честь Ральфа Уиггума, а Джеффри Хантли сделал её популярной в 2025 году.

while :; do cat PROMPT.md | claude -p --dangerously-skip-permissions; done

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

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

Ум заключается в привычке, а не в коде. Чтобы предотвратить затухание длинных диалогов, каждая итерация начинается с фиксированного набора базовых файлов. Файлы-инструкции каждый раз указывают на одни и те же документы — обычно спецификацию и чек-лист, который агент отмечает по мере работы. Таким образом, каждый новый проход начинается с четкой ориентации, а фиксация прогресса на каждом этапе не позволяет агенту отклоняться или перерабатывать уже выполненную работу.

Полезен ли такой примитивный прием? Команда на хакатоне Y Combinator за одну ночь создала шесть репозиториев с помощью цикла Ralph, потратив около 297 долларов на API-услуги, что по их оценке эквивалентно примерно пятидесяти тысячам долларов в виде оплаты труда подрядчиков. Хантли таким же способом создал целый небольшой язык программирования. Хотя в качестве учебного инструмента такой простой подход со временем становится недостаточным, он позволяет понять основы всей концепции за полминуты.

Проблема в том, что те, кто лучше всех разбирается в этом подходе, считают его устаревшим. Цикл Ralph предполагает, что терминал остается открытым, и никогда не проверяет, завершена ли работа. Он просто выполняется бесконечно, и в следующих двух разделах рассматривается этот момент.

Один команд: /goal и /loop

Не требуется писать bash вручную. Claude Code включает две команды, которые более безопасно реализуют тот же цикл.

Команда /goal заставляет агента работать до тех пор, пока не будет выполнено указанное условие, и именно в этом условии заключается суть решения.

/goal all tests in test/auth pass and the lint step is clean,
      or stop after 20 turns

То, что отличает этот подход от простого цикла while true, — это следующий шаг. По окончании каждого раунда Claude Code передаёт условие и ход разговора отдельной небольшой, быстрой модели — по умолчанию Haiku, — которая отвечает «да» или «нет» и приводит причину. В случае ответа «нет» эта причина используется в качестве руководства для следующего раунда. Модель-исполнитель никогда не может сама заявить о завершении работы.

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

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

Автономная однократная работа осуществляется в режиме без графического интерфейса с использованием указанного флага и цели, указанной в кавычках. Процесс должен оставаться активным во время работы, поэтому ему требуется открытый терминал или сервер, а не закрытый ноутбук. Чтобы закрыть крышку, подходит Claude Code в облаке. Команда Ctrl+C прерывает локальную работу преждевременно.

Короткая практическая работа, состоящая из двух ходов и занимающая примерно сорок секунд, выглядит следующим образом.

> /goal all tests in test/auth pass, npm test exits 0, or stop after 15 turns
◎ /goal active · turn 1
  ran: npm test
  ✗ 2 failing in test/auth/login.test.ts
  judge: not done, expired-token case still throws◎ /goal active · turn 2
  edited src/auth/token.ts
  ran: npm test
  ✓ 41 passing, exit 0
  judge: done, npm test exits 0 and only auth files changed✓ goal achieved · 2 turns · ~$0.40

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

Команда /loop — это своего рода запланированный механизм, который контролирует процесс. Собственный пример Черны, предназначенный для запуска, стоит скопировать, заменив существительные.

/loop babysit all my PRs. Auto-fix build issues, and when
      comments come in, use a worktree agent to fix them.

Он повторяется с определёнными интервалами, обрабатывает всё новое, появившееся с прошлого прохождения, и продолжает работу до тех пор, пока кто-то его не остановит или он не признает, что работа завершена. Это поллинг, а не обработка событий, что достаточно для отслеживания pull-запросов и устранения сбоев. Записываются намерение и правила остановки, а шаги оставляются без упоминания.

Самопроверка делает его надёжным

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

Люди, которые используют такие решения, придерживаются одного принципа: окончание процесса определяется внешней проверкой, а не собственной оценкой модели. Цикл продолжается до тех пор, пока команда docker build не завершится успешно, контейнер не запустится и проверка работоспособности не пройдет; в этом случае мнение агента о том, что всё в порядке, не имеет значения. Объективные критерии заменяют собой субъективные ощущения. В псевдокоде структура такого цикла выглядит примерно так.

loop:
  agent: make progress on the task
  run:   npm test  (or the build, or the linter)
  if check passes:   done, exit
  if check fails:    feed the failure back, try again
  if no progress in N tries, or budget hit: stop and ping me

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

Сам по себе цикл — не источник магии; магия кроется в обратной связи внутри него. При наличии реальной проверки он функционирует как двигатель, а без неё просто генерирует счёт.

Механизмы, сохраняющие бюджет нетронутым

Поскольку генерация кода практически бесплатна, расходы смещаются на циклы, которые его запускают, а цикл без ограничений представляет собой настоящий финансовый риск. Uber ограничил каждого инженера 1 500 долларами в месяц на использование инструментов Claude Code и Cursor после того, как за четыре месяца был исчерпан весь годовой бюджет на ИИ. Производственные команды боятся циклов, которые никогда не заканчиваются, когда забытый терминал к утру превращается в счет на сумму в несколько тысяч долларов.

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

max_iterations:   stop after N turns           (the runaway cap)
no_progress:      stop if M turns change nothing (the stuck cap)
budget_ceiling:   stop at $X or T tokens         (the wallet cap)
on_stop:          ping me with the state and the reason

Команда /goal практически бесплатно дает возможность превысить лимит, добавляя условие остановки после 20 ходов и передавая флаг хода. Оставшиеся два параметра необходимо вводить вручную. Проверка отсутствия прогресса не встроена, поэтому самый простой способ — использовать хук Stop или небольшой обёрточный код, который сравнивает результаты git diff --stat между ходами и останавливает процесс после нескольких незменившихся раундов. Лимит расходов должен находиться в системе контроля трат провайдера, в виде жёсткого денежного ограничения для рабочего пространства, заданного один раз в консоли до начала любого цикла. Это звучит как описание создания циклов, пока тысячи агентов строят компанию за одну ночь, но на практике большая часть инженерных усилий направлена на обеспечение их остановки.

Актив внутри — это навык

Цикл — это лишь инфраструктура, а ценным является то, что он выполняет.

Штайнбергер повторяет второй совет, который имеет более долгосрочный эффект. Любое действие, выполняемое дважды, превращается в навык, который можно использовать снова, а любая сложная задача, решенная один раз, делает последующие выполнения проще. Цикл, который с каждой итерацией заново обучает способу выполнения тестов, поиску конфигураций и форматированию вывода, заставляет модель бесконечно переобучаться на проекте. Цикл, использующий небольшую библиотеку проверенных навыков с определенными названиями — таких как выполнение набора тестов, создание пул-реквеста в соответствии с правилами команды или развертывание на стадионе — развивается сам по себе, поскольку каждая итерация начинается с уже имеющихся навыков. Это снижает затраты и минимизирует отклонения. Навыки обеспечивают ценность, а цикл лишь вызывает их в определенном порядке.

Циклы, контролирующие другие циклы

На границе, а также в том смысле, который имеют в виду Штайнбергер и Черный, циклы контролируют другие циклы. Контролирующий цикл одновременно распределяет задачи между множеством агентов, отслеживает их действия и выбирает следующий шаг, сохраняя стабильное состояние, поддерживаемое системой git, чтобы сбой не приводил к полной потере данных. Примером может служить open-source проект Gas Town Стива Йегге, в котором двадцать–тридцать экземпляров Claude Code управляются агентом-мэром, в то время как патрульные агенты постоянно выполняют свои задачи. Динамические рабочие процессы в Claude Code представляют собой упакованную форму такой организации, при которой агент пишет скрипт оркестрации и управляет группой подагентов.

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

Первый цикл на этой неделе

  1. Проверьте функцию вручную на временной ветке. Создайте ветку вроде loop-test и сами запустите команду тестирования, убедившись, что при возникновении ошибок код выполнения будет не нулевым. Если агент не может отличить успешный от неудачного результата, то и судья тоже не сможет.
  2. Выберите одну задачу с четко определенным конечным этапом. Подойдут ненадежные тесты, небольшие операции миграции или очистка кода. Игнорируйте задачи, где завершение работы зависит от субъективных оценок.
  3. Сформулируйте цель в виде /goal с ограничением. Используйте реальную команду, а не расплывчатое описание; например, вызов без графического интерфейса с лимитом в 15 операций, условием, указывающим на тесты аутентификации, кодом выполнения, равным нулю, и остановкой после 15 операций.
  • Убедитесь, что агент может выполнять проверку от начала до конца. Необходимо установить все зависимости, ничто не должно ждать нажатия клавиши, а при сбое должен быть получен код выхода, отличный от нуля. При первых запусках процесс тихо застывает на этом этапе.
  • Присутствуйте при первом запуске. Посмотрите, почему система сообщает о незавершении работы, и как агент реагирует на сбой проверки. Команда Ctrl+C прерывает её.
  • Установите лимиты расходов перед тем, как что-либо запускать без присмотра. Укажите жесткий лимит в долларах для рабочей области в консоли, а также ограничение количества шагов на каждый запуск: первое предотвращает неограниченное выполнение, а второе — постепенное истощение ресурсов.
  • Сохраняйте повторяющиеся элементы в виде навыков. Команды тестирования, шаги pull request или любые регулярно используемые пояснения записываются в файл SKILL.md, чтобы следующий цикл начинался с уже имеющихся знаний.
  • К концу недели появляется реальная работа, которую никто не писал, цикл, проверяющий и корректирующий себя, а также ограничение, предотвращающее его выход за рамки. Это и есть в миниатюре вся практика.

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

    Связанные материалы

  • Ornith-1.0: Модели кодирования с открытыми весами от 9B до 397B под лицензией MIT — Что обещает версия Ornith-1.0 на тестах SWE-Bench и Terminal-Bench, как она обучает структуру с решением и какое это может означать для агентов для кодирования с закрытым исходным кодом.