Tutorial For Power Users

Hermes를 끝날 때까지 돌리기 — `/goal`과 `/subgoal`의 실전

Hermes Agent

Hermes Agent

@hermesagents

May 17, 2026

8 분 소요

대부분의 AI 에이전트는 한 번에 한 턴이다. 네가 친다, 저쪽이 답한다, 저쪽이 기다린다. 루프를 도는 건 너다. 에이전트는 함수 호출 한 번에 지나지 않는다.

Hermes Agent도 그 모드를 갖고 있다 — 사실 기본값이다. 그런데 /goal이라는 다른 모드도 같이 출하된다. 여기선 반대다 — 루프를 도는 건 에이전트다. 목표와 성공 기준을 한 번 잡아주면, 에이전트가 제안하고, 실행하고, 자기 평가하고, 재시도하고, 별도의 judge LLM이 기준을 충족했다고 인정할 때까지 계속 간다. v0.14.0(2026년 5월 16일)이 /subgoal을 추가해서, 살아 도는 루프에 새 기준을 끼워 넣을 수 있게 됐다 — 재시작 없이(#25449).

이 글에선 안에서 실제로 무슨 일이 벌어지는지, 이게 맞는 도구인 경우는 언제인지, 그리고 그게 잘못된 도구가 되는 실패 모드는 어디인지를 다룬다.

기본 모드(대비를 위해)

Hermes의 모든 채팅 세션은 사용자 메시지 하나당 한 턴이다. 에이전트가 네 메시지를 읽고, 필요하면 도구를 호출하고, 응답을 돌려준다. 작업이 안 끝났으면 네가 밀어줘야 한다: "계속해", "다시 해봐", "X는 어때". 바깥 루프는 네가 도는 거다.

탐색형 작업에는 이게 좋다 — "이 코드 설명해줘", "메모 초안 잡아줘", "버그 좀 찾아봐". 각 스텝 뒤에 에이전트가 멈춰서 네가 방향을 바꿀 수 있게 해주길 바라는 부류.

성공 조건이 구체적이고 거기까지 가는 길이 반복적인 작업엔 어울린다. "pytest가 통과할 때까지 이 모듈을 리팩터링해줘"는 네가 매 턴을 운전하면 30턴짜리 작업이다. /goal로는 한 줄짜리 명령이다.

/goal이 실제로 하는 일

/goal Make all tests in tests/api/ pass. Don't change the test assertions. Done when pytest exits 0.

이걸 보내면 세 가지 일이 일어난다:

  1. 1.목표 텍스트가 worker의 타깃 prompt가 된다. 이후 매 턴마다 worker 모델은 목표와 현재 베스트 시도를 포함하는 시스템 메시지를 받는다.
  2. 2.각 worker 턴 뒤에 별도의 "judge" LLM 호출이 돈다. judge는 목표, 현재 상태, 제안된 완료본을 본다. 돌아오는 건 둘 중 하나다 — "done"(루프 종료) 또는 "계속해, 아직 빠진 건 이것".
  3. 3.루프는 judge가 done이라고 할 때까지 계속된다 — 아니면 네가 /stop으로 멈출 때까지, 아니면 설정된 반복 한계에 닿을 때까지.

judge가 핵심이다. worker와 같은 LLM 호출이 아니고, 생각의 사슬도 못 본다 — 목표와 현재 상태만 본다. 그 분리가 /goal을 작동하게 만든다: 이미 자기 답이 맞다고 스스로 설득된 worker 모델은 형편없는 심판이다. 컨텍스트 없이 새로 호출된 LLM이 훨씬 낫다.

이 패턴은 Hermes 코드베이스 내부에서 "Ralph loop"라고 불린다. 표준 의사 코드 while not done: do(work); ralph = judge(work)에서 따온 이름이다. v0.14.0의 /subgoal 확장은, 사용자가 도는 루프에 새 judge 기준을 주입할 수 있게 한 것이다.

/subgoal — 도중에 기준 덧붙이기

모듈 리팩터링을 위해 /goal을 띄웠다. 세 번째 루프쯤에서, 리팩터링하는 김에 함수당 순환 복잡도를 10 이하로도 지키고 싶어졌다. 루프를 멈추고 다시 짜고 싶진 않다.

/subgoal Each function must have cyclomatic complexity <= 10.

다음 judge 라운드에서, 그 새 제약이 같이 반영된다. 현재 베스트 시도가 그걸 충족 못 하면 루프는 계속 돈다. 충족하면 루프가 빠진다.

이건 릴리스 노트의 한 줄 bullet로는 작아 보이는 기능이다 — "사용자가 살아 있는 /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

worker가 리팩터를 시도하고, judge가 두 조건을 확인한다. 둘 다 초록이면 루프가 빠진다.

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

worker가 CSS를 편집하고, judge가 browser 도구로 스크린샷을 찍어서 확인한다. 네가 끼지 않아도 여러 반복이 돈다.

버그 찾기

/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.

여기서 judge가 확인하는 건 산출물의 두 부분이 다 있는지다 — 최소 재현과 한 문단 설명 — 하나만 있으면 안 친다. 첫 초안의 설명이 너무 막연하면 /subgoal로 "설명은 관련 요청/응답 사이클을 언급해야 함" 같은 제약을 더 끼울 수 있다.

써선 안 되는 경우

/goal이 잘못된 도구가 되는 작업:

  • 성공 조건이 흐릿할 때. "더 우아하게 만들어줘" — judge가 일관되게 채점을 못 하니까 루프가 진동하거나 도장 찍는다. 여긴 턴 단위로 가라.
  • 일이 진행되는 걸 보고 싶을 때. 매 반복이 judge가 발동하기 전에 완료까지 돌기 때문에 턴 단위의 가시성을 얻을 수 없다. 중간 리뷰가 중요하면 턴 단위나 /handoff로 가라.
  • 속도보다 비용이 중요할 때. 매 루프 반복이 worker 호출 + judge 호출이다. 10번 반복하는 목표면 LLM 호출 20번을 사는 거다. 리팩터 작업엔 그만한 값을 한다, "이 변수 이름 뭐 할까"엔 낭비다.
  • 성공 기준을 진지하게 안 생각했을 때. 쓰레기 기준 → 쓰레기 루프. /goal은 구체성에 보상한다, 그리고 모호함이 있으면 에이전트는 그걸 파고든다.

/goal/handoff를 함께

v0.14.0은 /handoff도 출하했다 — 컨텍스트를 잃지 않고 살아 있는 세션을 모델 간에 옮긴다(#23395). 둘이 합쳐진다: 도는 /goal이 빠른 모델로는 못 푸는 데에 부딪히면, 진행 중인 목표를 깊이 추론하는 모델로 넘길 수 있다. judge는 같은 기준으로 채점을 계속한다, worker만 더 좋아진 거다.

/sessions(#20805)도 마찬가지다 — 목표를 잠시 중단하고, 다른 세션을 둘러보고, 나중에 그 목표를 다시 이어갈 수 있다. 루프 상태는 checkpoint 돼 있다.

에이전트 스택에서의 위치

자율성이 낮은 쪽에서 높은 쪽으로, 에이전트 일의 모양 세 가지:

  1. 1.턴 단위 — 네가 운전하고 에이전트가 답한다. 대화형.
  2. 2./goal — 네가 기준을 잡고 에이전트가 충족할 때까지 돈다. 경계 있는 자율.
  3. 3.Cron 스케줄링 — 에이전트가 스케줄에 따라 무인으로 돌고, 결과는 메시징 플랫폼으로 배달된다. 시간상으로 경계 없는 자율.

/goal이 가운데다. 예전에는 무겁게 옆에 붙어 있거나 커스텀 스크립트가 필요했던 종류의 작업에 딱 맞는 손길. v0.14.0의 /subgoal이 루프를 도는 중에도 조향 가능하게 만들었고, 그게 이걸 호기심에서 일상 도구로 바꿨다.

더 읽기

업데이트 구독

Hermes Agent 릴리스, 새 스킬, 새 통합 소식을 커뮤니티 시선으로 모아 보낸다. 스팸 없음, 언제든 해지 가능.