Claude Code 세션 간 메시지 기능과 맥의 소켓 동작 구조

Claude Code 세션 간 메시지는 같은 맥 안에서는 유닉스 소켓으로 오갑니다. /tmp/cc-socks/ 아래에 세션마다 소켓 파일이 하나씩 생기고, 그 배달은 앤트로픽 서버를 거치지 않습니다.
다른 기기에 있는 세션은 사정이 다릅니다. 그쪽은 소켓이 아니라 Remote Control 을 타고, 그래서 목록에 잡히는 세션 수와 이 맥의 소켓 개수가 크게 어긋납니다.
세션 A 가 세션 B 에게 텍스트만 넘긴다
세션 간 메시지는 한 Claude 가 다른 Claude 에게 텍스트 한 덩어리를 넘기는 것입니다. 대화 기록도 파일도 권한도 함께 건너가지 않습니다. 받는 쪽에 도착하는 것은 보낸 세션의 이름과 그 텍스트뿐입니다. 대화 자체를 옮기고 싶으면 메시지가 아니라 세션 재개를 써야 합니다.
도구는 두 개입니다. ListAgents 로 닿을 수 있는 상대를 찾고, SendMessage 로 이름을 지정해 보냅니다. 둘 다 Claude 가 알아서 부르는 도구라 사람이 직접 호출할 일은 없습니다. 사람이 하는 일은 무엇을 전할지 말해 주는 쪽입니다.
주소로 쓰이는 이름은 /rename 이나 --name 으로 붙입니다. 안 붙이면 작업 디렉터리 이름을 딴 myapp-3f 같은 이름이 자동으로 붙고, 이름이 겹치면 목록이 짧은 식별자를 덧붙여 구분합니다.
받는 쪽은 도구 호출 사이에 메시지를 읽습니다. 돌고 있던 명령이 중간에 끊기는 일은 없고, 세션이 놀고 있으면 메시지가 새 턴을 엽니다. 본문에 /compact 같은 슬래시 명령이 섞여 있어도 실행되지 않고 글자 그대로 도착합니다. 배달 규칙과 예외는 세션 간 메시지 문서에 정리되어 있습니다.
쓸모는 세션끼리 어긋날 때 드러납니다. 한쪽이 스키마를 바꾸면 그 테이블을 쓰던 다른 세션이 곧 깨집니다. 그동안은 사람이 터미널을 옮겨 다니며 같은 이야기를 다시 설명해야 했습니다.
같은 맥 안에서는 앤트로픽 서버를 지나지 않는다
같은 맥의 세션끼리 오가는 메시지는 앤트로픽 서버를 거치지 않습니다. macOS 에서는 /tmp/cc-socks/ 아래에 세션마다 소켓 파일이 하나씩 생기고, 배달은 그 파일을 통해 기기 안에서 끝납니다.
이 파일은 소유자에게만 열려 있습니다. 한 맥을 여러 계정이 나눠 쓰더라도 OS 사용자가 다르면 서로의 세션에 닿지 못합니다.
닿는 상대가 대화형 세션만은 아닙니다. claude -p 로 띄운 헤드리스 워커에도 소켓이 붙어서, 오래 도는 작업이 메시지를 받고 목록에도 잡힙니다. 반대로 bare mode 로 시작한 세션은 소켓을 만들지 않아 목록에서 아예 보이지 않습니다.
주소는 세션과 함께 사라집니다. 세션을 끄면 그 소켓도 없어지고 목록에서 빠집니다.
35개가 잡히는데 소켓은 3개뿐이다
ListAgents 가 돌려주는 목록과 이 맥의 소켓 개수는 맞아떨어지지 않습니다. 목록이 35개일 때도 이 맥의 소켓은 세 개였습니다. 나머지는 전부 Remote Control 표시가 붙은, 이 맥에 없는 세션입니다.
Remote Control 이 붙지 않은 세션에서는 로컬만 남습니다. 아래는 그 상태에서 받은 목록입니다.
Peer sessions (2):
blog-92 [47fbc4] · interactive · busy · started 2d ago
google-ads-oauth-integration [5746b1] · interactive · shell · started 2h ago
두 줄 모두 소켓을 가진 이 맥의 세션이고, 목록을 부른 세션 자신은 빠져 있습니다. 소켓이 셋인데 상대가 둘인 이유가 이것입니다. Remote Control 이 붙는 순간 여기에 다른 기기와 웹의 세션이 얹히면서 줄 수가 열 배 넘게 뜁니다.
서버 없이 소켓으로 돈다는 설명은 그래서 같은 기기까지만 맞습니다. 다른 기기의 세션으로 가는 메시지는 앤트로픽 서버를 지나 그 기기의 Remote Control 연결로 내려갑니다. Claude Code CHANGELOG 의 2.1.224 소개 문구도 어느 기기에 있든 세션끼리 메시지를 주고받는다는 쪽입니다.
경로가 다르면 할 수 있는 일도 달라집니다. 같은 기기의 세션에는 먼저 말을 걸 수 있지만, 다른 기기와 웹의 세션에는 답장만 됩니다. 저쪽에서 메시지가 한 번 와야 답할 주소가 생기는 구조입니다. 세 경우가 공식 문서의 전송 경로 표에 나란히 정리되어 있습니다.
권한을 우회한 세션은 메시지를 보류한다
들어온 메시지가 언제나 배달되지는 않습니다. 받는 세션이 권한 확인을 건너뛰는 모드로 돌고 있으면 메시지는 보류되고 사용자 승인을 기다립니다. 그 밖의 세션으로 가는 메시지는 자동으로 배달됩니다. 2.1.224 에서 crossSessionInbound 와 dialogExpiry 설정이 함께 들어왔습니다.
crossSessionInbound 은 세 값을 받습니다. accept 는 그대로 배달, hold 는 알림만 띄우고 보류, refuse 는 배달 없이 버립니다. 값을 지정하지 않으면 보내는 세션과 받는 세션의 권한 모드를 견줘 자동으로 정해집니다. 보류된 승인 창을 그냥 두면 dialogExpiry 기한이 지나면서 메시지가 사라지고, 기본값은 5분입니다.
메시지가 할 수 없는 일도 정해져 있습니다. 다른 세션이 보낸 글은 사용자 동의를 대신하지 못해서, 떠 있는 권한 프롬프트에 대신 답할 수 없습니다. 설정이나 CLAUDE.md 를 바꿔 달라는 요구도 받아들이지 않습니다. 메시지대로 움직이려다 권한이 필요해지면 평소와 같은 프롬프트가 그대로 뜹니다.
배달 실패가 이제 에러로 뜬다
상대 수신함에 쓰기가 실패했는데도 Message sent 로 보고하던 동작이 2.1.224 에서 에러로 바뀌었습니다. 그 아래 버전에서는 배달이 조용히 실패했습니다. 세션끼리 넘기는 전달은 도착 여부를 사람이 눈으로 확인하지 않으니, 맡겨 두려면 이쪽이 먼저 필요한 조건입니다. 같은 내용이 짧은 간격으로 거듭 오면 버려지고, 세션당 대기 개수에도 상한이 있어 두 세션이 서로를 부르는 고리는 저절로 멎습니다. SendMessage 자체는 2.1.222 에도 있던 도구이고, 2.1.224 에서 달라진 것은 도구가 아니라 한 세션 울타리 밖의 독립 세션까지 닿는 도달 범위입니다.
세션을 여러 개 굴리는 방식 자체는 새롭지 않습니다. tmux 로 작업자를 여러 개 붙이는 가재코드(gjc)의 실행 구조처럼 별도 하네스를 쓰는 길도 있습니다. 달라진 것은 그런 하네스 없이, 이미 띄워 둔 세션끼리 서로를 이름으로 부를 수 있다는 점입니다.
맥과 리눅스에서만, 윈도우는 빠진다
조건은 버전과 운영체제부터 봅니다. Claude Code 2.1.224 이상, macOS 또는 Linux 입니다. 네이티브 윈도우에는 없고, 컨테이너 안 세션과 호스트 세션은 같은 파일을 못 봐 서로 닿지 않습니다. 빠지는 프로바이더는 공식 제공 조건 문서에 있습니다.
세션이 끝나면 소켓도 같이 사라집니다. 실제로 한 세션이 끝나자 이 맥의 소켓이 셋에서 둘로 줄고 목록에서도 함께 빠졌습니다.
명령이 인식되지 않으면 버전부터 볼 차례입니다. 지금 쓰는 세션에서 /list-agents 를 한 번 쳐 보십시오.