AI 에이전트를 쓰다 보면 반드시 한 번은 이 상황을 만납니다. 30분쯤 돌다가 "다음에 이어서 하겠습니다"라며 멈춰버리는 에이전트. 몇 시간 뒤 다시 보면 컨텍스트가 날아가서 처음부터 다시 시작하는 에이전트. 2026년 현재 Claude는 12시간, 길게는 30시간 이상 자율 실행이 가능해졌습니다. 문제는 모델이 아니라 설계입니다.
왜 지금 장기 에이전트가 가능해졌나
태스크 수행 시간 호라이즌은 4개월마다 2배씩 늘어나고 있습니다. Claude는 현재 12시간짜리 태스크를 처리할 수 있고, Claude Code 내부 테스트에서는 30시간 이상 자율 코딩으로 11,000줄 규모의 Slack 스타일 앱을 만든 사례도 있습니다.
Anthropic 내부에서는 2026년 2분기 기준 엔지니어 1인당 하루 코드 머지량이 2024년 대비 8배가 됐습니다. Claude Code가 연구 프리뷰로 나온 2025년 2월 이전에는 Claude가 작성한 코드 비율이 한 자릿수였지만, 지금은 머지되는 코드의 80% 이상이 Claude 작성입니다.
이 변화의 핵심은 모델 능력 향상만이 아닙니다. LangChain 2026년 보고서에 따르면 에이전트 실패의 약 60%는 모델 성능이 아니라 하네스, 즉 에이전트를 감싸는 설계 문제에서 비롯됩니다. 좋은 모델을 나쁜 구조에 넣으면 여전히 실패합니다.
장기 에이전트의 3가지 핵심 문제
장기 실행 에이전트를 망가뜨리는 패턴은 세 가지로 압축됩니다.
1. 컨텍스트 손실 새 세션은 이전 세션에서 무슨 일이 있었는지 전혀 모릅니다. 긴 세션이 컨텍스트 윈도우를 채우면 Claude Code는 히스토리를 요약하는데, 이 과정에서 세부 정보가 소실됩니다. 12시간 작업 중간에 세션이 끊기면 에이전트는 처음부터 다시 시작하거나 잘못된 방향으로 갑니다.
2. 에이전트 나태함(Agentic Laziness) 복잡한 멀티파트 태스크를 받으면 에이전트가 끝까지 완료하기 전에 이유를 만들어 멈추려는 경향이 있습니다. "이 부분은 다음에 이어서 하겠습니다" 같은 패턴입니다. 사람이 체크하지 않으면 태스크의 절반만 완료된 채로 끝납니다.
3. 실패한 접근의 반복 기록이 없으면 다음 세션에서 같은 막힌 길을 다시 시도합니다. "Tsit5로 시도했더니 시스템이 너무 강직(stiff)해서 실패. Kvaerno5로 전환"처럼 실패 이력을 명시적으로 남기지 않으면 에이전트는 같은 실수를 반복합니다.
핵심 패턴 1 — CLAUDE.md + CHANGELOG.md 이중 메모리 구조
Anthropic이 자체 장기 에이전트 연구에서 공개한 구조입니다.
CLAUDE.md는 에이전트의 살아있는 계획서입니다. 에이전트가 학습하면서 직접 수정합니다. CHANGELOG.md는 이동 가능한 장기 메모리로, 일종의 실험 노트 역할을 합니다. 현재 상태, 완료된 태스크, 실패한 접근과 이유, 핵심 체크포인트의 정확도 테이블, 알려진 한계를 추적합니다.
# CLAUDE.md — 에이전트 작업 계획서
## 현재 목표
레거시 결제 모듈을 새 API로 마이그레이션
## 작업 원칙
1. 작업 전 반드시 CHANGELOG.md를 읽어 이전 진행 상황 파악
2. 각 의미 있는 작업 단위 완료 후 git commit
3. 실패한 접근은 반드시 CHANGELOG.md에 이유와 함께 기록
4. 세션 종료 전 CHANGELOG.md 업데이트 필수
5. 완료 선언 전 체크리스트 자체 검증 실행
## 성공 기준
- 모든 기존 테스트 통과
- 새 API 엔드포인트 연동 확인
- 레거시 코드 제거 완료
# CHANGELOG.md — 작업 이력
## 2026-06-15 세션 2 (진행 중)
**현재 상태:** PaymentProcessor 클래스 리팩토링 중
**완료:**
- [x] API 클라이언트 모듈 작성 완료 (commit: a3f2b1c)
- [x] 인증 로직 마이그레이션 완료 (commit: 9d4e7f2)
**진행 중:**
- [ ] PaymentProcessor.charge() 메서드 변환
**실패한 접근 (재시도 금지):**
- ❌ requests 라이브러리로 직접 API 호출 시도 → SSL 인증서 오류 발생
→ httpx + 커스텀 cert 번들로 전환 필요
- ❌ 기존 retry 로직 재사용 시도 → 새 API는 exponential backoff 미지원
→ tenacity 라이브러리로 교체 필요
**다음 세션 시작 지점:**
PaymentProcessor.charge() 변환 후 refund() 메서드 순서로 진행
핵심 패턴 2 — Ralph Loop (에이전트 나태함 방지)
Ralph Loop는 에이전트가 완료를 선언할 때마다 "정말 다 됐냐"고 되물으면서 컨텍스트에 다시 킥하는 for 루프입니다. 에이전트 나태함을 방지하는 핵심 패턴입니다.
import anthropic
import subprocess
client = anthropic.Anthropic()
def ralph_loop(
goal: str,
max_iterations: int = 50,
check_model: str = "claude-sonnet-4-6" # 빠른 모델로 완료 검증
):
"""
Ralph Loop: 에이전트가 완료를 선언해도 실제 완료 여부를 별도 모델로 검증
"""
iteration = 0
while iteration < max_iterations:
iteration += 1
print(f"\n--- 이터레이션 {iteration} ---")
# 1. CHANGELOG.md 읽어서 현재 상태 파악
try:
with open("CHANGELOG.md", "r") as f:
changelog = f.read()
except FileNotFoundError:
changelog = "없음 (첫 세션)"
# 2. Claude에게 다음 작업 지시
prompt = f"""
CHANGELOG.md를 읽고 다음 작업을 이어서 진행해줘.
현재 CHANGELOG.md 내용:
{changelog}
전체 목표: {goal}
작업 완료 후 CHANGELOG.md를 업데이트하고,
모든 작업이 완료됐으면 마지막 줄에 'TASK_COMPLETE'를 출력해줘.
완료되지 않았으면 다음 작업 내용을 명확히 명시해줘.
"""
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=8096,
messages=[{"role": "user", "content": prompt}]
)
agent_output = response.content[0].text
print(agent_output[:500]) # 출력 미리보기
# 3. 에이전트가 완료 선언 시 별도 모델로 검증
if "TASK_COMPLETE" in agent_output:
print("\n에이전트가 완료 선언 → 독립 검증 실행 중...")
verification = client.messages.create(
model=check_model,
max_tokens=1024,
messages=[{
"role": "user",
"content": f"""
다음 목표가 실제로 완료됐는지 검증해줘:
목표: {goal}
에이전트 출력:
{agent_output}
CHANGELOG.md:
{open('CHANGELOG.md').read() if os.path.exists('CHANGELOG.md') else '없음'}
완료됐으면 'VERIFIED', 아니면 'NOT_DONE: [미완료 이유]'로 답해줘.
"""
}]
)
verdict = verification.content[0].text
print(f"검증 결과: {verdict}")
if "VERIFIED" in verdict:
print("✅ 태스크 완전 완료 확인")
return True
else:
print(f"⚠️ 미완료 감지: {verdict}")
# 완료 안 됐으면 다음 이터레이션 계속
continue
# 4. git commit (의미 있는 변경 시)
subprocess.run(["git", "add", "-A"], capture_output=True)
result = subprocess.run(
["git", "diff", "--cached", "--stat"],
capture_output=True, text=True
)
if result.stdout.strip():
subprocess.run([
"git", "commit", "-m",
f"[agent] 이터레이션 {iteration}: 자동 커밋"
], capture_output=True)
print(f"git commit 완료")
print(f"❌ 최대 이터레이션 {max_iterations} 도달")
return False
# 실행 예시
import os
ralph_loop(
goal="레거시 결제 모듈을 새 Stripe API v4로 마이그레이션하고 모든 테스트 통과",
max_iterations=100
)
핵심 패턴 3 — tmux + git 기반 장기 세션 관리
서버에서 며칠짜리 태스크를 돌릴 때 씁니다.
tmux 세션을 시작하고, Claude Code에 방향을 잡아준 다음 detach합니다. 필요할 때 다시 attach해서 확인하거나 방향을 수정합니다.
# 장기 세션 시작
tmux new-session -d -s claude-agent -x 220 -y 50
# CLAUDE.md 먼저 작성
cat > CLAUDE.md << 'EOF'
## 목표
exchange-core 금융 매칭 엔진 성능 최적화
## 작업 원칙
1. 시작 시 CHANGELOG.md 반드시 읽기
2. 프로파일링 → 최적화 → 테스트 순서 준수
3. 각 최적화 전략 시도 후 결과를 CHANGELOG.md에 기록
4. 성능 개선 수치를 정확히 측정하고 기록
5. 실패한 전략은 이유와 함께 기록 (재시도 금지)
## 성공 기준
처리량 50% 이상 향상 + 모든 기존 테스트 통과
EOF
# Claude Code 시작
tmux send-keys -t claude-agent "claude" Enter
sleep 2
# 목표 지시
tmux send-keys -t claude-agent \
"/goal CLAUDE.md를 읽고 exchange-core 최적화를 시작해줘. 완료 기준은 처리량 50% 향상이야." \
Enter
# detach (백그라운드에서 계속 실행)
tmux detach-session -t claude-agent
echo "에이전트 실행 중. 'tmux attach -t claude-agent'로 확인 가능"
진행 상황 모니터링:
# 언제든 attach해서 확인
tmux attach -t claude-agent
# git log로 진행 상황 파악
git log --oneline -20
# CHANGELOG.md로 현재 상태 파악
cat CHANGELOG.md
세션이 끊겼을 때 재시작:
tmux send-keys -t claude-agent \
"CHANGELOG.md를 읽고 중단된 작업을 이어서 진행해줘" \
Enter
핵심 패턴 4 — Claude Managed Agents API (서버리스 장기 실행)
직접 인프라 관리 없이 장기 에이전트를 돌리고 싶을 때 씁니다.
Claude Managed Agents는 상태 유지형(stateful) 설계입니다. 세션이 장기 실행되고, 일시 중지 후 깔끔하게 재개되며, 대화 히스토리·샌드박스 상태·출력물이 서버 사이드에 저장됩니다.
import anthropic
client = anthropic.Anthropic()
# 장기 에이전트 세션 생성
session = client.beta.managed_agents.sessions.create(
model="claude-opus-4-8",
system="""당신은 장기 소프트웨어 엔지니어링 태스크를 처리하는 에이전트입니다.
작업 시작 시 항상 PROGRESS.md를 먼저 확인하고,
의미 있는 작업 완료마다 PROGRESS.md를 업데이트하세요.
실패한 접근은 반드시 기록하고 같은 방법을 재시도하지 마세요.""",
betas=["managed-agents-2026-04-01"]
)
session_id = session.id
print(f"세션 생성: {session_id}")
# 초기 태스크 지시
response = client.beta.managed_agents.sessions.send_message(
session_id=session_id,
message="레거시 인증 시스템을 OAuth 2.0으로 마이그레이션해줘. "
"PROGRESS.md에 진행 상황을 계속 업데이트해줘."
)
# 몇 시간 후 진행 상황 확인
status = client.beta.managed_agents.sessions.retrieve(session_id)
print(f"세션 상태: {status.status}")
# 중간 점검 및 방향 수정
follow_up = client.beta.managed_agents.sessions.send_message(
session_id=session_id,
message="PROGRESS.md 현재 상태를 요약해주고, "
"다음으로 처리할 가장 중요한 항목은 뭐야?"
)
print(follow_up.content[0].text)
어떤 태스크에 장기 에이전트가 맞나
장기 자율 에이전트가 잘 맞는 태스크의 공통점은 세 가지입니다. 작업 범위가 명확히 정의돼 있고, 성공 기준이 측정 가능하며, 중간 검증이 가능한 태스크입니다.
잘 맞는 작업들:
레거시 코드 마이그레이션 (Python 2 → 3, 구 API → 신 API), 대형 코드베이스 리팩토링, 레퍼런스 구현 대비 수치 솔버 재구현, Fortran/COBOL 같은 구형 언어를 현대 언어로 변환, 대규모 테스트 스위트 작성, 성능 프로파일링 및 최적화.
맞지 않는 작업들: 성공 기준이 주관적인 작업(디자인 결정, 아키텍처 선택), 외부 사람의 승인이 필요한 작업, 매 단계 사람의 판단이 필수인 작업.
실패 방지 체크리스트
실전에서 자주 만나는 실패 패턴과 방지법입니다.
실패 패턴 방지 방법
| 세션 끊김 후 처음부터 재시작 | CHANGELOG.md 필수, 세션 시작 시 반드시 읽도록 지시 |
| 에이전트 나태함으로 조기 종료 | Ralph Loop 적용, 완료 선언 시 별도 모델로 검증 |
| 같은 실패 반복 | 실패한 접근을 CHANGELOG.md에 이유와 함께 기록 |
| 컨텍스트 윈도우 초과 | 세션을 기능 단위로 스코프, PROGRESS.md로 핸드오프 |
| 변경 사항 유실 | 의미 있는 작업 완료마다 git commit |
| 비용 폭발 | 최대 이터레이션 설정, 일일 지출 한도 설정 |
✅ 결론
- 장기 에이전트 실패의 60%는 모델이 아닌 설계 문제입니다
- CLAUDE.md(계획) + CHANGELOG.md(진행 이력) 이중 구조가 핵심입니다
- Ralph Loop로 에이전트 나태함을 방지하고, 별도 모델로 완료 검증을 하세요
- git commit을 체크포인트로 쓰면 어디서든 재시작이 가능합니다
- tmux + git은 서버 장기 실행, Managed Agents API는 인프라 없이 쓸 때 씁니다
❌ 주의
- 성공 기준이 측정 불가능한 태스크에는 장기 에이전트가 맞지 않습니다
- 비용을 과소평가하지 마세요. 12시간 실행은 상당한 토큰을 씁니다. 반드시 일일 한도를 먼저 설정하세요
- Claude Managed Agents는 현재 베타입니다. ZDR(Zero Data Retention)과 HIPAA BAA가 적용되지 않습니다
'Claude' 카테고리의 다른 글
| 미국 정부가 Anthropic Claude Fable 5·Mythos 5 접근을 차단했다 — 무슨 일이 있었나 (0) | 2026.06.15 |
|---|---|
| Claude Opus 4.8 Fast Mode 실전 가이드: Opus 4.7보다 3배 싸진 고속 모드, 언제 쓰면 이득인가 (0) | 2026.06.11 |
| Claude Fable 5, 지금 바로 써야 하는 이유 — 6월 22일까지 무료입니다 (0) | 2026.06.10 |
| Claude Fable 5 가격 분석 — $10/$50 실제로 얼마나 나오나, 쓸 만한가 (0) | 2026.06.10 |
| Claude Fable 5 실전 가이드 — API 연동부터 에이전트 설계까지 (0) | 2026.06.10 |