2P by GN⁺ 4시간전 | ★ favorite | 댓글과 토론
  • 장기 실행 에이전트를 위한 호스팅 서비스 Managed Agents는 하네스(harness)가 모델 발전에 따라 변해도 안정적으로 유지되는 인터페이스 기반 아키텍처를 채택
  • 하네스는 Claude가 혼자 수행하지 못하는 작업에 대한 가정을 인코딩하지만, 모델이 발전하면 해당 가정이 낡은 것(stale) 이 되어 불필요한 오버헤드 발생
  • 운영체제가 하드웨어를 프로세스·파일 같은 추상화로 가상화한 것처럼, Managed Agents는 에이전트 구성 요소(세션, 하네스, 샌드박스)를 가상화하여 독립적 교체 가능
  • 두뇌(하네스)와 손(샌드박스)을 분리함으로써 p50 TTFT 약 60% 감소, p95는 90% 이상 감소라는 성능 개선 달성
  • 이 설계는 향후 어떤 하네스·샌드박스가 등장하더라도 수용 가능한 메타 하네스(meta-harness) 역할 수행

하네스의 가정은 모델 발전에 따라 낡아짐

  • 하네스는 Claude가 스스로 할 수 없는 작업에 대한 가정을 인코딩하는 구조이나, 모델이 발전하면 해당 가정이 불필요해짐
  • Claude Sonnet 4.5에서는 컨텍스트 한계가 다가오면 작업을 조기에 종료하는 "context anxiety" 현상이 있어 컨텍스트 리셋을 하네스에 추가
  • Claude Opus 4.5에서는 해당 동작이 사라져 리셋 로직이 불필요한 코드가 됨
  • 하네스가 계속 변화할 것으로 예상하여, 특정 구현에 종속되지 않는 범용 인터페이스 기반의 Managed Agents 서비스 구축

운영체제에서 영감을 받은 설계 철학

  • 운영체제는 하드웨어를 프로세스, 파일 같은 추상화로 가상화하여, 아직 존재하지 않는 프로그램도 실행할 수 있도록 설계
  • read() 명령이 1970년대 디스크 팩이든 최신 SSD든 동일하게 작동하는 것처럼, 추상화가 하드웨어보다 오래 지속
  • Managed Agents도 동일한 패턴을 따라 에이전트 구성 요소를 가상화
    • 세션(session): 발생한 모든 이벤트의 append-only 로그
    • 하네스(harness): Claude를 호출하고 도구 호출을 라우팅하는 루프
    • 샌드박스(sandbox): Claude가 코드를 실행하고 파일을 편집하는 실행 환경

초기 설계: 단일 컨테이너의 한계 ("Pet" 문제)

  • 초기에는 세션, 하네스, 샌드박스를 하나의 컨테이너에 배치
  • 파일 편집이 직접 syscall로 가능하고 서비스 경계 설계가 불필요한 장점이 있었음
  • 하지만 컨테이너가 "pet"(교체 불가능한 개별 인스턴스)이 되는 문제 발생
    • 컨테이너 장애 시 세션 유실
    • 응답 불능 시 컨테이너를 수동으로 복구해야 함
  • 디버깅 관점에서 WebSocket 이벤트 스트림만으로는 장애 발생 위치 파악이 불가능했고, 컨테이너에 셸 접근 시 사용자 데이터가 포함되어 있어 디버깅 자체가 어려웠음
  • 하네스가 모든 작업 대상이 컨테이너 내부에 있다고 가정해, 고객의 VPC 연결 요구 시 네트워크 피어링이나 자체 환경에서 하네스 실행이 필요

두뇌와 손의 분리 (핵심 아키텍처)

  • "두뇌"(Claude와 하네스), "손"(샌드박스와 도구), "세션"(이벤트 로그)을 각각 독립 인터페이스로 분리
  • 각 구성 요소가 독립적으로 실패하거나 교체 가능

하네스의 컨테이너 탈출

  • 하네스가 컨테이너 외부로 이동하여, 컨테이너를 다른 도구와 동일하게 execute(name, input) → string으로 호출
  • 컨테이너가 "cattle"(교체 가능한 인스턴스)로 전환
  • 컨테이너 장애 시 하네스가 이를 도구 호출 오류로 처리하고, Claude가 재시도 결정 시 provision({resources})새 컨테이너 초기화

하네스 장애 복구

  • 세션 로그가 하네스 외부에 존재하므로, 하네스 내부에 생존해야 할 상태가 없음
  • 장애 시 wake(sessionId)getSession(id)로 이벤트 로그를 가져와 마지막 이벤트부터 재개
  • 하네스는 에이전트 루프 중 emitEvent(id, event)내구성 있는 이벤트 기록 유지

보안 경계

  • 결합 설계에서는 Claude가 생성한 비신뢰 코드가 자격 증명과 같은 컨테이너에서 실행되어, 프롬프트 인젝션으로 환경 변수 탈취 가능
  • 공격자가 토큰을 획득하면 제한 없는 새 세션 생성 및 작업 위임 가능
  • 구조적 해결: 샌드박스에서 토큰에 절대 접근할 수 없도록 분리
  • Git: 리포지토리 액세스 토큰으로 샌드박스 초기화 시 클론하고 로컬 git remote에 연결, 에이전트가 토큰을 직접 다루지 않고 push/pull 수행
  • MCP 커스텀 도구: OAuth 토큰을 보안 볼트(vault) 에 저장하고, 전용 프록시를 통해 MCP 도구 호출 시 세션 연관 토큰으로 볼트에서 자격 증명을 가져와 외부 서비스 호출

