본문으로 건너뛰기

지속 목표 (/goal)

/goal은 Hermes에 여러 턴에 걸쳐 유지되는 목표를 부여합니다. 각 턴이 끝날 때마다 가벼운 판정 모델이 assistant의 마지막 응답을 보고 목표가 충족되었는지 확인합니다. 아직 끝나지 않았다면 Hermes는 같은 세션에 continuation prompt를 자동으로 다시 넣고 작업을 이어 갑니다. 목표가 달성되거나, 사용자가 일시 중지/해제하거나, 턴 예산을 모두 사용할 때까지 계속됩니다.

이 기능은 Eric Traut(OpenAI)가 만든 Codex CLI 0.128.0의 /goal에서 직접 영감을 받은 Hermes식 Ralph loop입니다. 여러 턴에 걸쳐 목표를 계속 유지하고 달성될 때까지 멈추지 않는다는 핵심 아이디어는 Codex 쪽에서 온 것입니다. Hermes의 구현은 독립적이며 Hermes 아키텍처에 맞게 조정되었습니다.

사용할 때

매 턴마다 사용자가 다시 "계속해"라고 말하지 않아도 Hermes가 스스로 반복 작업을 이어가길 원할 때 /goal을 사용합니다.

  • "src/의 모든 lint 오류를 수정하고 ruff check가 통과하는지 검증해"
  • "repo Y의 feature X를 테스트까지 포함해 포팅하고 CI를 green으로 만들어"
  • "mid-run compression 중 session ID가 가끔 drift되는 이유를 조사하고 보고서를 작성해"
  • "EXIF 날짜 기준으로 파일명을 바꾸는 작은 CLI를 만들고 photos/ 폴더로 테스트해"

agent가 한 턴만 처리하고 멈춰도 되는 작업에는 /goal이 필요 없습니다. 원래라면 사용자가 "keep going"을 세 번쯤 말해야 하는 작업에서 특히 효과적입니다.

빠른 시작

/goal Fix every failing test in tests/hermes_cli/ and make sure scripts/run_tests.sh passes for that directory

실행하면 대략 다음 흐름을 보게 됩니다.

  1. 목표 수락 - ⊙ Goal set (20-turn budget): <your goal>
  2. 1턴 실행 - Hermes가 사용자가 일반 메시지로 목표를 보낸 것처럼 작업을 시작합니다.
  3. 판정 실행 - 턴이 끝나면 판정 모델이 done 또는 continue를 결정합니다.
  4. 필요하면 loop 계속 - continue이면 ↻ Continuing toward goal (1/20): <judge's reason>가 표시되고 Hermes가 다음 단계를 자동으로 수행합니다.
  5. 종료 - 결국 ✓ Goal achieved: &lt;reason&gt; 또는 ⏸ Goal paused — N/20 turns used를 보게 됩니다.

명령

명령동작
/goal &lt;text&gt;지속 목표를 설정하거나 교체합니다. 첫 턴을 즉시 시작하므로 별도 메시지를 보낼 필요가 없습니다.
/goal 또는 /goal status현재 목표, 상태, 사용한 턴 수를 표시합니다.
/goal pause목표는 지우지 않고 자동 continuation loop만 멈춥니다.
/goal resumeloop를 다시 시작합니다. 턴 카운터는 0으로 초기화됩니다.
/goal clear목표를 완전히 제거합니다.

CLI와 모든 gateway platform(Telegram, Discord, Slack, Matrix, Signal, WhatsApp, SMS, iMessage, Webhook, API server, web dashboard)에서 동일하게 동작합니다.

동작 세부 사항

판정 모델

각 턴이 끝나면 Hermes는 auxiliary model에 다음 정보를 전달합니다.

  • 지속 목표 텍스트
  • agent의 가장 최근 final response(마지막 약 4KB 텍스트)
  • strict JSON으로 답하라고 지시하는 system prompt: {"done": &lt;bool&gt;, "reason": "&lt;one-sentence rationale&gt;"}

판정 모델은 일부러 보수적으로 동작합니다. 응답이 목표 완료를 명시적으로 확인하거나, 최종 산출물이 분명히 만들어졌거나, 목표가 달성 불가능하거나 막힌 상태일 때만 목표를 done으로 표시합니다. 막힌 상태도 DONE으로 처리하되 block reason을 남깁니다. 불가능한 작업에 턴 예산을 계속 태우지 않기 위해서입니다.

Fail-open semantics

판정 모델 호출에서 오류가 나면(network blip, malformed response, unavailable aux client 등) Hermes는 verdict를 continue로 취급합니다. 판정기가 깨졌다고 진행이 멈추지는 않습니다. 실제 안전장치는 턴 예산입니다.

턴 예산

기본값은 20 continuation turn입니다. (config.yamlgoals.max_turns) 예산에 도달하면 Hermes는 자동으로 목표를 pause하고 다음에 무엇을 할 수 있는지 정확히 알려 줍니다.

⏸ Goal paused — 20/20 turns used. Use /goal resume to keep going, or /goal clear to stop.

/goal resume은 카운터를 0으로 초기화하므로, 긴 작업도 적당한 단위로 끊어 이어갈 수 있습니다.

사용자 메시지가 항상 우선함

목표가 활성화되어 있는 동안 사용자가 실제 메시지를 보내면 continuation loop보다 우선 처리됩니다. CLI에서는 메시지가 queued continuation보다 먼저 _pending_input에 들어가고, gateway에서는 같은 방식으로 adapter FIFO를 통과합니다. 사용자의 턴이 끝난 뒤 판정 모델이 다시 실행됩니다. 따라서 사용자의 메시지가 목표를 완료했다면 판정 모델이 이를 감지하고 loop를 멈춥니다.

