Claude Code Deep Interview + Ralph Loop: 아이디어 하나가 자동으로 PR이 되기까지
"다음날 아침에 일어났더니 PR이 올라와 있었다."
처음 이 후기를 봤을 때 솔직히 마케팅 문구려니 했습니다. AI가 코드를 짜준다는 말이야 새로운 게 아니니까요. 그런데 2025년 중반부터 같은 패턴의 경험담이 커뮤니티 여기저기에서 쌓이기 시작했습니다. GitHub 스타도 두 달 만에 12,000개를 넘긴 도구가 등장했고, 엔터프라이즈 블로그들도 슬슬 분석 글을 내놓기 시작했습니다. 그 중심에 있는 게 Ralph Loop 와 Deep Interview 의 조합입니다.
두 도구를 따로 보면 각각 유용한 정도인데, 붙여놓으면 뭔가 다른 일이 일어납니다. 막연한 아이디어 하나로 시작해서 AI가 스스로 요구사항을 정리하고 → 코드를 짜고 → 테스트를 돌리고 → 실패하면 고치는 전 주기가 자율로 돌아갑니다. 이 글에서는 두 개념이 어떻게 맞물리는지, 직접 써보면서 막혔던 지점은 어디였는지, 그리고 첫 번째 루프를 안전하게 돌리려면 뭘 챙겨야 하는지를 구체적으로 살펴봅니다.
핵심 개념
Ralph Loop: "포기하지 않는 AI 루프"
Geoffrey Huntley가 2025년 5월 공개한 snarktank/ralph의 구조는 놀랍도록 단순합니다. PRD(Product Requirements Document) 파일을 입력으로 받아 각 항목이 모두 완료될 때까지 AI 코딩 도구를 반복 호출하는 bash 스크립트입니다. 2개월 만에 12,000개 이상의 스타를 받은 건 기술적 복잡성 때문이 아니라 철학 때문입니다.
단순 지속성(naive persistence): 완벽한 계획을 세우는 대신, 오류와 실패를 다음 이터레이션의 입력으로 넘겨 성공 기준을 충족할 때까지 단순 반복하는 접근법. "지치지 않는 반복"을 설계 원칙으로 삼은 것입니다.
핵심 루프를 단순화하면 이렇습니다.
#!/bin/bash
# ralph.sh 핵심 루프 (단순화 버전)
# claude 명령어: npm install -g @anthropic-ai/claude-code 로 설치
PRD_FILE=$1
TOOL=${TOOL:-claude}
while true; do
# 미완료 체크박스 추출 (- [ ] 패턴)
NEXT_TASK=$(grep -n '- \[ \]' "$PRD_FILE" | head -1)
[ -z "$NEXT_TASK" ] && echo "모든 항목 완료. 루프 종료." && break
# 새 컨텍스트로 AI에게 태스크 위임
$TOOL "prd: $PRD_FILE, task: $NEXT_TASK, run tests and commit if passed"
echo "$(date): $NEXT_TASK attempted" >> progress.txt
done이터레이션마다 새 컨텍스트로 시작한다는 점이 핵심입니다. 컨텍스트 윈도우가 길어질수록 LLM은 초반 지시어를 무시하고 최근 출력을 그대로 이어받는 경향이 생기는데, 매번 새 컨텍스트에서 시작함으로써 이 문제를 구조적으로 차단합니다. 대신 git 히스토리와 progress.txt로 이터레이션 간 상태를 이어나갑니다.
Deep Interview: "PRD를 뽑아내는 소크라테스"
랄프 루프가 아무리 강력해도 입력 PRD가 엉성하면 루프 전체가 흔들립니다. 실질적인 병목은 "좋은 PRD를 만드는 것"이고, obra/superpowers 플러그인의 /deep-interview 스킬이 바로 이 병목을 공략합니다.
# Claude Code 터미널에서 실행
/deep-interview 할일 관리 앱 만들고 싶어실행하면 AI가 한 번에 하나씩 질문을 던집니다. 실제 대화는 이런 식으로 흘러갑니다.
AI: 이 앱을 주로 누가 사용하나요? 개인용인가요, 팀 공유용인가요?
나: 개인용이요.
AI: 완료한 할일은 어떻게 처리하면 좋을까요? 삭제하나요,
아니면 완료 목록으로 따로 보관하나요?
나: 완료 목록으로 남겨두고 싶어요.
AI: 오프라인에서도 동작해야 하나요?
나: 네, 인터넷 없이도 써야 해요.처음엔 "이런 질문이 필요한가?" 싶은 것들인데, 인터뷰가 끝나고 나면 혼자 생각했을 때 놓쳤던 엣지 케이스와 인수 조건들이 꽤 나옵니다. 저도 첫 번째 인터뷰에서 "오프라인 동기화 충돌 처리"를 미처 생각하지 못하고 있었다는 걸 세 번째 질문에서야 깨달았습니다.
인수 조건(Acceptance Criteria): "사용자가 할일을 추가하면 목록에 즉시 반영된다"처럼 기계적으로 테스트 통과/실패를 판단할 수 있게 명시된 완료 기준. 딥인터뷰에서 이걸 잘 뽑아야 랄프 루프의 종료 조건이 명확해집니다.
결과물은 tasks/prd-todo-app.md 형태로 저장됩니다. 기존 노트나 대화 기록을 첨부하면 Claude가 중복 질문을 건너뛰고 빠진 부분만 추가로 물어보는 점진적 보완 방식도 됩니다. 실무에서 "스펙이 어느 정도는 있는데 구멍이 있는" 상황에 딱 맞습니다.
두 개념의 결합: 전 주기 자동화 흐름
핵심 요약: PRD가 입력이고, 인수 조건이 종료 조건입니다. Deep Interview가 입력의 품질을 결정하고, 그 품질이 루프 전체의 결과를 결정합니다.
사용자 아이디어
↓
[Deep Interview] ← /deep-interview 스킬
↓
prd.md 생성 ← 구조화된 태스크 + 인수 조건
↓
[Ralph Loop] ← ./ralph.sh 실행
↓
이터레이션 반복 ← 구현 → 테스트 → 실패 → 재시도
↓
모든 체크박스 완료 ← git 커밋 누적
↓
완성된 코드베이스실전 적용
[기본] 예시 1: 할일 관리 앱을 처음부터 자동 구현
딥인터뷰로 PRD를 만들고 바로 랄프 루프를 돌리는 기본 패턴입니다.
# 1단계: Superpowers 플러그인 설치
git clone https://github.com/obra/superpowers ~/.claude/superpowers
# 2단계: Claude Code에서 딥인터뷰 실행
# (Claude Code 터미널 내부)
/deep-interview 할일 관리 앱 만들고 싶어
# → AI가 대화형으로 요구사항 질문
# → tasks/prd-todo-app.md 자동 생성
# 3단계: Ralph Loop로 자율 구현
git clone https://github.com/snarktank/ralph ~/ralph
cd my-project
~/ralph/ralph.sh --tool claude --prd tasks/prd-todo-app.md딥인터뷰가 만들어주는 PRD 파일 구조는 대략 이런 모양입니다.
# PRD: 할일 관리 앱
## 태스크 목록
### TASK-001: 할일 추가 기능
- **설명**: 사용자가 텍스트를 입력해 새 할일을 추가할 수 있다
- **인수 조건**:
- [ ] 빈 문자열 입력 시 추가되지 않는다
- [ ] 추가 후 입력창이 초기화된다
- [ ] 추가된 항목이 목록 상단에 표시된다
- **테스트**: `pnpm test -- todo-add`
### TASK-002: 할일 완료 처리
- **설명**: 체크박스 클릭으로 완료 상태를 토글한다
- **인수 조건**:
- [ ] 완료된 항목은 취소선으로 표시된다
- [ ] 완료 상태는 새로고침 후에도 유지된다
- **테스트**: `pnpm test -- todo-complete`ralph.sh는 - [ ] 패턴으로 미완료 항목을 추적하고, 테스트 명령어가 통과하면 해당 체크박스를 - [x]로 업데이트합니다.
| 구성 요소 | 역할 |
|---|---|
설명 |
AI가 구현 방향을 잡는 컨텍스트 |
인수 조건 |
루프 종료 여부를 판단하는 체크리스트 |
테스트 |
자동 실행될 검증 명령어 |
[야간 운용] 예시 2: 퇴근 전에 시작하고 아침에 결과 확인하기
실무에서 가장 극적인 활용 패턴입니다. 처음 돌려볼 때는 낮에 --max-iterations 5로 짧게 먼저 확인해보시는 걸 권장합니다. 가드레일 없이 야간 실행하면 루프가 수렴하지 않는 태스크에서 API 비용이 조용히 쌓입니다. 저도 처음에 이 실수를 했습니다.
#!/bin/bash
# overnight-ralph.sh: 야간 무인 개발 스크립트
# API 키는 .env 파일에서 관리하는 것을 권장합니다 (하드코딩 금지)
source .env
LOG_FILE="ralph-$(date +%Y%m%d).log"
echo "=== Ralph Loop 시작: $(date) ===" >> "$LOG_FILE"
# super-ralph: 가드레일이 강화된 Ralph 확장판 (htlkg/super-ralph)
./super-ralph/ralph.sh \
--tool claude \
--prd tasks/current-sprint.md \
--max-iterations 50 \
--timeout-minutes 480 \
--on-error "commit-and-continue" \
2>&1 | tee -a "$LOG_FILE"
echo "=== Ralph Loop 종료: $(date) ===" >> "$LOG_FILE"
# 완료 알림 (슬랙 웹훅 등)
curl -X POST "$SLACK_WEBHOOK" \
-d "{\"text\": \"Ralph Loop 완료. 결과: \`git log --oneline -10\`\"}"htlkg/super-ralph는 기본 ralph에 --max-iterations, --timeout-minutes 같은 안전장치를 추가한 확장판입니다. 야간 실행에는 이쪽을 쓰는 편이 훨씬 안전합니다.
[고급] 예시 3: 기존 코드베이스를 다른 언어로 포팅하기
Geoffrey Huntley가 LinearB 블로그 등을 통해 소개한 확장 패턴입니다. 기존 코드베이스를 언어 중립적 Markdown 스펙으로 압축한 뒤 랄프 루프로 다른 언어로 포팅합니다.
# 1단계: 기존 Python 코드베이스를 스펙 문서로 변환
claude "이 Python 프로젝트의 모든 동작을 언어 중립적 Markdown 스펙으로 변환해줘.
각 함수의 입출력, 사이드 이펙트, 엣지 케이스를 포함할 것.
출력: spec/codebase-spec.md"
# 2단계: 스펙 기반으로 TypeScript 포팅 PRD 생성
claude "spec/codebase-spec.md를 기반으로 TypeScript 구현 PRD를 생성해줘.
각 모듈을 독립적인 태스크로 분해하고 인수 조건에 테스트를 명시할 것.
출력: tasks/typescript-port.md"
# 3단계: Ralph Loop로 자율 포팅
~/ralph/ralph.sh --tool claude --prd tasks/typescript-port.md장단점 분석
솔직한 후기를 정리하면 이렇습니다.
장점
| 항목 | 내용 |
|---|---|
| 컨텍스트 오염 방지 | 이터레이션마다 새 컨텍스트로 시작해 초반 지시어를 일관되게 유지 |
| 검증 자동화 | 테스트 통과/실패라는 기계적 기준으로 완료 여부를 객관 판단 |
| 비용 효율 | 인간 개입 없이 야간 자율 실행 가능 |
| 점진적 메모리 | git 히스토리 + progress.txt로 이터레이션 간 맥락 누적 |
| 요구사항 품질 향상 | Deep Interview가 혼자 생각했으면 놓쳤을 요구사항을 사전에 발굴 |
단점 및 주의사항
| 항목 | 내용 | 대응 방안 |
|---|---|---|
| AI 슬롭 위험 | 검증 기준이 약하면 조건만 피상적으로 충족하는 저품질 코드 생성 | 인수 조건을 단위 테스트 수준으로 구체화 |
| 주관적 기준 불가 | "UI가 예뻐야 한다" 같은 비기계적 완료 조건은 처리 불가 | 주관적 항목은 루프 밖에서 별도 리뷰 |
| 런어웨이 루프 | 반복이 수렴하지 않고 API 비용이 폭증하는 경우 발생 | --max-iterations와 super-ralph 가드레일 적용 |
| PRD 품질 의존성 | 입력 PRD가 불명확하면 루프 전체가 비효율적으로 동작 | 딥인터뷰 단계에서 인수 조건을 충분히 구체화 |
| 태스크 가시성 부족 | 복수 에이전트 동시 동작 시 조율 및 진행 상황 파악 어려움 | progress.txt 로그 모니터링 또는 Ralph TUI 활용 |
AI 슬롭(AI Slop): 테스트를 통과하지만 실질적으로 요구사항을 해결하지 않는 코드. 예를 들어 실패하는 테스트를 삭제해버리는 방식으로 "통과" 상태를 만들어내는 경우입니다. 인수 조건이 구체적일수록 이런 우회가 통하기 어렵습니다.
실무에서 가장 흔한 실수
-
태스크를 너무 크게 잡는 것. 하나의 태스크가 단일 컨텍스트 윈도우 안에서 완료 가능한 크기를 넘으면 루프가 수렴하지 않습니다. "인증 시스템 구현"보다 "JWT 토큰 발급 엔드포인트 구현"처럼 작게 분해하는 편이 안전합니다.
-
인수 조건 없이 PRD를 넘기는 것. "로그인 기능을 만든다"만 있고 "잘못된 비밀번호 입력 시 401을 반환한다"가 없으면 루프가 언제 멈춰야 할지 모릅니다. 딥인터뷰 단계에서 "이게 테스트로 검증 가능한가?"를 항상 확인해보시면 좋습니다.
-
가드레일 없이 야간 실행하는 것.
--max-iterations없이 돌리면 수렴하지 않는 태스크에서 API 비용이 조용히 쌓입니다. 처음 몇 번은 낮에 짧게 실행해서 루프가 잘 수렴하는지 먼저 확인해보시면 좋습니다.
마치며
결국 이 워크플로에서 배운 건 이것입니다. 딥인터뷰로 뽑은 구체적인 PRD가 랄프 루프의 품질을 결정하고, 루프의 품질은 인수 조건의 명확성에서 나옵니다. 도구 자체보다 "테스트 가능한 조건으로 요구사항을 표현하는 능력"이 이 워크플로의 실질적인 핵심입니다.
직접 돌려보려면 이 순서로 시작해보시면 됩니다.
-
Superpowers 설치 후
/deep-interview를 한 번 돌려보세요.git clone https://github.com/obra/superpowers ~/.claude/superpowers로 설치한 뒤, 평소 머릿속에만 있던 프로젝트 아이디어로 인터뷰를 시작해보시면 됩니다. 인터뷰 결과물인prd.md에 처음엔 생각하지 못했던 항목이 몇 개나 있는지 확인해보시면 좋습니다. -
PRD를 직접 작성하면서 태스크 크기를 잡아보세요. 하나당 30분 이내에 완료 가능한 크기로 분해하고, 각 항목에 실행 가능한 테스트 명령어를 붙이다 보면 인수 조건이 얼마나 구체적이어야 하는지 감이 옵니다.
-
~/ralph/ralph.sh를--max-iterations 5로 제한해서 낮에 짧게 먼저 돌려보세요. 처음 몇 개 태스크만 실행해서 루프가 예상대로 수렴하는지, progress.txt와 git log에 결과가 쌓이는지 확인한 뒤 야간 실행으로 넘어가시면 됩니다.
참고 자료
- GitHub - snarktank/ralph: 핵심 Ralph Loop 구현체
- 2026 - The year of the Ralph Loop Agent | DEV Community
- Mastering Ralph loops transforms software engineering | LinearB Blog
- From ReAct to Ralph Loop | Alibaba Cloud Blog
- GitHub - obra/superpowers: 스킬 프레임워크
- GitHub - oh-my-claudecode (OMC)
- GitHub - htlkg/super-ralph: 가드레일 강화 Ralph 확장판
- Spec-Driven Development with Claude Code | DataCamp
- Claude Code Superpowers 완벽 가이드 | Frank's IT Blog