세션은 Claude의 컨텍스트 윈도우가 아님

  • 장기 작업은 Claude의 컨텍스트 윈도우 길이를 초과하는 경우가 많아, 무엇을 유지할지에 대한 비가역적 결정 필요
  • 압축(compaction): Claude가 컨텍스트 윈도우의 요약을 저장
  • 메모리 도구: Claude가 컨텍스트를 파일에 기록하여 세션 간 학습 가능
  • 컨텍스트 트리밍: 오래된 도구 결과나 사고 블록 등 선택적 토큰 제거
  • 비가역적 컨텍스트 폐기는 미래 턴이 필요로 할 토큰을 예측하기 어렵기 때문에 실패로 이어질 수 있음
  • 선행 연구에서는 컨텍스트를 컨텍스트 윈도우 외부에 존재하는 객체로 저장하고, LLM이 코드를 작성해 프로그래밍적으로 접근하는 방식 탐구

Managed Agents의 세션 로그 활용

  • 세션이 컨텍스트 윈도우 밖에 존재하는 컨텍스트 객체 역할 수행
  • 샌드박스나 REPL이 아닌 세션 로그에 내구적으로 저장
  • getEvents() 인터페이스로 이벤트 스트림의 위치 기반 슬라이스 선택 가능
    • 마지막 읽기 지점부터 이어서 읽기
    • 특정 시점 전 몇 개 이벤트를 되감아 확인
    • 특정 액션 전 컨텍스트 재읽기
  • 가져온 이벤트는 하네스에서 변환 후 Claude의 컨텍스트 윈도우에 전달 가능
  • 변환 내용에는 높은 프롬프트 캐시 적중률을 위한 컨텍스트 정리 및 컨텍스트 엔지니어링 포함
  • 세션은 내구적 저장과 조회만 보장하고, 구체적인 컨텍스트 관리는 하네스에 위임하여 미래 모델의 요구 변화에 대응

다수의 두뇌, 다수의 손

다수의 두뇌 (Many Brains)

  • 두뇌와 손의 분리로 초기 고객 불만 해소: VPC 내 리소스 작업 시 더 이상 네트워크 피어링 불필요
  • 초기 설계에서는 각 두뇌마다 컨테이너가 필요하여, 컨테이너 프로비저닝이 끝날 때까지 추론 시작 불가
  • 샌드박스가 필요 없는 세션도 리포지토리 클론, 프로세스 부팅, 펜딩 이벤트 가져오기 등 풀 컨테이너 셋업 비용 부담
  • 분리 후 컨테이너가 필요한 경우에만 도구 호출로 프로비저닝하여 불필요한 대기 시간 제거
  • 추론은 오케스트레이션 레이어가 세션 로그에서 펜딩 이벤트를 가져오는 즉시 시작 가능
  • p50 TTFT 약 60% 감소, p95 TTFT 90% 이상 감소
  • 다수의 두뇌 확장은 단순히 상태 없는(stateless) 하네스를 다수 시작하고, 필요 시에만 손에 연결

다수의 손 (Many Hands)

  • 각 두뇌를 다수의 실행 환경에 연결하는 기능 필요
  • Claude가 여러 실행 환경에 대해 추론하고 작업 배분을 결정해야 하므로 단일 셸보다 인지적으로 더 어려운 과제
  • 초기에는 모델 능력 부족으로 단일 컨테이너에 두뇌를 배치했으나, 지능이 향상되면서 단일 컨테이너가 오히려 제약으로 작용
  • 분리 설계에서 각 손은 execute(name, input) → string 도구로 취급
    • 커스텀 도구, MCP 서버, 자체 도구 모두 지원
    • 하네스는 샌드박스가 컨테이너인지, 폰인지, 포켓몬 에뮬레이터인지 알 필요 없음
  • 두뇌와 손이 결합되어 있지 않으므로, 두뇌 간 손의 전달도 가능

결론: 메타 하네스로서의 Managed Agents

  • 운영체제가 하드웨어를 가상화하여 아직 존재하지 않는 프로그램을 수용한 것과 동일한 접근
  • Managed Agents는 특정 하네스에 종속되지 않은 메타 하네스로, 다양한 하네스를 수용하는 범용 인터페이스 제공
  • Claude Code도 하나의 하네스로 사용 가능하며, 작업 특화 에이전트 하네스도 수용
  • 인터페이스에 대해서는 명확한 입장을 가짐: Claude가 상태 조작(세션)계산 수행(샌드박스) 능력을 필요로 한다는 점
  • 다수의 두뇌와 손으로의 확장, 장기 안정적·안전한 운영을 위한 인터페이스 설계
  • 두뇌와 손의 수량이나 위치에 대해서는 어떤 가정도 하지 않음