Большинство AI-агентов ходят по одному ходу за раз. Ты пишешь, они отвечают, они ждут. Цикл крутишь ты. Сам агент — просто вызов функции.
В Hermes Agent такой режим тоже есть — он дефолтный. Но рядом с ним лежит другой режим, который называется /goal — и тут цикл крутит уже агент. Ты задаёшь цель плюс критерии успеха, агент предлагает, исполняет, оценивает, перепробывает и крутится до тех пор, пока отдельный judge-LLM не согласится, что критерии достигнуты. v0.14.0 (16 мая 2026) добавил /subgoal, чтобы можно было подкладывать новые критерии в живой цикл прямо на лету, без перезапуска (#25449).
Этот пост разбирает, что в реальности происходит, когда это правильный инструмент, и какие сценарии падения превращают его в инструмент неправильный.
Дефолтный режим (для контраста)
Каждая чат-сессия в Hermes — один ход на одно пользовательское сообщение. Агент читает твоё сообщение, опционально дёргает tool'ы и возвращает ответ. Если задача не закрыта — ты должен подтолкнуть: «продолжай», «попробуй ещё раз», «а что насчёт X». Внешний цикл крутишь ты.
Это нормально для разведывательной работы — «объясни этот код», «набросай заметку», «найди мне баг». Тебе и нужно, чтобы агент останавливался после каждого шага, чтобы ты мог развернуть курс.
Это не нормально для задач, где условие успеха конкретное, а путь к нему — итеративный. «Отрефакторь этот модуль, пока pytest не пройдёт» — это тридцать ходов, если ты крутишь каждый из них руками. С /goal это одна команда.
Что /goal на самом деле делает
/goal Make all tests in tests/api/ pass. Don't change the test assertions. Done when pytest exits 0.
Когда ты это посылаешь, происходят три вещи:
- 1.Текст цели становится target-промптом для воркера. Каждый следующий ход воркер-модель получает system-message, в котором лежит цель и текущая лучшая попытка.
- 2.После каждого хода воркера запускается отдельный вызов LLM-судьи. Судья видит цель, текущее состояние и предлагаемое решение. Возвращает либо «done» (цикл выходит), либо «продолжай, вот чего ещё не хватает».
- 3.Цикл крутится, пока судья не скажет done — либо пока ты не остановишь его
/stop'ом, либо пока не упрёшься в настроенный лимит итераций.
Судья — ключевая деталь. Это не тот же самый вызов LLM, что воркер, и судья не видит цепочку рассуждений — только цель и текущее состояние. Именно эта развязка и заставляет /goal работать: воркер-модель, которая уже сама себя убедила, что ответ правильный, — плохой судья. Свежий LLM-вызов, у которого нет контекста, — гораздо лучше.
Этот паттерн внутри кодовой базы Hermes зовут «Ralph loop» — по канонической псевдокод-формуле while not done: do(work); ralph = judge(work). Расширение /subgoal в v0.14.0 даёт пользователю возможность подсовывать новые критерии в уже работающий цикл.
/subgoal — дописывать критерии на лету
Ты запустил /goal отрефакторить модуль. Три итерации внутрь ты понимаешь — заодно хорошо бы, чтобы рефакторинг удерживал цикломатическую сложность под 10 на функцию. Останавливать цикл и перезапускаться не хочется.
/subgoal Each function must have cyclomatic complexity <= 10.
В следующий запуск судья учтёт этот новый констрейнт. Если текущая лучшая попытка его не проходит — цикл крутится дальше. Если проходит — цикл выходит.
Это та фича, которая в release-notes-буллете выглядит мелко — «пользователь может добавлять критерии в активный /goal», — но в реальности оказывается несущей опорой для каждого, кто живёт в этом цикле. Реальные цели уточняются по ходу того, как ты смотришь, что делает агент. Без /subgoal единственным способом уточниться было /stop + переопределить + снова /goal — с потерей всего прогресса.
Примеры из практики
Рефакторить, пока тесты не пройдут
/goal Refactor src/api/users.py so the User class follows the new naming convention in src/conventions.md. Don't break any existing tests. Done when:
1. pytest exits 0
2. The User class matches the convention rules in conventions.md
Воркер пробует рефакторинги, судья проверяет оба условия. Когда оба зелёные, цикл выходит.
Доводить UI до ума итерациями
/goal Make the button on /pricing more prominent. Done when:
1. The button is the largest interactive element above the fold on desktop
2. It uses the primary brand color (#FF5A50)
3. Existing Lighthouse accessibility score doesn't drop
Воркер правит CSS, судья делает скриншот через browser-tool и проверяет. Куча итераций возможна без того, чтобы ты сидел рядом.
Найти баг
/goal Find the cause of the intermittent test failure in tests/auth/test_session.py::test_logout_clears_cookie. Done when you produce a minimal failing repro and a one-paragraph explanation.
Судья тут проверяет, что обе части deliverable'а на месте — репро и объяснение, — а не только что-то одно прилетело. /subgoal даёт возможность добавить ограничение вроде «объяснение должно ссылаться на соответствующий request/response-цикл», если первый черновик слишком размытый.
Когда не надо это использовать
/goal — неправильный инструмент для задач, где:
- •Условие успеха размыто. «Сделай это поэлегантнее» — судья не может это стабильно оценивать, и цикл либо колеблется, либо штампует. Тут — ход-за-ходом.
- •Тебе важно видеть работу по ходу. Каждая итерация добегает до конца до того, как стартует судья, так что покадровой видимости той же нет. Если нужен midstream-обзор, ходи ход-за-ходом или подключай
/handoff. - •Стоимость важнее скорости. Каждая итерация цикла = один вызов воркера плюс один вызов судьи. На 10 итераций ты платишь 20 LLM-вызовов. Окупается на рефакторинге; разорительно для «как мне назвать эту переменную».
- •Ты не подумал над критериями успеха. Мусорные критерии → мусорный цикл.
/goalнаграждает за конкретику, а агент проэксплуатирует любую двусмысленность.
Как /goal стыкуется с /handoff
v0.14.0 заодно выкатил /handoff — он переносит живую сессию между моделями без потери контекста (#23395). Эти двое отлично складываются: ты можешь передать goal-в-процессе с быстрой модели на reasoning-тяжёлую, когда цель упёрлась в место, которое быстрая не закрывает. Судья продолжит ставить оценки по тем же критериям; воркер просто стал получше.
То же самое с /sessions (#20805) — можно приостановить goal, сходить в другую сессию и вернуться к этому позже. Состояние цикла лежит в checkpoint'е.
Куда это встраивается в стек агентских инструментов
Три формы автономной работы, по нарастающей — сколько за агентом надо смотреть:
- 1.Ход-за-ходом — рулишь ты, агент отвечает. Разговорный.
- 2.
/goal— ты задаёшь критерии, агент крутится, пока они не сошлись. Ограниченная автономия. - 3.Cron-расписание — агент крутится без присмотра по расписанию, с доставкой в мессенджеры. Без ограничения автономии во времени.
/goal — это середина. Это правильный замах для целого класса задач, которые раньше требовали либо тяжёлой няньки, либо custom-скрипта. /subgoal из v0.14.0 делает цикл рулимым на лету — и именно это превращает его из любопытной диковины в ежедневный инструмент.