터미널 두 개에서 클로드 코드를 따로 돌리다 보면 한쪽에서 알아낸 걸 다른 쪽에 알려 주려고 복사해 붙여 넣는 일이 생깁니다. “A 세션에서 스키마를 바꿨으니 B 세션은 그걸 알아야 한다” 같은 상황입니다. 2026년 8월 들어 이게 자동화됐습니다. 프롬프트에 @세션이름을 쓰면 클로드가 그 세션에 메시지를 보내고, 같은 시기에 서브에이전트도 “대화를 통째로 물려받는 포크” 방식이 기본이 됐습니다.
둘 다 “클로드가 다른 클로드에게 일을 넘긴다”는 점에서 비슷해 보여서 헷갈립니다. 하지만 하나는 내가 시작한 독립된 세션 사이의 편지이고, 다른 하나는 한 세션 안에서 갈라져 나온 분신입니다. 이 글은 두 기능이 각각 무엇이고 언제 무엇을 쓰는지를 공식 문서를 기준으로 정리합니다. 지난 글 agents view 사용법이 여러 세션을 한눈에 보는 쪽이었다면, 이 글은 그 세션들이 서로 말을 거는 쪽입니다.
목차
먼저 구분 — 세션·서브에이전트·포크
| 구분 | 독립 세션 | 일반 서브에이전트 | 포크 서브에이전트 |
|---|---|---|---|
| 누가 만드나 | 내가 터미널에서 시작 | 클로드가 작업 중 생성 | 클로드가 작업 중 생성 |
| 시작 시 아는 것 | 자기 대화만 | 위임 프롬프트만(빈 컨텍스트) | 메인 대화 전체 |
| 모델·도구 | 각자 | 에이전트 정의 파일대로 | 메인 세션과 동일(모델 지정 무시) |
| 실행 | 각자 터미널 | 배경(기본) | 배경 |
| 결과 | 메시지로 주고받음 | 최종 보고만 메인에 돌아옴 | 최종 보고만 메인에 돌아옴 |
| 프롬프트 캐시 | 각자 | 별도 | 메인과 공유(저렴) |
포크는 v2.1.232부터 대화형 세션에서 기본으로 켜져 있습니다. 클로드가 부수 작업을 나눌 때 “지금까지의 대화를 다 아는 분신”을 배경에 띄우고, 그 분신의 도구 호출 로그는 내 화면에 안 올라오고 결과만 돌아옵니다. 직접 부르려면 /subtask(v2.1.212 이상) 뒤에 할 일을 적으면 됩니다. 끄려면 환경변수 CLAUDE_CODE_FORK_SUBAGENT=0, 클로드가 포크를 못 만들게 하려면 permissions.deny에 Agent(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 같은 명령 실행 | 명령은 그냥 텍스트로 도착 |
| 권한 없이 행동하기 | 받는 세션의 권한 프롬프트와 규칙이 그대로 적용 |
권한 경계는 세션마다 따로입니다. 자기 세션에서 거부된 행동을 다른 세션에 부탁하지 말라고 클로드에게 지시돼 있고, 그런 일은 사용자에게 돌리게 돼 있습니다. 수신 자체도 제어할 수 있습니다. crossSessionInbound를 accept·hold·refuse 중에서 정하면 되고(/config의 “Messages from your other sessions” 행), 아무것도 안 정하면 두 세션의 권한 모드로 판단합니다. 권한 확인을 건너뛰는(bypassPermissions) 세션에서 온 메시지는 보류하고 내 승인을 기다립니다. 다른 머신으로 나가는 메시지에 매번 승인을 걸려면 isolatePeerMachines: true를 씁니다.
어디로 지나가나 — 같은 머신이면 서버를 안 거칩니다
같은 머신의 세션끼리는 세션별 소켓(macOS·Linux) 또는 이름 있는 파이프(윈도우)로 전달돼 Anthropic 서버를 거치지 않습니다. 다른 머신이나 웹 세션으로 가는 메시지만 Anthropic 서버를 거쳐 Remote Control 연결로 도착합니다. 컨테이너 안팎, WSL 2와 네이티브 윈도우는 파일 시스템이 달라 서로 못 찾습니다.
정리 — 언제 무엇을 쓸까
- 지금 대화의 맥락을 아는 분신이 부수 작업을 하길 원한다 → 포크 서브에이전트(
/subtask). 대화를 다시 설명할 필요가 없고 캐시를 공유해 싸다. - 맥락 없이 깨끗하게 특정 역할만 시키고 싶다 → 일반 서브에이전트. 정의 파일의 모델·도구를 따른다.
- 내가 따로 띄운 세션에 결정이나 상태를 전하고 싶다 → 세션 간 메시징(
@세션이름). 짧은 글만 간다. - 한 세션의 대화 전체를 다른 터미널에서 잇고 싶다 → 세션 재개. 메시징으로는 안 된다.
공식 문서는 세션 간 메시징과 서브에이전트 두 페이지입니다. 세션을 예약해서 돌리는 방법은 /schedule과 launchd 글, 컨텍스트가 차면 어떻게 되는지는 컨텍스트 윈도우 글에서 이어집니다.