Anthropic Engineering Blog 분석 — "Scaling Managed Agents: Decoupling the brain from the hands"
하네스가 낡는다는 문제
에이전트를 만들다 보면 항상 이런 코드가 쌓인다. 모델이 이걸 못하니까 우리가 대신 처리해주는 로직들. 컨텍스트 한계에 가까워지면 조기에 태스크를 끝내버리는 "context anxiety" 현상을 발견하면 컨텍스트 리셋 로직을 하네스에 추가한다.
그런데 같은 하네스를 다음 모델에 적용하면 그 행동이 사라져 있다. 리셋 로직은 dead weight가 된다. 하네스는 "Claude가 아직 못 하는 것"에 대한 가정을 인코딩하는데, 모델이 개선될수록 그 가정이 낡는다.
Anthropic이 Managed Agents를 만든 이유가 바로 이것이다. 특정 하네스 구현보다 오래 살아남는 인터페이스를 설계하는 것.
OS에서 배운 교훈
이 문제는 컴퓨팅의 오래된 과제다. "아직 생각하지 못한 프로그램들을 위한 시스템을 어떻게 설계할 것인가." 수십 년 전 OS는 하드웨어를 추상화해서 이 문제를 풀었다. process, file 같은 추상화는 당시에 존재하지도 않던 프로그램들을 위해 충분히 일반적이었다. read() 커맨드는 1970년대 디스크 팩이든 현대 SSD든 무관하게 작동한다.
Managed Agents는 같은 패턴을 에이전트에 적용한다. 에이전트의 컴포넌트를 가상화해서 세 가지 인터페이스로 분리했다.
- Session — 세션에서 일어난 모든 일의 append-only 로그
- Harness — Claude를 호출하고 툴 콜을 라우팅하는 루프
- Sandbox — Claude가 코드를 실행하고 파일을 편집하는 환경
각각의 구현이 바뀌어도 나머지가 영향을 받지 않도록.
Pet을 만들지 마라
처음에는 모든 컴포넌트를 단일 컨테이너에 넣었다. Session 로그, Harness, Sandbox가 전부 같은 환경을 공유했다.
하지만 이 방식은 pets-vs-cattle 문제에 걸렸다. 컨테이너가 곧 "pet"이 됐다. 이름이 붙고, 손수 돌봐야 하고, 잃으면 안 되는 존재. 컨테이너가 죽으면 세션이 날아갔다. 컨테이너가 응답하지 않으면 되살려야 했다.
디버깅할 수 있는 유일한 창문은 WebSocket 이벤트 스트림뿐이었는데, 이걸로는 장애가 어디서 발생했는지 알 수 없었다. 하네스 버그인지, 패킷 드롭인지, 컨테이너 오프라인인지 모두 동일하게 보였다. 컨테이너 안에 사용자 데이터도 함께 있어서 직접 shell에 접근하는 것도 불가능했다.
보안 문제도 있었다. 컨테이너 안에 Claude가 생성한 코드와 크리덴셜이 함께 있으니, prompt injection 공격이 성공하면 크리덴셜을 바로 읽을 수 있었다.
해법: Brain과 Hands 분리
[이전]
┌──────────────────────────────────────┐
│ Harness + Claude │
│ Session log │
│ Sandbox + Credentials │
│ │
│ container dies → all state lost │
└──────────────────────────────────────┘
[현재: Managed Agents]
┌──────────────────────────────────────┐
│ Brain: Harness + Claude │
│ stateless · crash → wake(sessionId) │
└───────────┬───────────────┬──────────┘
│ │
getEvents() execute(name,input)
│ │
▼ ▼
┌────────────┐ ┌────────────┐
│ Session │ │ Sandbox #1 │ ← cattle
│ log │ │ Sandbox #2 │
│ (durable) │ │ Sandbox N │
└────────────┘ └──────┬─────┘
│
┌─────────┴────────┐
│ Credential Vault │
│ (isolated from │
│ sandbox code) │
└──────────────────┘
Harness가 컨테이너 밖으로 나온다. Harness는 더 이상 컨테이너 안에 살지 않는다. 컨테이너를 다른 툴과 동일한 방식으로 호출한다.
execute(name, input) → string
컨테이너가 죽으면 하네스가 툴 콜 에러로 받아서 Claude에게 넘긴다. Claude가 재시도를 결정하면 새 컨테이너가 표준 레시피로 재초기화된다. 컨테이너는 cattle이 됐다.
하네스 자체도 cattle이 된다. Session 로그가 하네스 외부에 존재하기 때문에, 하네스 안에 살아남아야 할 상태가 없다. 하네스가 크래시하면 새 하네스가 이렇게 재기동한다.
wake(sessionId) # 새 하네스 기동
getSession(id) # 이벤트 로그 복원
emitEvent(id, event) # 진행 중 이벤트 기록
크리덴셜을 샌드박스와 격리한다. Git은 초기화 시점에 액세스 토큰으로 repo를 clone하고 로컬 git remote에 연결한다. 에이전트는 토큰을 직접 다루지 않고도 push/pull이 된다. MCP 커스텀 툴은 OAuth 토큰을 vault에 보관하고 전용 프록시를 통해 호출한다. Harness는 크리덴셜을 전혀 알 필요가 없다.
Session은 컨텍스트 윈도우가 아니다
Session이 Claude의 컨텍스트 윈도우 외부에 존재하는 컨텍스트 오브젝트 역할을 한다. getEvents() 인터페이스로 이벤트 스트림의 위치 기반 슬라이스를 선택할 수 있다.
# 마지막으로 읽은 위치부터 이어받기
getEvents(sessionId, after=last_event_id)
# 특정 순간 직전으로 돌아가기
getEvents(sessionId, before=event_id, limit=5)
# 특정 액션 전 컨텍스트 다시 읽기
getEvents(sessionId, slice=(start, end))
Anthropic이 Session의 맥락 저장과 Harness의 임의적 컨텍스트 관리를 분리한 이유는 미래 모델에 어떤 컨텍스트 엔지니어링이 필요할지 예측할 수 없기 때문이다. 인터페이스는 그 관리를 하네스로 밀어넣고, Session이 내구성 있고 조회 가능하다는 것만 보장한다.
성능 임팩트
이 아키텍처 변경이 숫자로 드러난 부분이 흥미롭다.
기존 아키텍처에서는 Brain이 컨테이너 안에 있었기 때문에, 인퍼런스가 시작하려면 컨테이너 프로비저닝이 완료될 때까지 기다려야 했다. Sandbox가 필요 없는 세션도 컨테이너 셋업 비용 전체를 선불로 냈다.
Brain을 Hands로부터 분리하면 컨테이너는 실제로 필요할 때만 execute(name, input) 툴 콜로 프로비저닝된다.
지표 개선
| p50 TTFT | ~60% 감소 |
| p95 TTFT | 90% 이상 감소 |
많은 Brain으로 스케일링하는 것도 단순해졌다. 상태 없는 하네스를 여러 개 띄우는 것만으로 된다. 각 Brain이 필요할 때만 Hands에 연결하면 된다.
핵심 설계 철학
Managed Agents는 meta-harness다. 미래에 Claude가 어떤 특정 하네스를 필요로 할지에 대해서는 무관심하다. Claude Code처럼 훌륭한 범용 하네스도 있고, 좁은 도메인에 특화된 태스크별 하네스도 있다. Managed Agents는 둘 다 수용한다.
인터페이스에 대해서는 opinionated하다.
- Claude는 상태를 조작하는 능력 (Session) 이 필요하다
- Claude는 연산을 수행하는 능력 (Sandbox) 이 필요하다
- Claude는 many brains, many hands 로 스케일해야 한다
그 인터페이스들이 장기간 안정적으로 동작하도록 설계했다. 하지만 Brain이나 Hands의 수나 위치에 대해서는 어떤 가정도 하지 않는다.
개발자 관점에서 보면
에이전트 인프라를 직접 구축해본 사람이라면 이 글에서 공감할 부분이 많다. 모델이 개선될 때마다 하네스 로직을 들어내야 하는 경험, 디버깅하려고 컨테이너에 접근했더니 사용자 데이터가 함께 있던 당황스러운 상황, 컨텍스트가 부족해서 요약을 날렸는데 나중에 그 부분이 필요해진 상황.
Managed Agents가 제안하는 답은 단순하다. 각 컴포넌트를 인터페이스로 추상화하고, 구현이 아닌 인터페이스에 의존하라. 그러면 모델이 개선될수록 구현만 바꾸면 되고 인터페이스는 살아남는다. OS가 수십 년간 해온 것을 에이전트 인프라에 적용한 것이다.
원문: Scaling Managed Agents: Decoupling the brain from the hands
'AI Tips' 카테고리의 다른 글
| Superpowers: 당신의 코딩 에이전트에게 초능력을 부여하는 방법 (1) | 2026.04.21 |
|---|---|
| 클로드(Claude)에서 카톡 보내는 시대가 왔다 — 카카오 PlayMCP 완벽 가이드 (0) | 2026.04.21 |
| 하네스 엔지니어링(Harness Engineering) — 2026년 AI 개발자가 반드시 알아야 할 새로운 레이어 (1) | 2026.04.15 |
| andrej-karpathy-skills 완전 분석: Karpathy의 관찰을 CLAUDE.md 한 파일로 증류하다 (1) | 2026.04.14 |
| Claude-Mem 완전 분석: Claude Code에 장기 기억을 심는 방법 (0) | 2026.04.14 |