이론 관점
Test-time compute scaling이 왜 루프 패러다임의 이론적 기반인지 설명할 수 있다.
이론 관점
Test-time compute scaling이 왜 루프 패러다임의 이론적 기반인지 설명할 수 있다.
Ralph 관점
Harness, backpressure, garbage collection, 누적 학습의 작동 원리를 이해하고 구현할 수 있다.
확장 관점
RLM(재귀 추론)과 autoresearch(자율 실험)가 같은 루프 원리의 다른 적용임을 이해한다.
구현 관점
직접 Ralph 루프를 구현하고 실패→학습→성공 사이클을 경험한다.
밤새 돌려놓은 루프 하나가 복잡한 파이프라인보다 나은 결과를 가져온다.
2026년 AI 엔지니어링의 승부처는 더 큰 모델도, 더 정교한 프롬프트도 아니다. 루프의 반복이다. 같은 모델을 수백 번 돌리되, 매번 결과를 검증하고, 실패하면 버리고, 성공하면 쌓는다. 단순하지만, 이 패턴이 복잡한 멀티에이전트 아키텍처를 일관되게 이긴다.
이번 주에 다룰 세 가지 루프가 그 증거다:
git checkout .으로 지우고 재시도한다. 코드 품질의 루프.이 세 루프는 모두 같은 원리 위에 서 있다. 2주차에서 배운 거버넌스가 루프의 안전 경계를 설정하고, 3주차에서 배운 MIG가 컴퓨팅을 격리하고 MCP가 도구 접근을 표준화한다. 오늘은 그 인프라 위에서 실제로 돌아가는 루프를 이해하고 구현한다.
2024년 OpenAI o1이 검증한 핵심 발견이 있다: 모델 크기를 키우지 않아도, 추론 시점에 연산을 더 쓰면 성능이 올라간다. 이것이 test-time compute scaling이다.
전통적인 AI 성능 향상 전략은 train-time scaling — 더 큰 모델, 더 많은 데이터, 더 긴 학습 시간이었다. GPT-3 → GPT-4의 점프가 대표적이다. 하지만 이 접근은 비용이 지수적으로 증가한다.
Test-time compute scaling은 다른 길을 간다. 이미 훈련된 모델을 추론 시점에 더 오래, 더 많이 생각하게 한다. 구체적으로:
Ralph, RLM, autoresearch는 모두 test-time compute scaling의 구체적 실현이다:
| 루프 | 적용 영역 | test-time compute 활용 방식 |
|---|---|---|
| Ralph Loop | 코드 생성 | 코드 생성 → 테스트 실행 → 실패 시 재시도. 10번 시도하면 10배의 추론 토큰 사용 |
| RLM | 장문 이해 | 모델이 자기 자신을 재귀 호출. 호출 깊이만큼 추론 연산 증가 |
| autoresearch | ML 실험 | 5분 예산 × N회 반복. 반복 횟수만큼 연산 투입 |
공통점이 보이는가? 셋 다 같은 모델을 반복 호출하되, 결정론적 검증 조건으로 결과를 필터링한다. 모델 자체를 바꾸는 것이 아니라, 모델이 생각하는 시간과 횟수를 늘려서 품질을 확보한다.
2026년 SWE-bench 벤치마크가 이 강의의 핵심 주장을 실증적으로 증명한다:
| 벤치마크 | Claude Opus 4.5 점수 | 설명 |
|---|---|---|
| SWE-bench Verified | 80.9% | 검증된 이슈 세트, 표준 스캐폴드 |
| SWE-bench Pro | 45.9% | 더 현실적인 이슈, 최소 스캐폴드 |
같은 모델인데 하네스/스캐폴드 차이로 35pp 격차가 벌어진다. GPT-5.3-Codex는 Pro에서 56.8%로 선두지만, 이 역시 OpenAI가 자체 구축한 에이전트 하네스 덕분이다.
2026년 4월 발표된 T2 scaling laws(arxiv 2604.01411)는 test-time compute의 경제학을 한 단계 더 깊이 파고든다. 기존 Chinchilla 연구(2022)는 학습 연산 비용만 최적화했지만, T2는 추론 비용까지 포함하여 최적점을 재계산한다.
핵심 발견:
Claude 4.x에서 기존 budget_tokens(개발자가 직접 토큰 수를 지정)가 deprecated되고, adaptive effort 파라미터로 대체되었다:
| effort 레벨 | 동작 | 용도 |
|---|---|---|
low | 짧은 추론, 빠른 응답 | 단순 조회, 타입 확인 |
medium | 표준 추론 | 일반 코딩 |
high | 깊은 추론, 더 많은 토큰 | 복잡한 리팩터링 |
max | 최대 추론 깊이 | 아키텍처 설계, 디버깅 |
이것은 test-time compute 할당이 개발자 제어에서 모델 자율 제어로 이동하는 추세를 보여준다. 루프 패러다임의 시사점: 매 반복마다 effort를 동적으로 조절하는 전략이 가능하다 — 초반에는 low로 빠르게 탐색하고, 유망한 방향이 보이면 high로 깊이 파고드는 식이다.
2025년 말 개발자 Geoffrey Huntley가 대중화한 Ralph 루프 (Ralph Wiggum Loop)는 에이전틱 소프트웨어 개발의 핵심 패러다임이다.
# Ralph 루프의 핵심 — 단 한 줄while :; do cat PROMPT.md | claude-code; done# 다른 AI 코딩 CLI 도구도 동일한 패턴 적용 가능:# while :; do cat PROMPT.md | gemini; done# while :; do codex --approval-mode full-auto "$(cat PROMPT.md)"; done이 무한 루프를 관통하는 설계 결정이 두 가지 있다:
이 단순함이 핵심이다. 에이전트 간 통신도, 상태 DB도, 오케스트레이터도 없다. 루프의 지능은 루프 자체가 아닌 환경 제약에 있다 — 이것을 하네스(harness)라 부른다.
Ralph 루프는 의도적으로 모놀리식 (Monolithic)이다:
마이크로서비스 (복잡)
Ralph 루프 (단순)
하네스의 세 기둥:
pytest가 실패하면 그 코드는 존재하지 않는 것과 같다.git checkout .으로 실패한 코드를 완전히 제거한다. 저장소는 항상 마지막 성공 상태로 돌아간다. Jenga 탑처럼 잘못된 블록 위에 쌓는 것이 아니라, 도예 바퀴처럼 원하는 형태가 아니면 반죽을 다시 시작한다.Ralph 루프의 진화된 형태는 단순한 반복을 넘어 학습하는 루프다. 핵심은 AGENTS.md 파일이다.
# AGENTS.md — 누적 학습 기록
## 학습된 패턴- calculator.py의 division 함수는 ZeroDivisionError 처리 필수 (루프 3에서 실패)- pytest fixture는 conftest.py에 배치해야 import 에러 방지 (루프 5에서 실패)
## 금지 패턴- `eval()` 사용 금지 — 보안 리스크 + 타입 체커 우회- 전역 변수로 상태 공유 금지 — 테스트 격리 깨짐
## 현재 상태- [x] add() 구현 완료- [x] subtract() 구현 완료- [ ] multiply() 진행 중매 루프가 끝날 때 에이전트는 AGENTS.md에 이번 루프에서 배운 것을 기록한다. 다음 루프의 에이전트는 이 파일을 읽고 시작하므로, 같은 실수를 반복하지 않는다.
이것은 파인튜닝과 근본적으로 다르다:
“실패 자체가 정보다” — 에이전트의 실패한 시도는 “deterministically bad”이며, 이 정보가 다음 루프의 입력이 된다. 10회 이상 같은 태스크에서 실패하면 stuck으로 판단하고, 태스크를 더 작은 단위로 분할하여 재시도한다.
2026년 1월, Huntley와 Anthropic 사이에 흥미로운 “showdown”이 벌어졌다. Anthropic이 Ralph 루프를 위한 stop-hook 플러그인을 제안했는데, 이것은 연속 세션(같은 컨텍스트를 유지하며 반복) 방식이었다.
| 접근 | 방식 | 장점 | 단점 |
|---|---|---|---|
| 원래 Ralph | 매 루프마다 새 세션 | Context Rot 원천 차단, 결정론적 | 이전 시도의 맥락을 잃음 |
| Anthropic 플러그인 | 연속 세션 내 반복 | 이전 시도를 기억, 빠른 수렴 | Context Rot 위험, 비결정적 |
Huntley는 fresh context를 선택했다. 이유: “연속 세션에서 30번 실패하면 컨텍스트가 실패 이력으로 가득 차서 더 이상 유용한 추론이 불가능하다. 차라리 AGENTS.md에 핵심만 기록하고 매번 깨끗하게 시작하는 것이 낫다.”
이 트레이드오프는 5주차 Context Rot과 직결된다 — Ralph의 fresh context 전략이 곧 Context Rot 방지의 첫 번째 해법이다.
/loop — 공식 자동화 루프2026년 Anthropic이 Claude Code에 공식 탑재한 /loop 명령은 Ralph 루프 철학을 제품 수준으로 구현한 것이다. 수동 while 셸 스크립트 대신, 한 줄로 스케줄 기반 자율 에이전트를 띄울 수 있다.
# 기본 문법claude /loop "<지시문>" --every <간격> --for <기간>
# 예: 2시간마다 테스트 실패를 찾아 수정, 최대 3일claude /loop "check for failing tests and fix them" --every 2h --for 3d핵심 설계 원칙:
| 요소 | 설명 |
|---|---|
| Worktree 격리 | 매 반복마다 git worktree로 메인 브랜치에 영향 없이 실행 |
| CLAUDE.md = 제어면 | 매 사이클마다 CLAUDE.md를 읽으므로, 지시 파일 수정만으로 실행 중인 루프 동작 변경 가능 |
| 3일 만료 | 최대 --for 3d. 잊혀진 자율 에이전트의 컨텍스트 드리프트 방지를 위한 의도적 설계 |
| 3개 플래그 | "지시문", --every, --for — 이것이 전체 API 표면 |
3일 만료가 기능인 이유: 화요일에 설정한 루프가 금요일까지 돌면, 그 사이 팀이 병합한 15개 PR과 충돌한다. 오래된 컨텍스트로 자신 있게 패치하는 에이전트는 원래 버그보다 디버깅이 어려운 문제를 만든다. 72시간마다 재평가하고 재시작하는 것이 안전하다.
검증된 워크플로우 3가지:
claude /loop "check open PRs on the current branch. If CI is failing,read the error logs, fix the issue, and push. If CI passes and the PRhas no requested changes, post a comment saying 'Ready for human review.'Summarize what you did in the PR description." --every 30m --for 2dCI 파이프라인 감시, 린트/타입 에러 자동 수정, 준비 완료 시 알림. 비즈니스 로직 판단이 필요한 실패는 처리 못함.
claude /loop "run pnpm audit. If any high or critical vulnerabilities exist,create a branch, update the affected packages, run the test suite, andopen a PR if tests pass. Include the vulnerability details in the PR body."--every 4h --for 3d명확한 성공 기준(테스트 통과)과 최소한의 비즈니스 컨텍스트 — /loop에 이상적인 태스크.
claude /loop "summarize all commits merged to main in the last 24 hours.Include: PR titles, authors, files changed count, and any test coveragechanges. Write the summary as a Markdown standup update and save it to./reports/standup-$(date +%Y-%m-%d).md" --every 24h --for 3d수동 프로세스를 자동화. Slack MCP 연동 없이도 파일 출력으로 기본 기능 구현 가능.
/loop가 실패하는 경우:
LLM의 context window가 200K 토큰이라 해도, 실제로 긴 문서를 넣으면 앞부분과 뒷부분에 비해 중간 내용의 이해도가 떨어진다 (“Lost in the Middle” 현상). 기존 해법은 두 가지였다:
RLM (Recursive Language Model)은 근본적으로 다른 접근이다. 긴 프롬프트를 Python REPL의 변수에 올려놓고, 모델이 코드를 짜서 필요한 부분만 골라 자기 자신을 재귀 호출한다.
핵심 아이디어: context window를 키우는 대신, 모델이 맥락을 어떻게 읽을지 스스로 결정하게 한다.
# RLM 의사코드 — 재귀 호출 패턴def rlm_solve(question: str, documents: list[str]) -> str: """모델이 자기 자신을 재귀 호출하여 장문 문서를 처리한다."""
# 1단계: 전체 문서를 Python 변수에 올린다 context_vars = {f"doc_{i}": doc for i, doc in enumerate(documents)}
# 2단계: 모델에게 "어떤 부분을 읽을지 결정하는 코드"를 짜라고 요청 planning_code = llm_call( f"다음 질문에 답하기 위해 {len(documents)}개 문서 중 " f"어떤 부분을 읽어야 하는지 Python 코드로 작성하라.\n" f"질문: {question}" )
# 3단계: 코드 실행 → 관련 부분만 추출 relevant_parts = execute(planning_code, context_vars)
# 4단계: 추출된 부분으로 자기 자신을 재귀 호출 if fits_in_context(relevant_parts): return llm_call(f"질문: {question}\n맥락: {relevant_parts}") else: # 아직 크면 다시 재귀 return rlm_solve(question, split(relevant_parts))2025년 Zhang et al.의 실험 결과가 인상적이다: GPT-5-mini + RLM이 OOLONG 벤치마크에서 GPT-5 단독의 2배 이상 성능을 보였다. 더 작은 모델이 재귀 호출만으로 더 큰 모델을 능가한 것이다.
이것이 가능한 이유:
Ralph Loop과 RLM은 같은 원리의 다른 적용이다:
| 비교 항목 | Ralph Loop | RLM |
|---|---|---|
| 반복 대상 | 코드 생성 | 맥락 탐색 |
| 호출 방식 | 셸 루프에서 반복 호출 | 모델이 자기 자신을 재귀 호출 |
| 검증 조건 | 테스트 통과 여부 | 답변 완성 여부 |
| 상태 저장 | git + 파일시스템 | Python REPL 변수 |
| 공통점 | 같은 모델을 반복 호출하여 test-time compute를 추론 품질로 전환 |
Andrej Karpathy가 공개한 autoresearch는 ML 연구에 루프 패러다임을 적용한 것이다. 아이디어는 놀랍도록 단순하다:
train.py 하나를 에이전트에게 준다val_bpb(validation bits per byte)를 측정한다program.md에 연구 방향만 적어두면, 에이전트가 구체적 실험 설계와 실행을 자율적으로 수행한다.
2026년 3월 7일 공개 후 21K GitHub 스타, 860만 뷰를 기록하며 루프 패러다임의 상징이 되었다. 코드는 630줄, 3개 파일이라는 극도의 단순성이 특징이다.
| 지표 | 수치 |
|---|---|
| 총 실험 수 | ~700회 (밤새 자동 실행) |
| 발견된 최적화 | 20개 |
| 속도 개선 | 11% |
| 코드 규모 | 630줄, 3파일 |
Shopify CEO Tobi Lütke가 자사 ML 파이프라인에 autoresearch를 적용한 결과, 37개 실험을 하룻밤에 실행하여 19% validation 개선을 달성했다. 인간 연구자가 일주일 걸릴 실험을 에이전트가 8시간 만에 끝낸 것이다.
이 결과는 “The Karpathy Loop”이라는 공식으로 정리된다:
agent + single modifiable file + single metric + fixed time limit = automated research
핵심은 제약의 설계다. 파일 하나, 메트릭 하나, 시간 하나 — 에이전트에게 자유도를 제한할수록 루프의 품질이 올라간다. 이것은 Ralph 루프의 “결정론적 검증 조건”과 정확히 같은 원리다.
| 원칙 | 설명 | 왜 중요한가 |
|---|---|---|
| 고정 시간 예산 | 매 실험 5분으로 제한 | 공정한 비교. 한 실험이 40분 걸리면 다른 3개를 못 돌린다 |
| git branch 기반 | 성공 = commit, 실패 = reset | 실패한 실험의 부산물이 다음 실험을 오염시키지 않는다 |
| 단일 메트릭 | val_bpb 하나만 측정 | 모호함 제거. “더 좋아졌는가?”에 숫자로 답한다 |
| program.md | 연구 방향 텍스트 파일 | PROMPT.md와 동일한 역할. 인간이 전략을, 에이전트가 전술을 |
Karpathy는 autoresearch의 미래를 분산 연구로 그린다. SETI@home이 외계 신호를 분산 탐색했듯, 수백 대의 에이전트가 각각 다른 실험을 병렬로 실행하고, 개선된 결과만 중앙 저장소에 merge한다. 한 에이전트가 발견한 개선이 다른 에이전트의 다음 실험 출발점이 된다.
autoresearch와 Ralph Loop은 동일한 패턴이다:
| 비교 항목 | Ralph Loop | autoresearch |
|---|---|---|
| 대상 | 소프트웨어 코드 | ML 학습 코드 |
| 검증 조건 | 테스트 통과 | val_bpb 개선 |
| 상태 관리 | git checkout . | git reset |
| 지시 파일 | PROMPT.md | program.md |
| 핵심 | 결정론적 검증 + 루프 = 품질 | 결정론적 메트릭 + 루프 = 성능 |
차이는 검증 조건뿐이다. Ralph는 “코드가 테스트를 통과하는가”, autoresearch는 “val_bpb가 개선되는가”. 나머지 아키텍처 — 루프, git 기반 상태 관리, 텍스트 파일 지시 — 는 동일하다.
| 항목 | Ralph Loop | RLM | autoresearch |
|---|---|---|---|
| 적용 영역 | 소프트웨어 개발 | 장문 맥락 이해 | ML 실험 |
| 검증 조건 | 컴파일 + 테스트 통과 | 답변 완성도 | val_bpb 수치 |
| 상태 저장 | git + 파일시스템 | Python REPL 변수 | git branch |
| context 전략 | 매 루프 새 context (wiping) | 재귀적 맥락 탐색 | 매 실험 새 context |
| 실패 처리 | git checkout . | 재귀 분할 | git reset |
| 인간 역할 | PROMPT.md 작성 | 질문 제시 | program.md 작성 |
세 루프가 공유하는 본질적 요소는 세 가지다:
이 세 요소가 갖춰지면, 어떤 영역이든 루프 패러다임을 적용할 수 있다.
2026년 Martin Fowler / ThoughtWorks가 에이전틱 코딩에 대한 분석에서 하네스를 두 가지 구성요소로 분류했다:
| 구성 | 방향 | 역할 | 예시 |
|---|---|---|---|
| Guides (가이드) | Feedforward | 에이전트가 행동하기 전에 방향을 제시 | PROMPT.md, CLAUDE.md, 린터 설정, 타입 정의 |
| Sensors (센서) | Feedback | 에이전트가 행동한 후에 결과를 측정 | 테스트 결과, 토큰 사용량, 에러 로그, val_bpb |
이 프레임워크로 세 루프를 재분석하면:
LangChain은 이를 더 축약하여 Agent = Model + Harness로 정의한다. 모델은 교체 가능하지만, 하네스는 도메인에 특화된 설계 결정의 집합이다.
루프를 돌리는 데는 토큰 비용이 든다. 무한 반복은 비경제적이다. 실전에서는 손익분기점을 계산해야 한다.
반복당 토큰 비용 추정 (Sonnet 4.6 기준, 코드 수정 1회):
| 항목 | 토큰 수 | 비용 |
|---|---|---|
| Input (시스템 프롬프트 + 코드 + 에러 로그) | ~2,000 | $0.03 |
| Output (수정된 코드 + 설명) | ~4,000 | $0.30 |
| 반복당 합계 | ~6,000 | ~$0.33 |
| 시나리오 | 루프 비용 | 비교 대상 | 판정 |
|---|---|---|---|
| 10회 반복으로 버그 수정 | $3.3 | 개발자 30분 ($25) | 루프가 7.5배 저렴 |
| 50회 반복으로 리팩터링 | $16.5 | 개발자 2시간 ($100) | 루프가 6배 저렴 |
| 200회 반복, 수렴 실패 | $66 | 개발자 2시간 ($100) | 여전히 저렴하지만 비효율적 |
위에서 루프의 원리를 배웠다. 이제 루프를 빠르게, 안전하게, 대규모로 돌리는 실전 기법을 다룬다. Claude Code 창시자 Boris Cherny가 2026년 1-2월에 걸쳐 공개한 42개 팁은 개별 트릭이 아니라, 각 레이어가 이전 레이어를 전제하는 스택(stack) 구조다. 이 스택을 이해하면 Ralph 루프의 처리량을 한 자릿수에서 두 자릿수로 끌어올릴 수 있다.
Boris는 터미널에서 Claude Code 인스턴스 5개, claude.ai/code에서 5-10개를 동시에 운용한다. 멀티에이전트 파이프라인이 아니다. 한 명의 개발자가 여러 루프를 동시에 감독하는 실전 병렬성이다.
# tmux로 병렬 세션 구성tmux new-session -s loops -dfor i in 1 2 3 4; do tmux split-window -t loops; donetmux select-layout -t loops tiled
# 각 pane에서 독립 태스크 실행# pane 0: claude "프론트엔드 컴포넌트 리팩터링"# pane 1: claude "API 엔드포인트 테스트 작성"# pane 2: claude "문서 업데이트"# pane 3: claude "린트 에러 수정"# pane 4: claude "성능 프로파일링"핵심은 각 인스턴스가 독립적인 태스크를 처리한다는 점이다. 에이전트 간 통신은 없다. git이 유일한 조율 메커니즘이다 — 이것이 Ralph 루프의 모놀리식 철학의 자연스러운 확장이다.
--worktree 플래그 — 네이티브 격리앞서 /loop가 자동으로 worktree를 생성한다고 배웠다. --worktree 플래그는 이 격리를 ad-hoc 세션으로 확장한다.
# 기본: Claude에게 전용 worktree 부여claude --worktree my_feature
# tmux 세션까지 자동 생성claude --worktree my_feature --tmux
# 실전 패턴: 10개 병렬 에이전트로 마이그레이션for module in auth billing users payments notifications \ search analytics admin logging config; do claude --worktree "migrate-${module}" --tmux \ "모듈 ${module}의 sync I/O를 async로 마이그레이션하라. \ 모든 테스트가 통과하면 PR을 올려라."done# 위험: 모든 에이전트가 같은 working directory 공유claude "auth 모듈 수정" # ← 파일 충돌 위험claude "billing 모듈 수정" # ← 파일 충돌 위험# 한 에이전트의 git checkout .이 다른 에이전트의 작업을 삭제할 수 있다# 안전: 각 에이전트가 독립된 파일시스템에서 작업claude --worktree auth "auth 모듈 수정"claude --worktree billing "billing 모듈 수정"# 각 worktree는 독립 브랜치 → merge conflict는 PR 단계에서 해결/loop의 worktree는 시간 기반 반복에 최적화되어 있고, --worktree는 병렬 태스크 분배에 최적화되어 있다. 둘은 보완 관계다.
/sandbox — 신뢰 기반 격리3주차에서 배운 MIG는 GPU 컴퓨팅 격리였다 — 한 학생의 OOM이 다른 학생에게 전파되지 않는다. /sandbox는 BashTool의 파일 및 네트워크 접근을 격리하여 다른 관점의 보호를 제공한다.
| 관점 | MIG (Week 3) | /sandbox (Week 4) |
|---|---|---|
| 격리 대상 | GPU 컴퓨팅 | 파일시스템 + 네트워크 |
| 목적 | 자원 보호 — 한 학생의 OOM 차단 | 신뢰 — 에이전트 편집의 빠른 수용 |
| 메커니즘 | 하드웨어 파티셔닝 | BashTool 파일/네트워크 제한 |
| 효과 | ”이 프로세스는 내 GPU를 침범할 수 없다" | "이 에이전트가 실수해도 피해 범위가 명확하다” |
Boris의 핵심 통찰: “When you trust the containment, you accept edits faster. That speeds up the whole loop.” 격리를 신뢰하면 매 루프의 human review 시간이 줄어들고, 루프 전체의 처리량이 올라간다.
Boris의 42개 팁이 교육적으로 가치 있는 이유는 메뉴가 아니라 스택이기 때문이다. 각 레이어는 이전 레이어를 전제한다:
이 순서가 중요한 이유를 거꾸로 추적하면:
/batch로 10개 모듈을 동시 마이그레이션하려면 → 각각 worktree 격리가 필요하다아래 레이어 없이 위 레이어만 쓰면 실패한다. Worktree 없이 병렬 세션을 돌리면 파일 충돌이 나고, CLAUDE.md 없이 worktree를 써봐야 에이전트가 프로젝트 규칙을 모른다.
2026년 초부터 “Agentmaxxing”이라는 극단적 병렬화 전략이 등장했다. 한 repo에 여러 AI 코딩 도구를 동시에 투입하는 방식이다:
# 터미널 1: Claude Code (아키텍처 설계)claude --worktree arch "모듈 구조 리팩터링"
# 터미널 2: Codex (테스트 작성)codex --approval-mode full-auto "누락된 테스트 케이스 추가"
# 터미널 3: Gemini CLI (문서화)gemini "API 문서를 코드에서 자동 생성"Cursor 2.0은 이 패턴을 제품화하여 Background Agents(격리 VM에서 실행)와 Mission Control(병렬 에이전트 대시보드)을 도입했다. Codex CLI는 2026년 3월 기준 주간 160만 활성 사용자를 기록하며 오픈소스 하네스의 참조 구현이 되었다.
여기까지 이론과 기법을 배웠다. 그렇다면 실제로 루프만으로 프로덕션 소프트웨어를 만들 수 있는가? 2026년 3월, OpenAI가 Codex 에이전트만으로 내부 프로덕트를 구축한 사례가 그 답을 제시한다.
OpenAI 엔지니어링 팀이 Codex를 사용하여 내부 프로덕트를 구축했다:
이 과정에서 도출된 5대 패턴은 하네스 엔지니어링의 실전 교범이다:
| 패턴 | 원칙 | Ralph Loop 관점 |
|---|---|---|
| Repo as System of Record | 코드 = 단일 진실 소스. 구두 합의나 Wiki가 아닌 코드에 모든 결정을 반영 | PROMPT.md + AGENTS.md가 이 역할을 수행 |
| Application Legibility | 에이전트가 읽을 수 있는 코드 작성. 변수명, 타입, 주석이 명확해야 에이전트가 올바르게 수정 | backpressure의 전제 조건 — 린터와 타입 체커가 코드를 읽을 수 있어야 작동 |
| Layered Domain Architecture | 도메인 레이어를 명확히 분리. 한 레이어 변경이 다른 레이어에 전파되지 않도록 | 병렬 worktree의 전제 — 모듈이 분리되어야 병렬 수정이 가능 |
| Minimal Merge Gates | 머지 게이트를 최소화. 자동 테스트 통과 시 바로 머지 | 루프 속도의 핵심 — 승인 대기 시간이 루프 효율을 결정 |
| Entropy Management | 코드베이스의 무질서(엔트로피)를 능동적으로 관리. 기술 부채 축적을 루프로 방지 | /simplify 패턴 — 별도 에이전트가 주기적으로 코드 품질을 정리 |
/sandbox의 목적이 보안이 아니라 신뢰라는 주장에 동의하는가? 격리가 “신뢰를 높인다”는 것이 구체적으로 어떤 행동 변화를 의미하는지 토론하라.프로젝트 구조 설정
mkdir ralph-project && cd ralph-projectgit inittouch PROMPT.md AGENTS.mdmkdir testsPROMPT.md 작성
# 현재 태스크아래 항목을 순서대로 구현하라:- [ ] calculator.py에 add(a, b) 함수 구현- [ ] calculator.py에 subtract(a, b) 함수 구현- [ ] calculator.py에 divide(a, b) 함수 구현 (ZeroDivisionError 처리)
# 제약 사항- 한 번에 하나의 함수만 구현- 모든 함수에 타입 힌트 포함- 테스트 없이 코드 작성 금지- tests/test_calculator.py에 테스트 작성 후 구현
# 상태 추적- AGENTS.md의 학습 기록을 반드시 읽고 시작할 것- 실패 시 AGENTS.md에 실패 원인 기록 후 종료할 것- 성공 시 AGENTS.md에 성공 패턴 기록 후 다음 태스크로 진행harness.sh 작성 — backpressure + garbage collection
#!/bin/bash# harness.sh — Ralph 루프 하네스
set -eMAX_RETRIES=10RETRY_COUNT=0
while true; do echo "=== Ralph Loop #$((RETRY_COUNT + 1)) ==="
# 에이전트 실행 cat PROMPT.md | claude-code
# Backpressure: 타입 체크 + 테스트 실행 if python -m py_compile calculator.py 2>/dev/null && \ python -m pytest tests/ -q 2>/dev/null; then echo "Tests passed — committing and moving on" git add -A && git commit -m "loop $((RETRY_COUNT + 1)): task completed" RETRY_COUNT=0 else echo "Tests failed — garbage collection + retry" RETRY_COUNT=$((RETRY_COUNT + 1))
# Stuck 탐지 if [ $RETRY_COUNT -ge $MAX_RETRIES ]; then echo "STUCK: $MAX_RETRIES consecutive failures. Splitting task." echo "- STUCK at loop $RETRY_COUNT: $(date)" >> AGENTS.md git add AGENTS.md && git commit -m "stuck: recorded failure pattern" RETRY_COUNT=0 fi
# Garbage Collection — 실패 코드 제거 git checkout -- calculator.py tests/ 2>/dev/null || true sleep 2 fidoneAGENTS.md 누적 학습 구조 초기화
# AGENTS.md — 누적 학습 기록
## 학습된 패턴(루프 실행 후 자동으로 채워짐)
## 금지 패턴(반복 실패에서 학습한 안티패턴)
## 진행 상태- [ ] add() 구현- [ ] subtract() 구현- [ ] divide() 구현실행 및 관찰 — 최소 3회 루프
chmod +x harness.sh./harness.sh관찰 포인트:
git log --oneline으로 성공 커밋만 남아있는가?autoresearch 패턴 미니 실험 (선택)
간단한 Python 함수의 실행 시간을 최적화하는 autoresearch 패턴:
#!/bin/bashBEST_TIME=999
while true; do # 에이전트가 optimize.py를 수정 cat program.md | claude-code
# 5분 시간 제한으로 벤치마크 실행 CURRENT_TIME=$(timeout 300 python benchmark.py 2>/dev/null || echo 999)
if (( $(echo "$CURRENT_TIME < $BEST_TIME" | bc -l) )); then echo "Improved: $BEST_TIME -> $CURRENT_TIME" BEST_TIME=$CURRENT_TIME git add -A && git commit -m "improved: time=$CURRENT_TIME" else echo "No improvement ($CURRENT_TIME >= $BEST_TIME) — reset" git checkout . fidonegit checkout .)을 모두 구현하는가?git log에 성공 커밋만 남아있는가? (실패한 코드가 커밋되지 않았는가?)제출 마감: 2026-03-31 23:59
제출 경로: assignments/week-04/[학번]/
필수 요구사항 (5개):
harness.sh — backpressure + garbage collection 포함 Ralph 하네스PROMPT.md — 최소 3개 태스크 명세AGENTS.md — 루프 실행 후 누적된 학습 기록 (최소 2회 실패 후 성공 과정이 보일 것)loop_log.txt)README.md — 하네스 설계 결정 사항 + test-time compute scaling과의 연결 설명가산점 요소 (5개):
/loop 실행 후 worktree 격리 동작 분석 보고서평가 포인트: