클로드 코드 세션끼리 @세션이름으로 메시지를 보낼 수 있다는데, 서브에이전트와 뭐가 다를까?

터미널 두 개에서 클로드 코드를 따로 돌리다 보면 한쪽에서 알아낸 걸 다른 쪽에 알려 주려고 복사해 붙여 넣는 일이 생깁니다. “A 세션에서 스키마를 바꿨으니 B 세션은 그걸 알아야 한다” 같은 상황입니다. 2026년 8월 들어 이게 자동화됐습니다. 프롬프트에 @세션이름을 쓰면 클로드가 그 세션에 메시지를 보내고, 같은 시기에 서브에이전트도 “대화를 통째로 물려받는 포크” 방식이 기본이 됐습니다.

둘 다 “클로드가 다른 클로드에게 일을 넘긴다”는 점에서 비슷해 보여서 헷갈립니다. 하지만 하나는 내가 시작한 독립된 세션 사이의 편지이고, 다른 하나는 한 세션 안에서 갈라져 나온 분신입니다. 이 글은 두 기능이 각각 무엇이고 언제 무엇을 쓰는지를 공식 문서를 기준으로 정리합니다. 지난 글 agents view 사용법이 여러 세션을 한눈에 보는 쪽이었다면, 이 글은 그 세션들이 서로 말을 거는 쪽입니다.

먼저 구분 — 세션·서브에이전트·포크

구분독립 세션일반 서브에이전트포크 서브에이전트
누가 만드나내가 터미널에서 시작클로드가 작업 중 생성클로드가 작업 중 생성
시작 시 아는 것자기 대화만위임 프롬프트만(빈 컨텍스트)메인 대화 전체
모델·도구각자에이전트 정의 파일대로메인 세션과 동일(모델 지정 무시)
실행각자 터미널배경(기본)배경
결과메시지로 주고받음최종 보고만 메인에 돌아옴최종 보고만 메인에 돌아옴
프롬프트 캐시각자별도메인과 공유(저렴)

포크는 v2.1.232부터 대화형 세션에서 기본으로 켜져 있습니다. 클로드가 부수 작업을 나눌 때 “지금까지의 대화를 다 아는 분신”을 배경에 띄우고, 그 분신의 도구 호출 로그는 내 화면에 안 올라오고 결과만 돌아옵니다. 직접 부르려면 /subtask(v2.1.212 이상) 뒤에 할 일을 적으면 됩니다. 끄려면 환경변수 CLAUDE_CODE_FORK_SUBAGENT=0, 클로드가 포크를 못 만들게 하려면 permissions.denyAgent(fork)를 넣습니다.

세션 간 메시징 — 켤 것 없이 이미 켜져 있습니다

macOS·Linux(WSL 2 포함)는 v2.1.224, 네이티브 윈도우는 v2.1.234 이상이면 세션 간 메시징이 별도 설정 없이 켜져 있습니다. 클로드는 ListAgents로 닿을 수 있는 세션을 찾고 SendMessage로 보냅니다. 두 도구 모두 내가 직접 부르는 게 아니라, “다른 터미널 세션에 마이그레이션 끝났는지 물어봐”처럼 말하면 클로드가 알아서 씁니다. 클로드가 필요하다고 판단하면 시키지 않아도 먼저 보내기도 합니다.

대상을 직접 지목하려면 프롬프트에 @를 치고 세션 이름 앞글자를 입력해 목록에서 고릅니다(v2.1.232 이상). 세션 이름은 /rename이나 시작 시 --name으로 정하고, 안 정하면 클로드 코드가 붙여 줍니다. 지금 세션이 닿을 수 있는 목록은 /list-agents(별칭 /peers)로 볼 수 있습니다. 첫 줄이 이 세션의 이름이고, 아래 줄이 서브에이전트·팀원·같은 머신의 다른 세션·클라우드 세션 순입니다.

메시지는 무엇이고 무엇이 아닌가

