Claude Code /goal vs Ralph Loop 완벽 비교: 둘 다 반복인데 본질적으로 무엇이 다른가
Claude Code /goal vs Ralph Loop 완벽 비교: 둘 다 반복인데 본질적으로 무엇이 다른가
TL;DR (3줄 요약)
/goal은 매 턴마다 별도 Haiku 모델이 "목표 달성 여부"를 판정해 같은 세션 안에서 멈추는 단거리 감리 시스템입니다. Ralph Loop는 세션 자체를 반복 생성하면서 파일과 git 이력을 누적해 장기간 자율 작업하는 무인 공사 시스템입니다. 짧고 명확한 목표라면/goal, 며칠~수개월짜리 PRD 수준 작업이라면 Ralph Loop를 선택하세요.
둘 다 반복인데, 왜 헷갈릴까?
Claude Code를 쓰다 보면 자연스럽게 이 질문에 도달합니다.
"어? /goal도 완료될 때까지 계속 시도하고, Ralph Loop도 완료될 때까지 계속 시도하잖아. 그럼 뭐가 달라?"
표면만 보면 맞습니다. 둘 다 "목표가 달성될 때까지 AI가 알아서 반복한다"는 약속을 합니다. 그런데 어떻게 반복하는지, 누가 완료를 판단하는지, 어떤 데이터로 판단하는지가 근본적으로 다릅니다.
비유로 시작하겠습니다.
/goal= 건물 한 층을 올릴 때마다 감리사가 현장에 와서 설계도와 대조하고 "통과/재시공" 판정을 내리는 시공 방식- Ralph Loop = 설계도(PRD)를 건네주면 로봇 공사팀이 깃발이 꽂힐 때까지 24시간 무인으로 공사하는 방식
감리사는 당신이 눈앞에서 지켜보는 작업에 적합하고, 무인 공사는 당신이 자는 동안에도 돌아가야 하는 작업에 적합합니다.
/goal 메커니즘 해부
/goal은 Claude Code의 공식 슬래시 명령어입니다. 사용법은 단순합니다.
/goal "테스트 커버리지를 80% 이상으로 올려라"
이 명령 뒤에서 무슨 일이 벌어지는지 분해해 보겠습니다.
Session-scoped Stop hook 래퍼
/goal을 실행하면 현재 세션에 Stop hook이 설치됩니다. Claude가 한 턴을 완료하고 멈추려 할 때마다 이 hook이 개입합니다.
Haiku evaluator가 매 턴 판정
멈추기 전에 별도의 Claude Haiku 모델이 두 가지 정보를 받습니다.
- 처음 설정한 완료 조건
- 현재 세션의 대화 transcript 전체
Haiku는 이 두 가지를 비교해서 yes 또는 no를 반환합니다. yes면 진짜 멈춥니다. no면 왜 아직 안 됐는지 이유(reason)를 생성하고, 그 이유가 다음 턴의 가이드로 주입됩니다.
핵심 제약: transcript가 전부다
여기서 중요한 설계 제약이 있습니다. Haiku evaluator는 파일시스템에 접근하지 못하고 명령도 실행하지 못합니다. 오직 transcript만 봅니다. 그래서 종료 조건은 반드시 대화 내용에 표면화될 수 있어야 합니다.
"테스트 커버리지 80% 달성" 같은 조건은 Claude가 커버리지 수치를 터미널 출력으로 보여줄 수 있으니 OK입니다. 반면 "코드베이스의 전반적인 품질을 높여라" 같은 모호한 조건은 evaluator가 판단하기 어렵습니다.
Ralph Loop 메커니즘 해부
Ralph Loop는 Geoffrey Huntley가 설계하고 Anthropic이 공식 플러그인으로 채택한 자율 반복 프레임워크입니다. 별명인 "Ralph Wiggum"은 심슨즈의 캐릭터에서 따왔는데, 단순하지만 쉬지 않고 달리는 특성을 반영합니다.
/ralph-loop "결제 모듈을 완성하라" --completion-promise "PAYMENT_MODULE_COMPLETE"
--max-iterations 50
외부 루프가 세션을 감싼다
Ralph Loop의 핵심은 Claude 세션 바깥에 제어 루프가 있다는 점입니다. Bash while-true 구조로 Claude 세션 전체를 반복합니다.
Stop hook이 exit signal을 가로챈다
Claude가 한 세션을 마치고 정상 종료하려 할 때 Stop hook이 이 신호를 가로챕니다. 외부 스크립트가 Claude의 응답 전체를 스캔해서 completion-promise로 지정한 문자열(예: PAYMENT_MODULE_COMPLETE)을 찾습니다.
- 문자열 발견 → 루프 종료
- 문자열 미발견 → 원본 프롬프트 재투입, 새 iteration 시작
새 세션, 리셋된 컨텍스트, 누적된 파일
가장 중요한 특성입니다. 매 iteration마다 새 Claude 세션이 열립니다. 컨텍스트는 리셋됩니다. 하지만 파일시스템과 git 이력은 누적됩니다. 이전 iteration에서 작성한 코드가 다음 iteration의 출발점이 됩니다.
이것이 Ralph Loop가 수개월짜리 작업을 처리할 수 있는 이유입니다. 컨텍스트 윈도우 한계를 세션 경계로 분할하고, 결과물은 git으로 영속화합니다.
본질적 차이 3가지
두 메커니즘을 해부했으니 이제 핵심 차이를 정리하겠습니다.
| 축 | /goal | Ralph Loop |
|---|---|---|
| 반복 단위 | 턴 (turn) | 세션 (session) |
| 종료 판정자 | Haiku evaluator (AI) | 문자열 매칭 (스크립트) |
| 평가 데이터 | 대화 transcript | 파일 + git 이력 |
| 컨텍스트 | 누적 (같은 세션) | 리셋 (새 세션마다) |
| 평균 지속 시간 | 분 단위 | 수시간~수개월 |
| 비용 통제 | 자동 (evaluator가 판단) | 수동 (budget cap 필수) |
| 최적 작업 유형 | 단발 명확 목표 | 장기 자율 PRD |
1. 반복 단위: 턴 vs 세션
/goal은 턴 단위로 반복합니다. 한 번 응답하고, 평가하고, 계속할지 멈출지 결정합니다. 이 모든 과정이 하나의 세션 안에서 일어납니다.
Ralph Loop는 세션 단위로 반복합니다. Claude가 한 세션을 완전히 끝낸 뒤에야 루프가 돌아갑니다.
2. 판정자: AI vs 스크립트
/goal의 판정자는 AI(Haiku)입니다. 자연어로 된 목표를 이해하고 달성 여부를 추론합니다. 유연하지만 false-positive 위험이 있습니다.
Ralph Loop의 판정자는 단순 문자열 매칭 스크립트입니다. 정확하지만 Claude가 해당 문자열을 명시적으로 출력하지 않으면 절대 멈추지 않습니다.
3. 평가 데이터: transcript vs 파일+git
이것이 가장 실질적인 차이입니다.
/goal의 evaluator는 파일을 열어볼 수 없습니다. 테스트 결과를 보려면 Claude가 pytest 출력을 채팅창에 보여줘야 합니다.
Ralph Loop의 판정 시스템은 파일 전체와 git 로그를 볼 수 있습니다. 코드가 실제로 동작하는지, 어떤 커밋이 쌓였는지를 기반으로 판단합니다.
언제 무엇을 쓸 것인가: 실전 선택 가이드
/goal을 선택하는 상황
- 작업 시간: 30분 이내로 끝날 것으로 예상
- 목표 명확성: "유닛 테스트 추가", "함수 리팩토링", "타입 에러 수정" 수준
- 결과 확인: 터미널 출력만으로 완료 여부를 판단할 수 있음
- 감독 의향: 진행 상황을 실시간으로 보고 싶음
# /goal 적합 사례
/goal "auth.ts의 모든 함수에 JSDoc 주석을 추가하라"
/goal "빌드 에러를 모두 수정하고 npm run build가 성공하도록 하라"
Ralph Loop를 선택하는 상황
- 작업 시간: 수시간 이상, 심지어 수일~수개월
- 목표 복잡성: PRD 전체 구현, 새 기능 모듈 완성, 레거시 마이그레이션
- 비감독 실행: 자는 동안, 외출 중에도 돌아가야 함
- git 이력 중요: 작업 과정이 커밋으로 남아야 함
# Ralph Loop 적합 사례
/ralph-loop "결제 모듈 PRD를 완전히 구현하라" \
--completion-promise "PAYMENT_MODULE_COMPLETE" \
--max-iterations 100
/ralph-loop "Python 2 코드베이스를 Python 3.12로 마이그레이션하라" \
--completion-promise "MIGRATION_COMPLETE" \
--max-iterations 200
위험과 비용 통제
/goal의 위험: False-positive
Haiku evaluator가 AI이므로 "충분히 됐다"고 잘못 판단할 수 있습니다. 특히 모호한 목표를 줬을 때 발생합니다. 구체적이고 측정 가능한 조건을 설정하는 것이 핵심입니다.
또한 evaluator가 파일을 볼 수 없으므로, 복잡한 결과물(예: 그래픽 렌더링, 데이터베이스 스키마 변경)은 transcript에 검증 결과를 명시적으로 출력하도록 지시해야 합니다.
Ralph Loop의 위험: 무한 루프
가장 큰 위험입니다. completion-promise 문자열을 Claude가 출력하지 못하는 구조라면 영원히 돌 수 있습니다. 두 가지 안전장치가 필수입니다.
# 1. --max-iterations로 상한 설정 (필수)
/ralph-loop "작업" --completion-promise "DONE" --max-iterations 50
# 2. budget cap 별도 모니터링
export CLAUDE_BUDGET_CAP=50 # 달러 단위
또한 completion-promise는 다른 문맥에서 우연히 등장할 수 없는 고유한 문자열을 사용하세요. DONE보다 PROJECT_ALPHA_PAYMENT_V2_COMPLETE 같은 구체적 식별자가 안전합니다.
핵심 원칙:
/goal은 AI가 비용을 자동으로 통제하지만, Ralph Loop는 당신이 수동으로 상한을 설정해야 합니다.
실증 사례: 실제로 이걸로 뭘 만들었나
Geoffrey Huntley: 3개월짜리 프로그래밍 언어 구축
Ralph Loop를 설계한 Geoffrey Huntley 본인이 가장 극단적인 사례입니다. 그는 Ralph Loop를 3개월간 연속으로 실행해 새 프로그래밍 언어를 통째로 구현했습니다. 컴파일러, 런타임, 표준 라이브러리까지 포함한 작업이었습니다.
하나의 Claude 세션으로는 컨텍스트 한계 때문에 불가능한 규모입니다. Ralph Loop는 세션을 수백 번 반복하면서 각 세션의 결과를 git에 누적했고, 다음 세션은 그 위에서 시작했습니다.
그의 원본 글(ghuntley.com/loop)은 Ralph Loop의 설계 철학을 가장 잘 설명하는 레퍼런스입니다.
YC 해커톤 팀: 하룻밤에 6개 레포 출시
Y Combinator 해커톤에 참가한 팀이 Ralph Loop를 활용해 하룻밤 사이에 6개 이상의 독립 레포지터리를 출시했습니다. 각 레포마다 별도의 Ralph Loop를 실행하고, 팀원들은 잠을 자는 동안 AI가 코딩했습니다.
총 API 비용은 $297이었습니다. 인간 개발자 팀이 같은 작업을 하룻밤에 하려면 불가능하거나 훨씬 많은 비용이 들었을 것입니다.
이 사례는 Ralph Loop의 진짜 가치가 "자동화"가 아니라 **"인간의 수면 시간을 생산 시간으로 전환"**하는 데 있음을 보여줍니다.
관련 글: Claude Code 자동화 완전 가이드
자주 묻는 질문 (FAQ)
Q: /goal과 Ralph Loop를 동시에 쓸 수 있나요?
기술적으로는 Ralph Loop의 각 iteration 안에서 /goal을 사용할 수 있습니다. 하지만 권장하지 않습니다. 각 iteration이 단순하고 명확해야 Ralph Loop의 completion-promise 판정이 신뢰할 수 있습니다. 한 iteration 안에 너무 많은 목표를 넣으면 completion-promise를 출력하는 타이밍이 불명확해집니다.
Q: Ralph Loop는 컨텍스트가 리셋된다고 했는데, 이전 작업 내용을 어떻게 이어받나요?
파일시스템과 git이 메모리 역할을 합니다. 이전 iteration에서 작성한 코드, 커밋 메시지, README가 새 세션의 출발점이 됩니다. Claude는 새 세션 시작 시 git log와 파일 구조를 읽어 현재 상태를 파악합니다. 그래서 completion-promise와 함께 "현재 상태 파악 방법"을 프롬프트에 명시하는 것이 중요합니다.
Q: /goal의 Haiku evaluator 비용은 얼마나 되나요?
Haiku는 Claude 모델 중 가장 저렴합니다. 매 턴마다 transcript를 평가하지만, 대부분의 /goal 작업이 10-20턴 안에 끝나므로 추가 비용은 미미합니다. 반면 Ralph Loop는 세션당 Sonnet 또는 Opus 수준의 비용이 발생하고 이를 수십~수백 번 반복하므로, budget cap 설정이 필수입니다.
Q: completion-promise 문자열은 어떻게 설계해야 하나요?
세 가지 원칙을 따르세요. 첫째, 충분히 고유해야 합니다 (다른 문맥에서 우연히 등장 불가). 둘째, 대문자+언더스코어 조합이 일반 문장과 구분하기 쉽습니다. 셋째, 작업명을 포함해 어떤 작업의 완료인지 명확히 합니다. 예: PAYMENT_V2_REFACTOR_COMPLETE, AUTH_MODULE_TESTS_PASSING.
Q: /goal이 false-positive를 내면 어떻게 알 수 있나요?
evaluator의 판정 이유(reason)가 대화에 출력됩니다. 종료 직전에 어떤 이유로 "완료"를 판정했는지 transcript에서 확인할 수 있습니다. 의심스러운 완료 판정이라면 실제 파일을 직접 확인하거나, 더 구체적인 측정 조건으로 /goal을 다시 실행하세요.
마무리: 두 도구를 제대로 쓰는 1인 개발자의 전략
/goal과 Ralph Loop는 경쟁 관계가 아닙니다. 시간 척도가 다른 두 가지 자동화 도구입니다.
하루 동안의 작업 흐름 예시:
- 오전 업무 시간:
/goal로 구체적 태스크 처리 (테스트 수정, 타입 에러 해결, 문서 작성) - 퇴근 후 잠들기 전: Ralph Loop 실행 (
/ralph-loop "다음 스프린트 기능을 완성하라" --max-iterations 100) - 다음날 아침: git log 확인, completion-promise 달성 여부 확인
1인 기업 개발자에게 진짜 가치는 수면 시간을 생산 시간으로 만드는 것입니다. Ralph Loop가 그 역할을 합니다. 그리고 깨어 있는 시간의 집중도 높은 작업은 /goal이 지원합니다.
두 도구를 함께 쓰면, AI가 당신의 두 번째 교대 근무자가 됩니다.
다음 단계: Claude Code를 처음 설정하거나 슬래시 명령어 전체 목록이 궁금하다면 Claude Code 공식 문서를 확인하세요. Ralph Loop 설치는 공식 플러그인 페이지에서 시작하세요.
참고 자료
- Claude Code /goal 공식 문서 - Anthropic
- Ralph Loop 공식 플러그인 - Anthropic
- Ralph Wiggum GitHub README - Anthropic GitHub
- Geoffrey Huntley: How I built a programming language with Ralph Loop - Geoffrey Huntley
- From React to Ralph Loop: A Continuous Iteration Paradigm for AI Agents - Alibaba Cloud Blog