중간 실행 안전성(gateway)

agent가 이미 실행 중이어도 /goal status, /goal pause, /goal clear는 안전하게 실행할 수 있습니다. 이 명령들은 control-plane state만 건드리며 현재 턴을 중단하지 않습니다. 실행 중에 목표(/goal &lt;new text&gt;)를 설정하려고 하면 먼저 /stop을 사용하라는 메시지와 함께 거부됩니다. 이전 continuation과 새 목표가 서로 race하지 않게 하기 위한 동작입니다.

지속성

goal state는 goal:&lt;session_id&gt; 키로 SessionDB.state_meta에 저장됩니다. 즉 /resume을 사용하면 중단한 지점에서 그대로 이어갈 수 있습니다. 목표를 설정하고 노트북을 닫은 뒤 다음 날 돌아와 /resume을 실행해도, 목표는 active, paused, done 중 마지막 상태 그대로 유지됩니다.

Prompt cache

continuation prompt는 history에 추가되는 일반 user-role message입니다. system prompt를 바꾸거나, toolset을 교체하거나, Hermes의 prompt cache를 무효화하는 방식으로 대화를 변경하지 않습니다. 20턴짜리 goal을 실행해도 cache 관점에서는 일반 대화 20턴과 동일하게 동작합니다.

설정

~/.hermes/config.yaml에 추가합니다.

goals:
# Max continuation turns before Hermes auto-pauses and asks you to
# /goal resume. Default 20. Lower this if you want tighter loops;
# raise it for long-running refactors.
max_turns: 20

판정 모델 선택

판정에는 goal_judge auxiliary task가 사용됩니다. 기본적으로는 main model로 resolve됩니다. 자세한 내용은 Auxiliary Models를 참고하세요. 비용을 줄이기 위해 판정을 저렴하고 빠른 모델로 route하고 싶다면 override를 추가합니다.

auxiliary:
goal_judge:
provider: openrouter
model: google/gemini-3-flash-preview

판정 호출은 작고(출력 약 200 token), 턴마다 한 번만 실행됩니다. 보통은 저렴하고 빠른 모델이 적합합니다.

예제 walkthrough

You: /goal Create four files /tmp/note_{1..4}.txt, one per turn, each containing its number as text

⊙ Goal set (20-turn budget): Create four files /tmp/note_{1..4}.txt, one per turn, each containing its number as text

Hermes: Creating /tmp/note_1.txt now.
💻 echo "1" > /tmp/note_1.txt (0.1s)
I've created /tmp/note_1.txt with the content "1". I'll continue with the remaining files on the next turn as you specified.

↻ Continuing toward goal (1/20): Only 1 of 4 files has been created; 3 files remain.

Hermes: [Continuing toward your standing goal]
💻 echo "2" > /tmp/note_2.txt (0.1s)
Created /tmp/note_2.txt. Two more to go.

↻ Continuing toward goal (2/20): 2 of 4 files created; 2 remain.

Hermes: [Continuing toward your standing goal]
💻 echo "3" > /tmp/note_3.txt (0.1s)
Created /tmp/note_3.txt.

↻ Continuing toward goal (3/20): 3 of 4 files created; 1 remains.

Hermes: [Continuing toward your standing goal]
💻 echo "4" > /tmp/note_4.txt (0.1s)
All four files have been created: /tmp/note_1.txt through /tmp/note_4.txt, each containing its number.

✓ Goal achieved: All four files were created with the specified content, completing the goal.

You: _

네 턴, 한 번의 /goal 호출, 사용자의 "keep going" prompt는 0번입니다.

판정이 틀렸을 때

어떤 판정 모델도 완벽하지 않습니다. 특히 다음 두 가지 실패 모드를 주의하세요.

False negative - 목표가 실제로는 끝났는데 판정 모델이 continue라고 판단하는 경우. 이 경우 턴 예산이 마지막 안전장치가 됩니다. ⏸ Goal paused가 표시되면 /goal clear를 실행하거나 새 메시지를 보내면 됩니다.

False positive - 아직 작업이 남았는데 판정 모델이 done이라고 판단하는 경우. ✓ Goal achieved가 표시되지만 실제로는 부족하다는 것을 사용자가 알 수 있습니다. 후속 메시지로 계속 진행하게 하거나, /goal &lt;more specific text&gt;처럼 더 구체적인 목표로 다시 설정하세요. 판정 모델의 system prompt는 false positive보다 false negative가 더 자주 일어나도록 일부러 보수적으로 설계되어 있습니다.

판정 결과가 납득되지 않는다면 ↻ Continuing toward goal 또는 ✓ Goal achieved 줄의 reason text를 보세요. 판정 모델이 무엇을 근거로 판단했는지 알 수 있으며, 보통 목표 문장이 모호했는지 또는 모델 응답이 부족했는지 진단하기에 충분합니다.

출처

/goalRalph loop 패턴에 대한 Hermes식 구현입니다. 여러 턴에 걸쳐 목표를 유지하고, 달성될 때까지 멈추지 않으며, create/pause/resume/clear control을 제공하는 user-facing design은 OpenAI Codex 팀의 Eric Traut가 Codex CLI 0.128.0에서 대중화하고 출시했습니다. Hermes의 구현은 독립적입니다. 중앙 CommandDef registry, SessionDB.state_meta persistence, auxiliary-client judge, gateway 측 adapter-FIFO continuation을 사용합니다. 다만 아이디어의 출처는 Codex이며, 그 점을 명확히 밝힙니다.