가장 중요한 경계는 이것입니다. 메시지는 한 클로드가 다른 클로드에게 쓰는 짧은 글이지, 보내는 쪽의 대화 기록이나 파일이 아닙니다. 대화를 통째로 넘기고 싶으면 메시지가 아니라 세션 재개(resume)를 써야 합니다. 그래서 문서가 권하는 용도는 다음 네 가지입니다.

  • 발견 넘기기 — 한 세션이 깨지는 변경을 발견했거나 결정을 내렸을 때, 영향받는 쪽 세션에 요약을 보냅니다.
  • 워크트리 조율 — 같은 저장소를 여러 워크트리에서 작업할 때 무엇이 반영됐는지 알립니다.
  • 장시간 작업 상태 — 마이그레이션이나 테스트를 돌리는 세션이 끝나면 보고하게 합니다. v2.1.236부터는 “그 세션이 다음에 한가해지면 한 번 알려 달라”는 알림 예약도 됩니다. 12시간 안에 안 오면 자동으로 취소됩니다.
  • 다른 머신 — Remote Control로 연결된 다른 머신의 세션이나 웹 세션에도 닿습니다.

받는 쪽은 진행 중인 도구 호출을 중단하지 않고 호출 사이에 메시지를 읽습니다. 한가한 세션이면 메시지로 새 턴이 시작됩니다. 화면에는 › Message from @api-worker: … 같은 한 줄 미리보기로 뜨고, Ctrl+O로 전문을 볼 수 있습니다(v2.1.247 이후).

받는 쪽의 안전장치 — 메시지는 승인이 아닙니다

다른 세션에서 온 메시지가 내 세션을 마음대로 움직이지 못하게 하는 규칙이 문서에 못 박혀 있습니다.

메시지가 할 수 없는 것이유
대기 중인 권한 프롬프트에 대신 답하기다른 세션의 메시지는 내 동의로 치지 않음
권한 설정·CLAUDE.md·구성 바꾸기받는 클로드에게 그렇게 하지 말라고 지시돼 있음
/compact 같은 명령 실행명령은 그냥 텍스트로 도착
권한 없이 행동하기받는 세션의 권한 프롬프트와 규칙이 그대로 적용

권한 경계는 세션마다 따로입니다. 자기 세션에서 거부된 행동을 다른 세션에 부탁하지 말라고 클로드에게 지시돼 있고, 그런 일은 사용자에게 돌리게 돼 있습니다. 수신 자체도 제어할 수 있습니다. crossSessionInboundaccept·hold·refuse 중에서 정하면 되고(/config의 “Messages from your other sessions” 행), 아무것도 안 정하면 두 세션의 권한 모드로 판단합니다. 권한 확인을 건너뛰는(bypassPermissions) 세션에서 온 메시지는 보류하고 내 승인을 기다립니다. 다른 머신으로 나가는 메시지에 매번 승인을 걸려면 isolatePeerMachines: true를 씁니다.

어디로 지나가나 — 같은 머신이면 서버를 안 거칩니다

같은 머신의 세션끼리는 세션별 소켓(macOS·Linux) 또는 이름 있는 파이프(윈도우)로 전달돼 Anthropic 서버를 거치지 않습니다. 다른 머신이나 웹 세션으로 가는 메시지만 Anthropic 서버를 거쳐 Remote Control 연결로 도착합니다. 컨테이너 안팎, WSL 2와 네이티브 윈도우는 파일 시스템이 달라 서로 못 찾습니다.

정리 — 언제 무엇을 쓸까

  • 지금 대화의 맥락을 아는 분신이 부수 작업을 하길 원한다 → 포크 서브에이전트(/subtask). 대화를 다시 설명할 필요가 없고 캐시를 공유해 싸다.
  • 맥락 없이 깨끗하게 특정 역할만 시키고 싶다 → 일반 서브에이전트. 정의 파일의 모델·도구를 따른다.
  • 내가 따로 띄운 세션에 결정이나 상태를 전하고 싶다 → 세션 간 메시징(@세션이름). 짧은 글만 간다.
  • 한 세션의 대화 전체를 다른 터미널에서 잇고 싶다 → 세션 재개. 메시징으로는 안 된다.

공식 문서는 세션 간 메시징서브에이전트 두 페이지입니다. 세션을 예약해서 돌리는 방법은 /schedule과 launchd 글, 컨텍스트가 차면 어떻게 되는지는 컨텍스트 윈도우 글에서 이어집니다.